]> git.joonet.de Git - adminer.git/commitdiff
Defer syntax highlighting
authorJakub Vrana <jakub@vrana.cz>
Mon, 7 Apr 2025 12:12:44 +0000 (14:12 +0200)
committerJakub Vrana <jakub@vrana.cz>
Mon, 7 Apr 2025 12:58:19 +0000 (14:58 +0200)
adminer/include/adminer.inc.php
adminer/include/html.inc.php
adminer/static/editing.js
compile.php

index e508748be948fc9aeece09eb3567bdeea4a88fd0..2fa6990582f717883174e636865722690f7c3eb4 100644 (file)
@@ -1005,13 +1005,13 @@ class Adminer {
        */
        function syntaxHighlighting(array $tables): void {
                // this is matched by compile.php
-               echo script_src("../externals/jush/modules/jush.js");
-               echo script_src("../externals/jush/modules/jush-autocomplete-sql.js");
-               echo script_src("../externals/jush/modules/jush-textarea.js");
-               echo script_src("../externals/jush/modules/jush-txt.js");
-               echo script_src("../externals/jush/modules/jush-js.js");
+               echo script_src("../externals/jush/modules/jush.js", true);
+               echo script_src("../externals/jush/modules/jush-autocomplete-sql.js", true);
+               echo script_src("../externals/jush/modules/jush-textarea.js", true);
+               echo script_src("../externals/jush/modules/jush-txt.js", true);
+               echo script_src("../externals/jush/modules/jush-js.js", true);
                if (support("sql")) {
-                       echo script_src("../externals/jush/modules/jush-" . JUSH . ".js");
+                       echo script_src("../externals/jush/modules/jush-" . JUSH . ".js", true);
                        echo "<script" . nonce() . ">\n";
                        if ($tables) {
                                $links = array();
@@ -1028,13 +1028,11 @@ class Adminer {
                                                $tablesColumns[$table][] = $field["field"];
                                        }
                                }
-                               echo "autocompleter = jush.autocompleteSql('" . idf_escape("") . "', " . json_encode($tablesColumns) . ");\n";
+                               echo "addEventListener('DOMContentLoaded', () => { autocompleter = jush.autocompleteSql('" . idf_escape("") . "', " . json_encode($tablesColumns) . "); });\n";
                        }
                        echo "</script>\n";
                }
-               echo script("syntaxHighlighting('" . preg_replace('~^(\d\.?\d).*~s', '\1', connection()->server_info) . "'"
-                       . (connection()->flavor == 'maria' ? ", 'maria'" : (connection()->flavor == 'cockroach' ? ", 'cockroach'" : "")) . ");"
-               );
+               echo script("syntaxHighlighting('" . preg_replace('~^(\d\.?\d).*~s', '\1', connection()->server_info) . "', '" . connection()->flavor . "');");
        }
 
        /** Print databases list in menu */
index 91ce6cd8754d4ea9ce495735010ca4b00f11fb5c..575682cccde52be34c748d2f275b5b9b9993cfc8 100644 (file)
@@ -7,8 +7,8 @@ function script(string $source, string $trailing = "\n"): string {
 }
 
 /** Return <script src> element */
-function script_src(string $url): string {
-       return "<script src='" . h($url) . "'" . nonce() . "></script>\n";
+function script_src(string $url, bool $defer = false): string {
+       return "<script src='" . h($url) . "'" . nonce() . ($defer ? " defer" : "") . "></script>\n";
 }
 
 /** Get a nonce="" attribute with CSP nonce */
index 61bd71edb3b8851728eedd0a5a60aef4eb5cd1ba..67a8a549220d0eb63011cec858b5b9ca078eedc8 100644 (file)
@@ -7,56 +7,58 @@ let autocompleter; // set in adminer.inc.php
 * @param [string]
 */
 function syntaxHighlighting(version, vendor) {
-       if (window.jush) {
-               jush.create_links = 'target="_blank" rel="noreferrer noopener"';
-               if (version) {
-                       for (let key in jush.urls) {
-                               let obj = jush.urls;
-                               if (typeof obj[key] != 'string') {
-                                       obj = obj[key];
-                                       key = 0;
-                                       if (vendor == 'maria') {
-                                               for (let i = 1; i < obj.length; i++) {
-                                                       obj[i] = obj[i]
-                                                               .replace('.html', '/')
-                                                               .replace('-type-syntax', '-data-types')
-                                                               .replace(/numeric-(data-types)/, '$1-$&')
-                                                               .replace(/replication-options-(master|binary-log)\//, 'replication-and-binary-log-system-variables/')
-                                                               .replace('server-options/', 'server-system-variables/')
-                                                               .replace('innodb-parameters/', 'innodb-system-variables/')
-                                                               .replace(/#(statvar|sysvar|option_mysqld)_(.*)/, '#$2')
-                                                               .replace(/#sysvar_(.*)/, '#$1')
-                                                       ;
+       addEventListener('DOMContentLoaded', () => {
+               if (window.jush) {
+                       jush.create_links = 'target="_blank" rel="noreferrer noopener"';
+                       if (version) {
+                               for (let key in jush.urls) {
+                                       let obj = jush.urls;
+                                       if (typeof obj[key] != 'string') {
+                                               obj = obj[key];
+                                               key = 0;
+                                               if (vendor == 'maria') {
+                                                       for (let i = 1; i < obj.length; i++) {
+                                                               obj[i] = obj[i]
+                                                                       .replace('.html', '/')
+                                                                       .replace('-type-syntax', '-data-types')
+                                                                       .replace(/numeric-(data-types)/, '$1-$&')
+                                                                       .replace(/replication-options-(master|binary-log)\//, 'replication-and-binary-log-system-variables/')
+                                                                       .replace('server-options/', 'server-system-variables/')
+                                                                       .replace('innodb-parameters/', 'innodb-system-variables/')
+                                                                       .replace(/#(statvar|sysvar|option_mysqld)_(.*)/, '#$2')
+                                                                       .replace(/#sysvar_(.*)/, '#$1')
+                                                               ;
+                                                       }
                                                }
                                        }
-                               }
 
-                               obj[key] = (vendor == 'maria' ? obj[key].replace('dev.mysql.com/doc/mysql', 'mariadb.com/kb') : obj[key]) // MariaDB
-                                       .replace('/doc/mysql', '/doc/refman/' + version) // MySQL
-                               ;
-                               if (vendor != 'cockroach') {
-                                       obj[key] = obj[key].replace('/docs/current', '/docs/' + version); // PostgreSQL
+                                       obj[key] = (vendor == 'maria' ? obj[key].replace('dev.mysql.com/doc/mysql', 'mariadb.com/kb') : obj[key]) // MariaDB
+                                               .replace('/doc/mysql', '/doc/refman/' + version) // MySQL
+                                       ;
+                                       if (vendor != 'cockroach') {
+                                               obj[key] = obj[key].replace('/docs/current', '/docs/' + version); // PostgreSQL
+                                       }
                                }
                        }
-               }
-               if (window.jushLinks) {
-                       jush.custom_links = jushLinks;
-               }
-               jush.highlight_tag('code', 0);
-               adminerHighlighter = els => jush.highlight_tag(els, 0);
-               for (const tag of qsa('textarea')) {
-                       if (/(^|\s)jush-/.test(tag.className)) {
-                               const pre = jush.textarea(tag, autocompleter);
-                               if (pre) {
-                                       setupSubmitHighlightInput(pre);
-                                       tag.onchange = () => {
-                                               pre.textContent = tag.value;
-                                               pre.oninput();
-                                       };
+                       if (window.jushLinks) {
+                               jush.custom_links = jushLinks;
+                       }
+                       jush.highlight_tag('code', 0);
+                       adminerHighlighter = els => jush.highlight_tag(els, 0);
+                       for (const tag of qsa('textarea')) {
+                               if (/(^|\s)jush-/.test(tag.className)) {
+                                       const pre = jush.textarea(tag, autocompleter);
+                                       if (pre) {
+                                               setupSubmitHighlightInput(pre);
+                                               tag.onchange = () => {
+                                                       pre.textContent = tag.value;
+                                                       pre.oninput();
+                                               };
+                                       }
                                }
                        }
                }
-       }
+       });
 }
 
 /** Get value of dynamically created form field
index 2f6b8feb4b55269cf220dcbc72eef338c1f29731..7b57f0a24e918d6961fa2f4b81f646ec6cbbbf87 100755 (executable)
@@ -334,7 +334,7 @@ if ($_SESSION["lang"]) {
        $file = str_replace('<?php echo LANG; ?>', $_SESSION["lang"], $file);
 }
 $file = str_replace('echo script_src("static/editing.js");' . "\n", "", $file); // merged into functions.js
-$file = preg_replace('~\s+echo script_src\("\.\./externals/jush/modules/jush-(autocomplete-sql|textarea|txt|js|" \. JUSH \. ")\.js"\);~', '', $file); // merged into jush.js
+$file = preg_replace('~\s+echo script_src\("\.\./externals/jush/modules/jush-(autocomplete-sql|textarea|txt|js|" \. JUSH \. ")\.js", true\);~', '', $file); // merged into jush.js
 $file = preg_replace('~echo .*/jush(-dark)?.css\'>.*~', '', $file); // merged into default.css or dark.css
 if (function_exists('stripTypes')) {
        $file = stripTypes($file);