Я пишу сложный сценарий, который берет XML-резервную копию блога Blogger и преобразует его в текст с тегами InDesign для размещения в книге. Я использую целую кучу регулярных выражений, чтобы очистить теги HTML каждого сообщения в блоге и преобразовать их в теги InDesign. Например:
<p>A really long paragraph.</p> -> <ParaStyle:Main text>A really long paragraph.
<em>Whatever</em> -> <CharStyle:Italic>Whatever<CharStyle:>
По большей части скрипт работает отлично. Однако InDesign не может обрабатывать вложенные теги. <CharStyle:Small><CharStyle:Italic>This is small italic text<CharStyle:><CharStyle:>
не будет работать и должен закончиться как <CharStyle:Small italic>This is small italic text<CharStyle:>
Я пытаюсь использовать переменные в шаблонах поиска регулярных выражений, чтобы найти где-нибудь, где теги стиля символа удваиваются, но когда я использую переменные, ничего не найдено. Однако, если я жестко закодирую теги InDesign в регулярное выражение, это работает. Что делает переменные неразборчивыми?
Вот рабочая выдержка из моего кода (в реальной жизни $input
это не строковая переменная, а объект LibXML, который скрипт анализирует ... это только для иллюстрации)
#!/usr/bin/perl -w
use strict;
my $IDitalic = "<~~CharStyle:Italic>";
my $IDsmall = "<~~CharStyle:Small>";
my $IDsmallitalic = "<~~CharStyle:Small italic>";
my $IDcharend = "<~~CharStyle:>";
sub cleanText {
my $text = $_[0];
# Replace any span with a font size attribute with "small" character style
$text =~ s/<span[^>]*?font-size[^>]*>(.*?)<\/span>/$IDsmall$1$IDcharend/gis;
# Replace <em> tags with "italic" character style
$text =~ s/<em>(.*?)<\/em>/$IDitalic$1$IDcharend/gis;
#--------------------------------------------------------
# Problem section
#
# The following works since everything is hard coded
# $text =~ s/<~~CharStyle:Small><~~CharStyle:Italic>/$IDsmallitalic/gi;
# $text =~ s/<~~CharStyle:><~~CharStyle:>/$IDcharend/gi;
# When I use variables, though, it doesn't work...
$text =~ s/{$IDsmall}{$IDitalic}/$IDsmallitalic/gi;
$text =~ s/({$IDcharend})\1+/$1/gi;
#--------------------------------------------------------
# Clear out all tags that aren't the InDesign tags, take out the dummy ~~ and rebuild the actual tag
$text =~ s/<[^~~](?:[^>'"]*|(['"]).*?\1)*>//gs;
$text =~ s/<~~/</gs;
return $text;
}
my $input = "<~~ParaStyle:Main text>In sodales malesuada nisi quis varius. Proin a ligula mauris. Proin ac justo est, vitae sollicitudin tortor. Proin auctor, <span style=\"font-size:78%\">augue eu</span> fringilla imperdiet, nisi sapien tempus libero, sed aliquet quam metus vel risus. Curabitur feugiat tristique porttitor. Integer malesuada volutpat accumsan. <span class=\"dummy\"In egestas</span> metus ut erat placerat tempus. <em>Nam vestibulum</em>, est quis scelerisque tincidunt, enim est lacinia ligula, vel accumsan ante nisl consectetur massa. Nullam velit nisi, viverra quis viverra ac, dictum ac enim. Sed nisl magna, fringilla at placerat quis, facilisis id nibh. Mauris eget sapien mauris, nec sollicitudin urna. Curabitur ac nunc a arcu vulputate tincidunt.\n<~~ParaStyle:Main text><span style=\"font-size:78%\"><em>**This is really small text</em></span>\n<ParaStyle:Comments\:Comment author>Andrew\n<~~ParaStyle:Comments\:Comment date>Friday, May 29, 2009— 8:15 PM";
print cleanText($input);
Итак, что же не так?
Кроме того, есть ли лучший способ сохранить теги InDesign без наличия фиктивных тильд в имени переменной?
Спасибо!
Автор, очевидно, решил разобрать HTML, для получения дополнительной информации перейдите к последующему разбору вопроса .