dependabot[bot] dab7914eab
Bump @justinribeiro/lite-youtube from 0.9.0 to 0.9.1 in /build/javascript (#273)
* Commit updated Javascript packages

* Bump preact from 10.5.4 to 10.5.5 in /build/javascript (#265)

* Trying a new github workflow to install javascript packages

* Bump tailwindcss from 1.9.2 to 1.9.4 in /build/javascript (#266)

Bumps [tailwindcss](https://github.com/tailwindlabs/tailwindcss) from 1.9.2 to 1.9.4.
- [Release notes](https://github.com/tailwindlabs/tailwindcss/releases)
- [Changelog](https://github.com/tailwindlabs/tailwindcss/blob/master/CHANGELOG.md)
- [Commits](https://github.com/tailwindlabs/tailwindcss/compare/v1.9.2...v1.9.4)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* Commit updated Javascript packages

* Bump preact from 10.5.4 to 10.5.5 in /build/javascript

Bumps [preact](https://github.com/preactjs/preact) from 10.5.4 to 10.5.5.
- [Release notes](https://github.com/preactjs/preact/releases)
- [Commits](https://github.com/preactjs/preact/compare/10.5.4...10.5.5)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: Gabe Kangas <gabek@real-ity.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Owncast <owncast@owncast.online>

* Bump @justinribeiro/lite-youtube in /build/javascript

Bumps [@justinribeiro/lite-youtube](https://github.com/justinribeiro/lite-youtube) from 0.9.0 to 0.9.1.
- [Release notes](https://github.com/justinribeiro/lite-youtube/releases)
- [Commits](https://github.com/justinribeiro/lite-youtube/commits)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: Owncast <owncast@owncast.online>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Gabe Kangas <gabek@real-ity.com>
2020-10-20 15:15:56 -07:00

141 lines
2.9 KiB
JavaScript

const valueParser = require("postcss-value-parser");
const { stringify } = valueParser;
function getUrl(nodes) {
let url = "";
let urlEnd = 0;
for (let i = 0; i < nodes.length; i += 1) {
const node = nodes[i];
if (node.type === "string") {
if (i !== 0) {
throw Error(`Invalid "svg-load(${stringify(nodes)})" definition`);
}
url = node.value;
urlEnd = i + 1;
break;
}
if (node.type === "div" && node.value === ",") {
if (i === 0) {
throw Error(`Invalid "svg-load(${stringify(nodes)})" definition`);
}
urlEnd = i;
break;
}
url += stringify(node);
urlEnd += 1;
}
return {
url,
urlEnd
};
}
function getParamChunks(nodes) {
const list = [];
const lastArg = nodes.reduce((arg, node) => {
if (node.type === "word" || node.type === "string") {
return arg + node.value;
}
if (node.type === "space") {
return arg + " ";
}
if (node.type === "div" && node.value === ",") {
list.push(arg);
return "";
}
return arg + stringify(node);
}, "");
return list.concat(lastArg);
}
function splitParams(list) {
const params = {};
list.reduce((sep, arg) => {
if (!arg) {
throw Error(`Expected parameter`);
}
if (!sep) {
if (arg.indexOf(":") !== -1) {
sep = ":";
} else if (arg.indexOf("=") !== -1) {
sep = "=";
} else {
throw Error(`Expected ":" or "=" separator in "${arg}"`);
}
}
const pair = arg.split(sep);
if (pair.length !== 2) {
throw Error(`Expected "${sep}" separator in "${arg}"`);
}
params[pair[0].trim()] = pair[1].trim();
return sep;
}, null);
return params;
}
function getLoader(parsedValue, valueNode) {
if (!valueNode.nodes.length) {
throw Error(`Invalid "svg-load()" statement`);
}
// parse url
const { url, urlEnd } = getUrl(valueNode.nodes);
// parse params
const paramsNodes = valueNode.nodes.slice(urlEnd + 1);
const params =
urlEnd !== valueNode.nodes.length
? splitParams(getParamChunks(paramsNodes))
: {};
return {
url,
params,
valueNode,
parsedValue
};
}
function getInliner(parsedValue, valueNode) {
if (!valueNode.nodes.length) {
throw Error(`Invalid "svg-inline()" statement`);
}
const name = valueNode.nodes[0].value;
return {
name,
valueNode,
parsedValue
};
}
module.exports = function parseDeclValue(value) {
const loaders = [];
const inliners = [];
const parsedValue = valueParser(value);
parsedValue.walk(valueNode => {
if (valueNode.type === "function") {
if (valueNode.value === "svg-load") {
loaders.push(getLoader(parsedValue, valueNode));
} else if (valueNode.value === "svg-inline") {
inliners.push(getInliner(parsedValue, valueNode));
}
}
});
return {
loaders,
inliners
};
};