Editor.jsのマニアックな使い方
現在React+Ediotr.jsを使用してTRPGっぽいテキストエディタを作成しています。
製作中に得られたEditor.jsのマニアックな知見を記載していきす。
使用ReactWrapper:https://github.com/Jungwoo-An/react-editor-js
カスタムツール(damage)からstate等を読み込みたい場合は下記の様にconfigを通して渡しましょう。
const EDITOR_JS_TOOLS = {
embed: { class: Embed, inlineToolbar: true },
table: { class: Table, inlineToolbar: true },
paragraph: { class: Paragraph, inlineToolbar: true },
list: List,
damage: {
class: Damage,
config: {
userid: user_id,
diceworld: props.diceworld.diceworld_id,
characternamelist: characterNamelist,
characteridlist: characterIDlist,
},
},
}
カスタムツールに決定ボタンや数値入力する場合は <input> 等でUIを実装
this.api.listeners.onでクリック等のタイミングで
document.getElementById('damage_input').value で検出できます。
注意しなければならないのは、UI単体のイベント検出はできません。
(.classList.add('cdx-button')はボタンじゃなくてボタン風のCSS枠です)
Element全体で検出してるので入力フォームと実行ボタンはElementを分ける必要があります。
下記サンプルコードです。
class MyTool {
constructor({data, api}){
this.api = api;
this._element = document.createElement('div');
this.damage_form = document.createElement('div');
this.damage_form.innerHTML = `<input type="number" name="damage" id="damage_input"
pattern="[\d]" maxlength="4" autocomplete="off"/>`
this.damage_button = document.createElement('div');
this.api.listeners.on(this.damage_form, 'click', () => {
this.damage_value = document.getElementById('damage_input').value
console.log('input',this.damage_value);
}, false);
this.damage_button.classList.add('cdx-button')
button_damage.innerHTML = 'Damage'
this.api.listeners.on(damage_button,'click',() => {
console.log('Button clicked!',this.damage_value);
}, false)
this._element.appendChild(this.damage_form)
this._element.appendChild(this.damage_button)
}
render() {
return this._element
}
}
カスタムツールへReduxのアクションもconfigを通して渡せた。
ただし、変数への代入の挙動が不安定なのでnullチェック等でのフィルターが必要。
Paragraphはimportしたモジュールを使っていないので、カスタムツールの名前をParagraphにしても
カスタムツールがデフォルトになる事は無い。
これはreact-editor-jsの所為でした。
react-editor-jsのソースコードを編集すればカスタムツールをデフォルトにすることが出来ます。
react-editor-js だと、configの値を更新しても一度描画されると更新されない。
更新する際はリロード処理をしてEditorを再生成しなければならない。