Help us understand the problem. What is going on with this article?

NORENで生成されるHTMLで空行を(出来る限り)無くす

More than 3 years have passed since last update.

はじめに

NORENで生成されるHTMLソースの空行を無くすためのサクラエディタのマクロを書いてみました。
ここからダウンロード出来ます(GitHubへ飛びます)

以下つらつらと能書き。

説明

HTMLソースレベルの話なので、特に見かけ上影響は無いので不要と言えば不要な話かも知れませんが、
インデントに使ったスペースと改行でそれなりに容量食ったりするので、ちょっとはデプロイが速くなるかも…といった感じで。

NORENはテンプレートからHTMLを生成する時にアクションタグのみを除外して生成します。
これが、生成後のHTMLを見たりする時にかなり面倒&無駄に容量が大きくなったり、あまり良くない感じになります。
例えば、

sample01.txt
[[--ActionStart,row:5--]]
    [[--IfStart,is:xxxxx--]]
        [[--ThenStart--]]
            <li>~</li>
    [[--ThenEnd--]]
    [[--IfEnd--]]
[[--ActionEnd--]]

こんな感じでカテゴリ内の全ての記事を取得し、かつIf文で条件を満たすものだけを表示させる様な時に、アクションタグが書かれている行がそのまま吐き出されてやたらと空行の多いHTMLソースができあがります。
こんな感じに…

sample02.txt
 
     
         
            <li>~</li>
     
     
     
         
            <li>~</li>
     
     
     
         
            <li>~</li>
     
     
     
         
            <li>~</li>
     
     
     
         
            <li>~</li>
     
     
 

そんな訳で、何をするかと言うと、NORENのタグ部分にかかるインデント・改行はは全てコメントアウトしてしまいます。

sample01b.txt
[[--ActionStart,row:5--]][[---
    ---]][[--IfStart,is:xxxxx--]][[---
        ---]][[--ThenStart--]][[---
---]]            <li>~</li>
[[---        ---]][[--ThenEnd--]][[---
    ---]][[--IfEnd--]][[---
---]][[--ActionEnd--]][[---
---]]

これで結構すっきりしたソースが生成されます。

サクラエディタ用マクロ

でも、これを毎回毎回手でやっていたのではかなり手間なので、サクラエディタで使える変換用のマクロを作ってみました。コメントアウトするだけだと後から修正するのが大変なので、戻すマクロも併せて。
Ver.2.1.1.3で動作確認済みです…とは言っても単に正規表現での置換なので、バージョンどうこうで動かないとかにはならないはずです。

noren_indentmake.mac
//キーボードマクロのファイル
//---------------------------------------
//NORENソースの空行をなくすコメントアウトを入れるマクロ
// [[--ActionStart--]]
//    [[--Write--]]
// となっているものを
// [[--ActionStart--]][[---
//    ---]][[--Write--]]
// の形式に置き換える
//---------------------------------------
//行の最後がアクションタグであれば,改行をコメントでくくる
S_ReplaceAll('--\\]\\](\\r\\n|\\n)', '--\\]\\]\\[\\[---$1---\\]\\]', 44);   // 

//コメントアウト終了とアクションタグ開始の間に空白があればそれもコメントアウトに含める
S_ReplaceAll('^---\\]\\](\\s+)\\[\\[--', '$1---\\]\\]\\[\\[--', 44);    // 
S_ReDraw(0);    // 再描画
noren_indentdel.mac
//キーボードマクロのファイル
//---------------------------------------
//NORENソースの空行をなくすコメントアウトを削除するマクロ
// [[--ActionStart--]][[---
//    ---]][[--Write--]]
// となっているものを
// [[--ActionStart--]]
//    [[--Write--]]
// の形式に置き換える
//---------------------------------------
//行末のコメントアウト開始を削除
S_ReplaceAll('\\[\\[---(\\r\\n|\\n)', '$1', 44);    // 

//行頭のコメントアウト終了を削除.空白があればそれは残す
S_ReplaceAll('^(\\s*)---\\]\\]', '$1', 44); // 

S_ReDraw(0);    // 再描画

マクロ利用時の問題点

ただこのマクロ、今の所いくつか不具合があって、

  • コメント行の書き方に制限がある
  • コメントアウト出来ない場合がある

です。

1. コメント行の書き方に制限がある

コメント行は下記の様に書くとコメントアウトを削除する処理で余計に消してしまいます。

[[---
   コメント行
    複数行にわたるコメント
---]]

上記の様なコメントが書きたい場合、

[[---コメント行
    複数行にわたるコメント---]]

こう書く必要があります。

2. コメントアウト出来ない場合がある

これは、HTMLタグの改行の直後にアクションタグが来る場合です。
先ほども出てきましたが、こんなソースの時です。

sample01.txt
[[--ActionStart,row:5--]]
    [[--IfStart,is:xxxxx--]]
        [[--ThenStart--]]
            <li>~</li>
    [[--ThenEnd--]]
    [[--IfEnd--]]
[[--ActionEnd--]]

この時、マクロに変換させると下記の様になります。

sample01c.txt
[[--ActionStart,row:5--]][[---
    ---]][[--IfStart,is:xxxxx--]][[---
        ---]][[--ThenStart--]][[---
---]]            <li>~</li>
        [[--ThenEnd--]][[---
    ---]][[--IfEnd--]][[---
---]][[--ActionEnd--]][[---
---]]

とまあ問題もあったりしますが、それなりに実用に堪えるのではないかと思います。


2015/03/09追記

一応、NOREN5.1.1.1.5からReplaceタグが追加されたので、これを使っても空行は消せます。

テンプレートの最初と最後を囲む形でアクションタグで終わる行の改行コードを#BLANK#に置換する様にすれば良いです。

sample02.txt
[[--ReplaceStart,regex:(--\]\])\r\n,to:$1--]]

(NORENの処理を書く)

[[--ReplaceEnd--]]

こんな感じでしょうか。
ただ、これで置換対象が多くなってしまうと配信に影響が出るかも知れません。
そもそもAction使ったりすると結構重たくなるのに、更に重くするのか…とか。
検証はしないといけません。

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away