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

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

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

エラーが発生しました。

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

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

45日目 割烹芸人の開発5

ひたすらコードを書いていくだけの単純なお仕事です。

画像ブロックを作っていきます。


editor.jsのプラグインには画像ブロックもありますが、小説家になろうの活動報告で使えるようにはできていません(当たり前か)


活動報告で使えるようにカスタマイズしていく必要があります。


ということで作ります。


class SimpleImage{

static get enableLineBreaks() {

return true;

}


constructor({data, api, config}){

this.api = api;

this.config = config || {};


this.data = {

url: data.url || '',

position:data.position !== undefined ? data.position : 'left',

withBorder: data.withBorder !== undefined ? data.withBorder : false,

editURL: false

};


this.wrapper = undefined;


this.settings = [

{

name:'left',

icon:'左寄'

},

{

name:'center',

icon:'中央'

},

{

name:'right',

icon:'右寄'

},

{

name: 'withBorder',

icon:'枠線'

},

{

name: 'editURL',

icon:'URL',

}

]

}


render(){

this.wrapper = document.createElement('div');

this.wrapper.classList.add('image');


if(this.data && this.data.url){

this._createImage(this.data.url);

return this.wrapper;

}


this._resetImage()


return this.wrapper;

}


save(blockContent){

const input = blockContent.querySelector('img');


if (!input) {

return this.data;

}


return{

url:input.src,

withBorder:this.data['withBorder'],

potision:this.data.position

}

}


validate(saveData){

if(!saveData.url.trim()){

return false;

}

return true;

}


static get sanitize(){

return{

url:false,

withBorder:{},

potision:{},

linkURL:false


}

}


static get toolbox(){

return {

title:'画像の挿入(みてみんOnly)',

icon:'画像'

}

}



}



まずはクラス設定して、位置情報と枠線を追加できるようにします。


まずdataにpositionを追加します。rendersettingsようにsettingsに位置情報の選択ボタンを追加。またイメージURLの編集用のボタンも追加します。


renderSettings(){

const wrapper = document.createElement('div');


this.settings.forEach(tune =>{

let button = document.createElement('div');


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


button.innerHTML = tune.icon;

wrapper.appendChild(button);


if(tune.name === 'withBorder'){

button.classList.toggle(this.api.styles.settingsButtonActive, this.data[tune.name]);

}


button.classList.toggle(this.api.styles.settingsButtonActive, tune.name === this.data.position);


button.addEventListener('click', ()=>{

if(tune.name === 'editURL'){

this._resetImage();

}else if(tune.name === 'withBorder'){

this._toggleTune(tune.name);

button.classList.toggle(this.api.styles.settingsButtonActive);

}else if(tune.name === 'linkURL'){

button.classList.toggle(this.api.styles.settingsButtonActive);

}else{

this._alingSet(tune.name);


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


wrapper.querySelectorAll(`.${this.api.styles.settingsButton}`).forEach(el => {

if(tune.name==='left' && (el.innerHTML === '中央' || el.innerHTML === '右寄') ){

el.classList.remove(this.api.styles.settingsButtonActive);

}else if(tune.name==='right' && (el.innerHTML === '中央' || el.innerHTML === '左寄') ){

el.classList.remove(this.api.styles.settingsButtonActive);

}else if(tune.name==='center' && (el.innerHTML === '右寄' || el.innerHTML === '左寄') ){

el.classList.remove(this.api.styles.settingsButtonActive);

}


});

}

});

});


return wrapper;

}


_createImage(url){

const image = document.createElement('img');


image.src = url;

this.wrapper.innerHTML='';

this.wrapper.appendChild(image);


this._acceptTuneView();

}


_resetImage(){

const input = document.createElement('input');


this.wrapper.innerHTML='';

this.wrapper.appendChild(input);


input.placeholder = 'みてみんのURLを貼り付けてください'


input.addEventListener('paste',(event)=>{

this._createImage(event.clipboardData.getData('text/plain'));

});


input.addEventListener('keydown', (event) => {

const [ENTER, A] = [13, 65];


switch (event.keyCode) {

case ENTER:

event.preventDefault();

event.stopPropagation();

this._createImage(input.value);


break;

}

});


}


_toggleTune(tune){

this.data[tune] = !this.data[tune];

this._acceptTuneView();

}


_acceptTuneView(){

this.wrapper.classList.toggle('withBorder', this.data['withBorder']);

}


_alingSet(tune){

this.wrapper.setAttribute("style", `text-align:${tune};`);

this.data.position=tune;

}



_resetImageと_alignsetを追加してボタンをおしたら画像を消したり、スタイルを変えてるようにしておきます。



挿絵(By みてみん)


ということで完成。




挿絵(By みてみん)


コード書いている息抜きにお絵描きっていいかもしれない。

幾何学模様書くのも楽しい。

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

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

この作品はリンクフリーです。ご自由にリンク(紹介)してください。
この作品はスマートフォン対応です。スマートフォンかパソコンかを自動で判別し、適切なページを表示します。

↑ページトップへ