タグ付けスクリプト更新

あらよっと

  • プリプロセッサの処理変更。もうちょっとまともに動作するかも知れん。
  • キーワード追加。switchとか色々抜けていたやつ追加。ほら、記憶だけ頼りに書いてたから。あとC++0xに入りそうなのを追加。

以下コード

do {
	$tmp = <STDIN>;
	$_ .= $tmp;
} while ($tmp);

# & -> &amp;
s/&/&amp;/g;

# < -> &lt;
s/</&lt;/g;

# > -> &gt;
s/>/&gt;/g;

$string = qq/"(?:[^"\\\\]|\\\\(?:.|\\n))*?"/;
$char = qq/'(?:[^'\\\\]|\\\\(?:.|\\n))*?'/;
$comment = qq%//(?:[^\\\\]|\\\\(?:.|\\n))*?(?=\\n)|/\\*(?:[^\\\\]|\\\\(?:.|\\n))*?\\*/%;

$keywords = "(auto|asm|bool|break|case|catch|char|char16_t|char32_t|class|concept|concept_map|const|const_cast|constexpr|continue|decltype|default|do|double|dynamic_cast|enum"
	."|export|extern|false|float|for|goto|if|inline|int|late_check|long|mutable|namespace|nullptr|operator|private|protected|public|register|requires|reinterpret_cast|return|signed"
	."|sizeof|short|static|static_assert|static_cast|struct|switch|template|this|throw|true|try|typedef|typeid|typename|union|unsigned|using|virtual|void|volatile|wchar_t|while)";

# keywords
s%((?:[^"'\\/]|\\.|/[^*/]|$comment|$string|$char)*?)\b($keywords)\b%\1<span class="keywords">\2</span>%xg;

# string
s%\G((?:[^"'<\\/]|\\.|/[^*/]|$comment|$char|<.*?>)*?)($string)%\1<span class="string">\2</span>%xg;

# char
s%\G((?:[^"'<\\/]|\\.|/[^*/]|$comment|$string|<.*?>)*?)($char)%\1<span class="char">\2</span>%xg;

# number literal
s%\G((?:[^"'<\\/]|\\.|/[^*/]|$comment|$string|$char|<.*?>)*?)(\b(?:[[:digit:]]+(?=[^.])|0x[[:xdigit:]]+)(?:U|L|UL|LU)?|[[:digit:]]+\.[[:digit:]]+?[fl]?)%\1<span class="number">\2</span>%xg;

# comment
s%\G((?:[^"'<\\/]|\\.|/[^*/]|$string|$char|<.*?>)*?)($comment)%\1<span class="comment">\2</span>%xg;

# #include <foo.hpp>
s%\G((?:[^\\]|\\(?:.|\n))*?\n+[ \t]*\#[ \t]*include[^"'\\]*)(&lt;(?:[^\\]|\\.)*?&gt;)%\1<span class="string">\2</span>%xg;

# preprocess
s%\G((?:[^\\]|\\(?:.|\n))*?\n+[ \t]*)(\#[ \t]*(?:ifdef|ifndef|if|elif|else|endif|define|include|error|warning|pragma))\b%\1<span class="preprocess">\2</span>%g;

print qq/<pre class="cpp">\n/;
print;
print "</pre>\n";