message.naml
<macro name="message_with_signature" requires="node">
<n.node_message_as_html />
<n.if.both condition1="[n.owner.has_signature/]" condition2="[n.owner.is_active/]">
<then>
<div class="signature weak-color">
<n.owner.signature_as_html/>
</div>
</then>
</n.if.both>
</macro>
<macro name="node_message_block" dot_parameter="do" requires="node">
<n.global_set_var name="message_block_node" value="[n.this_node/]" />
<n.do/>
</macro>
<macro name="message_block_node" dot_parameter="do">
<n.get_node node="[n.global_var name='message_block_node'/]" do="[n.do/]" />
</macro>
<macro name="node_message_as_html" requires="node">
<n.node_message_block.message.message_as_html />
</macro>
<macro name="node_message_as_text" requires="node">
<n.node_message_block.message.message_as_text />
</macro>
<macro name="message_quoted" requires="node" unindent="true">
<quote author="[n.owner.name/]">
<n.trim.message.as_quoted_text/>
</quote>
<n.nop/>
</macro>
<macro name="message_as_html" requires="message">
<n.if.either condition1="[n.is_deleted/]" condition2="[n.is_deactivated/]">
<then>
<b><t>CONTENTS DELETED</t></b>
<div class="weak-color"><t>The author has deleted this message.</t></div>
</then>
<else>
<n.set_var. name="output">
<n.as_html_list.process_message_html />
</n.set_var.>
<n.if.is_imported_mail>
<then.set_var. name="output">
<n.remove_unsubscription_link.var name="output" />
</then.set_var.>
</n.if.is_imported_mail>
<n.var name="output" />
</else>
</n.if.either>
</macro>
<macro name="process_message_html" requires="html_list">
<n.process_raw_tags/>
<n.process_cdata_tags/>
<n.process_embed regex="[n.embed_regex/]" />
<n.process_file_tags/>
<n.apply_message_security/>
<n.process_quotes wrote="[t][n.author/] wrote[/t]"/>
<n.process_email/>
<n.set_target_to_top/>
<n.add_nofollow/>
<n.process_smilies/>
</macro>
<macro name="apply_message_security" requires="html_list">
<n.if.is_in_command name="node_message_block">
<then.if.not.message_block_node.has_unrestricted_posting>
<then.message_security/>
</then.if.not.message_block_node.has_unrestricted_posting>
<else.message_security/>
</n.if.is_in_command >
</macro>
<macro name="message_security" requires="html_list">
<n.disable_banned_tags.>
script,
style,
html,
head,
body,
link
</n.disable_banned_tags.>
<n.disable_invalid_urls.>
href,
src,
action
</n.disable_invalid_urls.>
<n.disable_javascript_urls.>
href,
src,
action
</n.disable_javascript_urls.>
<n.disable_on_event/>
<n.disable_scripts/>
<n.disable_style_blocks/>
</macro>
<macro name="message_as_text" requires="message">
<n.as_text_list.process_message_text />
</macro>
<macro name="process_message_text" requires="html_list">
<n.process_quotes_as_text wrote="[t][n.author/] wrote[/t]"/>
<n.process_smilies_as_text/>
<n.process_file_tags/>
<n.process_tag tag="b" do="*" />
<n.process_tag tag="/b" do="*" />
<n.process_tag tag="i" do="/" />
<n.process_tag tag="/i" do="/" />
<n.process_tag tag="u" do="_" />
<n.process_tag tag="/u" do="_" />
<n.process_text text="<" replacement="[n.lt/]" />
<n.process_text text=">" replacement="[n.gt/]" />
</macro>
<macro name="embed_regex">
<n.if.is_in_command name="node_message_block">
<then.if.message_block_node.has_unrestricted_posting>
<then>(?s).*</then>
<else.embed_regex_list/>
</then.if.message_block_node.has_unrestricted_posting>
<else.embed_regex_list/>
</n.if.is_in_command >
</macro>
<macro name="embed_regex_list">
(<n.youtube_object_regex/>)|(<n.youtube_object_regex2/>)|(<n.youtube_iframe_regex/>)|(<n.liveleak_regex/>)|(<n.polldaddy_regex/>)|(<n.vimeo_regex/>)
</macro>
<macro name="youtube_object_regex">
<![CDATA[\s*<object width="\d+" height="\d+"><param name="movie" value="http://www.youtube.com/v/[^"]+"></param><param name="allowFullScreen" value="\w+"></param><param name="allowscriptaccess" value="\w+"></param><embed src="http://www.youtube.com/v/[^"]+" type="application/x-shockwave-flash" allowscriptaccess="\w+" allowfullscreen="\w+" width="\d+" height="\d+"></embed></object>\s*]]>
</macro>
<macro name="youtube_object_regex2">
<![CDATA[\s*<object width="\d+" height="\d+"><param name="movie" value="https?://www.youtube(-nocookie)?.com/v/[^"]+"></param><param name="allowFullScreen" value="\w+"></param><param name="allowscriptaccess" value="\w+"></param><embed src="https?://www.youtube(-nocookie)?.com/v/[^"]+" type="application/x-shockwave-flash" width="\d+" height="\d+"( allowscriptaccess="\w+")?( allowfullscreen="\w+")?></embed></object>\s*]]>
</macro>
<macro name="youtube_iframe_regex">
<![CDATA[\s*<iframe[^>]* src="(https?:)?//www.youtube.com/embed/[^"]+"[^>]*></iframe>\s*]]>
</macro>
<macro name="liveleak_regex">
<![CDATA[\s*<object width="\d+" height="\d+"><param name="movie" value="http://www.liveleak.com/e/\w+"></param><param name="wmode" value="\w+"></param><param name="allowscriptaccess" value="\w+"></param><embed src="http://www.liveleak.com/e/\w+" type="application/x-shockwave-flash" wmode="\w+" allowscriptaccess="\w+" width="\d+" height="\d+"></embed></object>\s*]]>
</macro>
<macro name="polldaddy_regex">
<![CDATA[\s*<embed allowScriptAccess="\w+" saveEmbedTags="\w+" quality="\w+" wmode="\w+" bgcolor="#\w+" name="\w+" salign="\w+" scale="\w+" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" FlashVars="p=\d+" src="http://i.polldaddy.com/poll.swf" width="\d+" height="\d+"></embed>\s*]]>
</macro>
<macro name="vimeo_regex">
<![CDATA[\s*<iframe src="https?://player.vimeo.com/video/[^"]+" width="\d+" height="\d+" frameborder="0"( webkitAllowFullScreen)?( mozallowfullscreen)?( allowFullScreen)?></iframe>.*]]>
</macro>