aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShulhan <ms@kilabit.info>2021-08-28 20:23:24 +0700
committerShulhan <ms@kilabit.info>2021-08-28 21:12:26 +0700
commit50c57f048eecab68570a0568f20922044935ecca (patch)
treefe2f28401145e524fa09a0688ba59c50cf26dbaa
parentcf678376a91bf58ff4d9c032f96662ca02bdc59b (diff)
downloadpakakeh.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.adoc12
-rw-r--r--editor/editor.d.ts75
-rw-r--r--editor/editor.js595
-rw-r--r--editor/editor.ts718
-rw-r--r--editor/example.html2
-rw-r--r--notif/example.html38
-rw-r--r--notif/notif.js10
-rw-r--r--notif/notif.ts12
-rw-r--r--vfs/vfs.d.ts24
-rw-r--r--vfs/vfs.js68
-rw-r--r--vfs/vfs.ts80
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZWRpdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxrRUFBa0U7QUFDbEUseUVBQXlFO0FBQ3pFLDZCQUE2Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRTdCLElBQU0sZ0JBQWdCLEdBQUcsWUFBWSxDQUFDO0FBQ3RDLElBQU0scUJBQXFCLEdBQUcsaUJBQWlCLENBQUM7QUFDaEQsSUFBTSw0QkFBNEIsR0FBRyx3QkFBd0IsQ0FBQztBQUM5RCxJQUFNLDBCQUEwQixHQUFHLHNCQUFzQixDQUFDO0FBaUIxRDtJQWVDLG1CQUFtQixJQUFzQjtRQUF0QixTQUFJLEdBQUosSUFBSSxDQUFrQjtRQVZqQyxnQkFBVyxHQUErQixJQUFJLENBQUE7UUFDOUMsZ0JBQVcsR0FBdUIsSUFBSSxDQUFBO1FBQ3RDLGdCQUFXLEdBQVcsQ0FBQyxDQUFDLENBQUE7UUFDeEIsY0FBUyxHQUFXLENBQUMsQ0FBQyxDQUFBO1FBQ3RCLGNBQVMsR0FBYSxFQUFFLENBQUE7UUFDeEIsVUFBSyxHQUFvQixFQUFFLENBQUE7UUFFM0IsbUJBQWMsR0FBWSxLQUFLLENBQUE7UUFDL0IsU0FBSSxHQUFzQixJQUFJLGlCQUFpQixFQUFFLENBQUE7UUFHeEQsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFBO1FBQ2pCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQTtRQUVuQyxJQUFJLEVBQUUsR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUN6QyxJQUFJLENBQUMsRUFBRSxFQUFFO1lBQ1IsT0FBTyxDQUFDLEtBQUssQ0FBQyxrQ0FBa0MsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7WUFDMUQsT0FBTTtTQUNOO1FBQ0QsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUE7UUFFWixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUE7UUFFaEIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLENBQUE7UUFFdkMsSUFBSSxHQUFHLEdBQUcsTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFBO1FBQy9CLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDVCxPQUFPLENBQUMsS0FBSyxDQUFDLHdDQUF3QyxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtZQUNoRSxPQUFNO1NBQ047UUFDRCxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQTtRQUNkLElBQUksQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFBO0lBQ3BDLENBQUM7SUFFRCxxQ0FBcUM7SUFDckMsOEJBQVUsR0FBVjtRQUNDLElBQUksT0FBTyxHQUFHLEVBQUUsQ0FBQTtRQUNoQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDM0MsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUNWLE9BQU8sSUFBSSxJQUFJLENBQUE7YUFDZjtZQUNELE9BQU8sSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUE7U0FDMUM7UUFDRCxPQUFPLE9BQU8sQ0FBQTtJQUNmLENBQUM7SUFFRCxxQ0FBaUIsR0FBakI7UUFDQyxPQUFPO1lBQ04sUUFBUSxFQUFFLElBQUksQ0FBQyxXQUFXO1lBQzFCLE1BQU0sRUFBRSxJQUFJLENBQUMsU0FBUztTQUNjLENBQUE7SUFDdEMsQ0FBQztJQUVELCtCQUFXLEdBQVgsVUFBWSxJQUFpQjtRQUM1QixJQUFJLEdBQUcsR0FBRyxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUE7UUFDL0IsSUFBSSxHQUFHLEVBQUU7WUFDUixJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQTtTQUNkO0lBQ0YsQ0FBQztJQUVELDJCQUFPLEdBQVAsVUFBUSxDQUFTLEVBQUUsSUFBaUIsRUFBRSxFQUFpQjtRQUN0RCxJQUFJLFdBQW1CLENBQUE7UUFDdkIsSUFBSSxVQUFrQixDQUFBO1FBQ3RCLElBQUksR0FBVyxDQUFBO1FBRWYsUUFBUSxFQUFFLENBQUMsR0FBRyxFQUFFO1lBQ2YsS0FBSyxLQUFLLENBQUM7WUFDWCxLQUFLLFdBQVcsQ0FBQztZQUNqQixLQUFLLFdBQVcsQ0FBQztZQUNqQixLQUFLLFlBQVksQ0FBQztZQUNsQixLQUFLLFNBQVMsQ0FBQztZQUNmLEtBQUssVUFBVSxDQUFDO1lBQ2hCLEtBQUssYUFBYSxDQUFDO1lBQ25CLEtBQUssUUFBUSxDQUFDO1lBQ2QsS0FBSyxLQUFLLENBQUM7WUFDWCxLQUFLLE1BQU0sQ0FBQztZQUNaLEtBQUssUUFBUSxDQUFDO1lBQ2QsS0FBSyxJQUFJLENBQUM7WUFDVixLQUFLLFVBQVUsQ0FBQztZQUNoQixLQUFLLFFBQVEsQ0FBQztZQUNkLEtBQUssT0FBTyxDQUFDO1lBQ2IsS0FBSyxhQUFhLENBQUM7WUFDbkIsS0FBSyxZQUFZLENBQUM7WUFDbEIsS0FBSyxPQUFPO2dCQUNYLE1BQUs7WUFFTixLQUFLLFdBQVc7Z0JBQ2YsRUFBRSxDQUFDLGNBQWMsRUFBRSxDQUFBO2dCQUVuQixXQUFXLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtnQkFDL0IsSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUE7Z0JBQ3hDLFVBQVUsR0FBRyxZQUFZLENBQUMsU0FBUyxDQUFBO2dCQUVuQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUE7Z0JBQzFCLElBQUksR0FBRyxHQUFHLENBQUMsRUFBRTtvQkFDWixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsV0FBVyxFQUFFLFVBQVUsQ0FBQyxDQUFBO29CQUU5QyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQTtvQkFDOUIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLEVBQUUsR0FBRyxDQUFDLENBQUE7b0JBQ2hDLE9BQU8sS0FBSyxDQUFBO2lCQUNaO2dCQUVELG1DQUFtQztnQkFDbkMsSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFBO2dCQUU1QyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLFlBQVksQ0FBQyxTQUFTLEVBQUUsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFBO2dCQUV2RSxHQUFHLEdBQUcsWUFBWSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUE7Z0JBQ25DLFlBQVksQ0FBQyxTQUFTLEdBQUcsWUFBWSxDQUFDLFNBQVMsR0FBRyxZQUFZLENBQUMsU0FBUyxDQUFBO2dCQUN4RSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxZQUFZLENBQUMsU0FBUyxDQUFBO2dCQUU5QywwQkFBMEI7Z0JBQzFCLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUE7Z0JBQ2xCLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxFQUFFLEdBQUcsQ0FBQyxDQUFBO2dCQUNoQyxPQUFPLEtBQUssQ0FBQTtZQUViLEtBQUssU0FBUztnQkFDYixJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQTtnQkFDM0IsTUFBSztZQUVOLEtBQUssT0FBTztnQkFDWCxFQUFFLENBQUMsY0FBYyxFQUFFLENBQUE7Z0JBQ25CLE1BQUs7WUFFTixLQUFLLEdBQUc7Z0JBQ1AsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFO29CQUN4QixFQUFFLENBQUMsY0FBYyxFQUFFLENBQUE7b0JBQ25CLE9BQU07aUJBQ047Z0JBQ0QsTUFBSztZQUVOLEtBQUssR0FBRztnQkFDUCxJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUU7b0JBQ3hCLEVBQUUsQ0FBQyxjQUFjLEVBQUUsQ0FBQTtvQkFDbkIsT0FBTTtpQkFDTjtnQkFDRCxNQUFLO1lBRU47Z0JBQ0MsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFO29CQUN4QixNQUFLO2lCQUNMO2dCQUNELElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFBO2dCQUN6RSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQTtTQUNwRDtRQUNELE9BQU8sSUFBSSxDQUFBO0lBQ1osQ0FBQztJQUVELDZCQUFTLEdBQVQsVUFBVSxDQUFTLEVBQUUsT0FBb0IsRUFBRSxFQUFpQjtRQUMzRCxJQUFJLFdBQW1CLENBQUE7UUFDdkIsSUFBSSxVQUFrQixDQUFBO1FBQ3RCLElBQUksR0FBVyxDQUFBO1FBRWYsUUFBUSxFQUFFLENBQUMsR0FBRyxFQUFFO1lBQ2YsS0FBSyxTQUFTO2dCQUNiLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRTtvQkFDWCxPQUFPLEtBQUssQ0FBQTtpQkFDWjtnQkFDRCxFQUFFLENBQUMsY0FBYyxFQUFFLENBQUE7Z0JBRW5CLElBQUksU0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQTtnQkFDdkMsSUFBSSxLQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUE7Z0JBQzlCLElBQUksS0FBRyxHQUFHLFNBQU8sQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFO29CQUNuQyxLQUFHLEdBQUcsU0FBTyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUE7aUJBQzlCO2dCQUNELElBQUksQ0FBQyxRQUFRLENBQUMsU0FBTyxFQUFFLEtBQUcsQ0FBQyxDQUFBO2dCQUUzQixJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUU7b0JBQ1gsSUFBSSxDQUFDLEVBQUUsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFBO2lCQUNyQjtxQkFBTSxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxTQUFTLEVBQUU7b0JBQ3RDLElBQUksQ0FBQyxFQUFFLENBQUMsU0FBUyxJQUFJLEVBQUUsQ0FBQTtpQkFDdkI7Z0JBQ0QsT0FBTyxLQUFLLENBQUE7WUFFYixLQUFLLFdBQVc7Z0JBQ2YsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO29CQUMvQixPQUFPLEtBQUssQ0FBQTtpQkFDWjtnQkFDRCxFQUFFLENBQUMsY0FBYyxFQUFFLENBQUE7Z0JBRW5CLFNBQU8sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUE7Z0JBQ25DLEtBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQTtnQkFDMUIsSUFBSSxLQUFHLEdBQUcsU0FBTyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUU7b0JBQ25DLEtBQUcsR0FBRyxTQUFPLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQTtpQkFDOUI7Z0JBQ0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFPLEVBQUUsS0FBRyxDQUFDLENBQUE7Z0JBRTNCLENBQUMsSUFBSSxDQUFDLENBQUE7Z0JBQ04sSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLElBQUksQ0FBQyxFQUFFLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsU0FBUyxFQUFFO29CQUN2RCxJQUFJLENBQUMsRUFBRSxDQUFDLFNBQVMsSUFBSSxFQUFFLENBQUE7aUJBQ3ZCO2dCQUNELE9BQU8sS0FBSyxDQUFBO1lBRWIsS0FBSyxTQUFTO2dCQUNiLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFBO2dCQUMxQixNQUFLO1lBRU4sS0FBSyxPQUFPO2dCQUNYLEVBQUUsQ0FBQyxjQUFjLEVBQUUsQ0FBQTtnQkFFbkIsS0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFBO2dCQUMxQixJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUE7Z0JBQzFDLFdBQVcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxLQUFHLENBQUMsQ0FBQTtnQkFDaEMsVUFBVSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBRyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQTtnQkFFekMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxVQUFVLENBQUMsQ0FBQTtnQkFFN0MsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxHQUFHLFdBQVcsQ0FBQTtnQkFDN0MsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxXQUFXLENBQUE7Z0JBRS9CLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQTtnQkFDckMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUE7Z0JBQy9DLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRTtvQkFDbkMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUE7aUJBQ3hDO2dCQUNELE1BQUs7WUFFTixLQUFLLFFBQVE7Z0JBQ1osRUFBRSxDQUFDLGNBQWMsRUFBRSxDQUFBO2dCQUNuQixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUE7Z0JBQ3JCLE1BQUs7WUFFTixLQUFLLEtBQUs7Z0JBQ1QsRUFBRSxDQUFDLGNBQWMsRUFBRSxDQUFBO2dCQUVuQixTQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUE7Z0JBQy9CLEtBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQTtnQkFDMUIsV0FBVyxHQUFHLFNBQU8sQ0FBQyxTQUFTLENBQUE7Z0JBQy9CLFVBQVUsR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxLQUFHLENBQUMsR0FBRyxJQUFJLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxLQUFHLEVBQUUsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFBO2dCQUUxRixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsV0FBVyxFQUFFLFVBQVUsQ0FBQyxDQUFBO2dCQUM5QyxTQUFPLENBQUMsU0FBUyxHQUFHLFVBQVUsQ0FBQTtnQkFDOUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxVQUFVLENBQUE7Z0JBRTlCLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBTyxFQUFFLEtBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQTtnQkFDL0IsTUFBSztZQUVOLEtBQUssR0FBRztnQkFDUCxJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUU7b0JBQ3hCLEVBQUUsQ0FBQyxjQUFjLEVBQUUsQ0FBQTtvQkFDbkIsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFBO29CQUNiLE9BQU07aUJBQ047Z0JBQ0QsTUFBSztZQUVOLEtBQUssR0FBRztnQkFDUCxJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUU7b0JBQ3hCLEVBQUUsQ0FBQyxjQUFjLEVBQUUsQ0FBQTtvQkFDbkIsRUFBRSxDQUFDLGVBQWUsRUFBRSxDQUFBO29CQUNwQixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFO3dCQUNyQixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQTtxQkFDbkM7b0JBQ0QsT0FBTyxLQUFLLENBQUE7aUJBQ1o7Z0JBQ0QsTUFBSztZQUVOLEtBQUssR0FBRztnQkFDUCxJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUU7b0JBQ3hCLEVBQUUsQ0FBQyxjQUFjLEVBQUUsQ0FBQTtvQkFDbkIsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFBO29CQUNiLE9BQU07aUJBQ047Z0JBQ0QsTUFBSztTQUNOO0lBQ0YsQ0FBQztJQUVELHFDQUFpQixHQUFqQixVQUFrQixDQUFTO1FBQzFCLElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFBO0lBQ3JCLENBQUM7SUFFRCxtQ0FBZSxHQUFmLFVBQWdCLENBQVM7UUFDeEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUE7UUFDbEIsSUFBSSxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDdEMsT0FBTTtTQUNOO1FBQ0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQ1QsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNqQyxJQUFJLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFBO1NBQzdDO1FBQ0QsT0FBTyxDQUFDLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNoQyxJQUFJLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLDhCQUE4QixDQUFDLENBQUE7U0FDekU7UUFDRCxPQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDeEMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQTtTQUM3QztRQUNELElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDMUIsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUE7U0FDdkQ7SUFDRixDQUFDO0lBRUssNEJBQVEsR0FBZCxVQUFlLElBQVk7Ozs7OzRCQUNoQixxQkFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBQTs7d0JBQXBDLEdBQUcsR0FBRyxTQUE4Qjt3QkFDeEMsSUFBSSxDQUFDLEdBQUcsRUFBRTs0QkFDVCxzQkFBTyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQTZCLEVBQUE7eUJBQy9DO3dCQUNELElBQUksR0FBRyxDQUFDLElBQUksSUFBSSxHQUFHLEVBQUU7NEJBQ3BCLHNCQUFPLEdBQUcsRUFBQTt5QkFDVjt3QkFDRCxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRTs0QkFDZCxzQkFBTyxHQUFHLEVBQUE7eUJBQ1Y7d0JBRUQsSUFBSSxDQUFDLFdBQVcsR0FBRyxHQUFHLENBQUMsSUFBMkIsQ0FBQTt3QkFFOUMsT0FBTyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBaUIsQ0FBQTt3QkFDaEQsT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFBO3dCQUN2QyxJQUFJLENBQUMsU0FBUyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUE7d0JBRXBDLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFBO3dCQUNmLEtBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7NEJBQzNDLElBQUksR0FBRyxJQUFJLGFBQWEsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQTs0QkFDeEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7eUJBQ3JCO3dCQUVELElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQTt3QkFFYixzQkFBTyxHQUFHLEVBQUE7Ozs7S0FDVjtJQUVPLGtDQUFjLEdBQXRCO1FBQ0MsSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLENBQUMsRUFBRTtZQUN4QixPQUFNO1NBQ047UUFDRCxLQUFLLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDeEQsSUFBSSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQTtTQUM3QztRQUNELElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDLENBQUE7UUFDckIsSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQTtJQUNwQixDQUFDO0lBRU8sNkJBQVMsR0FBakI7UUFDQyxJQUFJLEtBQUssR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBQzNDLEtBQUssQ0FBQyxJQUFJLEdBQUcsVUFBVSxDQUFBO1FBQ3ZCLEtBQUssQ0FBQyxTQUFTLEdBQUcsMkZBSWQsZ0JBQWdCLG1KQU1oQixxQkFBcUIsMkVBSXJCLDRCQUE0QiwrUEFVNUIsNEJBQTRCLDBFQUc1QiwwQkFBMEIsNE9BUzdCLENBQUE7UUFDRCxRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUNqQyxDQUFDO0lBRU8sMEJBQU0sR0FBZCxVQUFlLE9BQXdDO1FBQ3RELElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQTtRQUNuRSxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQTtRQUNsQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQTtJQUN4RCxDQUFDO0lBRU8sMkJBQU8sR0FBZixVQUFnQixPQUF3QztRQUN2RCxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUE7UUFDbkUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQTtJQUN6RCxDQUFDO0lBRU8sNEJBQVEsR0FBaEIsVUFBaUIsT0FBd0M7UUFDeEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFBO1FBQ25FLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFBO0lBQ3hELENBQUM7SUFFTywwQkFBTSxHQUFkO1FBQ0MsSUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQTtRQUM1QixJQUFJLENBQUMsR0FBRyxFQUFFO1lBQ1QsT0FBTTtTQUNOO1FBQ0QsUUFBUSxHQUFHLENBQUMsSUFBSSxFQUFFO1lBQ2pCLEtBQUssTUFBTTtnQkFDVixJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQTtnQkFDdEIsTUFBSztZQUNOLEtBQUssT0FBTztnQkFDWCxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQTtnQkFDdkIsTUFBSztZQUNOLEtBQUssUUFBUTtnQkFDWixJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQTtnQkFDeEIsTUFBSztTQUNOO0lBQ0YsQ0FBQztJQUVPLDBCQUFNLEdBQWQ7UUFDQyxJQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFBO1FBQzVCLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDVCxPQUFNO1NBQ047UUFDRCxRQUFRLEdBQUcsQ0FBQyxJQUFJLEVBQUU7WUFDakIsS0FBSyxNQUFNO2dCQUNWLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFBO2dCQUN4QixNQUFLO1lBQ04sS0FBSyxPQUFPO2dCQUNYLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFBO2dCQUN2QixNQUFLO1lBQ04sS0FBSyxRQUFRO2dCQUNaLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFBO2dCQUN6QixNQUFLO1NBQ047SUFDRixDQUFDO0lBRU8sOEJBQVUsR0FBbEIsVUFBbUIsQ0FBUztRQUMzQixJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7UUFDdkIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO1FBRTNCLDBCQUEwQjtRQUMxQixPQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNsQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtTQUMxQjtRQUNELElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQTtJQUNkLENBQUM7SUFFTyxpQ0FBYSxHQUFyQixVQUFzQixDQUFTLEVBQUUsSUFBWTtRQUM1QyxJQUFJLE9BQU8sR0FBRyxJQUFJLGFBQWEsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFBO1FBQzlDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUMzQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUE7U0FDOUI7UUFFRCxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFBO1FBQ2hDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUE7UUFFakMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFBO1FBQ2IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFBO0lBQ2xDLENBQUM7SUFFTywwQkFBTSxHQUFkO1FBQ0MsSUFBSSxDQUFDLEVBQUUsQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFBO1FBQ3RCLEtBQW1CLFVBQVUsRUFBVixLQUFBLElBQUksQ0FBQyxLQUFLLEVBQVYsY0FBVSxFQUFWLElBQVUsRUFBRTtZQUExQixJQUFNLElBQUksU0FBQTtZQUNkLElBQUksQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtTQUM1QjtJQUNGLENBQUM7SUFFTyw0QkFBUSxHQUFoQixVQUFpQixPQUFvQixFQUFFLEdBQVc7UUFDakQsSUFBSSxPQUFPLENBQUMsVUFBVSxFQUFFO1lBQ3ZCLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsR0FBRyxDQUFDLENBQUE7U0FDNUM7YUFBTTtZQUNOLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQTtTQUNqQztRQUNELElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQ3pCLElBQUksQ0FBQyxHQUFHLENBQUMsZUFBZSxFQUFFLENBQUE7UUFDMUIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQzlCLENBQUM7SUFDRixnQkFBQztBQUFELENBQUMsQUF2ZEQsSUF1ZEM7QUF2ZFksOEJBQVM7QUF5ZHRCO0lBTUMsdUJBQW1CLENBQVMsRUFBUyxJQUFZLEVBQUUsRUFBYTtRQUFoRSxpQkEyQ0M7UUEzQ2tCLE1BQUMsR0FBRCxDQUFDLENBQVE7UUFBUyxTQUFJLEdBQUosSUFBSSxDQUFRO1FBTHpDLGFBQVEsR0FBVyxDQUFDLENBQUE7UUFNM0IsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUE7UUFDakIsSUFBSSxDQUFDLEVBQUUsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQ3ZDLElBQUksQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFBO1FBRTVDLElBQUksQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUMvQyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsNEJBQTRCLENBQUMsQ0FBQTtRQUMxRCxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUE7UUFFakQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLEdBQUcsVUFBQyxFQUFjO1lBQzNDLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFJLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDcEMsQ0FBQyxDQUFBO1FBQ0QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEdBQUcsVUFBQyxFQUFjO1lBQ3pDLEVBQUUsQ0FBQyxlQUFlLENBQUMsS0FBSSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQ2xDLENBQUMsQ0FBQTtRQUVELElBQUksQ0FBQyxPQUFPLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUM3QyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsMEJBQTBCLENBQUMsQ0FBQTtRQUN0RCxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUE7UUFDN0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxlQUFlLEdBQUcsTUFBTSxDQUFBO1FBRXJDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxHQUFHLFVBQUMsRUFBYztZQUNyQyxFQUFFLENBQUMsV0FBVyxDQUFDLEtBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUM3QixDQUFDLENBQUE7UUFFRCxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsR0FBRyxVQUFDLEVBQWlCO1lBQzFDLE9BQU8sRUFBRSxDQUFDLFNBQVMsQ0FBQyxLQUFJLENBQUMsUUFBUSxFQUFFLEtBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUE7UUFDckQsQ0FBQyxDQUFBO1FBQ0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEdBQUcsVUFBQyxFQUFpQjtZQUN4QyxPQUFPLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSSxDQUFDLFFBQVEsRUFBRSxLQUFJLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFBO1FBQ25ELENBQUMsQ0FBQTtRQUVELElBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLFVBQUMsRUFBa0I7WUFDekQsSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLEVBQUU7Z0JBQ3RCLE9BQU07YUFDTjtZQUNELEVBQUUsQ0FBQyxjQUFjLEVBQUUsQ0FBQTtZQUNuQixJQUFNLElBQUksR0FBRyxFQUFFLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQTtZQUNuRCxRQUFRLENBQUMsV0FBVyxDQUFDLFlBQVksRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUE7UUFDaEQsQ0FBQyxDQUFDLENBQUE7UUFFRixJQUFJLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUE7UUFDbkMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQ2xDLENBQUM7SUFFRCxpQ0FBUyxHQUFULFVBQVUsQ0FBUztRQUNsQixJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQTtRQUNqQixJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQTtJQUN0QyxDQUFDO0lBQ0Ysb0JBQUM7QUFBRCxDQUFDLEFBdkRELElBdURDO0FBRUQsRUFBRTtBQUNGLGdEQUFnRDtBQUNoRCxFQUFFO0FBQ0Y7SUFBQTtRQUNTLFFBQUcsR0FBVyxDQUFDLENBQUE7UUFDZixZQUFPLEdBQStCLEVBQUUsQ0FBQTtJQXlGakQsQ0FBQztJQXZGQSxrQ0FBTSxHQUFOLFVBQU8sUUFBZ0IsRUFBRSxRQUFnQixFQUFFLFNBQWlCO1FBQzNELElBQUksU0FBUyxHQUFHLFFBQVEsR0FBRyxDQUFDLENBQUE7UUFDNUIsSUFBSSxNQUFNLEdBQTZCO1lBQ3RDLElBQUksRUFBRSxNQUFNO1lBQ1osTUFBTSxFQUFFO2dCQUNQLFNBQVMsRUFBRSxRQUFRO2dCQUNuQixTQUFTLEVBQUUsUUFBUTtnQkFDbkIsU0FBUyxFQUFFLFFBQVEsR0FBRyxDQUFDO2dCQUN2QixTQUFTLEVBQUUsU0FBUzthQUNwQjtZQUNELEtBQUssRUFBRTtnQkFDTixTQUFTLEVBQUUsUUFBUTtnQkFDbkIsU0FBUyxFQUFFLFFBQVEsR0FBRyxTQUFTO2dCQUMvQixTQUFTLEVBQUUsUUFBUSxHQUFHLENBQUM7Z0JBQ3ZCLFNBQVMsRUFBRSxFQUFFO2FBQ2I7U0FDRCxDQUFBO1FBQ0QsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDNUIsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFBO1NBQzlDO1FBQ0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUE7UUFDekIsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFBO0lBQ1gsQ0FBQztJQUVELG1DQUFPLEdBQVAsVUFBUSxTQUFpQixFQUFFLFNBQWlCLEVBQUUsU0FBaUI7UUFDOUQsSUFBSSxNQUFNLEdBQUc7WUFDWixJQUFJLEVBQUUsT0FBTztZQUNiLE1BQU0sRUFBRTtnQkFDUCxTQUFTLEVBQUUsU0FBUztnQkFDcEIsU0FBUyxFQUFFLFNBQVMsR0FBRyxTQUFTO2dCQUNoQyxTQUFTLEVBQUUsU0FBUyxHQUFHLENBQUM7Z0JBQ3hCLFNBQVMsRUFBRSxFQUFFO2FBQ2I7WUFDRCxLQUFLLEVBQUU7Z0JBQ04sU0FBUyxFQUFFLFNBQVM7Z0JBQ3BCLFNBQVMsRUFBRSxTQUFTO2dCQUNwQixTQUFTLEVBQUUsU0FBUyxHQUFHLENBQUM7Z0JBQ3hCLFNBQVMsRUFBRSxTQUFTO2FBQ3BCO1NBQ0QsQ0FBQTtRQUNELElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQzVCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTtTQUM5QztRQUNELElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBQ3pCLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQTtJQUNYLENBQUM7SUFFRCxvQ0FBUSxHQUFSLFVBQVMsUUFBZ0IsRUFBRSxXQUFtQixFQUFFLFVBQWtCO1FBQ2pFLElBQU0sTUFBTSxHQUE2QjtZQUN4QyxJQUFJLEVBQUUsUUFBUTtZQUNkLE1BQU0sRUFBRTtnQkFDUCxTQUFTLEVBQUUsUUFBUTtnQkFDbkIsU0FBUyxFQUFFLFdBQVc7Z0JBQ3RCLFNBQVMsRUFBRSxDQUFDO2dCQUNaLFNBQVMsRUFBRSxFQUFFO2FBQ2I7WUFDRCxLQUFLLEVBQUU7Z0JBQ04sU0FBUyxFQUFFLFFBQVE7Z0JBQ25CLFNBQVMsRUFBRSxVQUFVO2dCQUNyQixTQUFTLEVBQUUsQ0FBQztnQkFDWixTQUFTLEVBQUUsRUFBRTthQUNiO1NBQ0QsQ0FBQTtRQUVELElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQzVCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTtTQUM5QztRQUNELElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBQ3pCLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQTtJQUNYLENBQUM7SUFFRCxnQ0FBSSxHQUFKO1FBQ0MsSUFBSSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRTtZQUNsQixPQUFPLElBQUksQ0FBQTtTQUNYO1FBQ0QsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFBO1FBQ1YsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTtJQUM5QixDQUFDO0lBRUQsZ0NBQUksR0FBSjtRQUNDLElBQUksSUFBSSxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRTtZQUNwQyxPQUFPLElBQUksQ0FBQTtTQUNYO1FBQ0QsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUE7UUFDbkMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFBO1FBQ1YsT0FBTyxNQUFNLENBQUE7SUFDZCxDQUFDO0lBQ0Ysd0JBQUM7QUFBRCxDQUFDLEFBM0ZELElBMkZDIn0= \ 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 {};
diff --git a/vfs/vfs.js b/vfs/vfs.js
index 0a0ef33..2f3eee3 100644
--- a/vfs/vfs.js
+++ b/vfs/vfs.js
@@ -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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmZzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsidmZzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxrRUFBa0U7QUFDbEUseUVBQXlFO0FBQ3pFLDZCQUE2Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBK0I3QjtJQU1DLGdCQUFtQixJQUFtQjtRQUFuQixTQUFJLEdBQUosSUFBSSxDQUFlO1FBRjlCLGNBQVMsR0FBZ0IsRUFBRSxDQUFBO1FBR2xDLElBQUksRUFBRSxHQUFHLFFBQVEsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFBO1FBQ3pDLElBQUksQ0FBQyxFQUFFLEVBQUU7WUFDUixPQUFPLENBQUMsS0FBSyxDQUFDLG9CQUFvQixFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsV0FBVyxDQUFDLENBQUE7WUFDekQsT0FBTTtTQUNOO1FBQ0QsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUE7SUFDYixDQUFDO0lBRUQsRUFBRTtJQUNGLDRFQUE0RTtJQUM1RSw0QkFBNEI7SUFDNUIsNEJBQTRCO0lBQzVCLHdCQUF3QjtJQUN4QixFQUFFO0lBQ1kscUJBQUksR0FBbEI7Ozs7Ozs0QkFFcUIscUJBQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFBQTs7d0JBQTNDLGFBQWEsR0FBRyxTQUEyQjt3QkFDL0MsSUFBSSxDQUFDLGFBQWEsRUFBRTs0QkFDbkIsc0JBQU07eUJBQ047d0JBRUQsS0FBVyxHQUFHLElBQUksYUFBYSxFQUFFOzRCQUMxQixLQUFLLEdBQUcsYUFBYSxDQUFDLEdBQUcsQ0FBd0IsQ0FBQTs0QkFDakQsSUFBSSxHQUFHLElBQUksVUFBVSxDQUFDLEtBQUssRUFBRSxVQUFDLElBQWdCO2dDQUNuRCxJQUFJLEtBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFO29DQUMxQixLQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQTtpQ0FDN0M7Z0NBQ0QsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFO29DQUNoQixLQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO2lDQUNmOzRCQUNGLENBQUMsQ0FBQyxDQUFBOzRCQUNGLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFBO3lCQUMxQjt3QkFFRCxJQUFJLENBQUMsRUFBRSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUE7d0JBRXRCLE1BQU07d0JBQ04sSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLFVBQVUsQ0FBQyxVQUFDLElBQVk7NEJBQzNDLEtBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUE7d0JBQ3BCLENBQUMsQ0FBQyxDQUFBO3dCQUNGLElBQUksQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUE7d0JBRXJDLE1BQU07d0JBQ04sSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLFVBQVUsRUFBRSxDQUFBO3dCQUNoQyxJQUFJLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFBO3dCQUVyQyxNQUFNO3dCQUNOLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFBOzs7OztLQUM5QjtJQUVPLHFCQUFJLEdBQVosVUFBYSxJQUFnQjtRQUM1QixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUN4QixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUN6QixDQUFDO0lBRUQsdUVBQXVFO0lBQ3ZFLHFCQUFxQjtJQUNyQix5QkFBUSxHQUFSLFVBQXVCLElBQVk7UUFDbEMsSUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUNqQyxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ1YsT0FBTyxDQUFDLEtBQUssQ0FBQyxrQ0FBa0MsRUFBRSxJQUFJLENBQUMsQ0FBQTtZQUN2RCxPQUFNO1NBQ047UUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO0lBQ2hCLENBQUM7SUFDRixhQUFDO0FBQUQsQ0FBQyxBQXhFRCxJQXdFQztBQXhFWSx3QkFBTTtBQTBFbkI7SUFZQyxvQkFBWSxJQUF5QixFQUFFLE9BQXlCO1FBQWhFLGlCQWtDQztRQWpDQSxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFBO1FBQzNCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUE7UUFDM0IsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsY0FBYyxJQUFJLENBQUMsQ0FBQTtRQUM5QyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixJQUFJLEVBQUUsQ0FBQTtRQUNuRCxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFBO1FBQzFCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUE7UUFDM0IsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQTtRQUVsQyxJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQTtRQUNoQixJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssU0FBUyxFQUFFO1lBQzlCLEtBQWMsVUFBVyxFQUFYLEtBQUEsSUFBSSxDQUFDLE1BQU0sRUFBWCxjQUFXLEVBQVgsSUFBVyxFQUFFO2dCQUF0QixJQUFJLENBQUMsU0FBQTtnQkFDVCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLFVBQVUsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQTthQUM1QztTQUNEO1FBRUQsSUFBSSxDQUFDLEVBQUUsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQ3ZDLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUE7UUFDN0IsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQTtRQUNoQyxJQUFJLENBQUMsRUFBRSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFBO1FBRTdCLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNoQixJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxlQUFlLEdBQUcsVUFBVSxDQUFBO1NBQzFDO1FBRUQsSUFBSSxDQUFDLEVBQUUsQ0FBQyxPQUFPLEdBQUcsVUFBQyxLQUFLO1lBQ3ZCLE9BQU8sQ0FBQyxLQUFJLENBQUMsQ0FBQTtRQUNkLENBQUMsQ0FBQTtRQUNELElBQUksQ0FBQyxFQUFFLENBQUMsVUFBVSxHQUFHLFVBQUMsS0FBSztZQUMxQixLQUFJLENBQUMsVUFBVSxDQUFDLEtBQUksQ0FBQyxDQUFBO1FBQ3RCLENBQUMsQ0FBQTtRQUNELElBQUksQ0FBQyxFQUFFLENBQUMsV0FBVyxHQUFHLFVBQUMsS0FBSztZQUMzQixLQUFJLENBQUMsV0FBVyxDQUFDLEtBQUksQ0FBQyxDQUFBO1FBQ3ZCLENBQUMsQ0FBQTtJQUNGLENBQUM7SUFFRCwrQkFBVSxHQUFWLFVBQVcsQ0FBYTtRQUN2QixJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDaEIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsZUFBZSxHQUFHLFVBQVUsQ0FBQTtTQUMxQzthQUFNO1lBQ04sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsZUFBZSxHQUFHLE9BQU8sQ0FBQTtTQUNwQztJQUNGLENBQUM7SUFDRCxnQ0FBVyxHQUFYLFVBQVksQ0FBYTtRQUN4QixDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxlQUFlLEdBQUcsV0FBVyxDQUFBO0lBQ3pDLENBQUM7SUFDRixpQkFBQztBQUFELENBQUMsQUExREQsSUEwREM7QUFFRDtJQUdDO1FBQ0MsSUFBSSxDQUFDLEVBQUUsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQ3ZDLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUE7UUFDakMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsV0FBVyxHQUFHLE9BQU8sQ0FBQTtRQUNuQyxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxXQUFXLEdBQUcsUUFBUSxDQUFBO0lBQ3JDLENBQUM7SUFFRCx5QkFBSSxHQUFKLFVBQUssSUFBZ0I7UUFDcEIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFBO1FBRXRCLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxTQUFTLEVBQUU7WUFDOUIsT0FBTTtTQUNOO1FBRUQsS0FBYyxVQUFXLEVBQVgsS0FBQSxJQUFJLENBQUMsTUFBTSxFQUFYLGNBQVcsRUFBWCxJQUFXLEVBQUU7WUFBdEIsSUFBSSxDQUFDLFNBQUE7WUFDVCxJQUFJLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUE7U0FDekI7SUFDRixDQUFDO0lBQ0YsaUJBQUM7QUFBRCxDQUFDLEFBckJELElBcUJDO0FBRUQ7SUFLQyxvQkFBWSxPQUF5QjtRQUNwQyxJQUFJLENBQUMsRUFBRSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDdkMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQTtRQUNqQyxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxXQUFXLEdBQUcsT0FBTyxDQUFBO1FBQ25DLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLFdBQVcsR0FBRyxRQUFRLENBQUE7UUFDcEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUE7UUFDaEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUE7SUFDdkIsQ0FBQztJQUVELHlCQUFJLEdBQUosVUFBSyxJQUFnQjtRQUFyQixpQkF5Q0M7UUF4Q0EsSUFBSSxDQUFDLEVBQUUsQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFBO1FBQ3RCLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFBO1FBQ2hCLElBQUksS0FBSyxHQUFHLEVBQUUsQ0FBQTtRQUVkLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxHQUFHLEVBQUU7WUFDckIsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7U0FDckI7YUFBTTtZQUNOLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQTtTQUM1QjtnQ0FFUSxDQUFDO1lBQ1QsSUFBSSxTQUFTLEdBQUcsRUFBRSxDQUFBO1lBQ2xCLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQTtZQUVWLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDWCxDQUFDLEdBQUcsR0FBRyxDQUFBO2dCQUNQLFNBQVMsR0FBRyxHQUFHLENBQUE7YUFDZjtpQkFBTTtnQkFDTixDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFBO2dCQUNaLFNBQVMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFBO2FBQzNDO1lBRUQsSUFBSSxLQUFLLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQTtZQUMxQyxLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxjQUFjLENBQUE7WUFDcEMsS0FBSyxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFBO1lBQzNCLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQTtZQUM5QixLQUFLLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQTtZQUVuQixLQUFLLENBQUMsT0FBTyxHQUFHLFVBQUMsS0FBSztnQkFDckIsS0FBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQTtZQUN4QixDQUFDLENBQUE7WUFDRCxLQUFLLENBQUMsVUFBVSxHQUFHLFVBQUMsS0FBSztnQkFDeEIsS0FBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUE7WUFDOUIsQ0FBQyxDQUFBO1lBQ0QsS0FBSyxDQUFDLFdBQVcsR0FBRyxVQUFDLEtBQUs7Z0JBQ3pCLEtBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFBO1lBQy9CLENBQUMsQ0FBQTtZQUVELE9BQUssRUFBRSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQTs7O1FBNUIzQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUU7b0JBQTVCLENBQUM7U0E2QlQ7SUFDRixDQUFDO0lBRU8sK0JBQVUsR0FBbEIsVUFBbUIsS0FBa0IsRUFBRSxLQUFpQjtRQUN2RCxLQUFLLENBQUMsS0FBSyxDQUFDLGVBQWUsR0FBRyxPQUFPLENBQUE7SUFDdEMsQ0FBQztJQUNPLGdDQUFXLEdBQW5CLFVBQW9CLEtBQWtCLEVBQUUsS0FBaUI7UUFDeEQsS0FBSyxDQUFDLEtBQUssQ0FBQyxlQUFlLEdBQUcsV0FBVyxDQUFBO0lBQzFDLENBQUM7SUFDRixpQkFBQztBQUFELENBQUMsQUEvREQsSUErREMifQ== \ No newline at end of file
diff --git a/vfs/vfs.ts b/vfs/vfs.ts
index a39f0f1..7372166 100644
--- a/vfs/vfs.ts
+++ b/vfs/vfs.ts
@@ -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