なんでそんなことしたいねん、という話ではあるが……。
理由
tinymce6になってから、必ず編集後にpタグが入るようになった。
DBに入れるときに普通に邪魔なのでpタグが取りたい。
ただし普通に文中にあるpタグは残したい。
どうしたらよいか。
結論
いろいろissueとか読んだけど絶対にpタグは入るらしいので、無理やり取る
const deleteItem = (
stringList: string[],
deleteString: string,
isBack: boolean
): string[] => {
const loopStrings = isBack ? [...stringList].reverse() : stringList;
const loop = (list: string[], inspected: string[]): string[] => {
if (isEmpty(list)) return inspected;
const [head, ...tail] = list;
if (head !== deleteString) return loop(tail, [...inspected, head ?? ""]);
return [...inspected, ...tail];
};
const result = loop(loopStrings, []);
return isBack ? result.reverse() : result;
};
これは再帰で文字を消すだけの関数でござる。
引数によって前からも後ろからも消せるでござる。
const deleteP = (stringList: string[]): string[] => {
const delFirstP = deleteItem(stringList, "<p>", false);
const delEndP = deleteItem(delFirstP, "</p>", true);
return delEndP;
};
べつに関数にまとめるほどでもないがまとめてみたでござる。
// tinyMCEからtextという変数に値を入れている
const regex = /(<\/?[a-z]*>)/g;
const parsed = text
.trim()
.split(regex)
const deleted = deleteP(parsed);
こんな感じでtinyMCEから取得したtextをうまいことパースしてpタグの頭とおしりを消すことに成功したのだった。
しかし、もうちょっとスマートなやり方があるんじゃないかなぁ、といつも思う。
普通に文字をstring[]にしてfindかなんかで消したらよかったのでは……?
なんだかもうちょっと簡単に書けるような……。
もっともっときれいにソースコード書けるようになりたいなぁ……。