From dcc2a4c51cad89f2d0324e7fc1ac2f18fddcf7cd Mon Sep 17 00:00:00 2001 From: Fabio Di Stasio Date: Sat, 9 Jul 2022 12:37:30 +0200 Subject: [PATCH 1/2] refactor: replaced @vscode/vscode-languagedetection with custom language detection --- package-lock.json | 14 -- package.json | 1 - src/common/libs/langDetector.ts | 182 ++++++++++++++++++ .../components/WorkspaceTabQueryTableRow.vue | 26 +-- 4 files changed, 195 insertions(+), 28 deletions(-) create mode 100644 src/common/libs/langDetector.ts diff --git a/package-lock.json b/package-lock.json index 6e9d1caa..a2841bff 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,7 +14,6 @@ "@faker-js/faker": "~6.1.2", "@mdi/font": "~6.9.96", "@turf/helpers": "~6.5.0", - "@vscode/vscode-languagedetection": "~1.0.21", "@vueuse/core": "~8.7.5", "ace-builds": "~1.4.13", "better-sqlite3": "~7.5.1", @@ -3096,14 +3095,6 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/@vscode/vscode-languagedetection": { - "version": "1.0.21", - "resolved": "https://registry.npmjs.org/@vscode/vscode-languagedetection/-/vscode-languagedetection-1.0.21.tgz", - "integrity": "sha512-zSUH9HYCw5qsCtd7b31yqkpaCU6jhtkKLkvOOA8yTrIRfBSOFb8PPhgmMicD7B/m+t4PwOJXzU1XDtrM9Fd3/g==", - "bin": { - "vscode-languagedetection": "cli/index.js" - } - }, "node_modules/@vue/compiler-core": { "version": "3.2.37", "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.37.tgz", @@ -19988,11 +19979,6 @@ } } }, - "@vscode/vscode-languagedetection": { - "version": "1.0.21", - "resolved": "https://registry.npmjs.org/@vscode/vscode-languagedetection/-/vscode-languagedetection-1.0.21.tgz", - "integrity": "sha512-zSUH9HYCw5qsCtd7b31yqkpaCU6jhtkKLkvOOA8yTrIRfBSOFb8PPhgmMicD7B/m+t4PwOJXzU1XDtrM9Fd3/g==" - }, "@vue/compiler-core": { "version": "3.2.37", "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.37.tgz", diff --git a/package.json b/package.json index 25487649..485d6f64 100644 --- a/package.json +++ b/package.json @@ -119,7 +119,6 @@ "@faker-js/faker": "~6.1.2", "@mdi/font": "~6.9.96", "@turf/helpers": "~6.5.0", - "@vscode/vscode-languagedetection": "~1.0.21", "@vueuse/core": "~8.7.5", "ace-builds": "~1.4.13", "better-sqlite3": "~7.5.1", diff --git a/src/common/libs/langDetector.ts b/src/common/libs/langDetector.ts new file mode 100644 index 00000000..12a1fcab --- /dev/null +++ b/src/common/libs/langDetector.ts @@ -0,0 +1,182 @@ +function isJSON (str: string) { + try { + if (!['{', '['].includes(str.trim()[0])) + return false; + + JSON.parse(str); + return true; + } + catch (_) { + return false; + } +} + +function isHTML (str: string) { + const tags = [ + 'a', + 'abbr', + 'address', + 'area', + 'article', + 'aside', + 'audio', + 'b', + 'base', + 'bdi', + 'bdo', + 'blockquote', + 'body', + 'br', + 'button', + 'canvas', + 'caption', + 'cite', + 'code', + 'col', + 'colgroup', + 'data', + 'datalist', + 'dd', + 'del', + 'details', + 'dfn', + 'dialog', + 'div', + 'dl', + 'dt', + 'em', + 'embed', + 'fieldset', + 'figcaption', + 'figure', + 'footer', + 'form', + 'h1', + 'h2', + 'h3', + 'h4', + 'h5', + 'h6', + 'head', + 'header', + 'hgroup', + 'hr', + 'html', + 'i', + 'iframe', + 'img', + 'input', + 'ins', + 'kbd', + 'label', + 'legend', + 'li', + 'link', + 'main', + 'map', + 'mark', + 'math', + 'menu', + 'menuitem', + 'meta', + 'meter', + 'nav', + 'noscript', + 'object', + 'ol', + 'optgroup', + 'option', + 'output', + 'p', + 'param', + 'picture', + 'pre', + 'progress', + 'q', + 'rb', + 'rp', + 'rt', + 'rtc', + 'ruby', + 's', + 'samp', + 'script', + 'section', + 'select', + 'slot', + 'small', + 'source', + 'span', + 'strong', + 'style', + 'sub', + 'summary', + 'sup', + 'svg', + 'table', + 'tbody', + 'td', + 'template', + 'textarea', + 'tfoot', + 'th', + 'thead', + 'time', + 'title', + 'tr', + 'track', + 'u', + 'ul', + 'var', + 'video', + 'wbr' + ]; + const doc = new DOMParser().parseFromString(str, 'text/html'); + if (Array.from(doc.body.childNodes).some(node => node.nodeType === 1)) + return tags.some((tag) => str.includes(`<${tag}>`)); + + return false; +} + +function isXML (str: string) { + const doc = new DOMParser().parseFromString(str, 'text/xml'); + const errorNode = doc.querySelector('parsererror'); + return !errorNode; +} + +function isMarkdown (str: string) { + const mdChecks = [ + '# ', + '`', + '- ', + '+ ', + '* ', + '1. ', + '**', + '__', + '~~', + '>> ', + '](http', + '![', + '[ ]', + '[x]' + ]; + + return mdChecks.some((tag) => str.includes(tag)); +} + +export function langDetector (str: string) { + if (!str.trim().length) + return 'text'; + + if (isJSON(str)) + return 'json'; + if (isHTML(str)) + return 'html'; + if (isXML(str)) + return 'xml'; + if (isMarkdown(str)) + return 'markdown'; + + return 'text'; +} diff --git a/src/renderer/components/WorkspaceTabQueryTableRow.vue b/src/renderer/components/WorkspaceTabQueryTableRow.vue index 7a6cf6ca..86487f5a 100644 --- a/src/renderer/components/WorkspaceTabQueryTableRow.vue +++ b/src/renderer/components/WorkspaceTabQueryTableRow.vue @@ -194,9 +194,9 @@ import { computed, onBeforeUnmount, Prop, ref, Ref, watch, nextTick } from 'vue'; import { useI18n } from 'vue-i18n'; import * as moment from 'moment'; -import { ModelOperations } from '@vscode/vscode-languagedetection'; import { mimeFromHex } from 'common/libs/mimeFromHex'; import { formatBytes } from 'common/libs/formatBytes'; +import { langDetector } from 'common/libs/langDetector'; import { bufferToBase64 } from 'common/libs/bufferToBase64'; import hexToBinary, { HexChar } from 'common/libs/hexToBinary'; import { @@ -604,19 +604,19 @@ watch(() => props.fields, () => { }); watch(isTextareaEditor, (val) => { - if (val) { - const modelOperations = new ModelOperations(); - (async () => { - const detected = await modelOperations.runModel(editingContent.value); - const filteredLanguages = detected.filter(dLang => - availableLanguages.value.some(aLang => aLang.id === dLang.languageId) && - dLang.confidence > 0.1 - ); + if (val) + editorMode.value = langDetector(editingContent.value); + // const modelOperations = new ModelOperations(); + // (async () => { + // const detected = await modelOperations.runModel(editingContent.value); + // const filteredLanguages = detected.filter(dLang => + // availableLanguages.value.some(aLang => aLang.id === dLang.languageId) && + // dLang.confidence > 0.1 + // ); - if (filteredLanguages.length) - editorMode.value = availableLanguages.value.find(lang => lang.id === filteredLanguages[0].languageId).slug; - })(); - } + // if (filteredLanguages.length) + // editorMode.value = availableLanguages.value.find(lang => lang.id === filteredLanguages[0].languageId).slug; + // })(); }); watch(() => props.selected, (isSelected) => { From 2c13433900c5177745f14c344856b7d6b8b10294 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 9 Jul 2022 10:38:14 +0000 Subject: [PATCH 2/2] build(deps): bump moment from 2.29.3 to 2.29.4 Bumps [moment](https://github.com/moment/moment) from 2.29.3 to 2.29.4. - [Release notes](https://github.com/moment/moment/releases) - [Changelog](https://github.com/moment/moment/blob/develop/CHANGELOG.md) - [Commits](https://github.com/moment/moment/compare/2.29.3...2.29.4) --- updated-dependencies: - dependency-name: moment dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index a2841bff..70b4c6c2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -24,7 +24,7 @@ "encoding": "~0.1.13", "leaflet": "~1.7.1", "marked": "~4.0.0", - "moment": "~2.29.1", + "moment": "~2.29.4", "mysql2": "~2.3.2", "pg": "~8.7.1", "pg-query-stream": "~4.2.3", @@ -11472,9 +11472,9 @@ } }, "node_modules/moment": { - "version": "2.29.3", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.3.tgz", - "integrity": "sha512-c6YRvhEo//6T2Jz/vVtYzqBzwvPT95JBQ+smCytzf7c50oMZRsR/a4w88aD34I+/QVSfnoAnSBFPJHItlOMJVw==", + "version": "2.29.4", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", "engines": { "node": "*" } @@ -26329,9 +26329,9 @@ "dev": true }, "moment": { - "version": "2.29.3", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.3.tgz", - "integrity": "sha512-c6YRvhEo//6T2Jz/vVtYzqBzwvPT95JBQ+smCytzf7c50oMZRsR/a4w88aD34I+/QVSfnoAnSBFPJHItlOMJVw==" + "version": "2.29.4", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==" }, "moo": { "version": "0.5.1", diff --git a/package.json b/package.json index 485d6f64..ccda9370 100644 --- a/package.json +++ b/package.json @@ -129,7 +129,7 @@ "encoding": "~0.1.13", "leaflet": "~1.7.1", "marked": "~4.0.0", - "moment": "~2.29.1", + "moment": "~2.29.4", "mysql2": "~2.3.2", "pg": "~8.7.1", "pg-query-stream": "~4.2.3",