diff --git a/packages/web/package.json b/packages/web/package.json index be180f8ce..e57c0d161 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -61,6 +61,7 @@ "date-fns": "^4.1.0", "debug": "^4.3.4", "fuzzy": "^0.1.3", + "highlight.js": "^11.11.1", "interval-operations": "^1.0.7", "leaflet": "^1.8.0", "wellknown": "^0.5.0" diff --git a/packages/web/src/celldata/XmlCellView.svelte b/packages/web/src/celldata/XmlCellView.svelte new file mode 100644 index 000000000..523076ff8 --- /dev/null +++ b/packages/web/src/celldata/XmlCellView.svelte @@ -0,0 +1,9 @@ + + +{#each selection as cell} + +{/each} diff --git a/packages/web/src/celldata/XmlHighlighter.svelte b/packages/web/src/celldata/XmlHighlighter.svelte new file mode 100644 index 000000000..f6df74049 --- /dev/null +++ b/packages/web/src/celldata/XmlHighlighter.svelte @@ -0,0 +1,42 @@ + + +{#key formattedCode} +
{formattedCode}
+{/key} + + diff --git a/packages/web/src/celldata/formatXml.ts b/packages/web/src/celldata/formatXml.ts new file mode 100644 index 000000000..2baef0720 --- /dev/null +++ b/packages/web/src/celldata/formatXml.ts @@ -0,0 +1,24 @@ +export default function formatXml(xml: string): string { + if (typeof xml !== 'string') return ''; + + xml = xml.replace(/>\s*<'); + + let formatted = ''; + let indent = 0; + + const tags = xml.split(/(<.*?>)/g).filter(s => s.trim()); + + for (let tag of tags) { + if (tag.startsWith('') && !tag.startsWith('`]+/ }, + ], + }, + ], + }, + ], + }; + return { + name: 'HTML, XML', + aliases: ['html', 'xhtml', 'rss', 'atom', 'xjb', 'xsd', 'xsl', 'plist', 'wsf', 'svg'], + case_insensitive: true, + unicodeRegex: true, + contains: [ + { + className: 'meta', + begin: //, + relevance: 10, + contains: [ + XML_META_KEYWORDS, + QUOTE_META_STRING_MODE, + APOS_META_STRING_MODE, + XML_META_PAR_KEYWORDS, + { + begin: /\[/, + end: /\]/, + contains: [ + { + className: 'meta', + begin: //, + contains: [XML_META_KEYWORDS, XML_META_PAR_KEYWORDS, QUOTE_META_STRING_MODE, APOS_META_STRING_MODE], + }, + ], + }, + ], + }, + hljs.COMMENT(//, { relevance: 10 }), + { + begin: //, + relevance: 10, + }, + XML_ENTITIES, + // xml processing instructions + { + className: 'meta', + end: /\?>/, + variants: [ + { + begin: /<\?xml/, + relevance: 10, + contains: [QUOTE_META_STRING_MODE], + }, + { + begin: /<\?[a-z][a-z0-9]+/, + }, + ], + }, + { + className: 'tag', + /* + The lookahead pattern (?=...) ensures that 'begin' only matches + ')/, + end: />/, + keywords: { name: 'style' }, + contains: [TAG_INTERNALS], + starts: { + end: /<\/style>/, + returnEnd: true, + subLanguage: ['css', 'xml'], + }, + }, + { + className: 'tag', + // See the comment in the