2007年7月23日月曜日

(X)HTMLコンバータ (5) 複数行文字列を取得

{"で始まり"}で終わる複数行文字列を切りだして表示するスクリプト。
変換はだいたいこんな感じで行っています。
このスクリプトの場合コメント内文字列にも律儀に反応してしまいますが、コンバータではそうはなりません。

instr後にちゃっちゃと切りだしてしてしまえば良さそうなものですが、そうしていない理由は次のようなスクリプトに対応するためです。mes {"
この行で終わってはいけない\"}
この行で終わるべき\\"}


mes {"2バイト目が'\\'の2バイト文字には
反応しない→ソ"}

これに対して、複数行コメントの場合はこうした心配は必要ありません。

// 複数行文字列を切りだすスクリプト

    dialog "hsp;*.as;*.hss;*.hsh", 16
    if stat == 0 : end
    notesel buf
    noteload refstr
    bufSize = notesize

    repeat bufSize
        bufPos = cnt
        c = peek( buf, bufPos )
        if ( c == '{' ) & ( bufPos + 1 < bufSize ) {
            if ( peek( buf, bufPos + 1 ) == '"' ) {
                k = 0
                repeat
                    ins = instr( buf, bufPos + k, "\"}" )
                    if ( ins < 0 ) {
                        k = bufSize - bufPos
                        break
                    }
                    repeat
                        j = peek( buf, bufPos + k + ins - cnt - 1 )
                        if j == '\\' : continue
                        if (( 129 <= j ) & ( j <= 159 )) | (( 224 <= j ) & ( j <= 252 )) {
                            j = cnt - 1
                            if ( j < 0 ) : j = 0
                            break
                        }
                        j = cnt
                        break
                    loop
                    k += ins + 2 // 2 = strlen( "\"}" )
                    if ( j \ 2 ) {
                        // まだ続く
                        continue
                    }
                    break
                loop
                s = strmid( buf, bufPos, k )
                mes s
                continue bufPos + k
            }
        }
    loop
    stop

0 件のコメント: