html.js 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. /* Copyright (c) Business Objects 2006. All rights reserved. */
  2. if (typeof(bobj.html) == 'undefined') {
  3. bobj.html = {};
  4. }
  5. bobj.html.openTag = function(tag, atts) {
  6. var html = '<' + tag;
  7. for (var i in atts) {
  8. if (i in Object.prototype) { continue; } // in case Object was extended
  9. html += ' ' + i + '="';
  10. var value = atts[i];
  11. if (bobj.isArray(value)) {
  12. value = value.join(' ');
  13. }
  14. else if (bobj.isObject(value)) {
  15. // create a string of the form "foo:bar;baz:garply"
  16. var stringValue = ""
  17. for (var k in value) {
  18. if (k in Object.prototype) { continue; }
  19. stringValue += k + ':' + value[k] + ';';
  20. }
  21. value = stringValue;
  22. }
  23. html += value + '"';
  24. }
  25. return html + '>'
  26. };
  27. bobj.html.closeTag = function(tag) {
  28. return '</' + tag + '>';
  29. };
  30. bobj.html.createHtml = function(tag, atts, innerHtml /*, innerHtml...*/) {
  31. var html = bobj.html.openTag(tag, atts);
  32. for (var i = 2; i < arguments.length; ++i) {
  33. html += arguments[i];
  34. }
  35. html += bobj.html.closeTag(tag);
  36. return html;
  37. };
  38. bobj.html.TABLE = MochiKit.Base.partial(bobj.html.createHtml, 'table');
  39. bobj.html.UL = MochiKit.Base.partial(bobj.html.createHtml, "ul");
  40. bobj.html.OL = MochiKit.Base.partial(bobj.html.createHtml, "ol");
  41. bobj.html.LI = MochiKit.Base.partial(bobj.html.createHtml, "li");
  42. bobj.html.TD = MochiKit.Base.partial(bobj.html.createHtml, "td");
  43. bobj.html.TR = MochiKit.Base.partial(bobj.html.createHtml, "tr");
  44. bobj.html.TBODY = MochiKit.Base.partial(bobj.html.createHtml, "tbody");
  45. bobj.html.THEAD = MochiKit.Base.partial(bobj.html.createHtml, "thead");
  46. bobj.html.TFOOT = MochiKit.Base.partial(bobj.html.createHtml, "tfoot");
  47. bobj.html.TABLE = MochiKit.Base.partial(bobj.html.createHtml, "table");
  48. bobj.html.TH = MochiKit.Base.partial(bobj.html.createHtml, "th");
  49. bobj.html.INPUT = MochiKit.Base.partial(bobj.html.createHtml, "input");
  50. bobj.html.SPAN = MochiKit.Base.partial(bobj.html.createHtml, "span");
  51. bobj.html.A = MochiKit.Base.partial(bobj.html.createHtml, "a");
  52. bobj.html.DIV = MochiKit.Base.partial(bobj.html.createHtml, "div");
  53. bobj.html.IMG = MochiKit.Base.partial(bobj.html.createHtml, "img");
  54. bobj.html.BUTTON = MochiKit.Base.partial(bobj.html.createHtml, "button");
  55. bobj.html.TT = MochiKit.Base.partial(bobj.html.createHtml, "tt");
  56. bobj.html.PRE = MochiKit.Base.partial(bobj.html.createHtml, "pre");
  57. bobj.html.H1 = MochiKit.Base.partial(bobj.html.createHtml, "h1");
  58. bobj.html.H2 = MochiKit.Base.partial(bobj.html.createHtml, "h2");
  59. bobj.html.H3 = MochiKit.Base.partial(bobj.html.createHtml, "h3");
  60. bobj.html.BR = MochiKit.Base.partial(bobj.html.createHtml, "br");
  61. bobj.html.HR = MochiKit.Base.partial(bobj.html.createHtml, "hr");
  62. bobj.html.LABEL = MochiKit.Base.partial(bobj.html.createHtml, "label");
  63. bobj.html.TEXTAREA = MochiKit.Base.partial(bobj.html.createHtml, "textarea");
  64. bobj.html.FORM = MochiKit.Base.partial(bobj.html.createHtml, "form");
  65. bobj.html.P = MochiKit.Base.partial(bobj.html.createHtml, "p");
  66. bobj.html.SELECT = MochiKit.Base.partial(bobj.html.createHtml, "select");
  67. bobj.html.OPTION = MochiKit.Base.partial(bobj.html.createHtml, "option");
  68. bobj.html.OPTGROUP = MochiKit.Base.partial(bobj.html.createHtml, "optgroup");
  69. bobj.html.LEGEND = MochiKit.Base.partial(bobj.html.createHtml, "legend");
  70. bobj.html.FIELDSET = MochiKit.Base.partial(bobj.html.createHtml, "fieldset");
  71. bobj.html.STRONG = MochiKit.Base.partial(bobj.html.createHtml, "strong");
  72. bobj.html.CANVAS = MochiKit.Base.partial(bobj.html.createHtml, "canvas");
  73. bobj.html.IFRAME = MochiKit.Base.partial(bobj.html.createHtml, "iframe");
  74. bobj.html.SCRIPT = MochiKit.Base.partial(bobj.html.createHtml, "script");
  75. /**
  76. * Extract scripts from an html fragment.
  77. *
  78. * @param html [String] html fragment
  79. *
  80. * @return [Object] Returns an object with a list of scripts and html without
  81. * scripts
  82. * i.e. {scripts: [{src:[String], text:[String]},...], html:[String]}
  83. */
  84. bobj.html.extractScripts = function(html) {
  85. // Match script tags with or without closing tags
  86. // 1 - Attributes of tag that doesn't have closing tag (e.g. <script/>)
  87. // 2 - Attributes of tag that has closing tag
  88. // 3 - Script text
  89. // 1 2 3
  90. var regexpScript = /(?:<script([^>]*)\/>|<script([^>]*)>([\s\S]*?)<\/script>)/i;
  91. // Match src attributes
  92. // 1 - URI
  93. // 1
  94. var regexpSrc = /src=\"([^\"]*)\"/i;
  95. var scripts = [];
  96. var match = null;
  97. while(match = regexpScript.exec(html)) {
  98. var script = {src: null, text: null};
  99. var attributes = match[1] || match[2];
  100. if (attributes = regexpSrc.exec(attributes)) {
  101. script.src = attributes[1];
  102. }
  103. if (match[3]) {
  104. script.text = match[3];
  105. }
  106. scripts.push(script);
  107. html = bobj.extractRange(html, match.index, match.index + match[0].length);
  108. }
  109. return {scripts: scripts, html: html};
  110. }
  111. /**
  112. * Extract scripts and css links from a html fragment.
  113. *
  114. * @param html [String] html fragment
  115. *
  116. * @return [Object] Returns an object with a list of scripts, css links and html
  117. * i.e. {scripts: [{src:[String], text:[String]},...], html:[String], links: [String,...]}
  118. */
  119. bobj.html.extractHtml = function(html) {
  120. var extScripts = bobj.html.extractScripts(html);
  121. var extLinks = bobj.html.extractLinks(extScripts.html);
  122. var extStyles = bobj.html.extractStyles(extLinks.html);
  123. return {scripts: extScripts.scripts, html : extStyles.html, links : extLinks.links, styles: extStyles.styles};
  124. }
  125. /**
  126. * Extract css links from a html fragment.
  127. *
  128. * @param html [String] html fragment
  129. *
  130. * @return [Object] Returns an object with a list of links and html without
  131. * links
  132. * i.e. {links: [String,...], html:[String]}
  133. */
  134. bobj.html.extractLinks = function(html) {
  135. var regexpLink = /<link([^>]*)>/i;
  136. var regexpHref = /href=\"([^\"]*)\"/i;
  137. var links = [];
  138. var match = null;
  139. while(match = regexpLink.exec(html)) {
  140. // match = "<link href='' \>
  141. var href = regexpHref.exec(match);
  142. if(href && href.length > 0) {
  143. links.push(href[1]);
  144. }
  145. html = bobj.extractRange(html, match.index, match.index + match[0].length);
  146. }
  147. return {links: links, html: html};
  148. }
  149. /**
  150. * Extract <style> tags from an html fragment.
  151. * Note - links to external style sheets are not currently extracted
  152. *
  153. * @param html [String] html fragment
  154. *
  155. * @return [Object] Returns an object with a list of styles and html without
  156. * styles
  157. * i.e. {styles: [{text:[String], type:[String], media:[String]},...], html:[String]}
  158. */
  159. bobj.html.extractStyles = function(html) {
  160. // Match style tags
  161. // 1 - Attributes
  162. // 2 - CSS text
  163. // 1 2
  164. var regexpStyle = /<style([^>]*)>([\s\S]*?)<\/style>/i;
  165. var regexpType = /type=\"([^\"]*)\"/i;
  166. var regexpMedia = /media=\"([^\"]*)\"/i;
  167. var styles = [];
  168. var match = null;
  169. while(match = regexpStyle.exec(html)) {
  170. var style = {media: null, type: null, text: match[2]};
  171. var matchType = regexpType.exec(match[1]);
  172. if (matchType) {
  173. style.type = matchType[1];
  174. }
  175. var matchMedia = regexpMedia.exec(match[1]);
  176. if (matchMedia) {
  177. style.media = matchMedia[1];
  178. }
  179. styles.push(style);
  180. html = bobj.extractRange(html, match.index, match.index + match[0].length);
  181. }
  182. return {styles: styles, html: html};
  183. }