From 7bf7efcd09cc3d99067833c4f435f856e7f30de2 Mon Sep 17 00:00:00 2001 From: Shadee Date: Jul 07 2022 06:35:18 +0000 Subject: UPDATE --- diff --git a/m-note-view.js b/m-note-view.js index 07f6f79..6f17d67 100644 --- a/m-note-view.js +++ b/m-note-view.js @@ -5,6 +5,7 @@ import {create_view} from "./struct-editor.js"; import * as utils from "./node-utils.js"; +import {part as p_sheet} from "./parts/sheet.js"; const prefix = type => "mn-" + type; @@ -38,27 +39,32 @@ To insert a preview block, type (@p (@sb @ ...)). (@h Demo) +Lisp like code + (@code (define (hello) (set! data [1 2 3 4 5 6]) (print "hello world!"))) + +Sheet + +(@sheet (4 4) + (cell A1) (cell B1) (cell C1) (cell D1) + (cell A2) (cell B2) (cell C2) (cell D2) + (cell A3) (cell B3) (cell C3) (cell D3) + (cell A4) (cell B4) (cell C4) (cell D4)) `; -const view = create_view(test_source, ({ - elem2node, - node2elem, - pre_struct_create, - pre_stream_create, -}) => { +const view = create_view(test_source, ctx => { const gen_fn_pre_text = type => { const parse_node = elem => [ "exp", '@' + type + ' ', - ...[...elem.children].map(elem2node), + ...[...elem.children].map(ctx.elem2node), ]; return node => { - const items = utils.pick_body(node).flatMap(node2elem); - const root = pre_stream_create({ + const items = utils.pick_body(node).flatMap(ctx.node2elem); + const root = ctx.pre_stream_create({ classes: [prefix(type)], parse_node, items, @@ -71,11 +77,11 @@ const view = create_view(test_source, ({ const parse_node = elem => [ "exp", '@' + type + ' ', - ...[...elem.children].map(elem2node), + ...[...elem.children].map(ctx.elem2node), ]; return node => { - const items = utils.pick_body(node).flatMap(node2elem); - const root = pre_struct_create({ + const items = utils.pick_body(node).flatMap(ctx.node2elem); + const root = ctx.pre_struct_create({ classes: [prefix(type)], parse_node, items, @@ -97,6 +103,7 @@ const view = create_view(test_source, ({ "mbl": gen_fn_pre_text("mbl"), "mbr": gen_fn_pre_text("mbr"), "code": gen_fn_pre_text_block("code"), +// "sheet": p_sheet(view, ctx), }, }; }); diff --git a/parts/sheet.js b/parts/sheet.js new file mode 100644 index 0000000..81ff565 --- /dev/null +++ b/parts/sheet.js @@ -0,0 +1,48 @@ +/* + * Module: sheet + * Gen 0.1 + */ + +const rxp_whitespace = /[\u0009\u000B\u000C\u0020\u00A0\u000A\u000D\u2028\u2029]+/; + +const nis_whitespace = n => rxp_whitespace.test(n); + +const node_mapper = ({lead, body, tail}, mapper) => { + return nodes => { + const elems = []; + const lnode = nodes[0]; + if (typeof lnode === "string" && nis_whitespace(lnode)) { + elems.push(...lead(lnode)); + nodes.shift(); + } + const tnode = nodes[nodes.length - 1]; + if (typeof tnode === "string" && nis_whitespace(tnode)) { + elems.push(...tail(tnode)); + nodes.pop(); + } + for (const node of nodes) { + if (typeof node === "string" && nis_whitespace(node)) + elems.push(...body(node)); + else + elems.push(...mapper(node)); + } + return nodes; + }; +}; + +export const part = (ed, ctx) => { + const mapper = node_mapper({ + lead: m_hide_token, + body: m_hide_token, + tail: m_hide_token, + }, ); + return node => { + const body = node.slice(2); + const elem = ctx.pre_struct_create({ + classes: ["mn-p-sheet"], + parse_node, // TODO + items: mapper(body), + }); + return elem; + }; +};