aboutsummaryrefslogtreecommitdiff
path: root/src/services/theme_data/iss_serializer.js
diff options
context:
space:
mode:
authorHJ <30-hj@users.noreply.git.pleroma.social>2024-09-19 15:29:29 +0000
committerHJ <30-hj@users.noreply.git.pleroma.social>2024-09-19 15:29:29 +0000
commit23f8c08809d2ad38780584ef4f46643772cf5efe (patch)
treefc52a83b643e4a518a56abbd58a84023bd363a7c /src/services/theme_data/iss_serializer.js
parent537145e93467dbc318995d8f709bd6d2eb8c5985 (diff)
parente089ca6d9a4592eb2ed0998419113b09906b94b8 (diff)
Merge branch 'update-prefixer' into 'develop'
Update prefixer settings and required gitlab runner tags See merge request pleroma/pleroma-fe!1942
Diffstat (limited to 'src/services/theme_data/iss_serializer.js')
-rw-r--r--src/services/theme_data/iss_serializer.js62
1 files changed, 62 insertions, 0 deletions
diff --git a/src/services/theme_data/iss_serializer.js b/src/services/theme_data/iss_serializer.js
new file mode 100644
index 00000000..39151e41
--- /dev/null
+++ b/src/services/theme_data/iss_serializer.js
@@ -0,0 +1,62 @@
+import { unroll } from './iss_utils'
+
+const getCanonicState = (state) => {
+ if (state) {
+ return ['normal', ...state.filter(x => x !== 'normal')]
+ } else {
+ return ['normal']
+ }
+}
+
+const getCanonicRuleHeader = ({
+ component,
+ variant = 'normal',
+ parent,
+ state
+}) => ({
+ component,
+ variant,
+ parent,
+ state: getCanonicState(state)
+})
+
+const prepareRule = (rule) => {
+ const { parent } = rule
+ const chain = [...unroll(parent), rule].map(getCanonicRuleHeader)
+ const header = chain.map(({ component, variant, state }) => [
+ component,
+ variant === 'normal' ? '' : ('.' + variant),
+ state.filter(s => s !== 'normal').map(s => ':' + s).join('')
+ ].join('')).join(' ')
+
+ console.log(header, rule.directives)
+ const content = Object.entries(rule.directives).map(([key, value]) => {
+ let realValue = value
+
+ switch (key) {
+ case 'shadow':
+ realValue = realValue.map(v => `${v.inset ? 'inset ' : ''}${v.x} ${v.y} ${v.blur} ${v.spread} ${v.color} / ${v.alpha}`)
+ }
+
+ if (Array.isArray(realValue)) {
+ realValue = realValue.join(', ')
+ }
+
+ return ` ${key}: ${realValue};`
+ }).sort().join('\n')
+
+ return [
+ header,
+ content
+ ]
+}
+
+export const serialize = (ruleset) => {
+ // Scrapped idea: automatically combine same-set directives
+ // problem: might violate the order rules
+
+ return ruleset.filter(r => Object.keys(r.directives).length > 0).map(r => {
+ const [header, content] = prepareRule(r)
+ return `${header} {\n${content}\n}\n\n`
+ })
+}