<li>タグを段落番号に変換No.08457
tyyyu2005 さん 16/11/28 01:39
 
 いつもお世話になっております。

 下記のように<ol></ol>タグに囲まれた<li>に1から段落番号を振りたいと考えてい
ます。
<li>タグの数はその都度変動、<ol></ol>タグは変換後削除

 <ol>
  <li>シンク用のボウル(小) (直径18cm)</li>
  <li>水道の蛇口部分の飾り(積み木+引き出しの取っ手)</li>
  <li>コンロ部分(10×20 cmくらいの板+コースター×2)</li>
  <li>コンロボタン部分の飾り(引き出しの取っ手×2)</li>
  </ol>

  ↓


 1. シンク用のボウル(小) (直径18cm)
 2. 水道の蛇口部分の飾り(積み木+引き出しの取っ手)
 3. コンロ部分(10×20 cmくらいの板+コースター×2)
 4. コンロボタン部分の飾り(引き出しの取っ手×2)


どうぞよろしくお願いいたします。

[ ]
RE:08457 <li>タグを段落番号に変換No.08458
秀まるお2 さん 16/11/30 09:44
 
 すみません。この話見逃してたというか・・・正規表現の簡単な置換では無理
なので、マクロを作る必要があって、ちょっと時間がかかりそうだなぁと思って
いたら、返事するの忘れてました。

 ちょっと作戦を考えるので、少々お待ちください。

[ ]
RE:08458 <li>タグを段落番号に変換No.08459
colder さん 16/11/30 13:52
 
ちょっとマクロ書いてみました。
HTMLタグが強調表示されていないと動作しません。
以下の変換モジュールを使っています。
http://hide.maruo.co.jp/lib/hmconv/xsort.html
//マクロここから
loaddll "xsort.hmf";
gofiletop;
while(1)
{
  searchdown "<ol>";
  if(!result) break;
  #a = dllfunc("numberingclear");
  beginsel;
  gotagpair;
  endsel;
  replaceall "(<li>)(.*?)(</li>)","\\(1,Numbering,xsort.hmf,\"d0100010001010
210030\"). \\2",inselect,regular;
  if(!result) down;
}
replaceall "</?ol>","",regular;
freedll;

[ ]
RE:08458 <li>タグを段落番号に変換No.08460
秀まるお2 さん 16/11/30 14:23
 
 一応マクロ作ってみましたけど、こんなんでいいのやら?

    gofiletop;
    while(1) {
        searchdown2 "<ol>", nocasesense;
        if( !result ) {
            break;
        }
        #xStart = x; #yStart = y;
        searchdown "</ol>", nocasesense;
        if( !result ) {
            break;
        }
        if( selecting ) {
            escape;
        }
        right 5;
        beginsel;
        moveto #xStart, #yStart;
        $text = gettext( seltopx, seltopy, selendx, selendy, 1 );

        loaddll "hmjre.dll";
        #number = 1;
        while(1) {
            $new = dllfuncstr("ReplaceRegularNoCaseSense"
                    , "<li>"
                    , $text
                    , 0
                    , str(#number) + ". "
                    , 0
                    );
            if( $new == "" ) {
                break;
            }
            $text = $new;
            #number = #number + 1;
        }
        $text = dllfuncstr("ReplaceRegularNoCaseSense"
                           , "</li>", $text, 0, "", 2);
        $text = dllfuncstr("ReplaceRegularNoCaseSense"
                           , "<ol>", $text, 0, "", 2);
        $text = dllfuncstr("ReplaceRegularNoCaseSense"
                           , "</ol>", $text, 0, "", 2);
        delete;
        insert $text;
    }

[ ]
RE:08460 <li>タグを段落番号に変換No.08461
秀まるお2 さん 16/11/30 14:35
 
 colderさんの、そんな便利な変換モジュールがあるとは知りませんでした。

 そっちの方がはるかに高速動作するし、マクロもシンプルでいいと思います。
そっちお勧めします。

[ ]
RE:08457 <li>タグを段落番号に変換No.08462
Iranoan さん 16/11/30 21:19
 
tyyyu2005さん今日は、Iranoan です
>  下記のように<ol></ol>タグに囲まれた<li>に1から段落番号を振りたいと考えてい
> ます。
お二方とは全く別のアプローチとして、テキスト・ベースの Web ブラウザをフィルタと
して使ってやる方法が有ります。
例えば、w3m の場合、範囲選択してから「プログラムの実行」で
w3m -T text/html < con > con
と指定します。
この方法の利点は、ol が入れ子になっている場合にも対応している点です。

[ ]
RE:08462 <li>タグを段落番号に変換No.08463
天翔記jp さん 16/12/01 15:24
 
本筋のやり方は、やはりHtmlAgilityPackなどを使って
DOM Treeにしたものに対してアプローチする、ということですね。

これなら非常に高い精度のパース力があるので、
少々崩れたHTMLや、HTMLの<ul>中にJavaScriptが書いてあり、そのJS中でさらに
ulやliがあるといった場合でもまず誤爆したりしません。
(ブラウザとほぼ同精度のDOM分解が出来ているから)

そこまでは求めず、
「パターンが固定的・フォーマットも崩れない・ネスト他、例外的要素はない」
という前提が立つなら、
すでに提示されているような
「とりあえず」な形となる正規表現や置き換えによる対処で充分かと思います。

[ ]
RE:08463 <li>タグを段落番号に変換No.08464
tyyyu2005 さん 16/12/05 16:57
 
秀まるお2さん、colderさん、Iranoanさん、天翔記jpさん

お返事遅れて申し訳ありません。
只今出張から帰ってきました><

様々な導き方があるのですね。
動作確認致しました。

olが入れ子に関してですが、Script類やHTMLの整形等事前に行っていますので、ご提
示頂いたマクロで大丈夫だと思います。
※すみません 先に伝えていればよかったです。

大変助かりました。
ありがとうございます。

[ ]