Start cleaning up document and the example parser. I think this is the way to move forward, finally. Next up: DSL on top of functions.

This commit is contained in:
Joshua Bemenderfer
2023-01-30 18:54:13 -05:00
parent b02e742c89
commit 67e7811772
9 changed files with 221 additions and 302 deletions

View File

@@ -1 +1 @@
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const s=require("./parser.cjs");function c(a,u=" "){let r=s.createLineData(null,u);const t={ended:!1,clone(){return c(a.clone(),u)},async next(){if(r.line=await a.next(),r.line===null)return!0;s.parseLine(r)},current(){return t},line(){var e;return(e=r.line)==null?void 0:e.slice(r.offsetHead)},head(){var e;return(e=r.line)==null?void 0:e.slice(r.offsetHead,r.offsetTail)},tail(){var e;return(e=r.line)==null?void 0:e.slice(r.offsetTail)},level(){return r.level},async content(e=-1,n=[]){var l;return e===-1&&(e=r.level+1),await t.next()||r.level<e?n:(n.push(((l=r.line)==null?void 0:l.slice(e))||""),t.content(e,n))},match(e){return e===t.head()},async each(e){const n=t.line()!==void 0?t.level():-1;for(;!(await t.next()||t.level()<=n||await e()););},async buildObject(e=[],n){n||(n=()=>t.tail().trim());const i={};return await t.each(async()=>{if(!!t.head()){if(!e.length||e.includes(t.head())){i[t.head()]=await n();return}if(e&&!e.includes(t.head())&&e.includes("#text")){i["#text"]=[t.line(),...await t.content(t.level())];return}}}),i},async seek(e,n=-1){return n===-1&&(n=r.level),await t.next()?!1:t.head()===e?t:r.level<n?!1:t.seek(e,n)}};return t}exports.useDocument=c;
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const h=require("./parser.cjs");function T(p,b=" "){let c=0;const t=h.createLineData("",b);async function s(){c===0&&(c=1);const e=await p.next();return e===null?(c=2,!0):(t.line=e,h.parseLine(t),!1)}const a=()=>t.level,u=()=>t.line.slice(t.offsetHead),o=()=>t.line.slice(t.offsetHead,t.offsetTail),f=()=>t.line.slice(t.offsetTail),v=e=>e===o();async function d(e){const n=c===0?-1:a();for(;!(await s()||a()<=n||await e()););}async function l(e=-1,n=[u()]){var i;return e===-1&&(e=t.level+1),await s()||t.level<e?n:(n.push(((i=t.line)==null?void 0:i.slice(e))||""),l(e,n))}async function w(e=[],n){const r={};return await d(async()=>{const i=o();if(!!i){if(!e.length||e.includes(i)){r[i]=n?await n():f().trim();return}if(e&&!e.includes(i)&&e.includes("#text")){r["#text"]=await l(a());return}}}),r}async function m(){const e=[["root",[]]];for(;!await s();){const n=a(),r=n+1,i=e[n];if(!i)continue;e.length=r;const x=e[r]=[u(),[]];i[1].push(x)}return e[0]}return{state:c,next:s,line:u,head:o,tail:f,level:a,match:v,each:d,blockAsText:l,buildObject:w,toArrays:m}}exports.useDocument=T;

View File

