@jswf/core
Version:
JavaScript Window Framework
271 lines • 10.3 kB
JavaScript
;
var __extends = (this && this.__extends) || (function () {
var extendStatics = function (d, b) {
extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
return extendStatics(d, b);
};
return function (d, b) {
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
var TextInputWindow_1 = require("./TextInputWindow");
var PanelControl_1 = require("./PanelControl");
var BaseView_1 = require("../BaseView");
var EditableView = /** @class */ (function (_super) {
__extends(EditableView, _super);
function EditableView() {
var _this = _super.call(this) || this;
_this.setJwfStyle("EditableView");
_this.addPanel();
var htmlArea = document.createElement("div");
_this.htmlArea = htmlArea;
htmlArea.contentEditable = "true";
htmlArea.style.width = "100%";
htmlArea.style.height = "100%";
_this.getClient().appendChild(htmlArea);
htmlArea.addEventListener("paste", function (e) {
if (!e.clipboardData)
return;
if (e.clipboardData.files.length) {
var params = { fileList: e.clipboardData.files, enter: false };
_this.callEvent("insertFile", params);
if (!params.enter)
_this.insertImage(e.clipboardData.files);
}
else {
var text = e.clipboardData.getData("text/plain");
text = text.replace(/(["&'<>\n\t ])/g, function (ch) {
var convert = {
'"': """,
"&": "&",
"'": "'",
"<": "<",
">": ">",
"\n": "<br>",
" ": " ",
"\t": " "
};
return convert[ch];
});
document.execCommand("insertHtml", false, text);
}
e.preventDefault();
_this.callEvent("updateText");
});
htmlArea.addEventListener("input", function () {
_this.callEvent("updateText");
});
htmlArea.addEventListener("blur", function () {
var select = document.getSelection();
if (!select)
return;
_this.keepRange = select.getRangeAt(0);
});
//ドラッグドロップの許可
htmlArea.ondragover = function (e) {
e.preventDefault();
};
htmlArea.addEventListener("drop", function (e) {
if (e.dataTransfer) {
var params = { fileList: e.dataTransfer.files, enter: false };
_this.callEvent("insertFile", params);
}
e.preventDefault();
});
return _this;
}
EditableView.prototype.insertImage = function (files) {
var _this = this;
var _loop_1 = function (i) {
var file = files[i];
if (file.type.indexOf("image") != -1) {
var reader_1 = new FileReader();
reader_1.readAsDataURL(file);
reader_1.onload = function () {
document.execCommand("insertImage", false, reader_1.result);
_this.callEvent("updateText");
};
}
};
//画像ファイルならDataURLに変換して貼り付ける
for (var i = 0; i < files.length; i++) {
_loop_1(i);
}
};
EditableView.prototype.insertNode = function (node) {
document.execCommand("insertHTML", false, node.outerHTML);
};
EditableView.prototype.getHtml = function () {
return this.htmlArea.innerHTML;
};
EditableView.prototype.setHtml = function (value) {
this.htmlArea.innerHTML = value;
};
EditableView.prototype.addPanel = function () {
var _this = this;
var client = this.getClient();
var panel = document.createElement("div");
this.panel = panel;
client.appendChild(panel);
PanelControl_1.PanelControl.createControl(panel, {
label: "解除",
event: function () {
document.execCommand("removeFormat");
_this.callEvent("updateText");
}
});
PanelControl_1.PanelControl.createControl(panel, {
label: "文字色",
type: "color",
value: { r: 0, g: 0, b: 0 },
event: function (node) {
if (node && node.style.background) {
_this.setRange();
document.execCommand("foreColor", false, node.style.background);
}
}
});
PanelControl_1.PanelControl.createControl(panel, {
label: "背景色",
value: { r: 200, g: 200, b: 200 },
type: "color",
event: function (node) {
if (node && node.style.background) {
_this.setRange();
document.execCommand("backColor", false, node.style.background);
}
}
});
PanelControl_1.PanelControl.createControl(panel, {
label: "太字",
event: function () {
document.execCommand("bold");
_this.callEvent("updateText");
}
});
PanelControl_1.PanelControl.createControl(panel, {
label: "斜体",
event: function () {
document.execCommand("italic");
_this.callEvent("updateText");
}
});
PanelControl_1.PanelControl.createControl(panel, {
label: "下線",
event: function () {
document.execCommand("underline");
_this.callEvent("updateText");
}
});
PanelControl_1.PanelControl.createControl(panel, {
label: "消線",
event: function () {
document.execCommand("strikeThrough");
_this.callEvent("updateText");
}
});
PanelControl_1.PanelControl.createControl(panel, {
type: "select",
label: "サイズ",
option: [
{ label: "サイズ" },
{ label: "1" },
{ label: "2" },
{ label: "3" },
{ label: "4" },
{ label: "5" },
{ label: "6" },
{ label: "7" }
],
event: function (node) {
var select = node;
if (select.value !== "サイズ") {
document.execCommand("fontSize", false, select.value);
_this.callEvent("updateText");
select.value = "サイズ";
}
}
});
PanelControl_1.PanelControl.createControl(panel, {
label: "リンク",
event: function () {
_this.createLink();
}
});
PanelControl_1.PanelControl.createControl(panel, {
label: "CODE",
event: function () {
_this.setPGCode();
}
});
PanelControl_1.PanelControl.createControl(panel, {
label: "PLAIN",
event: function () {
_this.setPGCode(true);
}
});
};
EditableView.prototype.createControl = function (param) {
if (this.panel)
PanelControl_1.PanelControl.createControl(this.panel, param);
};
EditableView.prototype.setPGCode = function (plain) {
var select = document.getSelection();
if (!select)
return;
var range = select.getRangeAt(0);
var text = select.toString().replace(/["&'<>\n]/g, function (ch) {
var convert = {
"</div>": "<br>\n",
"\n": "<br>\n",
'"': """,
"&": "&",
"'": "'",
"<": "<",
">": ">"
};
return convert[ch];
});
range.deleteContents();
range.insertNode(range.createContextualFragment("<br><div class='code" + (plain ? 2 : "") + "'>" + text + "</div><br>"));
this.callEvent("updateText");
};
EditableView.prototype.createLink = function () {
var select = document.getSelection();
if (!select)
return;
var range = select.getRangeAt(0);
var input = new TextInputWindow_1.TextInputWindow({
title: "リンク作成",
message: "リンク先の入力",
label: "URL",
event: function (value) {
select.removeAllRanges();
select.addRange(range);
document.execCommand("createLink", undefined, value);
if (select.anchorNode && select.anchorNode.parentElement) {
var parent_1 = select.anchorNode.parentElement;
parent_1.target = "_blank";
}
input.close();
}
});
};
EditableView.prototype.setRange = function () {
if (this.keepRange) {
var select = document.getSelection();
if (!select)
return;
select.removeAllRanges();
select.addRange(this.keepRange);
}
};
return EditableView;
}(BaseView_1.BaseView));
exports.EditableView = EditableView;
//# sourceMappingURL=EditableView.js.map