実現したいこと
HTMLのtable要素を受け取り、Pukiwikiの表組み構文に変換するプログラムを作りたいのですが、
縦結合(rowSpan)に対応できるロジックがうまく思い浮かびません。
なにかいいアルゴリズムはありませんでしょうか?
例えばですが、以下のような感じです。
例1
html
1<table> 2 <thead> 3 <tr> 4 <th colspan="2">ヘッダー</th> 5 </tr> 6 </thead> 7 <tbody> 8 <tr> 9 <td>セル</td> 10 <td>セル</td> 11 </tr> 12 </tbody> 13</table>
↓
pukiwiki
1|>|~ヘッダー|h 2|セル|セル|
例2
html
1<table border="1" id="test"> 2 <thead> 3 <tr> 4 <th colspan="1">TH01</th> 5 <th colspan="1">TH02</th> 6 <th colspan="1">TH03</th> 7 <th colspan="1">TH04</th> 8 </tr> 9 </thead> 10 <tbody> 11 <tr> 12 <td rowspan="2">1</td> 13 <td colspan="2">2</td> 14 <td rowspan="2">3</td> 15 </tr> 16 <tr> 17 <td>4</td> 18 <td rowspan="2">5</td> 19 </tr> 20 <tr> 21 <td>6</td> 22 <td>7</td> 23 <td>8</td> 24 </tr> 25 </tbody> 26</table>
↓
pukiwiki
1// 単独>が右のセルと結合で、単独~が上のセルと結合 2|~TH01|~TH02|~TH03|~TH04|h 3|1|>|2|3| 4|~|4|5|~| 5|6|7|~|8|
例3
html
1<table border="1" id="test"> 2 <thead> 3 <tr> 4 <th>TH01</th> 5 <th>TH02</th> 6 <th>TH03</th> 7 <th>TH04</th> 8 </tr> 9 </thead> 10 <tbody> 11 <tr> 12 <td rowspan="3">1</td> 13 <td colspan="3">2</td> 14 </tr> 15 <tr> 16 <td>3</td> 17 <td colspan="2" rowspan="2">4</td> 18 </tr> 19 <tr> 20 <td>5</td> 21 </tr> 22 </tbody> 23 <tfoot> 24 <tr> 25 <td>6</td> 26 <td colspan="3">7</td> 27 </tr> 28 </tfoot> 29</table>
↓
pukiwiki
1|~TH01|~TH02|~TH03|~TH04|h 2|1|>|>|2| 3|~|3|>|4| 4|~|5|~|~| 5|6|>|>|7|
自分で思いついたアルゴリズム
自分が思いついたのは以下のアルゴリズムです。(言語化下手ですみません)
-
失敗したコード(console参照)→https://codepen.io/shaddowww/pen/xxybRrO
-
共通
- thead、tr、tdと多重ループを行い、行ごとに配列を作成し最後結合する。tdから連結の情報(indexと連結数)をメモしておく。
-
結合への対応
- tdループ時の本来追加したいセルを追加する前にindexが合致したら縦結合部分を追加。(
|~|~|本来のセル|
といった感じ)- ❌最後のtd後に結合したい場合が対応できなくて駄目
- trループ時に後からspliceで該当indexに挿入。
- ❌tdループ時でないと縦連結が含まれていないためindexがズレてしまう。
- tdループ時の本来追加したいセルを追加する前にindexが合致したら縦結合部分を追加。(
補足情報
あなたの回答
tips
プレビュー