@@ -1,68 +1,64 @@
import { parseLine as f, createLineData as s } from "./parser.js";
function c(a, u = " ") {
let n = s(null, u);
const t = {
ended: !1,
clone() {
return c(a.clone(), u);
},
async next() {
if (n.line = await a.next(), n.line === null)
return !0;
f(n);
},
current() {
return t;
},
line() {
var e;
return (e = n.line) == null ? void 0 : e.slice(n.offsetHead);
},
head() {
var e;
return (e = n.line) == null ? void 0 : e.slice(n.offsetHead, n.offsetTail);
},
tail() {
var e;
return (e = n.line) == null ? void 0 : e.slice(n.offsetTail);
},
level() {
return n.level;
},
async content(e = -1, r = []) {
var l;
return e === -1 && (e = n.level + 1), await t.next() || n.level < e ? r : (r.push(((l = n.line) == null ? void 0 : l.slice(e)) || ""), t.content(e, r));
},
match(e) {
return e === t.head();
},
async each(e) {
const r = t.line() !== void 0 ? t.level() : -1;
for (; !(await t.next() || t.level() <= r || await e()); )
;
},
async buildObject(e = [], r) {
r || (r = () => t.tail().trim());
const i = {};
return await t.each(async () => {
if (!!t.head()) {
if (!e.length || e.includes(t.head())) {
i[t.head()] = await r();
return;
}
if (e && !e.includes(t.head()) && e.includes("#text")) {
i["#text"] = [t.line(), ...await t.content(t.level())];
return;
}
import { parseLine as v, createLineData as T } from "./parser.js";
function y(h, p = " ") {
let r = 0;
const t = T("", p);
async function s() {
r === 0 && (r = 1);
const e = await h.next();
return e === null ? (r = 2, !0) : (t.line = e, v(t), !1);
}
const a = () => t.level, o = () => t.line.slice(t.offsetHead), u = () => t.line.slice(t.offsetHead, t.offsetTail), l = () => t.line.slice(t.offsetTail), w = (e) => e === u();
async function d(e) {
const n = r === 0 ? -1 : a();
for (; !(await s() || a() <= n || await e()); )
;
}
async function f(e = -1, n = [o()]) {
var i;
return e === -1 && (e = t.level + 1), await s() || t.level < e ? n : (n.push(((i = t.line) == null ? void 0 : i.slice(e)) || ""), f(e, n));
}
async function x(e = [], n) {
const c = {};
return await d(async () => {
const i = u();
if (!!i) {
if (!e.length || e.includes(i)) {
c[i] = n ? await n() : l().trim();
return;
}
}), i;
},
async seek(e, r = -1) {
return r === -1 && (r = n.level), await t.next() ? !1 : t.head() === e ? t : n.level < r ? !1 : t.seek(e, r);
if (e && !e.includes(i) && e.includes("#text")) {
c["#text"] = await f(a());
return;
}
}
}), c;
}
async function b() {
const e = [["root", []]];
for (; !await s(); ) {
const n = a(), c = n + 1, i = e[n];
if (!i)
continue;
e.length = c;
const m = e[c] = [o(), []];
i[1].push(m);
}
return e[0];
}
return {
state: r,
next: s,
line: o,
head: u,
tail: l,
level: a,
match: w,
each: d,
blockAsText: f,
buildObject: x,
toArrays: b
};
return t;
}
export {
c as useDocument
y as useDocument
};

View File

@@ -1 +1 @@
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});function f(e=null,r=" "){return{line:e,indent:r,type:0,level:0,offsetHead:0,offsetTail:0}}function o(e){if(typeof e!="object"||!e||typeof e.type!="number"||typeof e.level!="number")throw new Error("'lineData' must be an object with 'line' string, and 'type' and 'level' integer properties");if(typeof e.indent!="string"||e.indent.length===0||e.indent.length>1)throw new Error("'lineData.indent' must be a single-character string");if(typeof e.line!="string")throw new Error("'lineData.line' must be a string");let r=0,t=0;if(!e.line.length)e.type===1&&(t+=1),e.type===0&&(t=e.level),e.type=r,e.level=t,e.offsetHead=0,e.offsetTail=0;else{for(r=1;e.line[t]===e.indent&&t<=e.level+1;)++t;for(e.type=r,e.level=t,e.offsetHead=t,e.offsetTail=t;e.line[e.offsetTail]&&e.line[e.offsetTail]!==" ";)++e.offsetTail}return e}exports.createLineData=f;exports.parseLine=o;
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});function f(e="",r=" "){return{line:e,indent:r,type:0,level:0,offsetHead:0,offsetTail:0}}function o(e){if(typeof e!="object"||!e||typeof e.type!="number"||typeof e.level!="number")throw new Error("'lineData' must be an object with 'line' string, and 'type' and 'level' integer properties");if(typeof e.indent!="string"||e.indent.length===0||e.indent.length>1)throw new Error("'lineData.indent' must be a single-character string");if(typeof e.line!="string")throw new Error("'lineData.line' must be a string");let r=0,t=0;if(!e.line.length)e.type===1&&(t+=1),e.type===0&&(t=e.level),e.type=r,e.level=t,e.offsetHead=0,e.offsetTail=0;else{for(r=1;e.line[t]===e.indent&&t<=e.level+1;)++t;for(e.type=r,e.level=t,e.offsetHead=t,e.offsetTail=t;e.line[e.offsetTail]&&e.line[e.offsetTail]!==" ";)++e.offsetTail}return e}exports.createLineData=f;exports.parseLine=o;

View File

@@ -1,4 +1,4 @@
function t(e = null, r = " ") {
function t(e = "", r = " ") {
return { line: e, indent: r, type: 0, level: 0, offsetHead: 0, offsetTail: 0 };
}
function o(e) {