タグ付けスクリプト更新
あらよっと
以下コード
do { $tmp = <STDIN>; $_ .= $tmp; } while ($tmp); # & -> & s/&/&/g; # < -> < s/</</g; # > -> > s/>/>/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[^"'\\]*)(<(?:[^\\]|\\.)*?>)%\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";