You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

596 lines
30 KiB

6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
5 years ago
5 years ago
6 years ago
5 years ago
6 years ago
6 years ago
6 years ago
6 years ago
5 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
  1. <html>
  2. <head>
  3. <meta charset="UTF-8">
  4. <title>VHDL Beautifier, Formatter Online</title>
  5. <link rel="stylesheet" href="style.css" />
  6. <link href="highlight.css" rel="stylesheet" />
  7. <script src="highlight.js"></script>
  8. <script>
  9. function selectText(element) {
  10. var doc = document,
  11. text = element,
  12. range, selection;
  13. if (doc.body.createTextRange) { //ms
  14. range = doc.body.createTextRange();
  15. range.moveToElementText(text);
  16. range.select();
  17. } else if (window.getSelection) { //all others
  18. selection = window.getSelection();
  19. range = doc.createRange();
  20. range.selectNodeContents(text);
  21. selection.removeAllRanges();
  22. selection.addRange(range);
  23. }
  24. }
  25. </script>
  26. </head>
  27. <body>
  28. <div class="content">
  29. <div class="top-bar">
  30. <div class="container">
  31. <h2>VHDL Beautifier, Formatter</h2>
  32. <ul>
  33. <li>
  34. <div class="tooltip emoji top-button" onclick="showInfo();">&#x2139;
  35. <span class="tooltiptext">Beautify and format your VHDL code online</span>
  36. </div>
  37. <div id="info" class="modal">
  38. <div class="modal-content">
  39. <span id="close-info" class="close">&times;</span>
  40. <p>Beautify and format your VHDL code online</p>
  41. </div>
  42. </div>
  43. </li>
  44. <li>
  45. <div class="tooltip emoji top-button" onclick="showWarning();">&#x26A0;
  46. <span class="tooltiptext">Please make a backup before you replace your code!</span>
  47. </div>
  48. <div id="warning" class="modal">
  49. <div class="modal-content">
  50. <span id="close-warning" class="close">&times;</span>
  51. <p>Please make a backup before you replace your code!</p>
  52. </div>
  53. </div>
  54. </li>
  55. <li>
  56. <div class="tooltip emoji top-button" onclick="showHappy();">&#x1F638;
  57. <span class="tooltiptext">Proper formatting makes code easier to read and understand.</span>
  58. </div>
  59. <div id="happy" class="modal">
  60. <div class="modal-content">
  61. <span id="close-happy" class="close">&times;</span>
  62. <p>Proper formatting makes code easier to read and understand.</p>
  63. </div>
  64. </div>
  65. </li>
  66. <li>
  67. <a class="top-button" href="https://github.com/g2384/VHDLFormatter/issues/new" target="_blank">Report
  68. <span class="inline-emoji">&#x1f41e;</span> bug</a>
  69. </li>
  70. <li>
  71. <a class="top-button" href="https://github.com/g2384/VHDLFormatter">Source code</a>
  72. </li>
  73. </ul>
  74. </div>
  75. </div>
  76. <textarea id="in" rows="10" wrap="off"></textarea>
  77. <br>
  78. <div class="setting-field">
  79. <div class="checkbox">
  80. <input type="checkbox" id="no_format" onclick="noFormat()">
  81. <label for="no_format">Only highlight, don't format</label>
  82. </div>
  83. <form id="keyword_div">Keyword case:
  84. <label>
  85. <input type="radio" name="keywordcase" value="UpperCase" checked="checked">UPPERCASE</label> |
  86. <label>
  87. <input type="radio" name="keywordcase" value="LowerCase">lowercase</label> |
  88. <label>
  89. <input type="radio" name="keywordcase" value="DefaultCase">Default</label>
  90. <div class="inline-note">
  91. e.g. begin, case, when
  92. </div>
  93. </form>
  94. <form id="typename_div">Type name case:
  95. <label>
  96. <input type="radio" name="typenamecase" value="UpperCase" checked="checked">UPPERCASE</label> |
  97. <label>
  98. <input type="radio" name="typenamecase" value="LowerCase">lowercase</label> |
  99. <label>
  100. <input type="radio" name="typenamecase" value="DefaultCase">Default</label>
  101. <div class="inline-note">
  102. e.g. boolean, natural, string
  103. </div>
  104. </form>
  105. <div class="hide" id="settings_div">
  106. <fieldset id="new_line_after_div" style="text-align: right;">
  107. <legend>New line after</legend>
  108. <form id="new_line_after_then">
  109. <span class="code">THEN</span>
  110. <label>
  111. <input type="radio" name="new_line_after_thencase" value="NewLine" checked="checked">New Line</label>
  112. <label>
  113. <input type="radio" name="new_line_after_thencase" value="NoNewLine">No New Line</label>
  114. <label>
  115. <input type="radio" name="new_line_after_thencase" value="None">None</label>
  116. </form>
  117. <form id="new_line_after_semicolon">
  118. <span class="code">semicolon ";"</span>
  119. <label>
  120. <input type="radio" name="new_line_after_semicoloncase" value="NewLine" checked="checked">New Line</label>
  121. <label>
  122. <input type="radio" name="new_line_after_semicoloncase" value="NoNewLine">No New Line</label>
  123. <label>
  124. <input type="radio" name="new_line_after_semicoloncase" value="None">None</label>
  125. </form>
  126. <form id="new_line_after_else">
  127. <span class="code">ELSE</span>
  128. <label>
  129. <input type="radio" name="new_line_after_elsecase" value="NewLine">New Line</label>
  130. <label>
  131. <input type="radio" name="new_line_after_elsecase" value="NoNewLine">No New Line</label>
  132. <label>
  133. <input type="radio" name="new_line_after_elsecase" value="None" checked="checked">None</label>
  134. </form>
  135. <form id="new_line_after_port">
  136. <span class="code">PORT | PORT MAP</span>
  137. <label>
  138. <input type="radio" name="new_line_after_portcase" value="NewLine">New Line</label>
  139. <label>
  140. <input type="radio" name="new_line_after_portcase" value="NoNewLine">No New Line</label>
  141. <label>
  142. <input type="radio" name="new_line_after_portcase" value="None" checked="checked">None</label>
  143. </form>
  144. <form id="new_line_after_generic">
  145. <span class="code">GENERIC</span>
  146. <label>
  147. <input type="radio" name="new_line_after_genericcase" value="NewLine">New Line</label>
  148. <label>
  149. <input type="radio" name="new_line_after_genericcase" value="NoNewLine">No New Line</label>
  150. <label>
  151. <input type="radio" name="new_line_after_genericcase" value="None" checked="checked">None</label>
  152. </form>
  153. </fieldset>
  154. <div class="checkbox inline" id="remove_comments_div">
  155. <input type="checkbox" id="remove_comments">
  156. <label for="remove_comments">Remove commments</label> |
  157. </div>
  158. <div class="checkbox inline" id="remove_lines_div">
  159. <input type="checkbox" id="remove_lines">
  160. <label for="remove_lines">Remove blank lines</label> |
  161. </div>
  162. <div class="checkbox inline" id="remove_report_div">
  163. <input type="checkbox" id="remove_report">
  164. <label for="remove_report">Remove REPORT</label>
  165. </div>
  166. <br>
  167. <div class="checkbox" id="check_alias_div">
  168. <input type="checkbox" id="check_alias">
  169. <label for="check_alias">Check ALIAS (all long names will be replaced by ALIAS names)</label>
  170. </div>
  171. <fieldset id="align_settings_div">
  172. <legend>Sign Alignment</legend>
  173. <div id="sign_align_in_div">
  174. Align signs in
  175. <div class="checkbox inline" id="sign_align_port_div">
  176. <input type="checkbox" id="sign_align_port" onclick="alignAllSigns(false);">
  177. <label for="sign_align_port" class="code">PORT()</label>
  178. </div>
  179. <div class="checkbox inline" id="sign_align_generic_div">
  180. <input type="checkbox" id="sign_align_generic" onclick="alignAllSigns(false);">
  181. <label for="sign_align_generic" class="code">GENERIC()</label></div>
  182. <div class="checkbox inline" id="sign_align_procedure_div">
  183. <input type="checkbox" id="sign_align_procedure" onclick="alignAllSigns(false);">
  184. <label for="sign_align_procedure" class="code">PROCEDURE()</label>
  185. </div>
  186. <div class="checkbox inline" id="sign_align_function_div">
  187. <input type="checkbox" id="sign_align_function" onclick="alignAllSigns(false);">
  188. <label for="sign_align_function" class="code">FUNCTION()</label>
  189. </div>
  190. </div>
  191. <div class="checkbox inline" id="sign_align_all_div">
  192. <input type="checkbox" id="sign_align_all" onclick="alignAllSigns(true);">
  193. <label for="sign_align_all">Align signs in all places</label>
  194. </div>
  195. <form class="inline" id="sign_align_mode_div">
  196. <span> | Mode: </span>
  197. <label>
  198. <input type="radio" name="sign_align_modecase" value="local">Local</label>
  199. <label>
  200. <input type="radio" name="sign_align_modecase" value="global">Global</label>
  201. </form>
  202. <div>
  203. <div class="checkbox inline" id="align_comments_div">
  204. <input type="checkbox" id="align_comments">
  205. <label for="align_comments">Align comments</label>
  206. </div>
  207. </div>
  208. </fieldset>
  209. <div id="customise_indentation_div">
  210. <div class="checkbox inline" id="use_space_div">
  211. <input type="checkbox" id="use_space">
  212. <label for="use_space">Customise Indentation: </label>
  213. </div>(tab is \t)
  214. <input type="text" id="customise_indentation" size="8" onKeyUp="counterDecode('customise_indentation', 'indent_s')" value=" " /> (
  215. <span id="indent_s">four blankspaces</span>)
  216. </div>
  217. <div id="cust_eol_div">
  218. End of line:
  219. <input type="text" id="cust_eol" size="8" onKeyUp="counterDecode('cust_eol', 'eol_s')" value="\r\n" /> (
  220. <span id="eol_s">one \r & one \n</span>)
  221. </div>
  222. <div id="customise_extraEOL_div">
  223. <div class="checkbox inline" id="add_extraEOL_div">
  224. <input type="checkbox" id="add_extraEOL" checked=true>
  225. <label for="add_extraEOL">Add a new line at the end of file</label>
  226. </div>
  227. </div>
  228. <div class="checkbox" id="compress_div">
  229. <input type="checkbox" id="compress">
  230. <label for="compress">! EVIL - compress VHDL (\r\n, comments will be removed)</label>
  231. </div>
  232. <div class="checkbox" id="mix_letter_div">
  233. <input type="checkbox" id="mix_letter">
  234. <label for="mix_letter">! EVIL - unreadable (mix upper/lower-case letters)</label>
  235. </div>
  236. </div>
  237. </div>
  238. <div>
  239. <a id="settings_control" onclick="showHideSettings();">Show More Settings ▼</a>
  240. <a onclick="outputSetting()">Output Settings</a>
  241. </div>
  242. <input type="button" class="btn" onclick="f()" value="Start" />
  243. <span class="show">
  244. <input type="button" class="btn " id="selectAll" value="Select All" onclick="selectText(document.getElementById('vhdl'))" />
  245. <div class="checkbox inline">
  246. <input type="checkbox" onclick="wordWrap()" id="word_wrap">
  247. <label for="word_wrap">Word wrap</label>
  248. </div>
  249. </span>
  250. <br>
  251. <pre id="result"><code class="vhdl" id="vhdl">
  252. <font style="background-color:#9D9D9D; color:#fff"> output sample </font>
  253. <span class="hljs-keyword">LIBRARY</span> IEEE; <span class="hljs-comment">-- declare the library</span>
  254. <span class="hljs-keyword">USE</span> IEEE.std_logic_1164.<span class="hljs-keyword">ALL</span>;
  255. <span class="hljs-keyword">USE</span> IEEE.std_logic_arith.<span class="hljs-keyword">ALL</span>;
  256. <font style="background-color:#9D9D9D; color:#fff"> (All reserved words are in capital) </font>
  257. <font style="background-color:#9D9D9D; color:#fff"> (All indents are in the right place) </font>
  258. <span class="hljs-comment">---------------------------------------------------------------</span>
  259. <span class="hljs-keyword">ENTITY</span> example <span class="hljs-keyword">IS</span>
  260. <span class="hljs-keyword">PORT</span> (
  261. rst : <span class="hljs-keyword">IN</span> <span class="hljs-typename">std_logic</span>;
  262. clk : <span class="hljs-keyword">IN</span> <span class="hljs-typename">std_logic</span>;
  263. example_of_long_words : <span class="hljs-keyword">OUT</span> <span class="hljs-typename">std_logic_vector</span>(<span class="hljs-number">3</span> <span class="hljs-keyword">DOWNTO</span> <span class="hljs-number">0</span>)
  264. <font style="background-color:#9D9D9D; color:#fff"> (<strong>Align signs in PORT()</strong> aligns these colons) </font>
  265. );
  266. <span class="hljs-keyword">END</span> example;
  267. <span class="hljs-keyword">ARCHITECTURE</span> EXA <span class="hljs-keyword">OF</span> example <span class="hljs-keyword">IS</span>
  268. <span class="hljs-keyword">ALIAS</span> slv <span class="hljs-keyword">IS</span> <span class="hljs-typename">std_logic_vector</span>;
  269. <span class="hljs-keyword">SUBTYPE</span> bit4 <span class="hljs-keyword">IS</span> slv(<span class="hljs-number">3</span> <span class="hljs-keyword">DOWNTO</span> <span class="hljs-number">0</span>); <font style="background-color:#9D9D9D; color:#fff"> (<strong>Check ALIAS</strong> replaces all "<strong>std_logic_vector</strong>" with "<strong>slv</strong>") </font>
  270. <span class="hljs-keyword">BEGIN</span>
  271. <del><span class="hljs-keyword">REPORT</span> <span class="hljs-string">"Hello World"</span></del>; <font style="background-color:#9D9D9D; color:#fff"> (Remove REPORT) </font>
  272. stages : <span class="hljs-keyword">PROCESS</span> (rst, clk)
  273. <span class="hljs-keyword">BEGIN</span>
  274. <span class="hljs-keyword">IF</span> (rst = <span class="hljs-literal">'0'</span>) <span class="hljs-keyword">THEN</span>
  275. <span class="hljs-keyword">CASE</span> bit4 <span class="hljs-keyword">IS</span>
  276. <span class="hljs-keyword">WHEN</span> <span class="hljs-string">"0000"</span> =&gt; bit4 &lt;= <span class="hljs-string">"0001"</span>;
  277. <span class="hljs-keyword">WHEN</span> <span class="hljs-string">"0001"</span> =&gt; bit4 &lt;= <span class="hljs-string">"0100"</span>;
  278. <span class="hljs-keyword">WHEN</span> <span class="hljs-string">"0010"</span> =&gt; bit4 &lt;= <span class="hljs-string">"0010"</span>;
  279. <span class="hljs-keyword">WHEN</span> <span class="hljs-string">"0100"</span> =&gt; bit4 &lt;= <span class="hljs-string">"0000"</span>;
  280. <span class="hljs-keyword">WHEN</span> <span class="hljs-keyword">OTHERS</span> =&gt;
  281. <del><span class="hljs-keyword">REPORT</span> <span class="hljs-string">"Are there any more cases?"</span></del>; <font style="background-color:#9D9D9D; color:#fff"> (Remove REPORT) </font>
  282. <span class="hljs-keyword">END</span> <span class="hljs-keyword">CASE</span>;
  283. <span class="hljs-keyword">ELSIF</span> (clk<span class="hljs-attribute">'event</span> <span class="hljs-keyword">AND</span> clk = <span class="hljs-literal">'1'</span>) <span class="hljs-keyword">THEN</span>
  284. <span class="hljs-keyword">IF</span> (bit4 = '<span class="hljs-number">0111</span>') <span class="hljs-keyword">THEN</span>
  285. bit4 &lt;= <span class="hljs-string">"0000"</span>;
  286. <span class="hljs-keyword">ELSE</span>
  287. bit4 &lt;= <span class="hljs-string">"1111"</span>;
  288. <span class="hljs-keyword">END</span> <span class="hljs-keyword">IF</span>;
  289. <del><span class="hljs-comment">-- Sample comments 1;</span> </del>
  290. <del> <span class="hljs-comment">-- Sample comments 2;</span></del> <font style="background-color:#9D9D9D; color:#fff"> (Remove comments) </font>
  291. <span class="hljs-keyword">END</span> <span class="hljs-keyword">IF</span>;
  292. <span class="hljs-keyword">END</span> <span class="hljs-keyword">PROCESS</span>;
  293. <span class="hljs-keyword">END</span> EXA;</code></pre>
  294. </div>
  295. <script>
  296. var exports = {};
  297. </script>
  298. <script src="VHDLFormatter.js"></script>
  299. <script src="descriptiveCounter.js"></script>
  300. <script src="main.js"></script>
  301. <script>
  302. const localStorageSettingKey = "settings";
  303. const localStorageNoFormatKey = "noFormat";
  304. var areaIn = document.getElementById("in");
  305. areaIn.placeholder = "library IEEE;\nuse IEEE.std_logic_1164.all;\nuse IEEE.std_logic_unsigned.all;\n...";
  306. function showHideSettings() {
  307. var settingsDiv = document.getElementById("settings_div");
  308. var control = document.getElementById("settings_control");
  309. if (settingsDiv.className.indexOf("hide") >= 0) {
  310. settingsDiv.className = settingsDiv.className.replace(/\s*hide/, "");
  311. control.innerHTML = "Show Less ▲";
  312. }
  313. else {
  314. settingsDiv.className += "hide";
  315. control.innerHTML = "Show More Settings ▼";
  316. }
  317. }
  318. function onLoad() {
  319. let global_endOfLine = navigator.platform === 'Win32' ? '\\r\\n' : '\\n';
  320. document.getElementById("cust_eol").value = global_endOfLine;
  321. var setting = loadSetting();
  322. if (setting == null) {
  323. return;
  324. }
  325. var beautifierSettings = setting.setting;
  326. document.getElementById("remove_comments").checked = beautifierSettings.RemoveComments;
  327. document.getElementById("remove_lines").checked = setting.removeLines;
  328. document.getElementById("remove_report").checked = beautifierSettings.RemoveAsserts;
  329. document.getElementById("check_alias").checked = beautifierSettings.CheckAlias;
  330. var alignSettings = beautifierSettings.SignAlignSettings;
  331. if (alignSettings != null) {
  332. var signAlignKeywords = alignSettings.keyWords;
  333. if (signAlignKeywords != null && signAlignKeywords.length > 0) {
  334. document.getElementById("sign_align_port").checked = signAlignKeywords.indexOf("PORT") >= 0;
  335. document.getElementById("sign_align_function").checked = signAlignKeywords.indexOf("FUNCTION") >= 0;
  336. document.getElementById("sign_align_procedure").checked = signAlignKeywords.indexOf("PROCEDURE") >= 0;
  337. document.getElementById("sign_align_generic").checked = signAlignKeywords.indexOf("GENERIC") >= 0;
  338. }
  339. document.getElementById("sign_align_all").checked = alignSettings.isAll;
  340. document.getElementById("sign_align_mode_div").elements.namedItem("sign_align_modecase").value = alignSettings.mode;
  341. document.getElementById("align_comments").checked = alignSettings.alignComments;
  342. }
  343. var newLineSettings = beautifierSettings.NewLineSettings;
  344. var newLineAfter = newLineSettings.newLineAfter;
  345. var noNewLineAfter = newLineSettings.noNewLineAfter;
  346. document.getElementById("new_line_after_port").elements.namedItem("new_line_after_portcase").value = decodeNewLineSetting(newLineAfter, noNewLineAfter, "port");
  347. document.getElementById("new_line_after_then").elements.namedItem("new_line_after_thencase").value = decodeNewLineSetting(newLineAfter, noNewLineAfter, "then");
  348. document.getElementById("new_line_after_semicolon").elements.namedItem("new_line_after_semicoloncase").value = decodeNewLineSetting(newLineAfter, noNewLineAfter, ";");
  349. document.getElementById("new_line_after_else").elements.namedItem("new_line_after_elsecase").value = decodeNewLineSetting(newLineAfter, noNewLineAfter, "else");
  350. document.getElementById("new_line_after_generic").elements.namedItem("new_line_after_genericcase").value = decodeNewLineSetting(newLineAfter, noNewLineAfter, "generic");
  351. document.getElementById("compress").checked = setting.compress;
  352. var indentation = beautifierSettings.Indentation;
  353. document.getElementById("use_space").checked = indentation != "\t";
  354. document.getElementById("add_extraEOL").checked = beautifierSettings.AddNewLine;
  355. document.getElementById("customise_indentation").value = indentation;
  356. document.getElementById("keyword_div").elements.namedItem("keywordcase").value = beautifierSettings.KeywordCase;
  357. document.getElementById("typename_div").elements.namedItem("typenamecase").value = beautifierSettings.TypeNameCase;
  358. document.getElementById("mix_letter").checked = setting.mixLetter;
  359. var eof = beautifierSettings.EndOfLine
  360. eof = eof.replace(/\r/g, "\\r");
  361. eof = eof.replace(/\n/g, "\\n");
  362. eof = eof.replace(/\t/g, "\\t");
  363. document.getElementById("cust_eol").value = eof;
  364. var noFormatBool = loadNoFormatSetting();
  365. if (noFormatBool) {
  366. document.getElementById("no_format").checked = true;
  367. noFormat();
  368. }
  369. counterDecode('customise_indentation', 'indent_s');
  370. counterDecode('cust_eol', 'eol_s');
  371. }
  372. function decodeNewLineSetting(hasNewLine, noNewLine, str) {
  373. if (hasNewLine.indexOf(str) >= 0) {
  374. return "NewLine";
  375. }
  376. if (noNewLine.indexOf(str) >= 0) {
  377. return "NoNewLine";
  378. }
  379. return "None";
  380. }
  381. onLoad();
  382. function f() {
  383. var input = document.getElementById("in").value;
  384. var no_format = document.getElementById("no_format").checked;
  385. saveNoFormatSetting(no_format);
  386. if (no_format) {
  387. document.getElementById("vhdl").innerHTML = input;
  388. document.querySelector(".show").style.display = "inline-block";
  389. hljs.highlightBlock(document.getElementById("vhdl"));
  390. return;
  391. }
  392. var remove_lines = document.getElementById("remove_lines").checked;
  393. var mix_letter = document.getElementById("mix_letter").checked;
  394. [beautifierSettings, compress] = CreateSettings();
  395. vhdlSettings = new VhdlSettings(beautifierSettings, remove_lines, compress, mix_letter);
  396. saveSetting(vhdlSettings);
  397. input = beautify(input, beautifierSettings);
  398. if (remove_lines) {
  399. input = input.replace(/(\r\n)*[ \t]*\r\n/g, '\r\n');
  400. }
  401. if (compress) {
  402. input = Compress(input);
  403. }
  404. if (mix_letter) {
  405. input = MixLetters(input);
  406. }
  407. document.getElementById("vhdl").innerHTML = input;
  408. document.querySelector(".show").style.display = "inline-block";
  409. hljs.highlightBlock(document.getElementById("vhdl"));
  410. }
  411. function CreateSettings() {
  412. var remove_comments = document.getElementById("remove_comments").checked;
  413. var remove_report = document.getElementById("remove_report").checked;
  414. var check_alias = document.getElementById("check_alias").checked;
  415. var sign_align_port = document.getElementById("sign_align_port").checked;
  416. var sign_align_function = document.getElementById("sign_align_function").checked;
  417. var sign_align_procedure = document.getElementById("sign_align_procedure").checked;
  418. var sign_align_generic = document.getElementById("sign_align_generic").checked;
  419. var sign_align_all = document.getElementById("sign_align_all").checked;
  420. var align_comments = document.getElementById("align_comments").checked;
  421. var sign_align_mode = document.getElementById("sign_align_mode_div").elements.namedItem("sign_align_modecase").value;
  422. var new_line_after_port = document.getElementById("new_line_after_port").elements.namedItem("new_line_after_portcase").value;
  423. var new_line_after_then = document.getElementById("new_line_after_then").elements.namedItem("new_line_after_thencase").value;
  424. var new_line_after_semicolon = document.getElementById("new_line_after_semicolon").elements.namedItem("new_line_after_semicoloncase").value;
  425. var new_line_after_else = document.getElementById("new_line_after_else").elements.namedItem("new_line_after_elsecase").value;
  426. var new_line_after_generic = document.getElementById("new_line_after_generic").elements.namedItem("new_line_after_genericcase").value;
  427. var use_space = document.getElementById("use_space").checked;
  428. var compress = document.getElementById("compress").checked;
  429. var cust_indent = document.getElementById("customise_indentation").value;
  430. var addNewLine = document.getElementById("add_extraEOL").checked;
  431. var keywordcase = document.getElementById("keyword_div").elements.namedItem("keywordcase").value;
  432. var typenamecase = document.getElementById("typename_div").elements.namedItem("typenamecase").value;
  433. var endOfLine = document.getElementById("cust_eol").value;
  434. endOfLine = endOfLine.replace(/\\r/g, "\r");
  435. endOfLine = endOfLine.replace(/\\n/g, "\n");
  436. if (compress) {
  437. remove_comments = true;
  438. }
  439. indentation = "\t";
  440. if (use_space) {
  441. cust_indent = cust_indent.replace(/\\t/, " ");
  442. indentation = cust_indent;
  443. }
  444. var newLineSettingsDict = {};
  445. newLineSettingsDict["generic"] = new_line_after_generic;
  446. newLineSettingsDict["generic map"] = new_line_after_generic;
  447. newLineSettingsDict["port"] = new_line_after_port;
  448. newLineSettingsDict["port map"] = new_line_after_port;
  449. newLineSettingsDict[";"] = new_line_after_semicolon;
  450. newLineSettingsDict["then"] = new_line_after_then;
  451. newLineSettingsDict["else"] = new_line_after_else;
  452. newLineSettings = ConstructNewLineSettings(newLineSettingsDict);
  453. var signAlignKeywords = [];
  454. if (sign_align_function) {
  455. signAlignKeywords.push("FUNCTION");
  456. signAlignKeywords.push("IMPURE FUNCTION");
  457. }
  458. if (sign_align_generic) {
  459. signAlignKeywords.push("GENERIC");
  460. }
  461. if (sign_align_port) {
  462. signAlignKeywords.push("PORT");
  463. }
  464. if (sign_align_procedure) {
  465. signAlignKeywords.push("PROCEDURE");
  466. }
  467. sign_align = signAlignKeywords.length > 0;
  468. let alignSettings = new signAlignSettings(sign_align, sign_align_all, sign_align_mode, signAlignKeywords, align_comments)
  469. beautifierSettings = new BeautifierSettings(remove_comments, remove_report, check_alias,
  470. alignSettings,
  471. keywordcase,
  472. typenamecase,
  473. indentation,
  474. newLineSettings,
  475. endOfLine,
  476. addNewLine);
  477. return [beautifierSettings, compress];
  478. }
  479. function outputSetting() {
  480. [beautifierSettings, compress] = CreateSettings();
  481. var json = JSON.stringify(beautifierSettings, null, 4);
  482. document.getElementById("vhdl").innerHTML = json;
  483. }
  484. function saveSetting(setting) {
  485. var json = JSON.stringify(setting);
  486. json = json.replace(/\r/g, "\\r");
  487. json = json.replace(/\n/g, "\\n");
  488. json = json.replace(/\t/g, "\\t");
  489. localStorage.setItem(localStorageSettingKey, json);
  490. }
  491. function loadSetting() {
  492. var json = localStorage.getItem(localStorageSettingKey);
  493. if (json == null) {
  494. return null;
  495. }
  496. return JSON.parse(json);
  497. }
  498. function saveNoFormatSetting(no_format) {
  499. localStorage.setItem(localStorageNoFormatKey, no_format);
  500. }
  501. function loadNoFormatSetting() {
  502. return JSON.parse(localStorage.getItem(localStorageNoFormatKey));
  503. }
  504. class VhdlSettings {
  505. constructor(setting, removeLines, compress, mixLetter) {
  506. this.setting = setting;
  507. this.removeLines = removeLines;
  508. this.compress = compress;
  509. this.mixLetter = mixLetter;
  510. }
  511. }
  512. var warning = document.getElementById('warning');
  513. var info = document.getElementById('info');
  514. var happy = document.getElementById('happy');
  515. var closeInfo = document.getElementById("close-info");
  516. var closeWarning = document.getElementById("close-warning");
  517. var closeHappy = document.getElementById("close-happy");
  518. function showWarning() {
  519. warning.style.display = "block";
  520. }
  521. function showInfo() {
  522. info.style.display = "block";
  523. }
  524. function showHappy() {
  525. happy.style.display = "block";
  526. }
  527. closeInfo.onclick = function() {
  528. hidePopups();
  529. }
  530. closeWarning.onclick = function() {
  531. hidePopups();
  532. }
  533. closeHappy.onclick = function(){
  534. hidePopups();
  535. }
  536. function hidePopups() {
  537. warning.style.display = "none";
  538. info.style.display = "none";
  539. happy.style.display = "none";
  540. }
  541. // When the user clicks anywhere outside of the modal, close it
  542. window.onclick = function(event) {
  543. var target = event.target;
  544. if (target == warning
  545. || target == info
  546. || target == happy) {
  547. hidePopups();
  548. }
  549. }
  550. </script>
  551. </body>
  552. </html>