割烹エディターの開発メモ4(変換部の作成)

Editor.jsの出力はJSON形式なのでそれをHTML形式に変換しないといけない。なので変換部を作る。


JSON形式を見てみると

キャプチャ2

blocks要素のtypeを調べてそれごとの処理を考えればいい。

そのあとの設定項目でさらに分岐させる感じにする。ということで実装していきます。

文章を書くところ:<br>
<div id="editor"></div>
<button id="save-button">押すと変換される</button><br>
変換した後のソースコードが出力されるところ:<br>
<textarea id="output-text"></textarea>
<button id="copy-button">押すとコピーすることができる</button><br>
<pre id="output"></pre>

まずはHTMLの方に出力後の置き場所としてtextareaを作成。

変換ボタン、コピーボタンを作ります。(縦書きで作ったのを再利用)

キャプチャ3

次に、ボタンを押したときの処理を追加。前回はinput buttonに処理を書いていたけど今回はイベントリスナーを利用する。アロー関数にも慣れたい。

   const saveButton = document.getElementById('save-button');
   const output = document.getElementById('output');
   const outputtext = document.getElementById('output-text');

   saveButton.addEventListener('click', () => {
     editor.save().then( savedData => {
       output.innerHTML = JSON.stringify(savedData, null, 4);
       outputtext.innerHTML = parsedata(savedData);
     })
   });
   
   const copyButton = document.getElementById('copy-button');
   copyButton.addEventListener('click', () => {
       outputtext.select();
       document.execCommand("Copy");
   });

saveButton.addEventListener('click', () => {});でボタンを押した処理を実現。

outputtext.innerHTML = parsedata(savedData);でパースしたHTMLタグを返す。

function parsedata(savedata){
   
   let returndata = '';
   
   savedata.blocks.forEach((value,index) =>{
   
   switch (value.type){
           
       case 'paragraph':
           returndata += ('<p>' + value.data.text + '</p>');
           break;
           
       case 'p':
           returndata += value.data.text + '\n';
           break;
           
       default:
           break;
   }
});
   
   return returndata;
   
}

パースは.forEach((value,index)で要素をループさせて実行。

value.typeで分岐させている。今は簡単な処理しか書いてないけど、増やしていく。

キャプチャ4

細かいところはカスタムブロックを作成するときに追加していく。

キャプチャ5

コピーボタンは縦書きと同じ処理だから特に説明しない。


ということで暫定の出力ができたので、ここからメインを作り込んでいこうと思います。

良ければサポートお願いします。サポート費用はサーバー維持などの開発費に使わせていただきます。