HttpHandlers+Scopes.swift 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869
  1. //
  2. // HttpHandlers+Scopes.swift
  3. // Swifter
  4. //
  5. // Copyright © 2014-2016 Damian Kołakowski. All rights reserved.
  6. //
  7. import Foundation
  8. public func scopes(scope: Closure) -> ((HttpRequest) -> HttpResponse) {
  9. return { r in
  10. ScopesBuffer[Process.TID] = ""
  11. scope()
  12. return .RAW(200, "OK", ["Content-Type": "text/html"],
  13. { $0.write([UInt8](("<!DOCTYPE html>" + (ScopesBuffer[Process.TID] ?? "")).utf8)) })
  14. }
  15. }
  16. public typealias Closure = (Void) -> Void
  17. public var idd: String? = nil
  18. public var dir: String? = nil
  19. public var rel: String? = nil
  20. public var rev: String? = nil
  21. public var alt: String? = nil
  22. public var forr: String? = nil
  23. public var src: String? = nil
  24. public var type: String? = nil
  25. public var href: String? = nil
  26. public var text: String? = nil
  27. public var abbr: String? = nil
  28. public var size: String? = nil
  29. public var face: String? = nil
  30. public var char: String? = nil
  31. public var cite: String? = nil
  32. public var span: String? = nil
  33. public var data: String? = nil
  34. public var axis: String? = nil
  35. public var Name: String? = nil
  36. public var name: String? = nil
  37. public var code: String? = nil
  38. public var link: String? = nil
  39. public var lang: String? = nil
  40. public var cols: String? = nil
  41. public var rows: String? = nil
  42. public var ismap: String? = nil
  43. public var shape: String? = nil
  44. public var style: String? = nil
  45. public var alink: String? = nil
  46. public var width: String? = nil
  47. public var rules: String? = nil
  48. public var align: String? = nil
  49. public var frame: String? = nil
  50. public var vlink: String? = nil
  51. public var deferr: String? = nil
  52. public var color: String? = nil
  53. public var media: String? = nil
  54. public var title: String? = nil
  55. public var scope: String? = nil
  56. public var classs: String? = nil
  57. public var value: String? = nil
  58. public var clear: String? = nil
  59. public var start: String? = nil
  60. public var label: String? = nil
  61. public var action: String? = nil
  62. public var height: String? = nil
  63. public var method: String? = nil
  64. public var acceptt: String? = nil
  65. public var object: String? = nil
  66. public var scheme: String? = nil
  67. public var coords: String? = nil
  68. public var usemap: String? = nil
  69. public var onblur: String? = nil
  70. public var nohref: String? = nil
  71. public var nowrap: String? = nil
  72. public var hspace: String? = nil
  73. public var border: String? = nil
  74. public var valign: String? = nil
  75. public var vspace: String? = nil
  76. public var onload: String? = nil
  77. public var target: String? = nil
  78. public var prompt: String? = nil
  79. public var onfocus: String? = nil
  80. public var enctype: String? = nil
  81. public var onclick: String? = nil
  82. public var onkeyup: String? = nil
  83. public var profile: String? = nil
  84. public var version: String? = nil
  85. public var onreset: String? = nil
  86. public var charset: String? = nil
  87. public var standby: String? = nil
  88. public var colspan: String? = nil
  89. public var charoff: String? = nil
  90. public var classid: String? = nil
  91. public var compact: String? = nil
  92. public var declare: String? = nil
  93. public var rowspan: String? = nil
  94. public var checked: String? = nil
  95. public var archive: String? = nil
  96. public var bgcolor: String? = nil
  97. public var content: String? = nil
  98. public var noshade: String? = nil
  99. public var summary: String? = nil
  100. public var headers: String? = nil
  101. public var onselect: String? = nil
  102. public var readonly: String? = nil
  103. public var tabindex: String? = nil
  104. public var onchange: String? = nil
  105. public var noresize: String? = nil
  106. public var disabled: String? = nil
  107. public var longdesc: String? = nil
  108. public var codebase: String? = nil
  109. public var language: String? = nil
  110. public var datetime: String? = nil
  111. public var selected: String? = nil
  112. public var hreflang: String? = nil
  113. public var onsubmit: String? = nil
  114. public var multiple: String? = nil
  115. public var onunload: String? = nil
  116. public var codetype: String? = nil
  117. public var scrolling: String? = nil
  118. public var onkeydown: String? = nil
  119. public var maxlength: String? = nil
  120. public var valuetype: String? = nil
  121. public var accesskey: String? = nil
  122. public var onmouseup: String? = nil
  123. public var autofocus: String? = nil
  124. public var onkeypress: String? = nil
  125. public var ondblclick: String? = nil
  126. public var onmouseout: String? = nil
  127. public var httpEquiv: String? = nil
  128. public var background: String? = nil
  129. public var onmousemove: String? = nil
  130. public var onmouseover: String? = nil
  131. public var cellpadding: String? = nil
  132. public var onmousedown: String? = nil
  133. public var frameborder: String? = nil
  134. public var marginwidth: String? = nil
  135. public var cellspacing: String? = nil
  136. public var placeholder: String? = nil
  137. public var marginheight: String? = nil
  138. public var acceptCharset: String? = nil
  139. public var inner: String? = nil
  140. public func a(c: Closure) { element("a", c) }
  141. public func b(c: Closure) { element("b", c) }
  142. public func i(c: Closure) { element("i", c) }
  143. public func p(c: Closure) { element("p", c) }
  144. public func q(c: Closure) { element("q", c) }
  145. public func s(c: Closure) { element("s", c) }
  146. public func u(c: Closure) { element("u", c) }
  147. public func br(c: Closure) { element("br", c) }
  148. public func dd(c: Closure) { element("dd", c) }
  149. public func dl(c: Closure) { element("dl", c) }
  150. public func dt(c: Closure) { element("dt", c) }
  151. public func em(c: Closure) { element("em", c) }
  152. public func hr(c: Closure) { element("hr", c) }
  153. public func li(c: Closure) { element("li", c) }
  154. public func ol(c: Closure) { element("ol", c) }
  155. public func rp(c: Closure) { element("rp", c) }
  156. public func rt(c: Closure) { element("rt", c) }
  157. public func td(c: Closure) { element("td", c) }
  158. public func th(c: Closure) { element("th", c) }
  159. public func tr(c: Closure) { element("tr", c) }
  160. public func tt(c: Closure) { element("tt", c) }
  161. public func ul(c: Closure) { element("ul", c) }
  162. public func ul<T: SequenceType>(collection: T, _ c: (T.Generator.Element) -> Void) {
  163. element("ul", {
  164. for item in collection {
  165. c(item)
  166. }
  167. })
  168. }
  169. public func h1(c: Closure) { element("h1", c) }
  170. public func h2(c: Closure) { element("h2", c) }
  171. public func h3(c: Closure) { element("h3", c) }
  172. public func h4(c: Closure) { element("h4", c) }
  173. public func h5(c: Closure) { element("h5", c) }
  174. public func h6(c: Closure) { element("h6", c) }
  175. public func bdi(c: Closure) { element("bdi", c) }
  176. public func bdo(c: Closure) { element("bdo", c) }
  177. public func big(c: Closure) { element("big", c) }
  178. public func col(c: Closure) { element("col", c) }
  179. public func del(c: Closure) { element("del", c) }
  180. public func dfn(c: Closure) { element("dfn", c) }
  181. public func dir(c: Closure) { element("dir", c) }
  182. public func div(c: Closure) { element("div", c) }
  183. public func img(c: Closure) { element("img", c) }
  184. public func ins(c: Closure) { element("ins", c) }
  185. public func kbd(c: Closure) { element("kbd", c) }
  186. public func map(c: Closure) { element("map", c) }
  187. public func nav(c: Closure) { element("nav", c) }
  188. public func pre(c: Closure) { element("pre", c) }
  189. public func rtc(c: Closure) { element("rtc", c) }
  190. public func sub(c: Closure) { element("sub", c) }
  191. public func sup(c: Closure) { element("sup", c) }
  192. public func varr(c: Closure) { element("var", c) }
  193. public func wbr(c: Closure) { element("wbr", c) }
  194. public func xmp(c: Closure) { element("xmp", c) }
  195. public func abbr(c: Closure) { element("abbr", c) }
  196. public func area(c: Closure) { element("area", c) }
  197. public func base(c: Closure) { element("base", c) }
  198. public func body(c: Closure) { element("body", c) }
  199. public func cite(c: Closure) { element("cite", c) }
  200. public func code(c: Closure) { element("code", c) }
  201. public func data(c: Closure) { element("data", c) }
  202. public func font(c: Closure) { element("font", c) }
  203. public func form(c: Closure) { element("form", c) }
  204. public func head(c: Closure) { element("head", c) }
  205. public func html(c: Closure) { element("html", c) }
  206. public func link(c: Closure) { element("link", c) }
  207. public func main(c: Closure) { element("main", c) }
  208. public func mark(c: Closure) { element("mark", c) }
  209. public func menu(c: Closure) { element("menu", c) }
  210. public func meta(c: Closure) { element("meta", c) }
  211. public func nobr(c: Closure) { element("nobr", c) }
  212. public func ruby(c: Closure) { element("ruby", c) }
  213. public func samp(c: Closure) { element("samp", c) }
  214. public func span(c: Closure) { element("span", c) }
  215. public func time(c: Closure) { element("time", c) }
  216. public func aside(c: Closure) { element("aside", c) }
  217. public func audio(c: Closure) { element("audio", c) }
  218. public func blink(c: Closure) { element("blink", c) }
  219. public func embed(c: Closure) { element("embed", c) }
  220. public func frame(c: Closure) { element("frame", c) }
  221. public func image(c: Closure) { element("image", c) }
  222. public func input(c: Closure) { element("input", c) }
  223. public func label(c: Closure) { element("label", c) }
  224. public func meter(c: Closure) { element("meter", c) }
  225. public func param(c: Closure) { element("param", c) }
  226. public func small(c: Closure) { element("small", c) }
  227. public func style(c: Closure) { element("style", c) }
  228. public func table(c: Closure) { element("table", c) }
  229. public func table<T: SequenceType>(collection: T, c: (T.Generator.Element) -> Void) {
  230. element("table", {
  231. for item in collection {
  232. c(item)
  233. }
  234. })
  235. }
  236. public func tbody(c: Closure) { element("tbody", c) }
  237. public func tbody<T: SequenceType>(collection: T, c: (T.Generator.Element) -> Void) {
  238. element("tbody", {
  239. for item in collection {
  240. c(item)
  241. }
  242. })
  243. }
  244. public func tfoot(c: Closure) { element("tfoot", c) }
  245. public func thead(c: Closure) { element("thead", c) }
  246. public func title(c: Closure) { element("title", c) }
  247. public func track(c: Closure) { element("track", c) }
  248. public func video(c: Closure) { element("video", c) }
  249. public func applet(c: Closure) { element("applet", c) }
  250. public func button(c: Closure) { element("button", c) }
  251. public func canvas(c: Closure) { element("canvas", c) }
  252. public func center(c: Closure) { element("center", c) }
  253. public func dialog(c: Closure) { element("dialog", c) }
  254. public func figure(c: Closure) { element("figure", c) }
  255. public func footer(c: Closure) { element("footer", c) }
  256. public func header(c: Closure) { element("header", c) }
  257. public func hgroup(c: Closure) { element("hgroup", c) }
  258. public func iframe(c: Closure) { element("iframe", c) }
  259. public func keygen(c: Closure) { element("keygen", c) }
  260. public func legend(c: Closure) { element("legend", c) }
  261. public func object(c: Closure) { element("object", c) }
  262. public func option(c: Closure) { element("option", c) }
  263. public func output(c: Closure) { element("output", c) }
  264. public func script(c: Closure) { element("script", c) }
  265. public func select(c: Closure) { element("select", c) }
  266. public func shadow(c: Closure) { element("shadow", c) }
  267. public func source(c: Closure) { element("source", c) }
  268. public func spacer(c: Closure) { element("spacer", c) }
  269. public func strike(c: Closure) { element("strike", c) }
  270. public func strong(c: Closure) { element("strong", c) }
  271. public func acronym(c: Closure) { element("acronym", c) }
  272. public func address(c: Closure) { element("address", c) }
  273. public func article(c: Closure) { element("article", c) }
  274. public func bgsound(c: Closure) { element("bgsound", c) }
  275. public func caption(c: Closure) { element("caption", c) }
  276. public func command(c: Closure) { element("command", c) }
  277. public func content(c: Closure) { element("content", c) }
  278. public func details(c: Closure) { element("details", c) }
  279. public func elementt(c: Closure) { element("element", c) }
  280. public func isindex(c: Closure) { element("isindex", c) }
  281. public func listing(c: Closure) { element("listing", c) }
  282. public func marquee(c: Closure) { element("marquee", c) }
  283. public func noembed(c: Closure) { element("noembed", c) }
  284. public func picture(c: Closure) { element("picture", c) }
  285. public func section(c: Closure) { element("section", c) }
  286. public func summary(c: Closure) { element("summary", c) }
  287. public func basefont(c: Closure) { element("basefont", c) }
  288. public func colgroup(c: Closure) { element("colgroup", c) }
  289. public func datalist(c: Closure) { element("datalist", c) }
  290. public func fieldset(c: Closure) { element("fieldset", c) }
  291. public func frameset(c: Closure) { element("frameset", c) }
  292. public func menuitem(c: Closure) { element("menuitem", c) }
  293. public func multicol(c: Closure) { element("multicol", c) }
  294. public func noframes(c: Closure) { element("noframes", c) }
  295. public func noscript(c: Closure) { element("noscript", c) }
  296. public func optgroup(c: Closure) { element("optgroup", c) }
  297. public func progress(c: Closure) { element("progress", c) }
  298. public func template(c: Closure) { element("template", c) }
  299. public func textarea(c: Closure) { element("textarea", c) }
  300. public func plaintext(c: Closure) { element("plaintext", c) }
  301. public func javascript(c: Closure) { element("script", ["type": "text/javascript"], c) }
  302. public func blockquote(c: Closure) { element("blockquote", c) }
  303. public func figcaption(c: Closure) { element("figcaption", c) }
  304. public func stylesheet(c: Closure) { element("link", ["rel": "stylesheet", "type": "text/css"], c) }
  305. public func element(node: String, _ c: Closure) { evaluate(node, [:], c) }
  306. public func element(node: String, _ attrs: [String: String?] = [:], _ c: Closure) { evaluate(node, attrs, c) }
  307. var ScopesBuffer = [UInt64: String]()
  308. private func evaluate(node: String, _ attrs: [String: String?] = [:], _ c: Closure) {
  309. // Push the attributes.
  310. let stackid = idd
  311. let stackdir = dir
  312. let stackrel = rel
  313. let stackrev = rev
  314. let stackalt = alt
  315. let stackfor = forr
  316. let stacksrc = src
  317. let stacktype = type
  318. let stackhref = href
  319. let stacktext = text
  320. let stackabbr = abbr
  321. let stacksize = size
  322. let stackface = face
  323. let stackchar = char
  324. let stackcite = cite
  325. let stackspan = span
  326. let stackdata = data
  327. let stackaxis = axis
  328. let stackName = Name
  329. let stackname = name
  330. let stackcode = code
  331. let stacklink = link
  332. let stacklang = lang
  333. let stackcols = cols
  334. let stackrows = rows
  335. let stackismap = ismap
  336. let stackshape = shape
  337. let stackstyle = style
  338. let stackalink = alink
  339. let stackwidth = width
  340. let stackrules = rules
  341. let stackalign = align
  342. let stackframe = frame
  343. let stackvlink = vlink
  344. let stackdefer = deferr
  345. let stackcolor = color
  346. let stackmedia = media
  347. let stacktitle = title
  348. let stackscope = scope
  349. let stackclass = classs
  350. let stackvalue = value
  351. let stackclear = clear
  352. let stackstart = start
  353. let stacklabel = label
  354. let stackaction = action
  355. let stackheight = height
  356. let stackmethod = method
  357. let stackaccept = acceptt
  358. let stackobject = object
  359. let stackscheme = scheme
  360. let stackcoords = coords
  361. let stackusemap = usemap
  362. let stackonblur = onblur
  363. let stacknohref = nohref
  364. let stacknowrap = nowrap
  365. let stackhspace = hspace
  366. let stackborder = border
  367. let stackvalign = valign
  368. let stackvspace = vspace
  369. let stackonload = onload
  370. let stacktarget = target
  371. let stackprompt = prompt
  372. let stackonfocus = onfocus
  373. let stackenctype = enctype
  374. let stackonclick = onclick
  375. let stackonkeyup = onkeyup
  376. let stackprofile = profile
  377. let stackversion = version
  378. let stackonreset = onreset
  379. let stackcharset = charset
  380. let stackstandby = standby
  381. let stackcolspan = colspan
  382. let stackcharoff = charoff
  383. let stackclassid = classid
  384. let stackcompact = compact
  385. let stackdeclare = declare
  386. let stackrowspan = rowspan
  387. let stackchecked = checked
  388. let stackarchive = archive
  389. let stackbgcolor = bgcolor
  390. let stackcontent = content
  391. let stacknoshade = noshade
  392. let stacksummary = summary
  393. let stackheaders = headers
  394. let stackonselect = onselect
  395. let stackreadonly = readonly
  396. let stacktabindex = tabindex
  397. let stackonchange = onchange
  398. let stacknoresize = noresize
  399. let stackdisabled = disabled
  400. let stacklongdesc = longdesc
  401. let stackcodebase = codebase
  402. let stacklanguage = language
  403. let stackdatetime = datetime
  404. let stackselected = selected
  405. let stackhreflang = hreflang
  406. let stackonsubmit = onsubmit
  407. let stackmultiple = multiple
  408. let stackonunload = onunload
  409. let stackcodetype = codetype
  410. let stackscrolling = scrolling
  411. let stackonkeydown = onkeydown
  412. let stackmaxlength = maxlength
  413. let stackvaluetype = valuetype
  414. let stackaccesskey = accesskey
  415. let stackonmouseup = onmouseup
  416. let stackonkeypress = onkeypress
  417. let stackondblclick = ondblclick
  418. let stackonmouseout = onmouseout
  419. let stackhttpEquiv = httpEquiv
  420. let stackbackground = background
  421. let stackonmousemove = onmousemove
  422. let stackonmouseover = onmouseover
  423. let stackcellpadding = cellpadding
  424. let stackonmousedown = onmousedown
  425. let stackframeborder = frameborder
  426. let stackmarginwidth = marginwidth
  427. let stackcellspacing = cellspacing
  428. let stackplaceholder = placeholder
  429. let stackmarginheight = marginheight
  430. let stackacceptCharset = acceptCharset
  431. let stackinner = inner
  432. // Reset the values before a nested scope evalutation.
  433. idd = nil
  434. dir = nil
  435. rel = nil
  436. rev = nil
  437. alt = nil
  438. forr = nil
  439. src = nil
  440. type = nil
  441. href = nil
  442. text = nil
  443. abbr = nil
  444. size = nil
  445. face = nil
  446. char = nil
  447. cite = nil
  448. span = nil
  449. data = nil
  450. axis = nil
  451. Name = nil
  452. name = nil
  453. code = nil
  454. link = nil
  455. lang = nil
  456. cols = nil
  457. rows = nil
  458. ismap = nil
  459. shape = nil
  460. style = nil
  461. alink = nil
  462. width = nil
  463. rules = nil
  464. align = nil
  465. frame = nil
  466. vlink = nil
  467. deferr = nil
  468. color = nil
  469. media = nil
  470. title = nil
  471. scope = nil
  472. classs = nil
  473. value = nil
  474. clear = nil
  475. start = nil
  476. label = nil
  477. action = nil
  478. height = nil
  479. method = nil
  480. acceptt = nil
  481. object = nil
  482. scheme = nil
  483. coords = nil
  484. usemap = nil
  485. onblur = nil
  486. nohref = nil
  487. nowrap = nil
  488. hspace = nil
  489. border = nil
  490. valign = nil
  491. vspace = nil
  492. onload = nil
  493. target = nil
  494. prompt = nil
  495. onfocus = nil
  496. enctype = nil
  497. onclick = nil
  498. onkeyup = nil
  499. profile = nil
  500. version = nil
  501. onreset = nil
  502. charset = nil
  503. standby = nil
  504. colspan = nil
  505. charoff = nil
  506. classid = nil
  507. compact = nil
  508. declare = nil
  509. rowspan = nil
  510. checked = nil
  511. archive = nil
  512. bgcolor = nil
  513. content = nil
  514. noshade = nil
  515. summary = nil
  516. headers = nil
  517. onselect = nil
  518. readonly = nil
  519. tabindex = nil
  520. onchange = nil
  521. noresize = nil
  522. disabled = nil
  523. longdesc = nil
  524. codebase = nil
  525. language = nil
  526. datetime = nil
  527. selected = nil
  528. hreflang = nil
  529. onsubmit = nil
  530. multiple = nil
  531. onunload = nil
  532. codetype = nil
  533. scrolling = nil
  534. onkeydown = nil
  535. maxlength = nil
  536. valuetype = nil
  537. accesskey = nil
  538. onmouseup = nil
  539. onkeypress = nil
  540. ondblclick = nil
  541. onmouseout = nil
  542. httpEquiv = nil
  543. background = nil
  544. onmousemove = nil
  545. onmouseover = nil
  546. cellpadding = nil
  547. onmousedown = nil
  548. frameborder = nil
  549. placeholder = nil
  550. marginwidth = nil
  551. cellspacing = nil
  552. marginheight = nil
  553. acceptCharset = nil
  554. inner = nil
  555. ScopesBuffer[Process.TID] = (ScopesBuffer[Process.TID] ?? "") + "<" + node
  556. // Save the current output before the nested scope evalutation.
  557. var output = ScopesBuffer[Process.TID] ?? ""
  558. // Clear the output buffer for the evalutation.
  559. ScopesBuffer[Process.TID] = ""
  560. // Evaluate the nested scope.
  561. c()
  562. // Render attributes set by the evalutation.
  563. var mergedAttributes = [String: String?]()
  564. if let idd = idd { mergedAttributes["id"] = idd }
  565. if let dir = dir { mergedAttributes["dir"] = dir }
  566. if let rel = rel { mergedAttributes["rel"] = rel }
  567. if let rev = rev { mergedAttributes["rev"] = rev }
  568. if let alt = alt { mergedAttributes["alt"] = alt }
  569. if let forr = forr { mergedAttributes["for"] = forr }
  570. if let src = src { mergedAttributes["src"] = src }
  571. if let type = type { mergedAttributes["type"] = type }
  572. if let href = href { mergedAttributes["href"] = href }
  573. if let text = text { mergedAttributes["text"] = text }
  574. if let abbr = abbr { mergedAttributes["abbr"] = abbr }
  575. if let size = size { mergedAttributes["size"] = size }
  576. if let face = face { mergedAttributes["face"] = face }
  577. if let char = char { mergedAttributes["char"] = char }
  578. if let cite = cite { mergedAttributes["cite"] = cite }
  579. if let span = span { mergedAttributes["span"] = span }
  580. if let data = data { mergedAttributes["data"] = data }
  581. if let axis = axis { mergedAttributes["axis"] = axis }
  582. if let Name = Name { mergedAttributes["Name"] = Name }
  583. if let name = name { mergedAttributes["name"] = name }
  584. if let code = code { mergedAttributes["code"] = code }
  585. if let link = link { mergedAttributes["link"] = link }
  586. if let lang = lang { mergedAttributes["lang"] = lang }
  587. if let cols = cols { mergedAttributes["cols"] = cols }
  588. if let rows = rows { mergedAttributes["rows"] = rows }
  589. if let ismap = ismap { mergedAttributes["ismap"] = ismap }
  590. if let shape = shape { mergedAttributes["shape"] = shape }
  591. if let style = style { mergedAttributes["style"] = style }
  592. if let alink = alink { mergedAttributes["alink"] = alink }
  593. if let width = width { mergedAttributes["width"] = width }
  594. if let rules = rules { mergedAttributes["rules"] = rules }
  595. if let align = align { mergedAttributes["align"] = align }
  596. if let frame = frame { mergedAttributes["frame"] = frame }
  597. if let vlink = vlink { mergedAttributes["vlink"] = vlink }
  598. if let deferr = deferr { mergedAttributes["defer"] = deferr }
  599. if let color = color { mergedAttributes["color"] = color }
  600. if let media = media { mergedAttributes["media"] = media }
  601. if let title = title { mergedAttributes["title"] = title }
  602. if let scope = scope { mergedAttributes["scope"] = scope }
  603. if let classs = classs { mergedAttributes["class"] = classs }
  604. if let value = value { mergedAttributes["value"] = value }
  605. if let clear = clear { mergedAttributes["clear"] = clear }
  606. if let start = start { mergedAttributes["start"] = start }
  607. if let label = label { mergedAttributes["label"] = label }
  608. if let action = action { mergedAttributes["action"] = action }
  609. if let height = height { mergedAttributes["height"] = height }
  610. if let method = method { mergedAttributes["method"] = method }
  611. if let acceptt = acceptt { mergedAttributes["accept"] = acceptt }
  612. if let object = object { mergedAttributes["object"] = object }
  613. if let scheme = scheme { mergedAttributes["scheme"] = scheme }
  614. if let coords = coords { mergedAttributes["coords"] = coords }
  615. if let usemap = usemap { mergedAttributes["usemap"] = usemap }
  616. if let onblur = onblur { mergedAttributes["onblur"] = onblur }
  617. if let nohref = nohref { mergedAttributes["nohref"] = nohref }
  618. if let nowrap = nowrap { mergedAttributes["nowrap"] = nowrap }
  619. if let hspace = hspace { mergedAttributes["hspace"] = hspace }
  620. if let border = border { mergedAttributes["border"] = border }
  621. if let valign = valign { mergedAttributes["valign"] = valign }
  622. if let vspace = vspace { mergedAttributes["vspace"] = vspace }
  623. if let onload = onload { mergedAttributes["onload"] = onload }
  624. if let target = target { mergedAttributes["target"] = target }
  625. if let prompt = prompt { mergedAttributes["prompt"] = prompt }
  626. if let onfocus = onfocus { mergedAttributes["onfocus"] = onfocus }
  627. if let enctype = enctype { mergedAttributes["enctype"] = enctype }
  628. if let onclick = onclick { mergedAttributes["onclick"] = onclick }
  629. if let onkeyup = onkeyup { mergedAttributes["onkeyup"] = onkeyup }
  630. if let profile = profile { mergedAttributes["profile"] = profile }
  631. if let version = version { mergedAttributes["version"] = version }
  632. if let onreset = onreset { mergedAttributes["onreset"] = onreset }
  633. if let charset = charset { mergedAttributes["charset"] = charset }
  634. if let standby = standby { mergedAttributes["standby"] = standby }
  635. if let colspan = colspan { mergedAttributes["colspan"] = colspan }
  636. if let charoff = charoff { mergedAttributes["charoff"] = charoff }
  637. if let classid = classid { mergedAttributes["classid"] = classid }
  638. if let compact = compact { mergedAttributes["compact"] = compact }
  639. if let declare = declare { mergedAttributes["declare"] = declare }
  640. if let rowspan = rowspan { mergedAttributes["rowspan"] = rowspan }
  641. if let checked = checked { mergedAttributes["checked"] = checked }
  642. if let archive = archive { mergedAttributes["archive"] = archive }
  643. if let bgcolor = bgcolor { mergedAttributes["bgcolor"] = bgcolor }
  644. if let content = content { mergedAttributes["content"] = content }
  645. if let noshade = noshade { mergedAttributes["noshade"] = noshade }
  646. if let summary = summary { mergedAttributes["summary"] = summary }
  647. if let headers = headers { mergedAttributes["headers"] = headers }
  648. if let onselect = onselect { mergedAttributes["onselect"] = onselect }
  649. if let readonly = readonly { mergedAttributes["readonly"] = readonly }
  650. if let tabindex = tabindex { mergedAttributes["tabindex"] = tabindex }
  651. if let onchange = onchange { mergedAttributes["onchange"] = onchange }
  652. if let noresize = noresize { mergedAttributes["noresize"] = noresize }
  653. if let disabled = disabled { mergedAttributes["disabled"] = disabled }
  654. if let longdesc = longdesc { mergedAttributes["longdesc"] = longdesc }
  655. if let codebase = codebase { mergedAttributes["codebase"] = codebase }
  656. if let language = language { mergedAttributes["language"] = language }
  657. if let datetime = datetime { mergedAttributes["datetime"] = datetime }
  658. if let selected = selected { mergedAttributes["selected"] = selected }
  659. if let hreflang = hreflang { mergedAttributes["hreflang"] = hreflang }
  660. if let onsubmit = onsubmit { mergedAttributes["onsubmit"] = onsubmit }
  661. if let multiple = multiple { mergedAttributes["multiple"] = multiple }
  662. if let onunload = onunload { mergedAttributes["onunload"] = onunload }
  663. if let codetype = codetype { mergedAttributes["codetype"] = codetype }
  664. if let scrolling = scrolling { mergedAttributes["scrolling"] = scrolling }
  665. if let onkeydown = onkeydown { mergedAttributes["onkeydown"] = onkeydown }
  666. if let maxlength = maxlength { mergedAttributes["maxlength"] = maxlength }
  667. if let valuetype = valuetype { mergedAttributes["valuetype"] = valuetype }
  668. if let accesskey = accesskey { mergedAttributes["accesskey"] = accesskey }
  669. if let onmouseup = onmouseup { mergedAttributes["onmouseup"] = onmouseup }
  670. if let onkeypress = onkeypress { mergedAttributes["onkeypress"] = onkeypress }
  671. if let ondblclick = ondblclick { mergedAttributes["ondblclick"] = ondblclick }
  672. if let onmouseout = onmouseout { mergedAttributes["onmouseout"] = onmouseout }
  673. if let httpEquiv = httpEquiv { mergedAttributes["http-equiv"] = httpEquiv }
  674. if let background = background { mergedAttributes["background"] = background }
  675. if let onmousemove = onmousemove { mergedAttributes["onmousemove"] = onmousemove }
  676. if let onmouseover = onmouseover { mergedAttributes["onmouseover"] = onmouseover }
  677. if let cellpadding = cellpadding { mergedAttributes["cellpadding"] = cellpadding }
  678. if let onmousedown = onmousedown { mergedAttributes["onmousedown"] = onmousedown }
  679. if let frameborder = frameborder { mergedAttributes["frameborder"] = frameborder }
  680. if let marginwidth = marginwidth { mergedAttributes["marginwidth"] = marginwidth }
  681. if let cellspacing = cellspacing { mergedAttributes["cellspacing"] = cellspacing }
  682. if let placeholder = placeholder { mergedAttributes["placeholder"] = placeholder }
  683. if let marginheight = marginheight { mergedAttributes["marginheight"] = marginheight }
  684. if let acceptCharset = acceptCharset { mergedAttributes["accept-charset"] = acceptCharset }
  685. for item in attrs.enumerate() {
  686. mergedAttributes.updateValue(item.element.1, forKey: item.element.0)
  687. }
  688. output = output + mergedAttributes.reduce("") {
  689. if let value = $0.1.1 {
  690. return $0.0 + " \($0.1.0)=\"\(value)\""
  691. } else {
  692. return $0.0
  693. }
  694. }
  695. if let inner = inner {
  696. ScopesBuffer[Process.TID] = output + ">" + (inner) + "</" + node + ">"
  697. } else {
  698. let current = ScopesBuffer[Process.TID] ?? ""
  699. ScopesBuffer[Process.TID] = output + ">" + current + "</" + node + ">"
  700. }
  701. // Pop the attributes.
  702. idd = stackid
  703. dir = stackdir
  704. rel = stackrel
  705. rev = stackrev
  706. alt = stackalt
  707. forr = stackfor
  708. src = stacksrc
  709. type = stacktype
  710. href = stackhref
  711. text = stacktext
  712. abbr = stackabbr
  713. size = stacksize
  714. face = stackface
  715. char = stackchar
  716. cite = stackcite
  717. span = stackspan
  718. data = stackdata
  719. axis = stackaxis
  720. Name = stackName
  721. name = stackname
  722. code = stackcode
  723. link = stacklink
  724. lang = stacklang
  725. cols = stackcols
  726. rows = stackrows
  727. ismap = stackismap
  728. shape = stackshape
  729. style = stackstyle
  730. alink = stackalink
  731. width = stackwidth
  732. rules = stackrules
  733. align = stackalign
  734. frame = stackframe
  735. vlink = stackvlink
  736. deferr = stackdefer
  737. color = stackcolor
  738. media = stackmedia
  739. title = stacktitle
  740. scope = stackscope
  741. classs = stackclass
  742. value = stackvalue
  743. clear = stackclear
  744. start = stackstart
  745. label = stacklabel
  746. action = stackaction
  747. height = stackheight
  748. method = stackmethod
  749. acceptt = stackaccept
  750. object = stackobject
  751. scheme = stackscheme
  752. coords = stackcoords
  753. usemap = stackusemap
  754. onblur = stackonblur
  755. nohref = stacknohref
  756. nowrap = stacknowrap
  757. hspace = stackhspace
  758. border = stackborder
  759. valign = stackvalign
  760. vspace = stackvspace
  761. onload = stackonload
  762. target = stacktarget
  763. prompt = stackprompt
  764. onfocus = stackonfocus
  765. enctype = stackenctype
  766. onclick = stackonclick
  767. onkeyup = stackonkeyup
  768. profile = stackprofile
  769. version = stackversion
  770. onreset = stackonreset
  771. charset = stackcharset
  772. standby = stackstandby
  773. colspan = stackcolspan
  774. charoff = stackcharoff
  775. classid = stackclassid
  776. compact = stackcompact
  777. declare = stackdeclare
  778. rowspan = stackrowspan
  779. checked = stackchecked
  780. archive = stackarchive
  781. bgcolor = stackbgcolor
  782. content = stackcontent
  783. noshade = stacknoshade
  784. summary = stacksummary
  785. headers = stackheaders
  786. onselect = stackonselect
  787. readonly = stackreadonly
  788. tabindex = stacktabindex
  789. onchange = stackonchange
  790. noresize = stacknoresize
  791. disabled = stackdisabled
  792. longdesc = stacklongdesc
  793. codebase = stackcodebase
  794. language = stacklanguage
  795. datetime = stackdatetime
  796. selected = stackselected
  797. hreflang = stackhreflang
  798. onsubmit = stackonsubmit
  799. multiple = stackmultiple
  800. onunload = stackonunload
  801. codetype = stackcodetype
  802. scrolling = stackscrolling
  803. onkeydown = stackonkeydown
  804. maxlength = stackmaxlength
  805. valuetype = stackvaluetype
  806. accesskey = stackaccesskey
  807. onmouseup = stackonmouseup
  808. onkeypress = stackonkeypress
  809. ondblclick = stackondblclick
  810. onmouseout = stackonmouseout
  811. httpEquiv = stackhttpEquiv
  812. background = stackbackground
  813. onmousemove = stackonmousemove
  814. onmouseover = stackonmouseover
  815. cellpadding = stackcellpadding
  816. onmousedown = stackonmousedown
  817. frameborder = stackframeborder
  818. placeholder = stackplaceholder
  819. marginwidth = stackmarginwidth
  820. cellspacing = stackcellspacing
  821. marginheight = stackmarginheight
  822. acceptCharset = stackacceptCharset
  823. inner = stackinner
  824. }