PageRenderTime 55ms CodeModel.GetById 18ms RepoModel.GetById 0ms app.codeStats 0ms

/source/Plug-in/xajax/xajax_controls/validate_HTML401TRANSITIONAL.inc.php

http://prosporous.googlecode.com/
PHP | 893 lines | 855 code | 22 blank | 16 comment | 10 complexity | 75f1465da8a2c498dfed54b8f9dcdbc7 MD5 | raw file
Possible License(s): LGPL-2.1
  1. <?php
  2. $aAttributes = array(
  3. '%bodycolors' => array(
  4. 'bgcolor',
  5. 'text',
  6. 'link',
  7. 'vlink',
  8. 'alink'
  9. ),
  10. '%coreattrs' => array(
  11. 'id',
  12. 'class',
  13. 'style',
  14. 'title'
  15. ),
  16. '%i18n' => array(
  17. 'lang',
  18. 'dir'
  19. ),
  20. '%events' => array(
  21. 'onclick',
  22. 'ondblclick',
  23. 'onmousedown',
  24. 'onmouseup',
  25. 'onmouseover',
  26. 'onmousemove',
  27. 'onmouseout',
  28. 'onkeypress',
  29. 'onkeydown',
  30. 'onkeyup'
  31. ),
  32. '%attrs' => array(
  33. '%coreattrs',
  34. '%i18n',
  35. '%events'
  36. ),
  37. '%align' => array(
  38. 'left',
  39. 'center',
  40. 'right',
  41. 'justify'
  42. ),
  43. '%cellhalign' => array(
  44. 'align'
  45. ),
  46. '%cellvalign' => array(
  47. 'valign'
  48. ),
  49. 'TT' => array('%attrs'),
  50. 'I' => array('%attrs'),
  51. 'B' => array('%attrs'),
  52. 'U' => array('%attrs'),
  53. 'S' => array('%attrs'),
  54. 'STRIKE' => array('%attrs'),
  55. 'BIG' => array('%attrs'),
  56. 'SMALL' => array('%attrs'),
  57. 'EM' => array('%attrs'),
  58. 'STRONG' => array('%attrs'),
  59. 'DFN' => array('%attrs'),
  60. 'CODE' => array('%attrs'),
  61. 'SAMP' => array('%attrs'),
  62. 'KBD' => array('%attrs'),
  63. 'VAR' => array('%attrs'),
  64. 'CITE' => array('%attrs'),
  65. 'ABBR' => array('%attrs'),
  66. 'ACRONYM' => array('%attrs'),
  67. 'SUB' => array('%attrs'),
  68. 'SUP' => array('%attrs'),
  69. 'SPAN' => array(
  70. '%attrs'
  71. // ,
  72. // '%reserved'
  73. ),
  74. 'BDO' => array(
  75. '%coreattrs',
  76. 'lang',
  77. 'dir'
  78. ),
  79. 'BASEFONT' => array(
  80. 'id',
  81. 'size',
  82. 'color',
  83. 'face'
  84. ),
  85. 'FONT' => array(
  86. '%coreattrs',
  87. '%i18n',
  88. 'size',
  89. 'color',
  90. 'face'
  91. ),
  92. 'BR' => array(
  93. '%coreattrs',
  94. 'clear'
  95. ),
  96. 'BODY' => array(
  97. '%attrs',
  98. 'onload',
  99. 'onunload',
  100. 'background',
  101. '%bodycolors'
  102. ),
  103. 'ADDRESS' => array('%attrs'),
  104. 'DIV' => array(
  105. '%attrs',
  106. '%align'
  107. // ,
  108. // '%reserved'
  109. ),
  110. 'CENTER' => array('%attrs'),
  111. 'A' => array(
  112. '%attrs',
  113. 'charset',
  114. 'type',
  115. 'name',
  116. 'href',
  117. 'hreflang',
  118. 'target',
  119. 'rel',
  120. 'rev',
  121. 'accesskey',
  122. 'shape',
  123. 'coords',
  124. 'tabindex',
  125. 'onfocus',
  126. 'onblur'
  127. ),
  128. 'MAP' => array(
  129. '%attrs',
  130. 'name'
  131. ),
  132. 'AREA' => array(
  133. '%attrs',
  134. 'shape',
  135. 'coords',
  136. 'href',
  137. 'target',
  138. 'nohref',
  139. 'alt',
  140. 'tabindex',
  141. 'accesskey',
  142. 'onfocus',
  143. 'onblur'
  144. ),
  145. 'LINK' => array(
  146. '%attrs',
  147. 'charset',
  148. 'href',
  149. 'hreflang',
  150. 'type',
  151. 'rel',
  152. 'rev',
  153. 'media',
  154. 'target'
  155. ),
  156. 'IMG' => array(
  157. '%attrs',
  158. 'src',
  159. 'alt',
  160. 'longdesc',
  161. 'name',
  162. 'height',
  163. 'width',
  164. 'usemap',
  165. 'ismap',
  166. 'align',
  167. 'border',
  168. 'hspace',
  169. 'vspace'
  170. ),
  171. 'OBJECT' => array(
  172. '%attrs',
  173. 'declare',
  174. 'classid',
  175. 'codebase',
  176. 'data',
  177. 'type',
  178. 'codetype',
  179. 'archive',
  180. 'standby',
  181. 'height',
  182. 'width',
  183. 'usemap',
  184. 'name',
  185. 'tabindex',
  186. 'align',
  187. 'border',
  188. 'hspace',
  189. 'vspace'
  190. // ,
  191. // '%reserved'
  192. ),
  193. 'PARAM' => array(
  194. 'id',
  195. 'name',
  196. 'value',
  197. 'valuetype',
  198. 'type'
  199. ),
  200. 'APPLET' => array(
  201. '%coreattrs',
  202. 'codebase',
  203. 'archive',
  204. 'code',
  205. 'object',
  206. 'alt',
  207. 'name',
  208. 'width',
  209. 'height',
  210. 'align',
  211. 'hspace',
  212. 'vspace'
  213. ),
  214. 'HR' => array(
  215. '%attrs',
  216. 'align',
  217. 'noshade',
  218. 'size',
  219. 'width'
  220. ),
  221. 'P' => array(
  222. '%attrs',
  223. '%align'
  224. ),
  225. 'H1' => array(
  226. '%attrs',
  227. '%align'
  228. ),
  229. 'H2' => array(
  230. '%attrs',
  231. '%align'
  232. ),
  233. 'H3' => array(
  234. '%attrs',
  235. '%align'
  236. ),
  237. 'H4' => array(
  238. '%attrs',
  239. '%align'
  240. ),
  241. 'H5' => array(
  242. '%attrs',
  243. '%align'
  244. ),
  245. 'H6' => array(
  246. '%attrs',
  247. '%align'
  248. ),
  249. 'PRE' => array(
  250. '%attrs',
  251. 'width'
  252. ),
  253. 'Q' => array(
  254. '%attrs',
  255. 'cite'
  256. ),
  257. 'BLOCKQUOTE' => array(
  258. '%attrs',
  259. 'cite'
  260. ),
  261. 'INS' => array(
  262. '%attrs',
  263. 'cite',
  264. 'datetime'
  265. ),
  266. 'DEL' => array(
  267. '%attrs',
  268. 'cite',
  269. 'datetime'
  270. ),
  271. 'DL' => array(
  272. '%attrs',
  273. 'compact'
  274. ),
  275. 'DT' => array('%attrs'),
  276. 'DD' => array('%attrs'),
  277. 'OL' => array(
  278. '%attrs',
  279. 'type',
  280. 'compact',
  281. 'start'
  282. ),
  283. 'UL' => array(
  284. '%attrs',
  285. 'type',
  286. 'compact'
  287. ),
  288. 'DIR' => array(
  289. '%attrs',
  290. 'compact'
  291. ),
  292. 'MENU' => array(
  293. '%attrs',
  294. 'compact'
  295. ),
  296. 'LI' => array(
  297. '%attrs',
  298. 'type',
  299. 'value'
  300. ),
  301. 'FORM' => array(
  302. '%attrs',
  303. 'action',
  304. 'method',
  305. 'enctype',
  306. 'accept',
  307. 'name',
  308. 'onsubmit',
  309. 'onreset',
  310. 'target',
  311. 'accept-charset'
  312. ),
  313. 'LABEL' => array(
  314. '%attrs',
  315. 'for',
  316. 'accesskey',
  317. 'onfocus',
  318. 'onblur'
  319. ),
  320. 'INPUT' => array(
  321. '%attrs',
  322. 'type',
  323. 'name',
  324. 'value',
  325. 'checked',
  326. 'disabled',
  327. 'readonly',
  328. 'size',
  329. 'maxlength',
  330. 'src',
  331. 'alt',
  332. 'usemap',
  333. 'ismap',
  334. 'tabindex',
  335. 'accesskey',
  336. 'onfocus',
  337. 'onblur',
  338. 'onselect',
  339. 'onchange',
  340. 'accept',
  341. 'align'
  342. // ,
  343. // '%reserved'
  344. ),
  345. 'SELECT' => array(
  346. '%attrs',
  347. 'name',
  348. 'size',
  349. 'multiple',
  350. 'disabled',
  351. 'tabindex',
  352. 'onfocus',
  353. 'onblur',
  354. 'onchange'
  355. // ,
  356. // '%reserved'
  357. ),
  358. 'OPTGROUP' => array(
  359. '%attrs',
  360. 'disabled',
  361. 'label'
  362. ),
  363. 'OPTION' => array(
  364. '%attrs',
  365. 'selected',
  366. 'disabled',
  367. 'label',
  368. 'value'
  369. ),
  370. 'TEXTAREA' => array(
  371. '%attrs',
  372. 'name',
  373. 'rows',
  374. 'cols',
  375. 'disabled',
  376. 'readonly',
  377. 'tabindex',
  378. 'accesskey',
  379. 'onfocus',
  380. 'onblur',
  381. 'onselect',
  382. 'onchange'
  383. // ,
  384. // '%reserved'
  385. ),
  386. 'FIELDSET' => array('%attrs'),
  387. 'LEGEND' => array(
  388. '%attrs',
  389. 'accesskey',
  390. 'align'
  391. ),
  392. 'BUTTON' => array(
  393. '%attrs',
  394. 'name',
  395. 'value',
  396. 'type',
  397. 'disabled',
  398. 'tabindex',
  399. 'accesskey',
  400. 'onfocus',
  401. 'onblur'
  402. // ,
  403. // '%reserved'
  404. ),
  405. 'TABLE' => array(
  406. '%attrs',
  407. 'summary',
  408. 'width',
  409. 'border',
  410. 'frame',
  411. 'rules',
  412. 'cellspacing',
  413. 'cellpadding',
  414. 'align',
  415. 'bgcolor',
  416. // '%reserved',
  417. 'datapagesize'
  418. ),
  419. 'CAPTION' => array('%attrs', 'align'),
  420. 'COLGROUP' => array(
  421. '%attrs',
  422. 'span',
  423. 'width',
  424. '%cellhalign',
  425. '%cellvalign'
  426. ),
  427. 'COL' => array(
  428. '%attrs',
  429. 'span',
  430. 'width',
  431. '%cellhalign',
  432. '%cellvalign'
  433. ),
  434. 'THEAD' => array(
  435. '%attrs',
  436. '%cellhalign',
  437. '%cellvalign'
  438. ),
  439. 'TBODY' => array(
  440. '%attrs',
  441. '%cellhalign',
  442. '%cellvalign'
  443. ),
  444. 'TFOOT' => array(
  445. '%attrs',
  446. '%cellhalign',
  447. '%cellvalign'
  448. ),
  449. 'TR' => array(
  450. '%attrs',
  451. '%cellhalign',
  452. '%cellvalign',
  453. 'bgcolor'
  454. ),
  455. 'TH' => array(
  456. '%attrs',
  457. 'abbr',
  458. 'axis',
  459. 'headers',
  460. 'scope',
  461. 'rowspan',
  462. 'colspan',
  463. '%cellhalign',
  464. '%cellvalign',
  465. 'nowrap',
  466. 'bgcolor',
  467. 'width',
  468. 'height'
  469. ),
  470. 'TD' => array(
  471. '%attrs',
  472. 'abbr',
  473. 'axis',
  474. 'headers',
  475. 'scope',
  476. 'rowspan',
  477. 'colspan',
  478. '%cellhalign',
  479. '%cellvalign',
  480. 'nowrap',
  481. 'bgcolor',
  482. 'width',
  483. 'height'
  484. ),
  485. 'IFRAME' => array(
  486. '%coreattrs',
  487. 'longdesc',
  488. 'name',
  489. 'src',
  490. 'frameborder',
  491. 'marginwidth',
  492. 'marginheight',
  493. 'scrolling',
  494. 'align',
  495. 'height',
  496. 'width'
  497. ),
  498. 'NOFRAMES' => array('%attrs'),
  499. 'HEAD' => array(
  500. '%i18n',
  501. 'profile'
  502. ),
  503. 'TITLE' => array('%i18n'),
  504. 'BASE' => array(
  505. 'href',
  506. 'target'
  507. ),
  508. 'META' => array(
  509. '%i18n',
  510. 'http-equiv',
  511. 'name',
  512. 'content',
  513. 'scheme'
  514. ),
  515. 'STYLE' => array(
  516. '%i18n',
  517. 'type',
  518. 'media',
  519. 'title'
  520. ),
  521. 'SCRIPT' => array(
  522. 'charset',
  523. 'type',
  524. 'language',
  525. 'src',
  526. 'defer',
  527. 'event',
  528. 'for'
  529. ),
  530. 'NOSCRIPT' => array('%attrs'),
  531. 'HTML' => array('%i18n') // , '%version')
  532. );
  533. $aTags = array(
  534. '%heading' => array(
  535. 'H1',
  536. 'H2',
  537. 'H3',
  538. 'H4',
  539. 'H5',
  540. 'H6'
  541. ),
  542. '%list' => array(
  543. 'UL',
  544. 'OL',
  545. 'DIR',
  546. 'MENU'
  547. ),
  548. '%preformatted' => array('PRE'),
  549. '%fontstyle' => array(
  550. 'TT',
  551. 'I',
  552. 'B',
  553. 'U',
  554. 'S',
  555. 'STRIKE',
  556. 'BIG',
  557. 'SMALL'
  558. ),
  559. '%phrase' => array(
  560. 'EM',
  561. 'STRONG',
  562. 'DFN',
  563. 'CODE',
  564. 'SAMP',
  565. 'KBD',
  566. 'VAR',
  567. 'CITE',
  568. 'ABBR',
  569. 'ACRONYM'
  570. ),
  571. '%special' => array(
  572. 'A',
  573. 'IMG',
  574. 'APPLET',
  575. 'OBJECT',
  576. 'FONT',
  577. 'BASEFONT',
  578. 'BR',
  579. 'SCRIPT',
  580. 'MAP',
  581. 'Q',
  582. 'SUB',
  583. 'SUP',
  584. 'SPAN',
  585. 'BDO',
  586. 'IFRAME'
  587. ),
  588. '%formctrl' => array(
  589. 'INPUT',
  590. 'SELECT',
  591. 'TEXTAREA',
  592. 'LABEL',
  593. 'BUTTON'
  594. ),
  595. '%inline' => array(
  596. 'CDATA',
  597. '%fontstyle',
  598. '%phrase',
  599. '%special',
  600. '%formctrl'
  601. ),
  602. '%block' => array(
  603. 'P',
  604. '%heading',
  605. '%list',
  606. '%preformatted',
  607. 'DL',
  608. 'DIV',
  609. 'CENTER',
  610. 'NOSCRIPT',
  611. 'NOFRAMES',
  612. 'BLOCKQUOTE',
  613. 'INS',
  614. 'DEL',
  615. 'FORM',
  616. 'ISINDEX',
  617. 'HR',
  618. 'TABLE',
  619. 'FIELDSET',
  620. 'ADDRESS'
  621. ),
  622. '%flow' => array(
  623. '%block',
  624. '%inline'
  625. ),
  626. 'TT' => array('%inline'), // fontstyle
  627. 'I' => array('%inline'),
  628. 'B' => array('%inline'),
  629. 'U' => array('%inline'),
  630. 'S' => array('%inline'),
  631. 'STRIKE' => array('%inline'),
  632. 'BIG' => array('%inline'),
  633. 'SMALL' => array('%inline'),
  634. 'EM' => array('%inline'), // phrase
  635. 'STRONG' => array('%inline'),
  636. 'DFN' => array('%inline'),
  637. 'CODE' => array('%inline'),
  638. 'SAMP' => array('%inline'),
  639. 'KBD' => array('%inline'),
  640. 'VAR' => array('%inline'),
  641. 'CITE' => array('%inline'),
  642. 'ABBR' => array('%inline'),
  643. 'ACRONYM' => array('%inline'),
  644. 'SUB' => array('%inline'),
  645. 'SUP' => array('%inline'),
  646. 'SPAN' => array('%inline'),
  647. 'BDO' => array('%inline'),
  648. 'BASEFONT' => array(),
  649. 'FONT' => array('%inline'),
  650. 'BR' => array(),
  651. 'BODY' => array(
  652. '%flow',
  653. 'INS',
  654. 'DEL'
  655. ),
  656. 'ADDRESS' => array(
  657. '%inline',
  658. 'P'
  659. ),
  660. 'DIV' => array('%flow'),
  661. 'CENTER' => array('%flow'),
  662. 'A' => array('%inline'),
  663. 'MAP' => array(
  664. '%block',
  665. 'AREA'
  666. ),
  667. 'AREA' => array(),
  668. 'LINK' => array(),
  669. 'IMG' => array(),
  670. 'OBJECT' => array(
  671. 'PARAM',
  672. '%flow'
  673. ),
  674. 'PARAM' => array(),
  675. 'HR' => array(),
  676. 'P' => array('%inline'),
  677. 'H1' => array('%inline'),
  678. 'H2' => array('%inline'),
  679. 'H3' => array('%inline'),
  680. 'H4' => array('%inline'),
  681. 'H5' => array('%inline'),
  682. 'H6' => array('%inline'),
  683. 'PRE' => array('%inline'),
  684. 'Q' => array('%inline'),
  685. 'BLOCKQUOTE' => array('%flow'),
  686. 'INS' => array('%flow'),
  687. 'DEL' => array('%flow'),
  688. 'DL' => array(
  689. 'DT',
  690. 'DD'
  691. ),
  692. 'DT' => array('%inline'),
  693. 'DD' => array('%flow'),
  694. 'OL' => array('LI'),
  695. 'UL' => array('LI'),
  696. 'DIR' => array('LI'),
  697. 'MENU' => array('LI'),
  698. 'LI' => array('%flow'),
  699. 'FORM' => array('%flow'),
  700. 'LABEL' => array('%inline'),
  701. 'INPUT' => array(),
  702. 'SELECT' => array(
  703. 'OPTGROUP',
  704. 'OPTION'
  705. ),
  706. 'OPTGROUP' => array('OPTION'),
  707. 'OPTION' => array('CDATA'),
  708. 'TEXTAREA' => array('CDATA'),
  709. 'FIELDSET' => array(
  710. 'CDATA',
  711. 'LEGEND',
  712. '%flow'
  713. ),
  714. 'LEGEND' => array('%inline'),
  715. 'BUTTON' => array('%flow'),
  716. 'TABLE' => array(
  717. 'CAPTION',
  718. 'COL',
  719. 'COLGROUP',
  720. 'THEAD',
  721. 'TFOOT',
  722. 'TBODY'
  723. ),
  724. 'CAPTION' => array('%inline'),
  725. 'THEAD' => array('TR'),
  726. 'TFOOT' => array('TR'),
  727. 'TBODY' => array('TR'),
  728. 'COLGROUP' => array('COL'),
  729. 'COL' => array(),
  730. 'TR' => array(
  731. 'TH',
  732. 'TD'
  733. ),
  734. 'TH' => array('%flow'),
  735. 'TD' => array('%flow'),
  736. 'IFRAME' => array('%flow'),
  737. 'NOFRAMES' => array('%flow'),
  738. 'HEAD' => array(
  739. 'TITLE',
  740. 'BASE',
  741. 'SCRIPT',
  742. 'STYLE',
  743. 'META',
  744. 'LINK',
  745. 'OBJECT'
  746. ),
  747. 'TITLE' => array('CDATA'),
  748. 'META' => array(),
  749. 'STYLE' => array('CDATA'),
  750. 'SCRIPT' => array('CDATA'),
  751. 'NOSCRIPT' => array('%flow'),
  752. 'BASE' => array(),
  753. 'HTML' => array(
  754. 'HEAD',
  755. 'BODY'
  756. ),
  757. 'DOCUMENT' => array(
  758. 'DOCTYPE',
  759. 'HTML'
  760. )
  761. );
  762. $aExclusions = array(
  763. 'A' => array('A'),
  764. 'PRE' => array(
  765. 'IMG',
  766. 'OBJECT',
  767. 'APPLET',
  768. 'BIG',
  769. 'SMALL',
  770. 'SUB',
  771. 'SUP',
  772. 'FONT',
  773. 'BASEFONT'
  774. ),
  775. 'DIR' => array('%block'),
  776. 'MENU' => array('%block'),
  777. 'FORM' => array('FORM'),
  778. 'LABEL' => array('LABEL'),
  779. 'BUTTON' => array(
  780. 'A',
  781. '%formctrl',
  782. 'FORM',
  783. 'ISINDEX',
  784. 'FIELDSET',
  785. 'IFRAME'
  786. )
  787. );
  788. $aRequiredAttributes = array(
  789. 'style' => array('type'),
  790. 'script' => array('type'),
  791. 'meta' => array('content'),
  792. 'optgroup' => array('label'),
  793. 'textarea' => array('rows', 'cols'),
  794. 'img' => array('src', 'alt')
  795. );
  796. class clsValidator
  797. {
  798. var $aTags;
  799. var $aAttributes;
  800. var $aRequiredAttributes;
  801. function clsValidator()
  802. {
  803. global $aTags;
  804. global $aAttributes;
  805. global $aRequiredAttributes;
  806. $this->aTags = array();
  807. $this->aAttributes = array();
  808. $this->aRequiredAttributes = array();
  809. foreach (array_keys($aTags) as $sTag)
  810. {
  811. $this->aTags[$sTag] = array();
  812. $this->_expand($this->aTags[$sTag], $aTags[$sTag], $aTags);
  813. }
  814. foreach (array_keys($aAttributes) as $sAttribute)
  815. {
  816. $this->aAttributes[$sAttribute] = array();
  817. $this->_expand($this->aAttributes[$sAttribute], $aAttributes[$sAttribute], $aAttributes);
  818. }
  819. foreach (array_keys($aRequiredAttributes) as $sElement)
  820. {
  821. $this->aRequiredAttributes[$sElement] = array();
  822. $this->_expand($this->aRequiredAttributes[$sElement], $aRequiredAttributes[$sElement], $aRequiredAttributes);
  823. }
  824. }
  825. function &getInstance()
  826. {
  827. static $obj;
  828. if (!$obj) {
  829. $obj = new clsValidator();
  830. }
  831. return $obj;
  832. }
  833. function _expand(&$aDestination, &$aSource, &$aDictionary)
  834. {
  835. foreach ($aSource as $sChild)
  836. {
  837. if ('%' == substr($sChild, 0, 1)) {
  838. $this->_expand($aDestination, $aDictionary[$sChild], $aDictionary);
  839. } else
  840. $aDestination[] = $sChild;
  841. }
  842. }
  843. function elementValid($sElement)
  844. {
  845. return isset($this->aTags[strtoupper($sElement)]);
  846. }
  847. function attributeValid($sElement, $sAttribute)
  848. {
  849. if (false == isset($this->aAttributes[strtoupper($sElement)]))
  850. return false;
  851. return in_array(strtolower($sAttribute), $this->aAttributes[strtoupper($sElement)]);
  852. }
  853. function childValid($sParent, $sElement)
  854. {
  855. if (false == isset($this->aTags[strtoupper($sParent)]))
  856. return false;
  857. return in_array(strtoupper($sElement), $this->aTags[strtoupper($sParent)]);
  858. }
  859. // verify that required attributes have been specified
  860. function checkRequiredAttributes($sElement, &$aAttributes, &$sMissing)
  861. {
  862. if (isset($this->aRequiredAttributes[strtolower($sElement)]))
  863. foreach ($this->aRequiredAttributes[strtolower($sElement)] as $sRequiredAttribute)
  864. if (false == isset($aAttributes[$sRequiredAttribute]))
  865. {
  866. $sMissing = $sRequiredAttribute;
  867. return false;
  868. }
  869. return true;
  870. }
  871. }