表示調整
閉じる
挿絵表示切替ボタン
▼配色
▼行間
▼文字サイズ
▼メニューバー
×閉じる

ブックマークに追加しました

設定
0/400
設定を保存しました
エラーが発生しました
※文字以内
ブックマークを解除しました。

エラーが発生しました。

エラーの原因がわからない場合はヘルプセンターをご確認ください。

ブックマーク機能を使うにはログインしてください。
とある割烹芸人の開発日誌 ~100日以内に割烹エディターをリリースする割烹芸人~  作者: とある割烹芸人まーくつーせかんど
α版への道
17/48

46日目 割烹芸人の開発6

ひたすら…… コードを……

今回はEditor.jsのカスタムインラインを作っていきます。


デフォルトでは、強調、斜体、リンクの3つが使えるようになってます。


これにあと、下線と取り消し線を追加していきます。


挿絵(By みてみん)


class UnderLine{


static get isInline(){

return true;

}


static get title(){

return 'Under Line';

}


constructor({api}){

this.api = api;


this.button = null;


this.tag = 'U';


}


render(){

this.button = document.createElement('button');

this.button.type = 'button';

this.button.textContent = 'u';

this.button.classList.add(this.api.styles.inlineToolButton);


return this.button;

}


static get sanitize() {

return {

u: {}

};

}


}


まずはUnderLineクラスを作って、isInlineをtrue, title指定、コンストラクタとレンダー、サニタイズを指定します。


終わったら、選択した時の処理を作っていきます。


surround(range) {


if (!range) {

return;

}


let termWrapper = this.api.selection.findParentTag(this.tag);


if (termWrapper) {

this.unwrap(termWrapper);

} else {

this.wrap(range);

}

}


wrap(range) {


let del = document.createElement(this.tag);


del.appendChild(range.extractContents());

range.insertNode(del);


this.api.selection.expandToTag(del);

}


unwrap(termWrapper) {


this.api.selection.expandToTag(termWrapper);


let sel = window.getSelection();

let range = sel.getRangeAt(0);


let unwrappedContent = range.extractContents();


termWrapper.parentNode.removeChild(termWrapper);


range.insertNode(unwrappedContent);


sel.removeAllRanges();

sel.addRange(range);

}


checkState() {

const termTag = this.api.selection.findParentTag(this.tag);


this.button.classList.toggle(this.api.styles.inlineToolButtonActive, !!termTag);

}


WrapとUnWrapでタグの付け外しができるようになります。





なお、このクラスのUタグをSタグに変えると取り消し線に使えます。





ということで完成版


class UnderLine{


static get isInline(){

return true;

}


static get title(){

return 'Under Line';

}


constructor({api}){

this.api = api;


this.button = null;


this.tag = 'U';


}


render(){

this.button = document.createElement('button');

this.button.type = 'button';

this.button.textContent = 'u';

this.button.classList.add(this.api.styles.inlineToolButton);


return this.button;

}


surround(range) {


if (!range) {

return;

}


let termWrapper = this.api.selection.findParentTag(this.tag);


if (termWrapper) {

this.unwrap(termWrapper);

} else {

this.wrap(range);

}

}


wrap(range) {


let del = document.createElement(this.tag);


del.appendChild(range.extractContents());

range.insertNode(del);


this.api.selection.expandToTag(del);

}


unwrap(termWrapper) {


this.api.selection.expandToTag(termWrapper);


let sel = window.getSelection();

let range = sel.getRangeAt(0);


let unwrappedContent = range.extractContents();


termWrapper.parentNode.removeChild(termWrapper);


range.insertNode(unwrappedContent);


sel.removeAllRanges();

sel.addRange(range);

}


checkState() {

const termTag = this.api.selection.findParentTag(this.tag);


this.button.classList.toggle(this.api.styles.inlineToolButtonActive, !!termTag);

}


static get sanitize() {

return {

u: {}

};

}



}

class Del{

static get isInline(){

return true;

}


static get title(){

return 'delete';

}


constructor({api}){

this.api = api;


this.button = null;


this.tag = 'S';

}


render(){

this.button = document.createElement('button');

this.button.type = 'button';

this.button.textContent = 's';

this.button.classList.add(this.api.styles.inlineToolButton);


return this.button;

}


surround(range) {


if (!range) {

return;

}


let termWrapper = this.api.selection.findParentTag(this.tag);


if (termWrapper) {

this.unwrap(termWrapper);

} else {

this.wrap(range);

}

}


wrap(range) {


let del = document.createElement(this.tag);


del.appendChild(range.extractContents());

range.insertNode(del);


this.api.selection.expandToTag(del);

}


unwrap(termWrapper) {


this.api.selection.expandToTag(termWrapper);


let sel = window.getSelection();

let range = sel.getRangeAt(0);


let unwrappedContent = range.extractContents();


termWrapper.parentNode.removeChild(termWrapper);


range.insertNode(unwrappedContent);


sel.removeAllRanges();

sel.addRange(range);

}


checkState() {

const termTag = this.api.selection.findParentTag(this.tag);


this.button.classList.toggle(this.api.styles.inlineToolButtonActive, !!termTag);

}


static get sanitize() {

return {

s: {}

};

}


}


あとはこれをEditor.js本体に読み込ませれば使えるようになります。


tools: {

u:{

class:UnderLine,

shortcut: 'CMD+U'

},

s:{

class:Del,

shortcut:'CMD+S'

}

}


ショートカットキーも指定しておきます。PCで書いている人はショートカットキーでも操作できるようになります。


挿絵(By みてみん)



ということでこれでインラインもできました。




ついでに装飾の方も追加してみました。

文字色、背景色、文字サイズを変更できます。


挿絵(By みてみん)



リンクを付ける場合は、先にリンクを追加してから装飾してください。

今のところ後からリンクを付けると装飾が無効になります。


挿絵(By みてみん)


じーーーー

評価をするにはログインしてください。
ブックマークに追加
ブックマーク機能を使うにはログインしてください。
― 新着の感想 ―
このエピソードに感想はまだ書かれていません。
感想一覧
+注意+

特に記載なき場合、掲載されている作品はすべてフィクションであり実在の人物・団体等とは一切関係ありません。
特に記載なき場合、掲載されている作品の著作権は作者にあります(一部作品除く)。
作者以外の方による作品の引用を超える無断転載は禁止しており、行った場合、著作権法の違反となります。

↑ページトップへ