This commit is contained in:
Henry Jameson 2024-09-19 20:37:14 +03:00
parent 74e5bb9104
commit af3b2e3dc9
3 changed files with 117 additions and 4 deletions

View file

@ -1,3 +1,43 @@
export const deserializer (string) { // this works nearly the same as HTML tree converter
let level = 0 export const deserialize = (input) => {
const buffer = []
let textBuffer = ''
const getCurrentBuffer = () => {
let current = buffer[buffer.length - 1][1]
if (current == null) {
current = { name: null, content: [] }
}
buffer.push(current)
return current
}
// Processes current line buffer, adds it to output buffer and clears line buffer
const flushText = (content) => {
if (textBuffer === '') return
if (content) {
getCurrentBuffer().content.push(textBuffer)
} else {
getCurrentBuffer().name = textBuffer
}
textBuffer = ''
}
for (let i = 0; i < input.length; i++) {
const char = input[i]
if (char === ';') {
flushText(true)
} else if (char === '{') {
flushText(false)
} else if (char === '}') {
buffer.push({ name: null, content: [] })
textBuffer = ''
} else {
textBuffer += char
}
}
flushText()
return buffer
} }

View file

@ -23,6 +23,9 @@ import {
findRules findRules
} from './iss_utils.js' } from './iss_utils.js'
import { parseCssShadow } from './css_utils.js' import { parseCssShadow } from './css_utils.js'
import {
serialize
} from './iss_serializer.js'
// Ensuring the order of components // Ensuring the order of components
const components = { const components = {
@ -504,9 +507,32 @@ export const init = ({
console.debug('Eager processing took ' + (t2 - t1) + ' ms') console.debug('Eager processing took ' + (t2 - t1) + ' ms')
} }
// optimization to traverse big-ass array only once instead of twice
const eager = []
const lazy = []
result.forEach(x => {
if (typeof x === 'function') {
lazy.push(x)
} else {
eager.push(x)
}
})
const serializedData = serialize(eager)
const file = new File(serializedData, 'ruleset.piss')
const blobUrl = URL.createObjectURL(file)
const a = document.createElement('a')
a.href = blobUrl
a.download = 'ruleset.piss'
document.body.appendChild(a)
a.dispatchEvent(new MouseEvent('click'))
URL.revokeObjectURL(blobUrl)
document.body.removeChild(a)
return { return {
lazy: result.filter(x => typeof x === 'function'), lazy,
eager: result.filter(x => typeof x !== 'function'), eager,
staticVars, staticVars,
engineChecksum engineChecksum
} }

View file

@ -0,0 +1,47 @@
import { deserialize } from 'src/services/theme_data/iss_deserializer.js'
/* eslint-disable quotes */
const testData = ```
Root {
--accent: color | #e2b188;
--badgeNotification: color | #e15932;
--bg: color | #0f161e;
--cBlue: color | #81beea;
--cGreen: color | #5dc94a;
--cOrange: color | #ffc459;
--cRed: color | #d31014;
--defaultButtonBevel: shadow | $borderSide(#FFFFFF, top, 0.2) | $borderSide(#000000, bottom, 0.2);
--defaultButtonHoverGlow: shadow | 0 0 4 --text;
--defaultButtonShadow: shadow | 0 0 2 #000000;
--defaultInputBevel: shadow | $borderSide(#FFFFFF, bottom, 0.2)| $borderSide(#000000, top, 0.2);
--fg: color | #151e2b;
--font: generic | sans-serif;
--link: color | #e2b188;
--monoFont: generic | monospace;
--pressedButtonBevel: shadow | $borderSide(#FFFFFF, bottom, 0.2)| $borderSide(#000000, top, 0.2);
--selectionBackground: color | --accent;
--selectionText: color | $textColor(--accent, --text, no-preserve);
--text: color | #b9b9ba;
--wallpaper: color | #0c1118;
background: transparent;
opacity: 0;
}
Root Underlay {
background: #000000;
opacity: 0.6;
}
Root Underlay, test {
background: #000000;
opacity: 0.6;
}
```
describe.only('html_tree_converter', () => {
describe('convertHtmlToTree', () => {
it('should parse ISS correctly', () => {
console.log(deserialize(testData))
})
})
})