dtd.js 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434
  1. ///import editor.js
  2. ///import core/dom/dom.js
  3. ///import core/utils.js
  4. /**
  5. * dtd html语义化的体现类
  6. * @constructor
  7. * @namespace dtd
  8. */
  9. var dtd = (dom.dtd = (function() {
  10. function _(s) {
  11. for (var k in s) {
  12. s[k.toUpperCase()] = s[k];
  13. }
  14. return s;
  15. }
  16. var X = utils.extend2;
  17. var A = _({ isindex: 1, fieldset: 1 }),
  18. B = _({ input: 1, button: 1, select: 1, textarea: 1, label: 1 }),
  19. C = X(_({ a: 1 }), B),
  20. D = X({ iframe: 1 }, C),
  21. E = _({
  22. hr: 1,
  23. ul: 1,
  24. menu: 1,
  25. div: 1,
  26. blockquote: 1,
  27. noscript: 1,
  28. table: 1,
  29. center: 1,
  30. address: 1,
  31. dir: 1,
  32. pre: 1,
  33. h5: 1,
  34. dl: 1,
  35. h4: 1,
  36. noframes: 1,
  37. h6: 1,
  38. ol: 1,
  39. h1: 1,
  40. h3: 1,
  41. h2: 1
  42. }),
  43. F = _({ ins: 1, del: 1, script: 1, style: 1 }),
  44. G = X(
  45. _({
  46. mark: 1,
  47. b: 1,
  48. acronym: 1,
  49. bdo: 1,
  50. var: 1,
  51. "#": 1,
  52. abbr: 1,
  53. code: 1,
  54. br: 1,
  55. i: 1,
  56. cite: 1,
  57. kbd: 1,
  58. u: 1,
  59. strike: 1,
  60. s: 1,
  61. tt: 1,
  62. strong: 1,
  63. q: 1,
  64. samp: 1,
  65. em: 1,
  66. dfn: 1,
  67. span: 1
  68. }),
  69. F
  70. ),
  71. H = X(
  72. _({
  73. sub: 1,
  74. img: 1,
  75. embed: 1,
  76. object: 1,
  77. sup: 1,
  78. basefont: 1,
  79. map: 1,
  80. applet: 1,
  81. font: 1,
  82. big: 1,
  83. small: 1
  84. }),
  85. G
  86. ),
  87. I = X(_({ p: 1 }), H),
  88. J = X(_({ iframe: 1 }), H, B),
  89. K = _({
  90. img: 1,
  91. embed: 1,
  92. noscript: 1,
  93. br: 1,
  94. kbd: 1,
  95. center: 1,
  96. button: 1,
  97. basefont: 1,
  98. h5: 1,
  99. h4: 1,
  100. samp: 1,
  101. h6: 1,
  102. ol: 1,
  103. h1: 1,
  104. h3: 1,
  105. h2: 1,
  106. form: 1,
  107. font: 1,
  108. "#": 1,
  109. select: 1,
  110. menu: 1,
  111. ins: 1,
  112. abbr: 1,
  113. label: 1,
  114. code: 1,
  115. table: 1,
  116. script: 1,
  117. cite: 1,
  118. input: 1,
  119. iframe: 1,
  120. strong: 1,
  121. textarea: 1,
  122. noframes: 1,
  123. big: 1,
  124. small: 1,
  125. span: 1,
  126. hr: 1,
  127. sub: 1,
  128. bdo: 1,
  129. var: 1,
  130. div: 1,
  131. object: 1,
  132. sup: 1,
  133. strike: 1,
  134. dir: 1,
  135. map: 1,
  136. dl: 1,
  137. applet: 1,
  138. del: 1,
  139. isindex: 1,
  140. fieldset: 1,
  141. ul: 1,
  142. b: 1,
  143. acronym: 1,
  144. a: 1,
  145. blockquote: 1,
  146. i: 1,
  147. u: 1,
  148. s: 1,
  149. tt: 1,
  150. address: 1,
  151. q: 1,
  152. pre: 1,
  153. p: 1,
  154. em: 1,
  155. dfn: 1
  156. }),
  157. L = X(_({ a: 0 }), J), //a不能被切开,所以把他
  158. M = _({ tr: 1 }),
  159. N = _({ "#": 1 }),
  160. O = X(_({ param: 1 }), K),
  161. P = X(_({ form: 1 }), A, D, E, I),
  162. Q = _({ li: 1, ol: 1, ul: 1 }),
  163. R = _({ style: 1, script: 1 }),
  164. S = _({ base: 1, link: 1, meta: 1, title: 1 }),
  165. T = X(S, R),
  166. U = _({ head: 1, body: 1 }),
  167. V = _({ html: 1 });
  168. var block = _({
  169. address: 1,
  170. blockquote: 1,
  171. center: 1,
  172. dir: 1,
  173. div: 1,
  174. dl: 1,
  175. fieldset: 1,
  176. form: 1,
  177. h1: 1,
  178. h2: 1,
  179. h3: 1,
  180. h4: 1,
  181. h5: 1,
  182. h6: 1,
  183. hr: 1,
  184. isindex: 1,
  185. menu: 1,
  186. noframes: 1,
  187. ol: 1,
  188. p: 1,
  189. pre: 1,
  190. table: 1,
  191. ul: 1
  192. }),
  193. empty = _({
  194. area: 1,
  195. base: 1,
  196. basefont: 1,
  197. br: 1,
  198. col: 1,
  199. command: 1,
  200. dialog: 1,
  201. embed: 1,
  202. hr: 1,
  203. img: 1,
  204. input: 1,
  205. isindex: 1,
  206. keygen: 1,
  207. link: 1,
  208. meta: 1,
  209. param: 1,
  210. source: 1,
  211. track: 1,
  212. wbr: 1
  213. });
  214. return _({
  215. // $ 表示自定的属性
  216. // body外的元素列表.
  217. $nonBodyContent: X(V, U, S),
  218. //块结构元素列表
  219. $block: block,
  220. //内联元素列表
  221. $inline: L,
  222. $inlineWithA: X(_({ a: 1 }), L),
  223. $body: X(_({ script: 1, style: 1 }), block),
  224. $cdata: _({ script: 1, style: 1 }),
  225. //自闭和元素
  226. $empty: empty,
  227. //不是自闭合,但不能让range选中里边
  228. $nonChild: _({ iframe: 1, textarea: 1 }),
  229. //列表元素列表
  230. $listItem: _({ dd: 1, dt: 1, li: 1 }),
  231. //列表根元素列表
  232. $list: _({ ul: 1, ol: 1, dl: 1 }),
  233. //不能认为是空的元素
  234. $isNotEmpty: _({
  235. table: 1,
  236. ul: 1,
  237. ol: 1,
  238. dl: 1,
  239. iframe: 1,
  240. area: 1,
  241. base: 1,
  242. col: 1,
  243. hr: 1,
  244. img: 1,
  245. embed: 1,
  246. input: 1,
  247. textarea: 1,
  248. link: 1,
  249. meta: 1,
  250. param: 1,
  251. h1: 1,
  252. h2: 1,
  253. h3: 1,
  254. h4: 1,
  255. h5: 1,
  256. h6: 1
  257. }),
  258. //如果没有子节点就可以删除的元素列表,像span,a
  259. $removeEmpty: _({
  260. a: 1,
  261. abbr: 1,
  262. acronym: 1,
  263. address: 1,
  264. b: 1,
  265. bdo: 1,
  266. big: 1,
  267. cite: 1,
  268. code: 1,
  269. del: 1,
  270. dfn: 1,
  271. em: 1,
  272. font: 1,
  273. i: 1,
  274. ins: 1,
  275. label: 1,
  276. kbd: 1,
  277. q: 1,
  278. s: 1,
  279. samp: 1,
  280. small: 1,
  281. span: 1,
  282. strike: 1,
  283. strong: 1,
  284. sub: 1,
  285. sup: 1,
  286. tt: 1,
  287. u: 1,
  288. var: 1
  289. }),
  290. $removeEmptyBlock: _({ p: 1, div: 1 }),
  291. //在table元素里的元素列表
  292. $tableContent: _({
  293. caption: 1,
  294. col: 1,
  295. colgroup: 1,
  296. tbody: 1,
  297. td: 1,
  298. tfoot: 1,
  299. th: 1,
  300. thead: 1,
  301. tr: 1,
  302. table: 1
  303. }),
  304. //不转换的标签
  305. $notTransContent: _({ pre: 1, script: 1, style: 1, textarea: 1 }),
  306. html: U,
  307. head: T,
  308. style: N,
  309. script: N,
  310. body: P,
  311. base: {},
  312. link: {},
  313. meta: {},
  314. title: N,
  315. col: {},
  316. tr: _({ td: 1, th: 1 }),
  317. img: {},
  318. embed: {},
  319. colgroup: _({ thead: 1, col: 1, tbody: 1, tr: 1, tfoot: 1 }),
  320. noscript: P,
  321. td: P,
  322. br: {},
  323. th: P,
  324. center: P,
  325. kbd: L,
  326. button: X(I, E),
  327. basefont: {},
  328. h5: L,
  329. h4: L,
  330. samp: L,
  331. h6: L,
  332. ol: Q,
  333. h1: L,
  334. h3: L,
  335. option: N,
  336. h2: L,
  337. form: X(A, D, E, I),
  338. select: _({ optgroup: 1, option: 1 }),
  339. font: L,
  340. ins: L,
  341. menu: Q,
  342. abbr: L,
  343. label: L,
  344. table: _({
  345. thead: 1,
  346. col: 1,
  347. tbody: 1,
  348. tr: 1,
  349. colgroup: 1,
  350. caption: 1,
  351. tfoot: 1
  352. }),
  353. code: L,
  354. tfoot: M,
  355. cite: L,
  356. li: P,
  357. input: {},
  358. iframe: P,
  359. strong: L,
  360. textarea: N,
  361. noframes: P,
  362. big: L,
  363. small: L,
  364. //trace:
  365. span: _({
  366. "#": 1,
  367. br: 1,
  368. b: 1,
  369. strong: 1,
  370. u: 1,
  371. i: 1,
  372. em: 1,
  373. sub: 1,
  374. sup: 1,
  375. strike: 1,
  376. span: 1
  377. }),
  378. hr: L,
  379. dt: L,
  380. sub: L,
  381. optgroup: _({ option: 1 }),
  382. param: {},
  383. bdo: L,
  384. var: L,
  385. div: P,
  386. object: O,
  387. sup: L,
  388. dd: P,
  389. strike: L,
  390. area: {},
  391. dir: Q,
  392. map: X(_({ area: 1, form: 1, p: 1 }), A, F, E),
  393. applet: O,
  394. dl: _({ dt: 1, dd: 1 }),
  395. del: L,
  396. isindex: {},
  397. fieldset: X(_({ legend: 1 }), K),
  398. thead: M,
  399. ul: Q,
  400. acronym: L,
  401. b: L,
  402. a: X(_({ a: 1 }), J),
  403. blockquote: X(_({ td: 1, tr: 1, tbody: 1, li: 1 }), P),
  404. caption: L,
  405. i: L,
  406. u: L,
  407. tbody: M,
  408. s: L,
  409. address: X(D, I),
  410. tt: L,
  411. legend: L,
  412. q: L,
  413. pre: X(G, C),
  414. p: X(_({ a: 1 }), L),
  415. em: L,
  416. dfn: L,
  417. mark: L
  418. });
  419. })());