mirror of
https://github.com/TxtDot/dalet.git
synced 2024-12-25 20:23:44 +03:00
feat: add typescript lib, add daletl parser, add html converter
This commit is contained in:
parent
dfa42ae830
commit
bc6b6a7db4
10 changed files with 224 additions and 0 deletions
14
libs/typescript/.eslintrc.json
Normal file
14
libs/typescript/.eslintrc.json
Normal file
|
@ -0,0 +1,14 @@
|
|||
{
|
||||
"env": {
|
||||
"browser": true,
|
||||
"es2021": true
|
||||
},
|
||||
"extends": ["eslint:recommended", "plugin:@typescript-eslint/recommended"],
|
||||
"parser": "@typescript-eslint/parser",
|
||||
"parserOptions": {
|
||||
"ecmaVersion": "latest",
|
||||
"sourceType": "module"
|
||||
},
|
||||
"plugins": ["@typescript-eslint"],
|
||||
"rules": {}
|
||||
}
|
0
.gitignore → libs/typescript/.gitignore
vendored
0
.gitignore → libs/typescript/.gitignore
vendored
36
libs/typescript/package.json
Normal file
36
libs/typescript/package.json
Normal file
|
@ -0,0 +1,36 @@
|
|||
{
|
||||
"name": "@txtdot/dalet",
|
||||
"version": "1.0.0-pre0",
|
||||
"description": "Dalet realization in typescript",
|
||||
"main": "dist/lib.js",
|
||||
"types": "dist/lib.d.ts",
|
||||
"files": [
|
||||
"/dist"
|
||||
],
|
||||
"scripts": {
|
||||
"build": "tsc"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+https://github.com/TxtDot/dalet.git"
|
||||
},
|
||||
"keywords": [
|
||||
"dalet",
|
||||
"markup-language",
|
||||
"markup",
|
||||
"language",
|
||||
"web"
|
||||
],
|
||||
"author": "artegoser",
|
||||
"license": "MIT",
|
||||
"bugs": {
|
||||
"url": "https://github.com/TxtDot/dalet/issues"
|
||||
},
|
||||
"homepage": "https://github.com/TxtDot/dalet#readme",
|
||||
"devDependencies": {
|
||||
"tsc": "^2.0.4"
|
||||
},
|
||||
"dependencies": {
|
||||
"@msgpack/msgpack": "3.0.0-beta2"
|
||||
}
|
||||
}
|
33
libs/typescript/pnpm-lock.yaml
generated
Normal file
33
libs/typescript/pnpm-lock.yaml
generated
Normal file
|
@ -0,0 +1,33 @@
|
|||
lockfileVersion: '9.0'
|
||||
|
||||
settings:
|
||||
autoInstallPeers: true
|
||||
excludeLinksFromLockfile: false
|
||||
|
||||
importers:
|
||||
|
||||
.:
|
||||
dependencies:
|
||||
'@msgpack/msgpack':
|
||||
specifier: 3.0.0-beta2
|
||||
version: 3.0.0-beta2
|
||||
devDependencies:
|
||||
tsc:
|
||||
specifier: ^2.0.4
|
||||
version: 2.0.4
|
||||
|
||||
packages:
|
||||
|
||||
'@msgpack/msgpack@3.0.0-beta2':
|
||||
resolution: {integrity: sha512-y+l1PNV0XDyY8sM3YtuMLK5vE3/hkfId+Do8pLo/OPxfxuFAUwcGz3oiiUuV46/aBpwTzZ+mRWVMtlSKbradhw==}
|
||||
engines: {node: '>= 14'}
|
||||
|
||||
tsc@2.0.4:
|
||||
resolution: {integrity: sha512-fzoSieZI5KKJVBYGvwbVZs/J5za84f2lSTLPYf6AGiIf43tZ3GNrI1QzTLcjtyDDP4aLxd46RTZq1nQxe7+k5Q==}
|
||||
hasBin: true
|
||||
|
||||
snapshots:
|
||||
|
||||
'@msgpack/msgpack@3.0.0-beta2': {}
|
||||
|
||||
tsc@2.0.4: {}
|
51
libs/typescript/src/converters/html.ts
Normal file
51
libs/typescript/src/converters/html.ts
Normal file
|
@ -0,0 +1,51 @@
|
|||
import { Root, Tag } from "../daletl/types";
|
||||
|
||||
interface Props {
|
||||
[key: string]: string;
|
||||
}
|
||||
|
||||
function hy(tag: string, body?: string, props?: Props) {
|
||||
return `<${tag} ${
|
||||
props
|
||||
? Object.entries(props)
|
||||
.map(([key, value]) => `${key}="${value}"`)
|
||||
.join(" ")
|
||||
: ""
|
||||
}>${body}</${tag}>`;
|
||||
}
|
||||
|
||||
function comp(
|
||||
name: string,
|
||||
body: string | Tag[],
|
||||
classNames: string,
|
||||
classes: boolean,
|
||||
props: Props = {}
|
||||
): string {
|
||||
let realBody = Array.isArray(body)
|
||||
? body.map((b) => htmlTag(b, classes)).join("")
|
||||
: body;
|
||||
return hy(name, realBody, {
|
||||
class: classes ? classNames : undefined,
|
||||
...props,
|
||||
});
|
||||
}
|
||||
|
||||
function element(tag: Tag, classes: boolean): string {
|
||||
return comp("section", tag.body, "el", classes);
|
||||
}
|
||||
|
||||
function heading(tag: Tag, classes: boolean): string {
|
||||
if (typeof tag.argument !== "number") {
|
||||
return comp("h1", tag.body, "h", classes);
|
||||
}
|
||||
|
||||
return comp(`h${tag.argument}`, tag.body, `h hl${tag.argument}`, classes);
|
||||
}
|
||||
|
||||
function htmlTag(tag: Tag, classes: boolean): string {
|
||||
return [element, heading][tag.id](tag, classes);
|
||||
}
|
||||
|
||||
export function toHtml(root: Root, classes: boolean = true): string {
|
||||
return root.map((t) => htmlTag(t, classes)).join("");
|
||||
}
|
1
libs/typescript/src/converters/main.ts
Normal file
1
libs/typescript/src/converters/main.ts
Normal file
|
@ -0,0 +1 @@
|
|||
export { toHtml } from "./html";
|
64
libs/typescript/src/daletl/main.ts
Normal file
64
libs/typescript/src/daletl/main.ts
Normal file
|
@ -0,0 +1,64 @@
|
|||
import { encode, decode } from "@msgpack/msgpack";
|
||||
import { ParseError, Root, Tag } from "./types";
|
||||
|
||||
export function parseRawTag(raw_tag: any[] | string): Tag {
|
||||
if (typeof raw_tag === "string") {
|
||||
return {
|
||||
id: 0,
|
||||
body: raw_tag,
|
||||
argument: null,
|
||||
};
|
||||
}
|
||||
|
||||
if (Array.isArray(raw_tag)) {
|
||||
if (Array.isArray(raw_tag[0])) {
|
||||
return {
|
||||
id: 0,
|
||||
body: parseRawTagBody(raw_tag),
|
||||
argument: null,
|
||||
};
|
||||
}
|
||||
|
||||
if (typeof raw_tag[0] === "number") {
|
||||
return {
|
||||
id: raw_tag[0],
|
||||
body: parseRawTagBody(raw_tag[1]),
|
||||
argument: raw_tag[3] || null,
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
throw new ParseError("Invalid tag");
|
||||
}
|
||||
|
||||
export function parseRawTagBody(body: string | null | any[]): Tag["body"] {
|
||||
if (typeof body === "string") {
|
||||
return body;
|
||||
}
|
||||
|
||||
if (body === null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
if (Array.isArray(body)) {
|
||||
if (Array.isArray(body[0])) {
|
||||
return body.map(parseRawTag);
|
||||
}
|
||||
|
||||
if (typeof body[0] === "number") {
|
||||
return [parseRawTag(body)];
|
||||
}
|
||||
}
|
||||
|
||||
throw new ParseError("Invalid tag body");
|
||||
}
|
||||
|
||||
export function parse(root_data?: Uint8Array): Root {
|
||||
let root = root_data ? decode(root_data) : [];
|
||||
|
||||
if (!Array.isArray(root)) {
|
||||
throw new ParseError("Daletl root must be array");
|
||||
}
|
||||
|
||||
return root.map(parseRawTag);
|
||||
}
|
14
libs/typescript/src/daletl/types.ts
Normal file
14
libs/typescript/src/daletl/types.ts
Normal file
|
@ -0,0 +1,14 @@
|
|||
export interface Tag {
|
||||
id: number;
|
||||
body: string | null | Tag[];
|
||||
argument: number | string | null;
|
||||
}
|
||||
|
||||
export type Root = Tag[];
|
||||
|
||||
export class ParseError extends Error {
|
||||
constructor(message: string = "Parse error") {
|
||||
super(message);
|
||||
this.name = "ParseError";
|
||||
}
|
||||
}
|
2
libs/typescript/src/lib.ts
Normal file
2
libs/typescript/src/lib.ts
Normal file
|
@ -0,0 +1,2 @@
|
|||
export { parse } from "./daletl/main";
|
||||
export * as converters from "./converters/main";
|
9
libs/typescript/tsconfig.json
Normal file
9
libs/typescript/tsconfig.json
Normal file
|
@ -0,0 +1,9 @@
|
|||
{
|
||||
"compilerOptions": {
|
||||
"module": "commonjs",
|
||||
"target": "es2019",
|
||||
"declaration": true,
|
||||
"outDir": "./dist"
|
||||
},
|
||||
"include": ["src/**/*"]
|
||||
}
|
Loading…
Add table
Reference in a new issue