diff options
| author | Shulhan <ms@kilabit.info> | 2021-08-28 20:23:24 +0700 |
|---|---|---|
| committer | Shulhan <ms@kilabit.info> | 2021-08-28 21:12:26 +0700 |
| commit | 50c57f048eecab68570a0568f20922044935ecca (patch) | |
| tree | fe2f28401145e524fa09a0688ba59c50cf26dbaa | |
| parent | cf678376a91bf58ff4d9c032f96662ca02bdc59b (diff) | |
| download | pakakeh.ts-50c57f048eecab68570a0568f20922044935ecca.tar.xz | |
all: refactoring to follow the coding style in README
* Use snake_case for field, variable, HTML ID, and CSS class names.
* Use camelCase for class, interface, type, function, or method names.
* An exported type or class. interface, type, method, or function name
MUST start with an upper-case letter.
* An exported class, type, interface, or function MUST be prefixed with
"Wui".
| -rw-r--r-- | README.adoc | 12 | ||||
| -rw-r--r-- | editor/editor.d.ts | 75 | ||||
| -rw-r--r-- | editor/editor.js | 595 | ||||
| -rw-r--r-- | editor/editor.ts | 718 | ||||
| -rw-r--r-- | editor/example.html | 2 | ||||
| -rw-r--r-- | notif/example.html | 38 | ||||
| -rw-r--r-- | notif/notif.js | 10 | ||||
| -rw-r--r-- | notif/notif.ts | 12 | ||||
| -rw-r--r-- | vfs/vfs.d.ts | 24 | ||||
| -rw-r--r-- | vfs/vfs.js | 68 | ||||
| -rw-r--r-- | vfs/vfs.ts | 80 |
11 files changed, 777 insertions, 857 deletions
diff --git a/README.adoc b/README.adoc new file mode 100644 index 0000000..fddcc77 --- /dev/null +++ b/README.adoc @@ -0,0 +1,12 @@ += web-user interface (wui) +Shulhan <ms@kilabit.info> + +A HTML web-user interface components built with TypeScript. + +== Coding style + +* Use snake_case for field, variable, HTML ID, and CSS class names. +* Use camelCase for class, interface, type, function, or method names. +* An exported type or class. interface, type, method, or function name MUST + start with an upper-case letter. +* An exported class, type, interface, or function MUST be prefixed with "Wui". diff --git a/editor/editor.d.ts b/editor/editor.d.ts index d0023df..2c716ee 100644 --- a/editor/editor.d.ts +++ b/editor/editor.d.ts @@ -1,56 +1,49 @@ -import { IVfsNode, Response } from "../vfs/vfs"; -export interface IEditor { +import { WuiVfsResponseInterface } from "../vfs/vfs"; +export interface WuiEditorOptions { id: string; is_editable: boolean; - OpenFile(path: string): Response; + OpenFile(path: string): WuiVfsResponseInterface; OnSelection(begin: number, end: number): void; OnSave(content: string): void; } -export declare class Editor { - opts: IEditor; +export declare class WuiEditor { + opts: WuiEditorOptions; id: string; is_editable: boolean; private el; - private activeFile; - private activeText; - private rangeBegin; - private rangeEnd; - private rawLines; - private lines; private sel; + private active_file; + private active_text; + private range_begin; + private range_end; + private raw_lines; + private lines; private range; - private isKeyControl; + private is_key_control; private unre; - constructor(opts: IEditor); + constructor(opts: WuiEditorOptions); GetContent(): string; - GetFile(): IVfsNode; - GetSelectionRange(): SelectionRange; - OpenFile(path: string): Promise<Response>; - clearSelection(): void; - initStyle(): void; - doJoin(changes: ActionChanges): void; - doSplit(changes: ActionChanges): void; - doUpdate(changes: ActionChanges): void; - doRedo(): void; - doUndo(): void; - deleteLine(x: number): void; - insertNewline(x: number, text: string): void; - onClickText(text: HTMLElement): void; - onKeyup(x: number, text: HTMLElement, ev: KeyboardEvent): boolean | undefined; - onKeydown(x: number, elText: HTMLElement, ev: KeyboardEvent): false | undefined; - onMouseDownAtLine(x: number): void; - onMouseUpAtLine(x: number): void; - render(): void; - setCaret(elText: HTMLElement, off: number): void; -} -interface ActionChanges { - currLine: number; - currText: string; - nextLine: number; - nextText: string; + GetSelectionRange(): WuiEditorSelectionRangeInterface; + OnClickText(text: HTMLElement): void; + OnKeyup(x: number, text: HTMLElement, ev: KeyboardEvent): boolean | undefined; + OnKeydown(x: number, el_text: HTMLElement, ev: KeyboardEvent): false | undefined; + OnMouseDownAtLine(x: number): void; + OnMouseUpAtLine(x: number): void; + OpenFile(path: string): Promise<WuiVfsResponseInterface>; + private clearSelection; + private initStyle; + private doJoin; + private doSplit; + private doUpdate; + private doRedo; + private doUndo; + private deleteLine; + private insertNewline; + private render; + private setCaret; } -interface SelectionRange { - BeginAt: number; - EndAt: number; +interface WuiEditorSelectionRangeInterface { + begin_at: number; + end_at: number; } export {}; diff --git a/editor/editor.js b/editor/editor.js index 0749605..3f0bad2 100644 --- a/editor/editor.js +++ b/editor/editor.js @@ -39,188 +39,66 @@ var __generator = (this && this.__generator) || function (thisArg, body) { } }; exports.__esModule = true; -exports.Editor = void 0; -var Editor = /** @class */ (function () { - function Editor(opts) { +exports.WuiEditor = void 0; +var WUI_EDITOR_CLASS = "wui_editor"; +var WUI_EDITOR_CLASS_LINE = "wui_editor_line"; +var WUI_EDITOR_CLASS_LINE_NUMBER = "wui_editor_line_number"; +var WUI_EDITOR_CLASS_LINE_TEXT = "wui_editor_line_text"; +var WuiEditor = /** @class */ (function () { + function WuiEditor(opts) { this.opts = opts; - this.activeFile = null; - this.activeText = null; - this.rangeBegin = -1; - this.rangeEnd = -1; - this.rawLines = []; + this.active_file = null; + this.active_text = null; + this.range_begin = -1; + this.range_end = -1; + this.raw_lines = []; this.lines = []; - this.sel = null; - this.isKeyControl = false; - this.unre = new UndoRedo(); + this.is_key_control = false; + this.unre = new WuiEditorUndoRedo(); this.id = opts.id; this.is_editable = opts.is_editable; - this.el = document.getElementById(opts.id); - if (!this.el) { - console.error("Editor: element ID not found:", opts.id); + var el = document.getElementById(opts.id); + if (!el) { + console.error("WuiEditor: element ID not found:", opts.id); return; } + this.el = el; this.initStyle(); - this.el.classList.add("wui-editor"); - this.sel = window.getSelection(); + this.el.classList.add(WUI_EDITOR_CLASS); + var sel = window.getSelection(); + if (!sel) { + console.error("WuiEditor: cannot get window selection", opts.id); + return; + } + this.sel = sel; this.range = document.createRange(); } // GetContent return content of file. - Editor.prototype.GetContent = function () { + WuiEditor.prototype.GetContent = function () { var content = ""; for (var x = 0; x < this.lines.length; x++) { if (x > 0) { content += "\n"; } - content += this.lines[x].elText.innerText; + content += this.lines[x].el_text.innerText; } return content; }; - Editor.prototype.GetFile = function () { - var node = { - name: "", - path: "" - }; - if (!this.activeFile) { - return node; - } - node.name = this.activeFile.name; - node.path = this.activeFile.path; - node.content = this.GetContent(); - return node; - }; - Editor.prototype.GetSelectionRange = function () { + WuiEditor.prototype.GetSelectionRange = function () { return { - BeginAt: this.rangeBegin, - EndAt: this.rangeEnd + begin_at: this.range_begin, + end_at: this.range_end }; }; - Editor.prototype.OpenFile = function (path) { - return __awaiter(this, void 0, void 0, function () { - var res, content, x, line; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: - if (!this.el) { - return [2 /*return*/, { code: 500 }]; - } - return [4 /*yield*/, this.opts.OpenFile(path)]; - case 1: - res = _a.sent(); - if (!res) { - return [2 /*return*/, { code: 500 }]; - } - if (res.code != 200) { - return [2 /*return*/, res]; - } - if (!res.data) { - return [2 /*return*/, res]; - } - this.activeFile = res.data; - content = this.activeFile.content; - content = content.replace("\r\n", "\n"); - this.rawLines = content.split("\n"); - this.lines = []; - for (x = 0; x < this.rawLines.length; x++) { - line = new EditorLine(x, this.rawLines[x], this); - this.lines.push(line); - } - this.render(); - return [2 /*return*/, res]; - } - }); - }); - }; - Editor.prototype.clearSelection = function () { - if (!this.el) { - return; - } - if (this.rangeEnd == 0) { - return; - } - for (var x = this.rangeBegin; x <= this.rangeEnd; x++) { - this.el.children[x].setAttribute("style", ""); + WuiEditor.prototype.OnClickText = function (text) { + var sel = window.getSelection(); + if (sel) { + this.sel = sel; } - this.rangeBegin = -1; - this.rangeEnd = -1; - }; - Editor.prototype.initStyle = function () { - var style = document.createElement("style"); - style.type = "text/css"; - style.innerText = "\n\t\t\t[contenteditable] {\n\t\t\t\toutline: 0px solid transparent;\n\t\t\t}\n\t\t\t.wui-editor {\n\t\t\t\tbackground-color: cornsilk;\n\t\t\t\tfont-family: monospace;\n\t\t\t\toverflow-y: auto;\n\t\t\t\twidth: 100%;\n\t\t\t}\n\t\t\t.wui-editor-line {\n\t\t\t\tdisplay: block;\n\t\t\t\twidth: 100%;\n\t\t\t}\n\t\t\t.wui-line-number {\n\t\t\t\tcolor: dimgrey;\n\t\t\t\tcursor: pointer;\n\t\t\t\tdisplay: inline-block;\n\t\t\t\tpadding: 4px 10px 4px 4px;\n\t\t\t\ttext-align: right;\n\t\t\t\tuser-select: none;\n\t\t\t\tvertical-align: top;\n\t\t\t\twidth: 30px;\n\t\t\t}\n\t\t\t.wui-line-number:hover {\n\t\t\t\tbackground-color: lightsalmon;\n\t\t\t}\n\t\t\t.wui-line-text {\n\t\t\t\tdisplay: inline-block;\n\t\t\t\tpadding: 4px;\n\t\t\t\tborder-color: lightblue;\n\t\t\t\tborder-width: 0px;\n\t\t\t\tborder-style: solid;\n\t\t\t\twhite-space: pre-wrap;\n\t\t\t\twidth: calc(100% - 60px);\n\t\t\t}\n\t\t"; - document.head.appendChild(style); - }; - Editor.prototype.doJoin = function (changes) { - this.lines[changes.currLine].elText.innerText = changes.currText; - this.deleteLine(changes.nextLine); - this.setCaret(this.lines[changes.currLine].elText, 0); }; - Editor.prototype.doSplit = function (changes) { - this.lines[changes.currLine].elText.innerText = changes.currText; - this.insertNewline(changes.nextLine, changes.nextText); - }; - Editor.prototype.doUpdate = function (changes) { - this.lines[changes.currLine].elText.innerText = changes.currText; - this.setCaret(this.lines[changes.currLine].elText, 0); - }; - Editor.prototype.doRedo = function () { - var act = this.unre.Redo(); - if (!act) { - return; - } - switch (act.kind) { - case "join": - this.doJoin(act.after); - break; - case "split": - this.doSplit(act.after); - break; - case "update": - this.doUpdate(act.after); - break; - } - }; - Editor.prototype.doUndo = function () { - var act = this.unre.Undo(); - if (!act) { - return; - } - switch (act.kind) { - case "join": - this.doSplit(act.before); - break; - case "split": - this.doJoin(act.before); - break; - case "update": - this.doUpdate(act.before); - break; - } - }; - Editor.prototype.deleteLine = function (x) { - this.lines.splice(x, 1); - this.rawLines.splice(x, 1); - // Reset the line numbers. - for (; x < this.lines.length; x++) { - this.lines[x].setNumber(x); - } - this.render(); - }; - Editor.prototype.insertNewline = function (x, text) { - var newline = new EditorLine(x, text, this); - for (var y = x; y < this.lines.length; y++) { - this.lines[y].setNumber(y + 1); - } - this.lines.splice(x, 0, newline); - this.rawLines.splice(x, 0, text); - this.render(); - this.setCaret(newline.elText, 0); - }; - Editor.prototype.onClickText = function (text) { - this.sel = window.getSelection(); - }; - Editor.prototype.onKeyup = function (x, text, ev) { - var textBefore; - var textAfter; + WuiEditor.prototype.OnKeyup = function (x, text, ev) { + var text_before; + var text_after; var off; switch (ev.key) { case "Alt": @@ -243,79 +121,70 @@ var Editor = /** @class */ (function () { case "Shift": break; case "Backspace": - if (!this.sel) { - return false; - } ev.preventDefault(); - textBefore = this.rawLines[x]; - var elTextCurr = this.lines[x].elText; - textAfter = elTextCurr.innerText; + text_before = this.raw_lines[x]; + var el_text_curr = this.lines[x].el_text; + text_after = el_text_curr.innerText; off = this.sel.focusOffset; if (off > 0) { - this.unre.DoUpdate(x, textBefore, textAfter); - this.rawLines[x] = textAfter; - this.setCaret(elTextCurr, off); + this.unre.DoUpdate(x, text_before, text_after); + this.raw_lines[x] = text_after; + this.setCaret(el_text_curr, off); return false; } // Join current line with previous. - var elTextPrev = this.lines[x - 1].elText; - this.unre.DoJoin(x - 1, elTextPrev.innerText, elTextCurr.innerText); - off = elTextPrev.innerText.length; - elTextPrev.innerText = elTextPrev.innerText + elTextCurr.innerText; - this.rawLines[x - 1] = elTextPrev.innerText; + var el_text_prev = this.lines[x - 1].el_text; + this.unre.DoJoin(x - 1, el_text_prev.innerText, el_text_curr.innerText); + off = el_text_prev.innerText.length; + el_text_prev.innerText = el_text_prev.innerText + el_text_curr.innerText; + this.raw_lines[x - 1] = el_text_prev.innerText; // Remove the current line this.deleteLine(x); - this.setCaret(elTextPrev, off); + this.setCaret(el_text_prev, off); return false; case "Control": - this.isKeyControl = false; + this.is_key_control = false; break; case "Enter": ev.preventDefault(); break; case "r": - if (this.isKeyControl) { + if (this.is_key_control) { ev.preventDefault(); return; } break; case "z": - if (this.isKeyControl) { + if (this.is_key_control) { ev.preventDefault(); return; } break; default: - if (this.isKeyControl) { + if (this.is_key_control) { break; } - this.unre.DoUpdate(x, this.rawLines[x], this.lines[x].elText.innerText); - this.rawLines[x] = this.lines[x].elText.innerText; + this.unre.DoUpdate(x, this.raw_lines[x], this.lines[x].el_text.innerText); + this.raw_lines[x] = this.lines[x].el_text.innerText; } return true; }; - Editor.prototype.onKeydown = function (x, elText, ev) { - var textBefore; - var textAfter; + WuiEditor.prototype.OnKeydown = function (x, el_text, ev) { + var text_before; + var text_after; var off; switch (ev.key) { case "ArrowUp": if (x == 0) { return false; } - if (!this.el) { - return false; - } - if (!this.sel) { - return false; - } ev.preventDefault(); - var elText_1 = this.lines[x - 1].elText; + var el_text_1 = this.lines[x - 1].el_text; var off_1 = this.sel.focusOffset; - if (off_1 > elText_1.innerText.length) { - off_1 = elText_1.innerText.length; + if (off_1 > el_text_1.innerText.length) { + off_1 = el_text_1.innerText.length; } - this.setCaret(elText_1, off_1); + this.setCaret(el_text_1, off_1); if (x == 1) { this.el.scrollTop = 0; } @@ -327,45 +196,33 @@ var Editor = /** @class */ (function () { if (x == this.lines.length - 1) { return false; } - if (!this.el) { - return false; - } - if (!this.sel) { - return false; - } ev.preventDefault(); - elText_1 = this.lines[x + 1].elText; + el_text_1 = this.lines[x + 1].el_text; off_1 = this.sel.focusOffset; - if (off_1 > elText_1.innerText.length) { - off_1 = elText_1.innerText.length; + if (off_1 > el_text_1.innerText.length) { + off_1 = el_text_1.innerText.length; } - this.setCaret(elText_1, off_1); + this.setCaret(el_text_1, off_1); x += 2; if (x * 25 >= this.el.clientHeight + this.el.scrollTop) { this.el.scrollTop += 25; } return false; case "Control": - this.isKeyControl = true; + this.is_key_control = true; break; case "Enter": - if (!this.el) { - return; - } - if (!this.sel) { - return; - } ev.preventDefault(); off_1 = this.sel.focusOffset; - var text = this.lines[x].elText.innerText; - textBefore = text.slice(0, off_1); - textAfter = text.slice(off_1, text.length); - this.unre.DoSplit(x, textBefore, textAfter); - this.lines[x].elText.innerText = textBefore; - this.rawLines[x] = textBefore; - this.insertNewline(x + 1, textAfter); - console.log("scroll", x, this.rawLines.length); - if (x + 3 >= this.rawLines.length) { + var text = this.lines[x].el_text.innerText; + text_before = text.slice(0, off_1); + text_after = text.slice(off_1, text.length); + this.unre.DoSplit(x, text_before, text_after); + this.lines[x].el_text.innerText = text_before; + this.raw_lines[x] = text_before; + this.insertNewline(x + 1, text_after); + console.log("scroll", x, this.raw_lines.length); + if (x + 3 >= this.raw_lines.length) { this.el.scrollTop = this.el.scrollHeight; } break; @@ -374,28 +231,25 @@ var Editor = /** @class */ (function () { this.clearSelection(); break; case "Tab": - if (!this.sel) { - return false; - } ev.preventDefault(); - elText_1 = this.lines[x].elText; + el_text_1 = this.lines[x].el_text; off_1 = this.sel.focusOffset; - textBefore = elText_1.innerText; - textAfter = textBefore.slice(0, off_1) + "\t" + textBefore.slice(off_1, textBefore.length); - this.unre.DoUpdate(x, textBefore, textAfter); - elText_1.innerText = textAfter; - this.rawLines[x] = textAfter; - this.setCaret(elText_1, off_1 + 1); + text_before = el_text_1.innerText; + text_after = text_before.slice(0, off_1) + "\t" + text_before.slice(off_1, text_before.length); + this.unre.DoUpdate(x, text_before, text_after); + el_text_1.innerText = text_after; + this.raw_lines[x] = text_after; + this.setCaret(el_text_1, off_1 + 1); break; case "r": - if (this.isKeyControl) { + if (this.is_key_control) { ev.preventDefault(); this.doRedo(); return; } break; case "s": - if (this.isKeyControl) { + if (this.is_key_control) { ev.preventDefault(); ev.stopPropagation(); if (this.opts.OnSave) { @@ -405,7 +259,7 @@ var Editor = /** @class */ (function () { } break; case "z": - if (this.isKeyControl) { + if (this.is_key_control) { ev.preventDefault(); this.doUndo(); return; @@ -413,90 +267,195 @@ var Editor = /** @class */ (function () { break; } }; - Editor.prototype.onMouseDownAtLine = function (x) { - this.rangeBegin = x; + WuiEditor.prototype.OnMouseDownAtLine = function (x) { + this.range_begin = x; }; - Editor.prototype.onMouseUpAtLine = function (x) { - this.rangeEnd = x; - if (this.rangeEnd < this.rangeBegin) { - return; - } - if (!this.el) { + WuiEditor.prototype.OnMouseUpAtLine = function (x) { + this.range_end = x; + if (this.range_end < this.range_begin) { return; } var y = 0; - for (; y < this.rangeBegin; y++) { + for (; y < this.range_begin; y++) { this.el.children[y].setAttribute("style", ""); } - for (; y <= this.rangeEnd; y++) { + for (; y <= this.range_end; y++) { this.el.children[y].setAttribute("style", "background-color:lightsalmon"); } for (; y < this.el.children.length; y++) { this.el.children[y].setAttribute("style", ""); } if (this.opts.OnSelection) { - this.opts.OnSelection(this.rangeBegin, this.rangeEnd); + this.opts.OnSelection(this.range_begin, this.range_end); } }; - Editor.prototype.render = function () { - if (!this.el) { + WuiEditor.prototype.OpenFile = function (path) { + return __awaiter(this, void 0, void 0, function () { + var res, content, x, line; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, this.opts.OpenFile(path)]; + case 1: + res = _a.sent(); + if (!res) { + return [2 /*return*/, { code: 500 }]; + } + if (res.code != 200) { + return [2 /*return*/, res]; + } + if (!res.data) { + return [2 /*return*/, res]; + } + this.active_file = res.data; + content = this.active_file.content; + content = content.replace("\r\n", "\n"); + this.raw_lines = content.split("\n"); + this.lines = []; + for (x = 0; x < this.raw_lines.length; x++) { + line = new WuiEditorLine(x, this.raw_lines[x], this); + this.lines.push(line); + } + this.render(); + return [2 /*return*/, res]; + } + }); + }); + }; + WuiEditor.prototype.clearSelection = function () { + if (this.range_end == 0) { return; } + for (var x = this.range_begin; x <= this.range_end; x++) { + this.el.children[x].setAttribute("style", ""); + } + this.range_begin = -1; + this.range_end = -1; + }; + WuiEditor.prototype.initStyle = function () { + var style = document.createElement("style"); + style.type = "text/css"; + style.innerText = "\n\t\t\t[contenteditable] {\n\t\t\t\toutline: 0px solid transparent;\n\t\t\t}\n\t\t\t." + WUI_EDITOR_CLASS + " {\n\t\t\t\tbackground-color: cornsilk;\n\t\t\t\tfont-family: monospace;\n\t\t\t\toverflow-y: auto;\n\t\t\t\twidth: 100%;\n\t\t\t}\n\t\t\t." + WUI_EDITOR_CLASS_LINE + " {\n\t\t\t\tdisplay: block;\n\t\t\t\twidth: 100%;\n\t\t\t}\n\t\t\t." + WUI_EDITOR_CLASS_LINE_NUMBER + " {\n\t\t\t\tcolor: dimgrey;\n\t\t\t\tcursor: pointer;\n\t\t\t\tdisplay: inline-block;\n\t\t\t\tpadding: 4px 10px 4px 4px;\n\t\t\t\ttext-align: right;\n\t\t\t\tuser-select: none;\n\t\t\t\tvertical-align: top;\n\t\t\t\twidth: 30px;\n\t\t\t}\n\t\t\t." + WUI_EDITOR_CLASS_LINE_NUMBER + ":hover {\n\t\t\t\tbackground-color: lightsalmon;\n\t\t\t}\n\t\t\t." + WUI_EDITOR_CLASS_LINE_TEXT + " {\n\t\t\t\tdisplay: inline-block;\n\t\t\t\tpadding: 4px;\n\t\t\t\tborder-color: lightblue;\n\t\t\t\tborder-width: 0px;\n\t\t\t\tborder-style: solid;\n\t\t\t\twhite-space: pre-wrap;\n\t\t\t\twidth: calc(100% - 60px);\n\t\t\t}\n\t\t"; + document.head.appendChild(style); + }; + WuiEditor.prototype.doJoin = function (changes) { + this.lines[changes.curr_line].el_text.innerText = changes.curr_text; + this.deleteLine(changes.next_line); + this.setCaret(this.lines[changes.curr_line].el_text, 0); + }; + WuiEditor.prototype.doSplit = function (changes) { + this.lines[changes.curr_line].el_text.innerText = changes.curr_text; + this.insertNewline(changes.next_line, changes.next_text); + }; + WuiEditor.prototype.doUpdate = function (changes) { + this.lines[changes.curr_line].el_text.innerText = changes.curr_text; + this.setCaret(this.lines[changes.curr_line].el_text, 0); + }; + WuiEditor.prototype.doRedo = function () { + var act = this.unre.Redo(); + if (!act) { + return; + } + switch (act.kind) { + case "join": + this.doJoin(act.after); + break; + case "split": + this.doSplit(act.after); + break; + case "update": + this.doUpdate(act.after); + break; + } + }; + WuiEditor.prototype.doUndo = function () { + var act = this.unre.Undo(); + if (!act) { + return; + } + switch (act.kind) { + case "join": + this.doSplit(act.before); + break; + case "split": + this.doJoin(act.before); + break; + case "update": + this.doUpdate(act.before); + break; + } + }; + WuiEditor.prototype.deleteLine = function (x) { + this.lines.splice(x, 1); + this.raw_lines.splice(x, 1); + // Reset the line numbers. + for (; x < this.lines.length; x++) { + this.lines[x].setNumber(x); + } + this.render(); + }; + WuiEditor.prototype.insertNewline = function (x, text) { + var newline = new WuiEditorLine(x, text, this); + for (var y = x; y < this.lines.length; y++) { + this.lines[y].setNumber(y + 1); + } + this.lines.splice(x, 0, newline); + this.raw_lines.splice(x, 0, text); + this.render(); + this.setCaret(newline.el_text, 0); + }; + WuiEditor.prototype.render = function () { this.el.innerHTML = ""; for (var _i = 0, _a = this.lines; _i < _a.length; _i++) { var line = _a[_i]; this.el.appendChild(line.el); } }; - Editor.prototype.setCaret = function (elText, off) { - if (!this.sel) { - return; - } - if (elText.firstChild) { - this.range.setStart(elText.firstChild, off); + WuiEditor.prototype.setCaret = function (el_text, off) { + if (el_text.firstChild) { + this.range.setStart(el_text.firstChild, off); } else { - this.range.setStart(elText, off); + this.range.setStart(el_text, off); } this.range.collapse(true); this.sel.removeAllRanges(); this.sel.addRange(this.range); }; - return Editor; + return WuiEditor; }()); -exports.Editor = Editor; -var EditorLine = /** @class */ (function () { - function EditorLine(x, text, ed) { +exports.WuiEditor = WuiEditor; +var WuiEditorLine = /** @class */ (function () { + function WuiEditorLine(x, text, ed) { var _this = this; this.x = x; this.text = text; - this.lineNum = 0; - this.lineNum = x; + this.line_num = 0; + this.line_num = x; this.el = document.createElement("div"); - this.el.classList.add("wui-editor-line"); - this.elNumber = document.createElement("span"); - this.elNumber.classList.add("wui-line-number"); - this.elNumber.innerText = this.lineNum + 1 + ""; - this.elNumber.onmousedown = function (ev) { - ed.onMouseDownAtLine(_this.lineNum); + this.el.classList.add(WUI_EDITOR_CLASS_LINE); + this.el_number = document.createElement("span"); + this.el_number.classList.add(WUI_EDITOR_CLASS_LINE_NUMBER); + this.el_number.innerText = this.line_num + 1 + ""; + this.el_number.onmousedown = function (ev) { + ed.OnMouseDownAtLine(_this.line_num); }; - this.elNumber.onmouseup = function (ev) { - ed.onMouseUpAtLine(_this.lineNum); + this.el_number.onmouseup = function (ev) { + ed.OnMouseUpAtLine(_this.line_num); }; - this.elText = document.createElement("span"); - this.elText.classList.add("wui-line-text"); - this.elText.innerText = text; - this.elText.contentEditable = "true"; - this.elText.onclick = function (ev) { - ed.onClickText(_this.elText); + this.el_text = document.createElement("span"); + this.el_text.classList.add(WUI_EDITOR_CLASS_LINE_TEXT); + this.el_text.innerText = text; + this.el_text.contentEditable = "true"; + this.el_text.onclick = function (ev) { + ed.OnClickText(_this.el_text); }; - this.elText.onkeydown = function (ev) { - return ed.onKeydown(_this.lineNum, _this.elText, ev); + this.el_text.onkeydown = function (ev) { + return ed.OnKeydown(_this.line_num, _this.el_text, ev); }; - this.elText.onkeyup = function (ev) { - return ed.onKeyup(_this.lineNum, _this.elText, ev); + this.el_text.onkeyup = function (ev) { + return ed.OnKeyup(_this.line_num, _this.el_text, ev); }; - this.elText.addEventListener("paste", function (ev) { + this.el_text.addEventListener("paste", function (ev) { if (!ev.clipboardData) { return; } @@ -504,38 +463,38 @@ var EditorLine = /** @class */ (function () { var text = ev.clipboardData.getData("text/plain"); document.execCommand("insertHTML", false, text); }); - this.el.appendChild(this.elNumber); - this.el.appendChild(this.elText); + this.el.appendChild(this.el_number); + this.el.appendChild(this.el_text); } - EditorLine.prototype.setNumber = function (x) { - this.lineNum = x; - this.elNumber.innerText = x + 1 + ""; + WuiEditorLine.prototype.setNumber = function (x) { + this.line_num = x; + this.el_number.innerText = x + 1 + ""; }; - return EditorLine; + return WuiEditorLine; }()); // -// UndoRedo store the state of actions. +// WuiEditorUndoRedo store the state of actions. // -var UndoRedo = /** @class */ (function () { - function UndoRedo() { +var WuiEditorUndoRedo = /** @class */ (function () { + function WuiEditorUndoRedo() { this.idx = 0; this.actions = []; } - UndoRedo.prototype.DoJoin = function (prevLine, prevText, currText) { - var currLine = prevLine + 1; + WuiEditorUndoRedo.prototype.DoJoin = function (prevLine, prevText, curr_text) { + var curr_line = prevLine + 1; var action = { kind: "join", before: { - currLine: prevLine, - currText: prevText, - nextLine: prevLine + 1, - nextText: currText + curr_line: prevLine, + curr_text: prevText, + next_line: prevLine + 1, + next_text: curr_text }, after: { - currLine: prevLine, - currText: prevText + currText, - nextLine: prevLine + 1, - nextText: "" + curr_line: prevLine, + curr_text: prevText + curr_text, + next_line: prevLine + 1, + next_text: "" } }; if (this.actions.length > 0) { @@ -544,20 +503,20 @@ var UndoRedo = /** @class */ (function () { this.actions.push(action); this.idx++; }; - UndoRedo.prototype.DoSplit = function (currLine, currText, nextText) { + WuiEditorUndoRedo.prototype.DoSplit = function (curr_line, curr_text, next_text) { var action = { kind: "split", before: { - currLine: currLine, - currText: currText + nextText, - nextLine: currLine + 1, - nextText: "" + curr_line: curr_line, + curr_text: curr_text + next_text, + next_line: curr_line + 1, + next_text: "" }, after: { - currLine: currLine, - currText: currText, - nextLine: currLine + 1, - nextText: nextText + curr_line: curr_line, + curr_text: curr_text, + next_line: curr_line + 1, + next_text: next_text } }; if (this.actions.length > 0) { @@ -566,20 +525,20 @@ var UndoRedo = /** @class */ (function () { this.actions.push(action); this.idx++; }; - UndoRedo.prototype.DoUpdate = function (lineNum, textBefore, textAfter) { + WuiEditorUndoRedo.prototype.DoUpdate = function (line_num, text_before, text_after) { var action = { kind: "update", before: { - currLine: lineNum, - currText: textBefore, - nextLine: 0, - nextText: "" + curr_line: line_num, + curr_text: text_before, + next_line: 0, + next_text: "" }, after: { - currLine: lineNum, - currText: textAfter, - nextLine: 0, - nextText: "" + curr_line: line_num, + curr_text: text_after, + next_line: 0, + next_text: "" } }; if (this.actions.length > 0) { @@ -588,14 +547,14 @@ var UndoRedo = /** @class */ (function () { this.actions.push(action); this.idx++; }; - UndoRedo.prototype.Undo = function () { + WuiEditorUndoRedo.prototype.Undo = function () { if (this.idx == 0) { return null; } this.idx--; return this.actions[this.idx]; }; - UndoRedo.prototype.Redo = function () { + WuiEditorUndoRedo.prototype.Redo = function () { if (this.idx == this.actions.length) { return null; } @@ -603,6 +562,6 @@ var UndoRedo = /** @class */ (function () { this.idx++; return action; }; - return UndoRedo; + return WuiEditorUndoRedo; }()); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZWRpdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxrRUFBa0U7QUFDbEUseUVBQXlFO0FBQ3pFLDZCQUE2Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBaUI3QjtJQWVDLGdCQUFtQixJQUFhO1FBQWIsU0FBSSxHQUFKLElBQUksQ0FBUztRQVh4QixlQUFVLEdBQW9CLElBQUksQ0FBQTtRQUNsQyxlQUFVLEdBQXVCLElBQUksQ0FBQTtRQUNyQyxlQUFVLEdBQVcsQ0FBQyxDQUFDLENBQUE7UUFDdkIsYUFBUSxHQUFXLENBQUMsQ0FBQyxDQUFBO1FBQ3JCLGFBQVEsR0FBYSxFQUFFLENBQUE7UUFDdkIsVUFBSyxHQUFpQixFQUFFLENBQUE7UUFDeEIsUUFBRyxHQUFxQixJQUFJLENBQUE7UUFFNUIsaUJBQVksR0FBWSxLQUFLLENBQUE7UUFDN0IsU0FBSSxHQUFhLElBQUksUUFBUSxFQUFFLENBQUE7UUFHdEMsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFBO1FBQ2pCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQTtRQUVuQyxJQUFJLENBQUMsRUFBRSxHQUFHLFFBQVEsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFBO1FBQzFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFO1lBQ2IsT0FBTyxDQUFDLEtBQUssQ0FBQywrQkFBK0IsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7WUFDdkQsT0FBTTtTQUNOO1FBRUQsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFBO1FBRWhCLElBQUksQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQTtRQUVuQyxJQUFJLENBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQTtR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
\ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZWRpdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxrRUFBa0U7QUFDbEUseUVBQXlFO0FBQ3pFLDZCQUE2Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRTdCLElBQU0sZ0JBQWdCLEdBQUcsWUFBWSxDQUFDO0FBQ3RDLElBQU0scUJBQXFCLEdBQUcsaUJBQWlCLENBQUM7QUFDaEQsSUFBTSw0QkFBNEIsR0FBRyx3QkFBd0IsQ0FBQztBQUM5RCxJQUFNLDBCQUEwQixHQUFHLHNCQUFzQixDQUFDO0FBaUIxRDtJQWVDLG1CQUFtQixJQUFzQjtRQUF0QixTQUFJLEdBQUosSUFBSSxDQUFrQjtRQVZqQyxnQkFBVyxHQUErQixJQUFJLENBQUE7UUFDOUMsZ0JBQVcsR0FBdUIsSUFBSSxDQUFBO1FBQ3RDLGdCQUFXLEdBQVcsQ0FBQyxDQUFDLENBQUE7UUFDeEIsY0FBUyxHQUFXLENBQUMsQ0FBQyxDQUFBO1FBQ3RCLGNBQVMsR0FBYSxFQUFFLENBQUE7UUFDeEIsVUFBSyxHQUFvQixFQUFFLENBQUE7UUFFM0IsbUJBQWMsR0FBWSxLQUFLLENBQUE7UUFDL0IsU0FBSSxHQUFzQixJQUFJLGlCQUFpQixFQUFFLENBQUE7UUFHeEQsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFBO1FBQ2pCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQTtRQUVuQyxJQUFJLEVBQUUsR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUN6QyxJQUFJLENBQUMsRUFBRSxFQUFFO1lBQ1IsT0FBTyxDQUFDLEtBQUssQ0FBQyxrQ0FBa0MsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7WUFDMUQsT0FBTTtTQUNOO1FBQ0QsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUE7UUFF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
\ No newline at end of file diff --git a/editor/editor.ts b/editor/editor.ts index b227f3c..e97b563 100644 --- a/editor/editor.ts +++ b/editor/editor.ts @@ -2,51 +2,62 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import { IVfsNode, Response } from "../vfs/vfs" +const WUI_EDITOR_CLASS = "wui_editor" +const WUI_EDITOR_CLASS_LINE = "wui_editor_line" +const WUI_EDITOR_CLASS_LINE_NUMBER = "wui_editor_line_number" +const WUI_EDITOR_CLASS_LINE_TEXT = "wui_editor_line_text" -export interface IEditor { +import { WuiVfsNodeInterface, WuiVfsResponseInterface } from "../vfs/vfs" + +export interface WuiEditorOptions { id: string is_editable: boolean - OpenFile(path: string): Response + OpenFile(path: string): WuiVfsResponseInterface // Handler that will be called when user select lines. OnSelection(begin: number, end: number): void - // Handler that will be callend when user press CTRL+S. + // Handler that will be called when user press CTRL+S. OnSave(content: string): void } -export class Editor { +export class WuiEditor { id: string is_editable: boolean - private el: HTMLElement | null - private activeFile: IVfsNode | null = null - private activeText: HTMLElement | null = null - private rangeBegin: number = -1 - private rangeEnd: number = -1 - private rawLines: string[] = [] - private lines: EditorLine[] = [] - private sel: Selection | null = null + private el!: HTMLElement + private sel!: Selection + private active_file: WuiVfsNodeInterface | null = null + private active_text: HTMLElement | null = null + private range_begin: number = -1 + private range_end: number = -1 + private raw_lines: string[] = [] + private lines: WuiEditorLine[] = [] private range!: Range - private isKeyControl: boolean = false - private unre: UndoRedo = new UndoRedo() + private is_key_control: boolean = false + private unre: WuiEditorUndoRedo = new WuiEditorUndoRedo() - constructor(public opts: IEditor) { + constructor(public opts: WuiEditorOptions) { this.id = opts.id this.is_editable = opts.is_editable - this.el = document.getElementById(opts.id) - if (!this.el) { - console.error("Editor: element ID not found:", opts.id) + let el = document.getElementById(opts.id) + if (!el) { + console.error("WuiEditor: element ID not found:", opts.id) return } + this.el = el this.initStyle() - this.el.classList.add("wui-editor") + this.el.classList.add(WUI_EDITOR_CLASS) - this.sel = window.getSelection() + let sel = window.getSelection() + if (!sel) { + console.error("WuiEditor: cannot get window selection", opts.id) + return + } + this.sel = sel this.range = document.createRange() } @@ -57,203 +68,28 @@ export class Editor { if (x > 0) { content += "\n" } - content += this.lines[x].elText.innerText + content += this.lines[x].el_text.innerText } return content } - GetFile(): IVfsNode { - let node: IVfsNode = { - name: "", - path: "", - } - if (!this.activeFile) { - return node - } - node.name = this.activeFile.name - node.path = this.activeFile.path - node.content = this.GetContent() - return node - } - - GetSelectionRange(): SelectionRange { + GetSelectionRange(): WuiEditorSelectionRangeInterface { return { - BeginAt: this.rangeBegin, - EndAt: this.rangeEnd, - } as SelectionRange + begin_at: this.range_begin, + end_at: this.range_end, + } as WuiEditorSelectionRangeInterface } - async OpenFile(path: string): Promise<Response> { - if (!this.el) { - return { code: 500 } as Response - } - - let res = await this.opts.OpenFile(path) - if (!res) { - return { code: 500 } as Response - } - if (res.code != 200) { - return res + OnClickText(text: HTMLElement) { + let sel = window.getSelection() + if (sel) { + this.sel = sel } - if (!res.data) { - return res - } - - this.activeFile = res.data as IVfsNode - - let content = this.activeFile.content as string - content = content.replace("\r\n", "\n") - this.rawLines = content.split("\n") - - this.lines = [] - for (let x = 0; x < this.rawLines.length; x++) { - let line = new EditorLine(x, this.rawLines[x], this) - this.lines.push(line) - } - - this.render() - - return res } - clearSelection() { - if (!this.el) { - return - } - if (this.rangeEnd == 0) { - return - } - for (let x = this.rangeBegin; x <= this.rangeEnd; x++) { - this.el.children[x].setAttribute("style", "") - } - this.rangeBegin = -1 - this.rangeEnd = -1 - } - - initStyle() { - let style = document.createElement("style") - style.type = "text/css" - style.innerText = ` - [contenteditable] { - outline: 0px solid transparent; - } - .wui-editor { - background-color: cornsilk; - font-family: monospace; - overflow-y: auto; - width: 100%; - } - .wui-editor-line { - display: block; - width: 100%; - } - .wui-line-number { - color: dimgrey; - cursor: pointer; - display: inline-block; - padding: 4px 10px 4px 4px; - text-align: right; - user-select: none; - vertical-align: top; - width: 30px; - } - .wui-line-number:hover { - background-color: lightsalmon; - } - .wui-line-text { - display: inline-block; - padding: 4px; - border-color: lightblue; - border-width: 0px; - border-style: solid; - white-space: pre-wrap; - width: calc(100% - 60px); - } - ` - document.head.appendChild(style) - } - - doJoin(changes: ActionChanges) { - this.lines[changes.currLine].elText.innerText = changes.currText - this.deleteLine(changes.nextLine) - this.setCaret(this.lines[changes.currLine].elText, 0) - } - doSplit(changes: ActionChanges) { - this.lines[changes.currLine].elText.innerText = changes.currText - this.insertNewline(changes.nextLine, changes.nextText) - } - doUpdate(changes: ActionChanges) { - this.lines[changes.currLine].elText.innerText = changes.currText - this.setCaret(this.lines[changes.currLine].elText, 0) - } - - doRedo() { - const act = this.unre.Redo() - if (!act) { - return - } - switch (act.kind) { - case "join": - this.doJoin(act.after) - break - case "split": - this.doSplit(act.after) - break - case "update": - this.doUpdate(act.after) - break - } - } - - doUndo() { - const act = this.unre.Undo() - if (!act) { - return - } - switch (act.kind) { - case "join": - this.doSplit(act.before) - break - case "split": - this.doJoin(act.before) - break - case "update": - this.doUpdate(act.before) - break - } - } - - deleteLine(x: number) { - this.lines.splice(x, 1) - this.rawLines.splice(x, 1) - - // Reset the line numbers. - for (; x < this.lines.length; x++) { - this.lines[x].setNumber(x) - } - this.render() - } - - insertNewline(x: number, text: string) { - let newline = new EditorLine(x, text, this) - for (let y = x; y < this.lines.length; y++) { - this.lines[y].setNumber(y + 1) - } - - this.lines.splice(x, 0, newline) - this.rawLines.splice(x, 0, text) - - this.render() - this.setCaret(newline.elText, 0) - } - - onClickText(text: HTMLElement) { - this.sel = window.getSelection() - } - - onKeyup(x: number, text: HTMLElement, ev: KeyboardEvent) { - let textBefore: string - let textAfter: string + OnKeyup(x: number, text: HTMLElement, ev: KeyboardEvent) { + let text_before: string + let text_after: string let off: number switch (ev.key) { @@ -278,40 +114,37 @@ export class Editor { break case "Backspace": - if (!this.sel) { - return false - } ev.preventDefault() - textBefore = this.rawLines[x] - let elTextCurr = this.lines[x].elText - textAfter = elTextCurr.innerText + text_before = this.raw_lines[x] + let el_text_curr = this.lines[x].el_text + text_after = el_text_curr.innerText off = this.sel.focusOffset if (off > 0) { - this.unre.DoUpdate(x, textBefore, textAfter) + this.unre.DoUpdate(x, text_before, text_after) - this.rawLines[x] = textAfter - this.setCaret(elTextCurr, off) + this.raw_lines[x] = text_after + this.setCaret(el_text_curr, off) return false } // Join current line with previous. - let elTextPrev = this.lines[x - 1].elText + let el_text_prev = this.lines[x - 1].el_text - this.unre.DoJoin(x - 1, elTextPrev.innerText, elTextCurr.innerText) + this.unre.DoJoin(x - 1, el_text_prev.innerText, el_text_curr.innerText) - off = elTextPrev.innerText.length - elTextPrev.innerText = elTextPrev.innerText + elTextCurr.innerText - this.rawLines[x - 1] = elTextPrev.innerText + off = el_text_prev.innerText.length + el_text_prev.innerText = el_text_prev.innerText + el_text_curr.innerText + this.raw_lines[x - 1] = el_text_prev.innerText // Remove the current line this.deleteLine(x) - this.setCaret(elTextPrev, off) + this.setCaret(el_text_prev, off) return false case "Control": - this.isKeyControl = false + this.is_key_control = false break case "Enter": @@ -319,32 +152,32 @@ export class Editor { break case "r": - if (this.isKeyControl) { + if (this.is_key_control) { ev.preventDefault() return } break case "z": - if (this.isKeyControl) { + if (this.is_key_control) { ev.preventDefault() return } break default: - if (this.isKeyControl) { + if (this.is_key_control) { break } - this.unre.DoUpdate(x, this.rawLines[x], this.lines[x].elText.innerText) - this.rawLines[x] = this.lines[x].elText.innerText + this.unre.DoUpdate(x, this.raw_lines[x], this.lines[x].el_text.innerText) + this.raw_lines[x] = this.lines[x].el_text.innerText } return true } - onKeydown(x: number, elText: HTMLElement, ev: KeyboardEvent) { - let textBefore: string - let textAfter: string + OnKeydown(x: number, el_text: HTMLElement, ev: KeyboardEvent) { + let text_before: string + let text_after: string let off: number switch (ev.key) { @@ -352,20 +185,14 @@ export class Editor { if (x == 0) { return false } - if (!this.el) { - return false - } - if (!this.sel) { - return false - } ev.preventDefault() - let elText = this.lines[x - 1].elText + let el_text = this.lines[x - 1].el_text let off = this.sel.focusOffset - if (off > elText.innerText.length) { - off = elText.innerText.length + if (off > el_text.innerText.length) { + off = el_text.innerText.length } - this.setCaret(elText, off) + this.setCaret(el_text, off) if (x == 1) { this.el.scrollTop = 0 @@ -378,20 +205,14 @@ export class Editor { if (x == this.lines.length - 1) { return false } - if (!this.el) { - return false - } - if (!this.sel) { - return false - } ev.preventDefault() - elText = this.lines[x + 1].elText + el_text = this.lines[x + 1].el_text off = this.sel.focusOffset - if (off > elText.innerText.length) { - off = elText.innerText.length + if (off > el_text.innerText.length) { + off = el_text.innerText.length } - this.setCaret(elText, off) + this.setCaret(el_text, off) x += 2 if (x * 25 >= this.el.clientHeight + this.el.scrollTop) { @@ -400,31 +221,25 @@ export class Editor { return false case "Control": - this.isKeyControl = true + this.is_key_control = true break case "Enter": - if (!this.el) { - return - } - if (!this.sel) { - return - } ev.preventDefault() off = this.sel.focusOffset - let text = this.lines[x].elText.innerText - textBefore = text.slice(0, off) - textAfter = text.slice(off, text.length) + let text = this.lines[x].el_text.innerText + text_before = text.slice(0, off) + text_after = text.slice(off, text.length) - this.unre.DoSplit(x, textBefore, textAfter) + this.unre.DoSplit(x, text_before, text_after) - this.lines[x].elText.innerText = textBefore - this.rawLines[x] = textBefore + this.lines[x].el_text.innerText = text_before + this.raw_lines[x] = text_before - this.insertNewline(x + 1, textAfter) - console.log("scroll", x, this.rawLines.length) - if (x + 3 >= this.rawLines.length) { + this.insertNewline(x + 1, text_after) + console.log("scroll", x, this.raw_lines.length) + if (x + 3 >= this.raw_lines.length) { this.el.scrollTop = this.el.scrollHeight } break @@ -435,25 +250,22 @@ export class Editor { break case "Tab": - if (!this.sel) { - return false - } ev.preventDefault() - elText = this.lines[x].elText + el_text = this.lines[x].el_text off = this.sel.focusOffset - textBefore = elText.innerText - textAfter = textBefore.slice(0, off) + "\t" + textBefore.slice(off, textBefore.length) + text_before = el_text.innerText + text_after = text_before.slice(0, off) + "\t" + text_before.slice(off, text_before.length) - this.unre.DoUpdate(x, textBefore, textAfter) - elText.innerText = textAfter - this.rawLines[x] = textAfter + this.unre.DoUpdate(x, text_before, text_after) + el_text.innerText = text_after + this.raw_lines[x] = text_after - this.setCaret(elText, off + 1) + this.setCaret(el_text, off + 1) break case "r": - if (this.isKeyControl) { + if (this.is_key_control) { ev.preventDefault() this.doRedo() return @@ -461,7 +273,7 @@ export class Editor { break case "s": - if (this.isKeyControl) { + if (this.is_key_control) { ev.preventDefault() ev.stopPropagation() if (this.opts.OnSave) { @@ -472,7 +284,7 @@ export class Editor { break case "z": - if (this.isKeyControl) { + if (this.is_key_control) { ev.preventDefault() this.doUndo() return @@ -481,51 +293,201 @@ export class Editor { } } - onMouseDownAtLine(x: number) { - this.rangeBegin = x + OnMouseDownAtLine(x: number) { + this.range_begin = x } - onMouseUpAtLine(x: number) { - this.rangeEnd = x - if (this.rangeEnd < this.rangeBegin) { - return - } - if (!this.el) { + OnMouseUpAtLine(x: number) { + this.range_end = x + if (this.range_end < this.range_begin) { return } let y = 0 - for (; y < this.rangeBegin; y++) { + for (; y < this.range_begin; y++) { this.el.children[y].setAttribute("style", "") } - for (; y <= this.rangeEnd; y++) { + for (; y <= this.range_end; y++) { this.el.children[y].setAttribute("style", "background-color:lightsalmon") } for (; y < this.el.children.length; y++) { this.el.children[y].setAttribute("style", "") } if (this.opts.OnSelection) { - this.opts.OnSelection(this.rangeBegin, this.rangeEnd) + this.opts.OnSelection(this.range_begin, this.range_end) + } + } + + async OpenFile(path: string): Promise<WuiVfsResponseInterface> { + let res = await this.opts.OpenFile(path) + if (!res) { + return { code: 500 } as WuiVfsResponseInterface + } + if (res.code != 200) { + return res + } + if (!res.data) { + return res + } + + this.active_file = res.data as WuiVfsNodeInterface + + let content = this.active_file.content as string + content = content.replace("\r\n", "\n") + this.raw_lines = content.split("\n") + + this.lines = [] + for (let x = 0; x < this.raw_lines.length; x++) { + let line = new WuiEditorLine(x, this.raw_lines[x], this) + this.lines.push(line) + } + + this.render() + + return res + } + + private clearSelection() { + if (this.range_end == 0) { + return + } + for (let x = this.range_begin; x <= this.range_end; x++) { + this.el.children[x].setAttribute("style", "") + } + this.range_begin = -1 + this.range_end = -1 + } + + private initStyle() { + let style = document.createElement("style") + style.type = "text/css" + style.innerText = ` + [contenteditable] { + outline: 0px solid transparent; + } + .${WUI_EDITOR_CLASS} { + background-color: cornsilk; + font-family: monospace; + overflow-y: auto; + width: 100%; + } + .${WUI_EDITOR_CLASS_LINE} { + display: block; + width: 100%; + } + .${WUI_EDITOR_CLASS_LINE_NUMBER} { + color: dimgrey; + cursor: pointer; + display: inline-block; + padding: 4px 10px 4px 4px; + text-align: right; + user-select: none; + vertical-align: top; + width: 30px; + } + .${WUI_EDITOR_CLASS_LINE_NUMBER}:hover { + background-color: lightsalmon; + } + .${WUI_EDITOR_CLASS_LINE_TEXT} { + display: inline-block; + padding: 4px; + border-color: lightblue; + border-width: 0px; + border-style: solid; + white-space: pre-wrap; + width: calc(100% - 60px); + } + ` + document.head.appendChild(style) + } + + private doJoin(changes: WuiEditorActionChangesInterface) { + this.lines[changes.curr_line].el_text.innerText = changes.curr_text + this.deleteLine(changes.next_line) + this.setCaret(this.lines[changes.curr_line].el_text, 0) + } + + private doSplit(changes: WuiEditorActionChangesInterface) { + this.lines[changes.curr_line].el_text.innerText = changes.curr_text + this.insertNewline(changes.next_line, changes.next_text) + } + + private doUpdate(changes: WuiEditorActionChangesInterface) { + this.lines[changes.curr_line].el_text.innerText = changes.curr_text + this.setCaret(this.lines[changes.curr_line].el_text, 0) + } + + private doRedo() { + const act = this.unre.Redo() + if (!act) { + return + } + switch (act.kind) { + case "join": + this.doJoin(act.after) + break + case "split": + this.doSplit(act.after) + break + case "update": + this.doUpdate(act.after) + break } } - render() { - if (!this.el) { + private doUndo() { + const act = this.unre.Undo() + if (!act) { return } + switch (act.kind) { + case "join": + this.doSplit(act.before) + break + case "split": + this.doJoin(act.before) + break + case "update": + this.doUpdate(act.before) + break + } + } + + private deleteLine(x: number) { + this.lines.splice(x, 1) + this.raw_lines.splice(x, 1) + + // Reset the line numbers. + for (; x < this.lines.length; x++) { + this.lines[x].setNumber(x) + } + this.render() + } + + private insertNewline(x: number, text: string) { + let newline = new WuiEditorLine(x, text, this) + for (let y = x; y < this.lines.length; y++) { + this.lines[y].setNumber(y + 1) + } + + this.lines.splice(x, 0, newline) + this.raw_lines.splice(x, 0, text) + + this.render() + this.setCaret(newline.el_text, 0) + } + + private render() { this.el.innerHTML = "" for (const line of this.lines) { this.el.appendChild(line.el) } } - setCaret(elText: HTMLElement, off: number) { - if (!this.sel) { - return - } - if (elText.firstChild) { - this.range.setStart(elText.firstChild, off) + private setCaret(el_text: HTMLElement, off: number) { + if (el_text.firstChild) { + this.range.setStart(el_text.firstChild, off) } else { - this.range.setStart(elText, off) + this.range.setStart(el_text, off) } this.range.collapse(true) this.sel.removeAllRanges() @@ -533,45 +495,45 @@ export class Editor { } } -class EditorLine { - private lineNum: number = 0 +class WuiEditorLine { + private line_num: number = 0 el!: HTMLElement - elNumber!: HTMLElement - elText!: HTMLElement + el_number!: HTMLElement + el_text!: HTMLElement - constructor(public x: number, public text: string, ed: Editor) { - this.lineNum = x + constructor(public x: number, public text: string, ed: WuiEditor) { + this.line_num = x this.el = document.createElement("div") - this.el.classList.add("wui-editor-line") + this.el.classList.add(WUI_EDITOR_CLASS_LINE) - this.elNumber = document.createElement("span") - this.elNumber.classList.add("wui-line-number") - this.elNumber.innerText = this.lineNum + 1 + "" + this.el_number = document.createElement("span") + this.el_number.classList.add(WUI_EDITOR_CLASS_LINE_NUMBER) + this.el_number.innerText = this.line_num + 1 + "" - this.elNumber.onmousedown = (ev: MouseEvent) => { - ed.onMouseDownAtLine(this.lineNum) + this.el_number.onmousedown = (ev: MouseEvent) => { + ed.OnMouseDownAtLine(this.line_num) } - this.elNumber.onmouseup = (ev: MouseEvent) => { - ed.onMouseUpAtLine(this.lineNum) + this.el_number.onmouseup = (ev: MouseEvent) => { + ed.OnMouseUpAtLine(this.line_num) } - this.elText = document.createElement("span") - this.elText.classList.add("wui-line-text") - this.elText.innerText = text - this.elText.contentEditable = "true" + this.el_text = document.createElement("span") + this.el_text.classList.add(WUI_EDITOR_CLASS_LINE_TEXT) + this.el_text.innerText = text + this.el_text.contentEditable = "true" - this.elText.onclick = (ev: MouseEvent) => { - ed.onClickText(this.elText) + this.el_text.onclick = (ev: MouseEvent) => { + ed.OnClickText(this.el_text) } - this.elText.onkeydown = (ev: KeyboardEvent) => { - return ed.onKeydown(this.lineNum, this.elText, ev) + this.el_text.onkeydown = (ev: KeyboardEvent) => { + return ed.OnKeydown(this.line_num, this.el_text, ev) } - this.elText.onkeyup = (ev: KeyboardEvent) => { - return ed.onKeyup(this.lineNum, this.elText, ev) + this.el_text.onkeyup = (ev: KeyboardEvent) => { + return ed.OnKeyup(this.line_num, this.el_text, ev) } - this.elText.addEventListener("paste", (ev: ClipboardEvent) => { + this.el_text.addEventListener("paste", (ev: ClipboardEvent) => { if (!ev.clipboardData) { return } @@ -580,40 +542,38 @@ class EditorLine { document.execCommand("insertHTML", false, text) }) - this.el.appendChild(this.elNumber) - this.el.appendChild(this.elText) + this.el.appendChild(this.el_number) + this.el.appendChild(this.el_text) } setNumber(x: number) { - this.lineNum = x - this.elNumber.innerText = x + 1 + "" + this.line_num = x + this.el_number.innerText = x + 1 + "" } } // -// UndoRedo store the state of actions. +// WuiEditorUndoRedo store the state of actions. // -class UndoRedo { - idx: number = 0 - actions: Action[] = [] - - constructor() {} +class WuiEditorUndoRedo { + private idx: number = 0 + private actions: WuiEditorActionInterface[] = [] - DoJoin(prevLine: number, prevText: string, currText: string) { - let currLine = prevLine + 1 - let action: Action = { + DoJoin(prevLine: number, prevText: string, curr_text: string) { + let curr_line = prevLine + 1 + let action: WuiEditorActionInterface = { kind: "join", before: { - currLine: prevLine, - currText: prevText, - nextLine: prevLine + 1, - nextText: currText, + curr_line: prevLine, + curr_text: prevText, + next_line: prevLine + 1, + next_text: curr_text, }, after: { - currLine: prevLine, - currText: prevText + currText, - nextLine: prevLine + 1, - nextText: "", + curr_line: prevLine, + curr_text: prevText + curr_text, + next_line: prevLine + 1, + next_text: "", }, } if (this.actions.length > 0) { @@ -623,20 +583,20 @@ class UndoRedo { this.idx++ } - DoSplit(currLine: number, currText: string, nextText: string) { + DoSplit(curr_line: number, curr_text: string, next_text: string) { let action = { kind: "split", before: { - currLine: currLine, - currText: currText + nextText, - nextLine: currLine + 1, - nextText: "", + curr_line: curr_line, + curr_text: curr_text + next_text, + next_line: curr_line + 1, + next_text: "", }, after: { - currLine: currLine, - currText: currText, - nextLine: currLine + 1, - nextText: nextText, + curr_line: curr_line, + curr_text: curr_text, + next_line: curr_line + 1, + next_text: next_text, }, } if (this.actions.length > 0) { @@ -646,20 +606,20 @@ class UndoRedo { this.idx++ } - DoUpdate(lineNum: number, textBefore: string, textAfter: string) { - const action: Action = { + DoUpdate(line_num: number, text_before: string, text_after: string) { + const action: WuiEditorActionInterface = { kind: "update", before: { - currLine: lineNum, - currText: textBefore, - nextLine: 0, - nextText: "", + curr_line: line_num, + curr_text: text_before, + next_line: 0, + next_text: "", }, after: { - currLine: lineNum, - currText: textAfter, - nextLine: 0, - nextText: "", + curr_line: line_num, + curr_text: text_after, + next_line: 0, + next_text: "", }, } @@ -670,7 +630,7 @@ class UndoRedo { this.idx++ } - Undo(): Action | null { + Undo(): WuiEditorActionInterface | null { if (this.idx == 0) { return null } @@ -678,7 +638,7 @@ class UndoRedo { return this.actions[this.idx] } - Redo(): Action | null { + Redo(): WuiEditorActionInterface | null { if (this.idx == this.actions.length) { return null } @@ -694,20 +654,20 @@ class UndoRedo { // * split: split line using enter // * join: join line using backspace. // -interface Action { +interface WuiEditorActionInterface { kind: string - before: ActionChanges - after: ActionChanges + before: WuiEditorActionChangesInterface + after: WuiEditorActionChangesInterface } -interface ActionChanges { - currLine: number - currText: string - nextLine: number - nextText: string +interface WuiEditorActionChangesInterface { + curr_line: number + curr_text: string + next_line: number + next_text: string } -interface SelectionRange { - BeginAt: number - EndAt: number +interface WuiEditorSelectionRangeInterface { + begin_at: number + end_at: number } diff --git a/editor/example.html b/editor/example.html index 7321386..1c22f3f 100644 --- a/editor/example.html +++ b/editor/example.html @@ -20,7 +20,7 @@ OpenFile: doOpenFile, } - wuiEditor = new Editor(opts) + wuiEditor = new WuiEditor(opts) wuiEditor.OpenFile("/test.aww") } diff --git a/notif/example.html b/notif/example.html index 681a951..e6b12c5 100644 --- a/notif/example.html +++ b/notif/example.html @@ -4,41 +4,37 @@ <meta charset="UTF-8" /> <title>WUI - notif</title> <style> - .test-1 { - width: 80%; + #input_msg { + width: calc(100% - 1em); height: 4em; - border: 2px solid salmon; - background-color: lightsalmon; - margin-bottom: 1em; - } - .test-2 { - width: 80%; - height: 4em; - border: 2px solid silver; - background-color: honeydew; - margin-bottom: 1em; } </style> </head> <body onload="main()"> - <input id="notif.msg"></input> + <textarea id="input_msg"></textarea> <button onclick="notifInfo()">Info</button> - <button onclick="notifError()">Error</button> - - <br/> - <br/> - <div class="test-1"></div> - <div class="test-2"></div> + <button onclick="notifError()">Error</button + <p></p> <script> var exports = {} - let inputMsg = document.getElementById("notif.msg") + let inputMsg = document.getElementById("input_msg") let wuiNotif = null </script> <script src="notif.js"></script> <script> function main() { wuiNotif = new WuiNotif() - inputMsg.value = `test <b>bold</b>` + inputMsg.value = `Hello world, this is a notification with HTML format using <b>bold</b> and <u>underline</u> words.` + + let previewError = document.createElement("div") + previewError.classList.add(`${WUI_NOTIF_CLASS_ERROR}`) + previewError.innerText = `Preview of error style`; + document.body.appendChild(previewError) + + let previewInfo = document.createElement("div") + previewInfo.classList.add(`${WUI_NOTIF_CLASS_INFO}`) + previewInfo.innerText = `Preview of info style`; + document.body.appendChild(previewInfo) } function notifInfo() { wuiNotif.Info(inputMsg.value) diff --git a/notif/notif.js b/notif/notif.js index 084ddfc..4601055 100644 --- a/notif/notif.js +++ b/notif/notif.js @@ -4,9 +4,9 @@ // found in the LICENSE file. exports.__esModule = true; exports.WuiNotif = void 0; -var WUI_NOTIF_ID = "wui-notif"; -var WUI_NOTIF_CLASS_INFO = "wui-notif-info"; -var WUI_NOTIF_CLASS_ERROR = "wui-notif-error"; +var WUI_NOTIF_ID = "wui_notif"; +var WUI_NOTIF_CLASS_INFO = "wui_notif_info"; +var WUI_NOTIF_CLASS_ERROR = "wui_notif_error"; // // WuiNotif implement the HTML interface to display pop-up notification. // The notification can be triggered by calling method Info() or Error(). @@ -46,10 +46,10 @@ var WuiNotif = /** @class */ (function () { WuiNotif.prototype.initStyle = function () { var style = document.createElement("style"); style.type = "text/css"; - style.innerText = "\n\t\t\t#wui-notif {\n\t\t\t\tleft: 10%;\n\t\t\t\tposition: absolute;\n\t\t\t\ttop: 1em;\n\t\t\t\twidth: 80%;\n\t\t\t}\n\t\t\t#wui-notif > ." + WUI_NOTIF_CLASS_INFO + " {\n\t\t\t\tborder: 1px solid silver;\n\t\t\t\tbackground-color: honeydew;\n\t\t\t\tmargin-bottom: 1em;\n\t\t\t\tpadding: 1em;\n\t\t\t}\n\t\t\t#wui-notif > ." + WUI_NOTIF_CLASS_ERROR + " {\n\t\t\t\tborder: 1px solid salmon;\n\t\t\t\tbackground-color: lightsalmon;\n\t\t\t\tmargin-bottom: 1em;\n\t\t\t\tpadding: 1em;\n\t\t\t}\n\t\t"; + style.innerText = "\n\t\t\t#" + WUI_NOTIF_ID + " {\n\t\t\t\tleft: 10%;\n\t\t\t\tposition: absolute;\n\t\t\t\ttop: 1em;\n\t\t\t\twidth: 80%;\n\t\t\t}\n\t\t\t." + WUI_NOTIF_CLASS_INFO + " {\n\t\t\t\tborder: 1px solid silver;\n\t\t\t\tbackground-color: honeydew;\n\t\t\t\tmargin-bottom: 1em;\n\t\t\t\tpadding: 1em;\n\t\t\t}\n\t\t\t." + WUI_NOTIF_CLASS_ERROR + " {\n\t\t\t\tborder: 1px solid salmon;\n\t\t\t\tbackground-color: lightsalmon;\n\t\t\t\tmargin-bottom: 1em;\n\t\t\t\tpadding: 1em;\n\t\t\t}\n\t\t"; document.head.appendChild(style); }; return WuiNotif; }()); exports.WuiNotif = WuiNotif; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90aWYuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJub3RpZi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsa0VBQWtFO0FBQ2xFLHlFQUF5RTtBQUN6RSw2QkFBNkI7OztBQUU3QixJQUFNLFlBQVksR0FBRyxXQUFXLENBQUE7QUFDaEMsSUFBTSxvQkFBb0IsR0FBRyxnQkFBZ0IsQ0FBQTtBQUM3QyxJQUFNLHFCQUFxQixHQUFHLGlCQUFpQixDQUFBO0FBRS9DLEVBQUU7QUFDRix3RUFBd0U7QUFDeEUseUVBQXlFO0FBQ3pFLHNFQUFzRTtBQUN0RSxpQkFBaUI7QUFDakIsRUFBRTtBQUNGO0lBSUM7UUFGUSxZQUFPLEdBQVcsSUFBSSxDQUFBLENBQUMsb0JBQW9CO1FBR2xELElBQUksQ0FBQyxFQUFFLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUN2QyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxZQUFZLENBQUE7UUFFekIsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFBO1FBRWxDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQTtJQUNqQixDQUFDO0lBRUQsb0NBQW9DO0lBQ3BDLHVCQUFJLEdBQUosVUFBSyxHQUFXO1FBQWhCLGlCQVNDO1FBUkEsSUFBSSxJQUFJLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUN4QyxJQUFJLENBQUMsU0FBUyxHQUFHLEdBQUcsQ0FBQTtRQUNwQixJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFBO1FBQ3hDLElBQUksQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFBO1FBRXpCLFVBQVUsQ0FBQztZQUNWLEtBQUksQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQzFCLENBQUMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUE7SUFDakIsQ0FBQztJQUVELGlDQUFpQztJQUNqQyx3QkFBSyxHQUFMLFVBQU0sR0FBVztRQUFqQixpQkFTQztRQVJBLElBQUksSUFBSSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDeEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxHQUFHLENBQUE7UUFDcEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMscUJBQXFCLENBQUMsQ0FBQTtRQUN6QyxJQUFJLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUV6QixVQUFVLENBQUM7WUFDVixLQUFJLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUMxQixDQUFDLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQ2pCLENBQUM7SUFFTyw0QkFBUyxHQUFqQjtRQUNDLElBQUksS0FBSyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDM0MsS0FBSyxDQUFDLElBQUksR0FBRyxVQUFVLENBQUE7UUFDdkIsS0FBSyxDQUFDLFNBQVMsR0FBRyxpSkFPRCxvQkFBb0IscUtBTXBCLHFCQUFxQixxSkFNckMsQ0FBQTtRQUNELFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQ2pDLENBQUM7SUFDRixlQUFDO0FBQUQsQ0FBQyxBQTlERCxJQThEQztBQTlEWSw0QkFBUSJ9
\ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90aWYuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJub3RpZi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsa0VBQWtFO0FBQ2xFLHlFQUF5RTtBQUN6RSw2QkFBNkI7OztBQUU3QixJQUFNLFlBQVksR0FBRyxXQUFXLENBQUE7QUFDaEMsSUFBTSxvQkFBb0IsR0FBRyxnQkFBZ0IsQ0FBQTtBQUM3QyxJQUFNLHFCQUFxQixHQUFHLGlCQUFpQixDQUFBO0FBRS9DLEVBQUU7QUFDRix3RUFBd0U7QUFDeEUseUVBQXlFO0FBQ3pFLHNFQUFzRTtBQUN0RSxpQkFBaUI7QUFDakIsRUFBRTtBQUNGO0lBSUM7UUFGUSxZQUFPLEdBQVcsSUFBSSxDQUFBLENBQUMsb0JBQW9CO1FBR2xELElBQUksQ0FBQyxFQUFFLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUN2QyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxZQUFZLENBQUE7UUFFekIsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFBO1FBRWxDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQTtJQUNqQixDQUFDO0lBRUQsb0NBQW9DO0lBQ3BDLHVCQUFJLEdBQUosVUFBSyxHQUFXO1FBQWhCLGlCQVNDO1FBUkEsSUFBSSxJQUFJLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUN4QyxJQUFJLENBQUMsU0FBUyxHQUFHLEdBQUcsQ0FBQTtRQUNwQixJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFBO1FBQ3hDLElBQUksQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFBO1FBRXpCLFVBQVUsQ0FBQztZQUNWLEtBQUksQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQzFCLENBQUMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUE7SUFDakIsQ0FBQztJQUVELGlDQUFpQztJQUNqQyx3QkFBSyxHQUFMLFVBQU0sR0FBVztRQUFqQixpQkFTQztRQVJBLElBQUksSUFBSSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDeEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxHQUFHLENBQUE7UUFDcEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMscUJBQXFCLENBQUMsQ0FBQTtRQUN6QyxJQUFJLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUV6QixVQUFVLENBQUM7WUFDVixLQUFJLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUMxQixDQUFDLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQ2pCLENBQUM7SUFFTyw0QkFBUyxHQUFqQjtRQUNDLElBQUksS0FBSyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDM0MsS0FBSyxDQUFDLElBQUksR0FBRyxVQUFVLENBQUE7UUFDdkIsS0FBSyxDQUFDLFNBQVMsR0FBRyxjQUNkLFlBQVkscUhBTVosb0JBQW9CLHdKQU1wQixxQkFBcUIscUpBTXhCLENBQUE7UUFDRCxRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUNqQyxDQUFDO0lBQ0YsZUFBQztBQUFELENBQUMsQUE5REQsSUE4REM7QUE5RFksNEJBQVEifQ==
\ No newline at end of file diff --git a/notif/notif.ts b/notif/notif.ts index f3ec4c4..701d31a 100644 --- a/notif/notif.ts +++ b/notif/notif.ts @@ -2,9 +2,9 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -const WUI_NOTIF_ID = "wui-notif" -const WUI_NOTIF_CLASS_INFO = "wui-notif-info" -const WUI_NOTIF_CLASS_ERROR = "wui-notif-error" +const WUI_NOTIF_ID = "wui_notif" +const WUI_NOTIF_CLASS_INFO = "wui_notif_info" +const WUI_NOTIF_CLASS_ERROR = "wui_notif_error" // // WuiNotif implement the HTML interface to display pop-up notification. @@ -53,19 +53,19 @@ export class WuiNotif { let style = document.createElement("style") style.type = "text/css" style.innerText = ` - #wui-notif { + #${WUI_NOTIF_ID} { left: 10%; position: absolute; top: 1em; width: 80%; } - #wui-notif > .${WUI_NOTIF_CLASS_INFO} { + .${WUI_NOTIF_CLASS_INFO} { border: 1px solid silver; background-color: honeydew; margin-bottom: 1em; padding: 1em; } - #wui-notif > .${WUI_NOTIF_CLASS_ERROR} { + .${WUI_NOTIF_CLASS_ERROR} { border: 1px solid salmon; background-color: lightsalmon; margin-bottom: 1em; diff --git a/vfs/vfs.d.ts b/vfs/vfs.d.ts index 3be3f6a..3d18e7d 100644 --- a/vfs/vfs.d.ts +++ b/vfs/vfs.d.ts @@ -1,4 +1,4 @@ -export interface IVfsNode { +export interface WuiVfsNodeInterface { name: string; path: string; is_dir?: boolean; @@ -6,31 +6,31 @@ export interface IVfsNode { mod_time_rfc3339?: string; size?: number; mode?: string; - childs?: IVfsNode[]; + childs?: WuiVfsNodeInterface[]; content?: string; } -export interface Response { +export interface WuiVfsResponseInterface { code: number; message?: string; - data?: IVfsNode | IPathNode; + data?: WuiVfsNodeInterface | WuiPathNodeInterface; } -export interface VfsOptions { +export interface WuiVfsOptions { id: string; - ListNodes: () => IPathNode; + ListNodes: () => WuiPathNodeInterface; OnClickNode(path: string, is_dir: boolean): void; } -export declare class Vfs { - opts: VfsOptions; +export declare class WuiVfs { + opts: WuiVfsOptions; private el; private com_path; private com_list; private path_node; - constructor(opts: VfsOptions); + constructor(opts: WuiVfsOptions); private init; private open; - OpenPath(this: Vfs, path: string): void; + OpenPath(this: WuiVfs, path: string): void; } -declare type IPathNode = { - [key: string]: IVfsNode; +declare type WuiPathNodeInterface = { + [key: string]: WuiVfsNodeInterface; }; export {}; @@ -39,25 +39,25 @@ var __generator = (this && this.__generator) || function (thisArg, body) { } }; exports.__esModule = true; -exports.Vfs = void 0; -var Vfs = /** @class */ (function () { - function Vfs(opts) { +exports.WuiVfs = void 0; +var WuiVfs = /** @class */ (function () { + function WuiVfs(opts) { this.opts = opts; this.path_node = {}; var el = document.getElementById(opts.id); if (!el) { - console.error("Vfs: element id", opts.id, "not found"); + console.error("WuiVfs: element id", opts.id, "not found"); return; } this.el = el; } // // (0) Fetch the list of nodes from remote server and store it in path_node. - // (1) Create the VfsPath - // (2) Create the VfsList + // (1) Create the WuiVfsPath + // (2) Create the WuiVfsList // (3) Open the root "/" // - Vfs.prototype.init = function () { + WuiVfs.prototype.init = function () { return __awaiter(this, void 0, void 0, function () { var res_path_node, key, value, node; var _this = this; @@ -71,7 +71,7 @@ var Vfs = /** @class */ (function () { } for (key in res_path_node) { value = res_path_node[key]; - node = new VfsNode(value, function (node) { + node = new WuiVfsNode(value, function (node) { if (_this.opts.OnClickNode) { _this.opts.OnClickNode(node.path, node.is_dir); } @@ -83,12 +83,12 @@ var Vfs = /** @class */ (function () { } this.el.innerHTML = ""; // (1) - this.com_path = new VfsPath(function (path) { + this.com_path = new WuiVfsPath(function (path) { _this.OpenPath(path); }); this.el.appendChild(this.com_path.el); // (2) - this.com_list = new VfsList(); + this.com_list = new WuiVfsList(); this.el.appendChild(this.com_list.el); // (3) this.open(this.path_node["/"]); @@ -97,25 +97,25 @@ var Vfs = /** @class */ (function () { }); }); }; - Vfs.prototype.open = function (node) { - this.com_path.open(node); - this.com_list.open(node); + WuiVfs.prototype.open = function (node) { + this.com_path.Open(node); + this.com_list.Open(node); }; // OpenPath is a handler that will be called when the directory name on // top of UI clicked. - Vfs.prototype.OpenPath = function (path) { + WuiVfs.prototype.OpenPath = function (path) { var node = this.path_node[path]; if (!node) { - console.error("Vfs: OpenPath: invalid path: ", path); + console.error("WuiVfs: OpenPath: invalid path: ", path); return; } this.open(node); }; - return Vfs; + return WuiVfs; }()); -exports.Vfs = Vfs; -var VfsNode = /** @class */ (function () { - function VfsNode(opts, onClick) { +exports.WuiVfs = WuiVfs; +var WuiVfsNode = /** @class */ (function () { + function WuiVfsNode(opts, onClick) { var _this = this; this.path = opts.path || ""; this.name = opts.name || ""; @@ -128,7 +128,7 @@ var VfsNode = /** @class */ (function () { if (opts.childs !== undefined) { for (var _i = 0, _a = opts.childs; _i < _a.length; _i++) { var c = _a[_i]; - this.childs.push(new VfsNode(c, onClick)); + this.childs.push(new WuiVfsNode(c, onClick)); } } this.el = document.createElement("div"); @@ -148,7 +148,7 @@ var VfsNode = /** @class */ (function () { _this.onMouseOver(_this); }; } - VfsNode.prototype.onMouseOut = function (t) { + WuiVfsNode.prototype.onMouseOut = function (t) { if (this.is_dir) { this.el.style.backgroundColor = "cornsilk"; } @@ -156,19 +156,19 @@ var VfsNode = /** @class */ (function () { t.el.style.backgroundColor = "white"; } }; - VfsNode.prototype.onMouseOver = function (t) { + WuiVfsNode.prototype.onMouseOver = function (t) { t.el.style.backgroundColor = "aliceblue"; }; - return VfsNode; + return WuiVfsNode; }()); -var VfsList = /** @class */ (function () { - function VfsList() { +var WuiVfsList = /** @class */ (function () { + function WuiVfsList() { this.el = document.createElement("div"); this.el.style.borderWidth = "1px"; this.el.style.borderStyle = "solid"; this.el.style.borderColor = "silver"; } - VfsList.prototype.open = function (node) { + WuiVfsList.prototype.Open = function (node) { this.el.innerHTML = ""; if (node.childs === undefined) { return; @@ -178,10 +178,10 @@ var VfsList = /** @class */ (function () { this.el.appendChild(c.el); } }; - return VfsList; + return WuiVfsList; }()); -var VfsPath = /** @class */ (function () { - function VfsPath(onClick) { +var WuiVfsPath = /** @class */ (function () { + function WuiVfsPath(onClick) { this.el = document.createElement("div"); this.el.style.borderWidth = "1px"; this.el.style.borderStyle = "solid"; @@ -189,7 +189,7 @@ var VfsPath = /** @class */ (function () { this.crumbs = []; this.onClick = onClick; } - VfsPath.prototype.open = function (node) { + WuiVfsPath.prototype.Open = function (node) { var _this = this; this.el.innerHTML = ""; this.crumbs = []; @@ -232,12 +232,12 @@ var VfsPath = /** @class */ (function () { _loop_1(x); } }; - VfsPath.prototype.onMouseOut = function (crumb, event) { + WuiVfsPath.prototype.onMouseOut = function (crumb, event) { crumb.style.backgroundColor = "white"; }; - VfsPath.prototype.onMouseOver = function (crumb, event) { + WuiVfsPath.prototype.onMouseOver = function (crumb, event) { crumb.style.backgroundColor = "aliceblue"; }; - return VfsPath; + return WuiVfsPath; }()); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmZzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsidmZzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxrRUFBa0U7QUFDbEUseUVBQXlFO0FBQ3pFLDZCQUE2Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBK0I3QjtJQU1DLGFBQW1CLElBQWdCO1FBQWhCLFNBQUksR0FBSixJQUFJLENBQVk7UUFGM0IsY0FBUyxHQUFhLEVBQUUsQ0FBQTtRQUcvQixJQUFJLEVBQUUsR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUN6QyxJQUFJLENBQUMsRUFBRSxFQUFFO1lBQ1IsT0FBTyxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLFdBQVcsQ0FBQyxDQUFBO1lBQ3RELE9BQU07U0FDTjtRQUNELElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFBO0lBQ2IsQ0FBQztJQUVELEVBQUU7SUFDRiw0RUFBNEU7SUFDNUUseUJBQXlCO0lBQ3pCLHlCQUF5QjtJQUN6Qix3QkFBd0I7SUFDeEIsRUFBRTtJQUNZLGtCQUFJLEdBQWxCOzs7Ozs7NEJBRXFCLHFCQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUE7O3dCQUEzQyxhQUFhLEdBQUcsU0FBMkI7d0JBQy9DLElBQUksQ0FBQyxhQUFhLEVBQUU7NEJBQ25CLHNCQUFNO3lCQUNOO3dCQUVELEtBQVcsR0FBRyxJQUFJLGFBQWEsRUFBRTs0QkFDMUIsS0FBSyxHQUFHLGFBQWEsQ0FBQyxHQUFHLENBQWEsQ0FBQTs0QkFDdEMsSUFBSSxHQUFHLElBQUksT0FBTyxDQUFDLEtBQUssRUFBRSxVQUFDLElBQWE7Z0NBQzdDLElBQUksS0FBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUU7b0NBQzFCLEtBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLEVB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
\ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmZzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsidmZzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxrRUFBa0U7QUFDbEUseUVBQXlFO0FBQ3pFLDZCQUE2Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBK0I3QjtJQU1DLGdCQUFtQixJQUFtQjtRQUFuQixTQUFJLEdBQUosSUFBSSxDQUFlO1FBRjlCLGNBQVMsR0FBZ0IsRUFBRSxDQUFBO1FBR2xDLElBQUksRUFBRSxHQUFHLFFBQVEsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFBO1FBQ3pDLElBQUksQ0FBQyxFQUFFLEVBQUU7WUFDUixPQUFPLENBQUMsS0FBSyxDQUFDLG9CQUFvQixFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsV0FBVyxDQUFDLENBQUE7WUFDekQsT0FBTTtTQUNOO1FBQ0QsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUE7SUFDYixDQUFDO0lBRUQsRUFBRTtJQUNGLDRFQUE0RTtJQUM1RSw0QkFBNEI7SUFDNUIsNEJBQTRCO0lBQzVCLHdCQUF3QjtJQUN4QixFQUFFO0lBQ1kscUJBQUksR0FBbEI7Ozs7Ozs0QkFFcUIscUJBQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFBQTs7d0JBQTNDLGFBQWEsR0FBRyxTQUEyQjt3QkFDL0MsSUFBSSxDQUFDLGFBQWEsRUFBRTs0QkFDbkIsc0JBQU07eUJBQ047d0JBRUQsS0FBVyxHQUFHLElBQUksYUFBYSxFQUFFOzRCQUMxQixLQUFLLEdBQUcsYUFBYSxDQUFDLEdBQUcsQ0FBd0IsQ0FBQTs0QkFDakQsSUFBSSxHQUFHLElBQUksVUFBVSxDQUFDLEtBQUssRUFBRSxVQUFDLElBQWdCO2dDQUNuRCxJQUFJLEtBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFO29DQUMxQixLQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFB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
\ No newline at end of file @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -export interface IVfsNode { +export interface WuiVfsNodeInterface { name: string path: string is_dir?: boolean @@ -11,36 +11,36 @@ export interface IVfsNode { mod_time_rfc3339?: string size?: number mode?: string - childs?: IVfsNode[] + childs?: WuiVfsNodeInterface[] content?: string } -export interface Response { +export interface WuiVfsResponseInterface { code: number message?: string - data?: IVfsNode | IPathNode + data?: WuiVfsNodeInterface | WuiPathNodeInterface } -export interface VfsOptions { +export interface WuiVfsOptions { id: string - ListNodes: () => IPathNode + ListNodes: () => WuiPathNodeInterface // OnClickNode define an handler that will be called everytime a node is // clicked. The is_dir will be true, if the node is a directory. OnClickNode(path: string, is_dir: boolean): void } -export class Vfs { +export class WuiVfs { private el!: HTMLElement - private com_path!: VfsPath - private com_list!: VfsList - private path_node: PathNode = {} + private com_path!: WuiVfsPath + private com_list!: WuiVfsList + private path_node: WuiPathNode = {} - constructor(public opts: VfsOptions) { + constructor(public opts: WuiVfsOptions) { let el = document.getElementById(opts.id) if (!el) { - console.error("Vfs: element id", opts.id, "not found") + console.error("WuiVfs: element id", opts.id, "not found") return } this.el = el @@ -48,8 +48,8 @@ export class Vfs { // // (0) Fetch the list of nodes from remote server and store it in path_node. - // (1) Create the VfsPath - // (2) Create the VfsList + // (1) Create the WuiVfsPath + // (2) Create the WuiVfsList // (3) Open the root "/" // private async init() { @@ -60,8 +60,8 @@ export class Vfs { } for (const key in res_path_node) { - const value = res_path_node[key] as IVfsNode - const node = new VfsNode(value, (node: VfsNode) => { + const value = res_path_node[key] as WuiVfsNodeInterface + const node = new WuiVfsNode(value, (node: WuiVfsNode) => { if (this.opts.OnClickNode) { this.opts.OnClickNode(node.path, node.is_dir) } @@ -75,37 +75,37 @@ export class Vfs { this.el.innerHTML = "" // (1) - this.com_path = new VfsPath((path: string) => { + this.com_path = new WuiVfsPath((path: string) => { this.OpenPath(path) }) this.el.appendChild(this.com_path.el) // (2) - this.com_list = new VfsList() + this.com_list = new WuiVfsList() this.el.appendChild(this.com_list.el) // (3) this.open(this.path_node["/"]) } - private open(node: VfsNode) { - this.com_path.open(node) - this.com_list.open(node) + private open(node: WuiVfsNode) { + this.com_path.Open(node) + this.com_list.Open(node) } // OpenPath is a handler that will be called when the directory name on // top of UI clicked. - public OpenPath(this: Vfs, path: string) { + OpenPath(this: WuiVfs, path: string) { const node = this.path_node[path] if (!node) { - console.error("Vfs: OpenPath: invalid path: ", path) + console.error("WuiVfs: OpenPath: invalid path: ", path) return } this.open(node) } } -class VfsNode implements IVfsNode { +class WuiVfsNode implements WuiVfsNodeInterface { path: string name: string mod_time_epoch: number @@ -113,11 +113,11 @@ class VfsNode implements IVfsNode { size: number mode: string is_dir: boolean - childs: VfsNode[] + childs: WuiVfsNode[] el: HTMLElement - constructor(opts: IVfsNode, onClick: NodeClickHandler) { + constructor(opts: WuiVfsNodeInterface, onClick: NodeClickHandler) { this.path = opts.path || "" this.name = opts.name || "" this.mod_time_epoch = opts.mod_time_epoch || 0 @@ -129,7 +129,7 @@ class VfsNode implements IVfsNode { this.childs = [] if (opts.childs !== undefined) { for (let c of opts.childs) { - this.childs.push(new VfsNode(c, onClick)) + this.childs.push(new WuiVfsNode(c, onClick)) } } @@ -153,19 +153,19 @@ class VfsNode implements IVfsNode { } } - onMouseOut(t: VfsNode) { + onMouseOut(t: WuiVfsNode) { if (this.is_dir) { this.el.style.backgroundColor = "cornsilk" } else { t.el.style.backgroundColor = "white" } } - onMouseOver(t: VfsNode) { + onMouseOver(t: WuiVfsNode) { t.el.style.backgroundColor = "aliceblue" } } -class VfsList { +class WuiVfsList { el: HTMLElement constructor() { @@ -175,7 +175,7 @@ class VfsList { this.el.style.borderColor = "silver" } - open(node: VfsNode) { + Open(node: WuiVfsNode) { this.el.innerHTML = "" if (node.childs === undefined) { @@ -188,7 +188,7 @@ class VfsList { } } -class VfsPath { +class WuiVfsPath { el: HTMLElement private crumbs: string[] private onClick: PathClickHandler @@ -202,7 +202,7 @@ class VfsPath { this.onClick = onClick } - open(node: VfsNode) { + Open(node: WuiVfsNode) { this.el.innerHTML = "" this.crumbs = [] let paths = [] @@ -245,21 +245,21 @@ class VfsPath { } } - onMouseOut(crumb: HTMLElement, event: MouseEvent) { + private onMouseOut(crumb: HTMLElement, event: MouseEvent) { crumb.style.backgroundColor = "white" } - onMouseOver(crumb: HTMLElement, event: MouseEvent) { + private onMouseOver(crumb: HTMLElement, event: MouseEvent) { crumb.style.backgroundColor = "aliceblue" } } -type IPathNode = { - [key: string]: IVfsNode +type WuiPathNode = { + [key: string]: WuiVfsNode } -type PathNode = { - [key: string]: VfsNode +type WuiPathNodeInterface = { + [key: string]: WuiVfsNodeInterface } -type NodeClickHandler = (node: VfsNode) => void +type NodeClickHandler = (node: WuiVfsNode) => void type PathClickHandler = (path: string) => void |
