我正致力于在Trac wiki中记录一些数学研究。我已经使用MathJax插件设置了Trac安装,一切都运行良好。随着文档变得越来越长,我希望能够使用TextMate进行语法突出显示,并使生成预览变得更容易。我找到了Trac bundle并安装了它。在bundle中,它有以下用于生成HTML预览的perl脚本:
# Preview command contributed by Tudor Marghidanu
#
# Requires the Text::Trac perl module:
#
# sudo perl -MCPAN -e 'install Text::Trac'
#
#!/usr/bin/env perl
use strict;
use warnings;
use Text::Trac;
my $parser = Text::Trac->new();
$parser->parse( join( '', <STDIN> ) );
print $parser->html();
(对于使用此捆绑包的其他人,需要将#!行移至文件顶部才能正常工作)
这很好地将Trac wiki标记生成为HTML,但显然,没有对MathJax标记做任何事情。我只是添加了一行
print '<script type="text/javascript"
src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML">
</script>';
从CDN加载javascript。现在的问题是MathJax代码符号(例如^)正在被翻译成HTML,因为它们也是TracWiki语法的一部分。我尝试使用TracWiki标记基本上“注释掉”MathJax代码段,但Perl Trac库似乎并不关心这些。
似乎应该有一种方法可以正则表达式匹配所有mathjax代码段,将它们存储到数组中,用占位符标记(如mj1,mj2,...)替换它们,将替换的wiki文本处理为HTML,然后正则表达式替换存储值数组中的占位符。
如果这是正确的方法,那么在Perl中如何完成?
如果这不是正确的方法,那是什么?
答案 0 :(得分:2)
以您的解决方案为出发点,以下是一个更简单的解决方案。
它依赖于剪切片段的有序性和s///eg
一次性替换而不是两步:
#!/usr/bin/env perl
#
# Preview command contributed by Tudor Marghidanu
#
# Requires the Text::Trac perl module:
#
# sudo perl -MCPAN -e 'install Text::Trac'
#
use strict;
use warnings;
use Text::Trac;
my $parser = Text::Trac->new();
my $tractext = join '', <STDIN>;
my @mathjax_snippets;
$tractext =~ s{(\\\(.*\\\))}{
push @mathjax_snippets, $1;
"math_jax_snippet"
}eg;
$parser->parse($tractext);
my $html = $parser->html();
$html =~ s/math_jax_snippet/shift @mathjax_snippets/eg;
print '<script type="text/javascript"
src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML">
</script>';
print $html;
答案 1 :(得分:1)
好的,所以我能够聚集一些代码。它可能不是Perl-y最好的方法,但确实有效:
#!/usr/bin/env perl
#
# Preview command contributed by Tudor Marghidanu
#
# Requires the Text::Trac perl module:
#
# sudo perl -MCPAN -e 'install Text::Trac'
#
use strict;
use warnings;
use Text::Trac;
my $parser = Text::Trac->new();
my $tractext = join( '', <STDIN> );
my @mathjax_snippets = ();
my @placeholders = ();
while ($tractext =~ /(\\\(.*\\\))/g) {
push(@mathjax_snippets,"$1");
my $pos = pos $tractext;
push(@placeholders,"math_jax_snippet_$pos");
}
my %substitution;
@substitution{@mathjax_snippets} = @placeholders;
my $pattern = '(' . join('|', map quotemeta, @mathjax_snippets) . ')';
$tractext =~ s/$pattern/$substitution{"$1"}/g;
$parser->parse( $tractext );
my $html = $parser->html();
my %replace;
@replace{@placeholders} = @mathjax_snippets;
$pattern = '(' . join('|', map quotemeta, @placeholders) . ')';
$html =~ s/$pattern/$replace{"$1"}/g;
print '<script type="text/javascript"
src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML">
</script>';
print $html;