browserconsole.pas 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. unit browserconsole;
  2. {$mode objfpc}
  3. interface
  4. uses
  5. js,web;
  6. Const
  7. DefaultMaxConsoleLines = 25;
  8. DefaultConsoleStyle = '.pasconsole { '+sLineBreak+
  9. 'font-family: courier;'+sLineBreak+
  10. 'font-size: 14px;'+sLineBreak+
  11. 'background: #FFFFFF;'+sLineBreak+
  12. 'color: #000000;'+sLineBreak+
  13. 'display: block;'+sLineBreak+
  14. '}';
  15. DefaultCRTConsoleStyle = '.pasconsole { '+sLineBreak+
  16. 'font-family: courier;'+sLineBreak+
  17. 'font-size: 14px;'+sLineBreak+
  18. 'background: #000;'+sLineBreak+
  19. 'color: #14fdce;'+sLineBreak+
  20. 'display: block;'+sLineBreak+
  21. '}';
  22. Var
  23. // Element ID for console output. If this is not set, body is used.
  24. // If you cange this, call HookConsole.
  25. ConsoleElementID : String;
  26. // Style to use for console lines. If you change this, call initconsole
  27. ConsoleStyle : String;
  28. // Style to use for console lines. You can change this at any time.
  29. MaxConsoleLines : Integer;
  30. // Copy console lines on newline to browser console log
  31. ConsoleLinesToBrowserLog : Boolean;
  32. // Clear console content
  33. Procedure ResetConsole;
  34. // Re-initialize console (style)
  35. Procedure InitConsole;
  36. // Re-hook console
  37. Procedure HookConsole;
  38. implementation
  39. Var
  40. LastLine,
  41. StyleElement,
  42. LinesParent,
  43. ConsoleElement : TJSElement;
  44. Procedure AppendLine;
  45. Var
  46. CurrentCount : Integer;
  47. S : TJSNode;
  48. begin
  49. CurrentCount:=0;
  50. S:=LinesParent.firstChild;
  51. While Assigned(S) do
  52. begin
  53. Inc(CurrentCount);
  54. S:=S.nextSibling;
  55. end;
  56. While CurrentCount>MaxConsoleLines do
  57. begin
  58. Dec(CurrentCount);
  59. LinesParent.removeChild(LinesParent.firstChild);
  60. end;
  61. LastLine:=Document.createElement('div');
  62. LastLine.className:='pasconsole';
  63. LinesParent.AppendChild(LastLine);
  64. end;
  65. Procedure WriteConsole(S : JSValue; NewLine : Boolean);
  66. Var
  67. CL: String;
  68. begin
  69. // Maybe add some way to limit line length
  70. CL:=LastLine.InnerText;
  71. CL:=CL+String(S);
  72. LastLine.InnerText:=CL;
  73. if NewLine then
  74. begin
  75. if ConsoleLinesToBrowserLog then
  76. console.log(CL);
  77. AppendLine;
  78. end;
  79. end;
  80. Procedure ResetConsole;
  81. begin
  82. if LinesParent=Nil then exit;
  83. While LinesParent.firstElementChild<>Nil do
  84. LinesParent.removeChild(LinesParent.firstElementChild);
  85. AppendLine;
  86. end;
  87. Procedure InitConsole;
  88. begin
  89. if ConsoleElement=Nil then
  90. exit;
  91. if (TJSString(ConsoleElement.nodeName).toLowerCase<>'body') then
  92. begin
  93. While ConsoleElement.firstElementChild<>Nil do
  94. ConsoleElement.removeChild(ConsoleElement.firstElementChild);
  95. end;
  96. StyleElement:=Document.createElement('style');
  97. StyleElement.innerText:=ConsoleStyle;
  98. ConsoleElement.appendChild(StyleElement);
  99. LinesParent:=Document.createElement('div');
  100. ConsoleElement.appendChild(LinesParent);
  101. end;
  102. Procedure HookConsole;
  103. begin
  104. ConsoleElement:=Nil;
  105. if (ConsoleElementID<>'') then
  106. ConsoleElement:=document.getElementById(ConsoleElementID);
  107. if (ConsoleElement=Nil) then
  108. ConsoleElement:=document.body;
  109. if ConsoleElement=Nil then
  110. exit;
  111. InitConsole;
  112. ResetConsole;
  113. SetWriteCallBack(@WriteConsole);
  114. end;
  115. initialization
  116. ConsoleLinesToBrowserLog:=True;
  117. ConsoleElementID:='pasjsconsole';
  118. ConsoleStyle:=DefaultConsoleStyle;
  119. MaxConsoleLines:=DefaultMaxConsoleLines;
  120. HookConsole;
  121. end.