Skip to content

Instantly share code, notes, and snippets.

@yuru4c
Last active February 12, 2019 09:05
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save yuru4c/b1b15f4311b39ce0349da801b8f56f9e to your computer and use it in GitHub Desktop.
Save yuru4c/b1b15f4311b39ce0349da801b8f56f9e to your computer and use it in GitHub Desktop.
CSS 風宣言パーサ
var parse = (function () {
var cb = '\\', cd = '"', cq = "'";
var re = /\\(?=[;/*])/g, rc = /\\(?=:)/g, rt = /[^\s]/;
function slice(css, h, i) {
return css.substring(h, i).replace(re, '');
}
function prop(css, h, i) {
return slice(css, h, i).replace(rc, '');
}
function trim(s) {
var i = s.search(rt), j = i, k = j;
for (var c; c = s.charAt(k); k++) {
if (c == cb) { j = ++k; continue; }
if (rt.test(c)) j = k;
if (c == cd || c == cq) {
var d;
while (d = s.charAt(++k)) {
if (d == cb) { k++; continue; }
if (d == c) break;
}
j = k;
}
}
return s.substring(i, j + 1);
}
function parse(css) {
var decs = {}; var i = 0;
for (var c; c = css.charAt(i); i++) {
var s = '', p = null;
var h = i;
var f = false;
do {
if (c == cb) {
f = false;
i++; continue;
}
if (f && c == '*') {
f = false;
s += slice(css, h, i - 1);
i = css.indexOf('*/', i + 1) + 1 || css.length;
h = i + 1;
continue;
}
f = c == '/';
if (c == ';') break;
if (p == null && c == ':') {
p = trim(s + prop(css, h, i));
s = '';
h = i + 1;
continue;
}
if (c != cd && c != cq) continue;
s += slice(css, h, i);
h = i++;
for (var d; d = css.charAt(i); i++) {
if (d == cb) { i++; continue; }
if (d == c) break;
}
s += css.substring(h, i + 1);
h = i + 1;
} while (c = css.charAt(++i));
if (p == null) {
p = trim(s + prop(css, h, i));
if (p) decs[p] = null;
} else {
decs[p] = trim(s + slice(css, h, i));
}
}
return decs;
}
return parse;
})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment