DOMSyntaxHighlighter.js 3.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. /*
  2. * Copyright (C) 2010 Google Inc. All rights reserved.
  3. *
  4. * Redistribution and use in source and binary forms, with or without
  5. * modification, are permitted provided that the following conditions are
  6. * met:
  7. *
  8. * * Redistributions of source code must retain the above copyright
  9. * notice, this list of conditions and the following disclaimer.
  10. * * Redistributions in binary form must reproduce the above
  11. * copyright notice, this list of conditions and the following disclaimer
  12. * in the documentation and/or other materials provided with the
  13. * distribution.
  14. * * Neither the name of Google Inc. nor the names of its
  15. * contributors may be used to endorse or promote products derived from
  16. * this software without specific prior written permission.
  17. *
  18. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  19. * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  20. * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  21. * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  22. * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  23. * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  24. * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  25. * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  26. * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  27. * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  28. * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  29. */
  30. /**
  31. * @constructor
  32. */
  33. WebInspector.DOMSyntaxHighlighter = function(mimeType, stripExtraWhitespace)
  34. {
  35. this._tokenizer = WebInspector.SourceTokenizer.Registry.getInstance().getTokenizer(mimeType);
  36. this._stripExtraWhitespace = stripExtraWhitespace;
  37. }
  38. WebInspector.DOMSyntaxHighlighter.prototype = {
  39. createSpan: function(content, className)
  40. {
  41. var span = document.createElement("span");
  42. span.className = "webkit-" + className;
  43. if (this._stripExtraWhitespace && className !== "whitespace")
  44. content = content.replace(/^[\n\r]*/, "").replace(/\s*$/, "");
  45. span.appendChild(document.createTextNode(content));
  46. return span;
  47. },
  48. syntaxHighlightNode: function(node)
  49. {
  50. this._tokenizer.condition = this._tokenizer.createInitialCondition();
  51. var lines = node.textContent.split("\n");
  52. node.removeChildren();
  53. for (var i = lines[0].length ? 0 : 1; i < lines.length; ++i) {
  54. var line = lines[i];
  55. var plainTextStart = 0;
  56. this._tokenizer.line = line;
  57. var column = 0;
  58. do {
  59. var newColumn = this._tokenizer.nextToken(column);
  60. var tokenType = this._tokenizer.tokenType;
  61. if (tokenType) {
  62. if (column > plainTextStart) {
  63. var plainText = line.substring(plainTextStart, column);
  64. node.appendChild(document.createTextNode(plainText));
  65. }
  66. var token = line.substring(column, newColumn);
  67. node.appendChild(this.createSpan(token, tokenType));
  68. plainTextStart = newColumn;
  69. }
  70. column = newColumn;
  71. } while (column < line.length)
  72. if (plainTextStart < line.length) {
  73. var plainText = line.substring(plainTextStart, line.length);
  74. node.appendChild(document.createTextNode(plainText));
  75. }
  76. if (i < lines.length - 1)
  77. node.appendChild(document.createElement("br"));
  78. }
  79. }
  80. }