Могу ли я использовать регулярные выражения для копирования заголовка в каждую запись до следующего заголовка?(Гиперссылка сносок в электронную книгу) - PullRequest
0 голосов
/ 04 августа 2011

Хорошо, регулярное выражение ниндзя.Я пытаюсь разработать шаблон для добавления гиперссылок на сноски в XHTML-файле ePub ebook.Проблема в том, что нумерация перезапускается в каждой главе, поэтому мне нужно добавить уникальный идентификатор к имени якоря, чтобы хешировать ссылку на него.

Учитывая (очень упрощенный) список, подобный этому:

<h2>Introduction</h2>
<p> 1 Endnote entry number one.</p>
<p> 2 Endnote entry number two.</p>
<p> 3 Endnote entry number three.</p>
<p> 4 Endnote entry number four.</p>

<h2>Chapter 1: The Beginning</h2>
<p> 1 Endnote entry number one.</p>
<p> 2 Endnote entry number two.</p>
<p> 3 Endnote entry number three.</p>
<p> 4 Endnote entry number four.</p>

Мне нужно превратить это во что-то вроде этого:

<h2>Introduction</h2>
<a name="endnote-introduction-1"></a><p> 1 Endnote entry number one.</p>
<a name="endnote-introduction-2"></a><p> 2 Endnote entry number two.</p>
<a name="endnote-introduction-3"></a><p> 3 Endnote entry number three.</p>
<a name="endnote-introduction-4"></a><p> 4 Endnote entry number four.</p>

<h2>Chapter 1: The Beginning</h2>
<a name="endnote-chapter-1-the-beginning-1"></a><p> 1 Endnote entry number one.</p>
<a name="endnote-chapter-1-the-beginning-2"></a><p> 2 Endnote entry number two.</p>
<a name="endnote-chapter-1-the-beginning-3"></a><p> 3 Endnote entry number three.</p>
<a name="endnote-chapter-1-the-beginning-4"></a><p> 4 Endnote entry number four.</p>

Очевидно, что будет необходим подобный поиск в реальном тексте книги, где каждая сноска будет связана с endnotes.xhtml#endnote-introduction-1 и т. д.

Самым большим препятствием является то, что поиск каждого совпадения начинается ПОСЛЕ окончания предыдущего поиска, поэтому, если вы не используете рекурсию, вы не можете сопоставить один и тот же бит (в данном случае заголовок) для более чем одногозапись.Однако мои попытки с рекурсией до сих пор приводили только к бесконечным циклам.

Я использую механизм grep TextWrangler, но если у вас есть решение в другом редакторе (например, vim), это тоже хорошо.

Спасибо!

Ответы [ 2 ]

1 голос
/ 04 августа 2011

Я думаю, что это будет трудно сделать в текстовом редакторе, поскольку он требует двухэтапного процесса.Сначала вам нужно разделить файл на главы, затем вам нужно обработать содержимое каждой главы.Предполагая, что «конечные абзацы» (где вы хотите добавить якоря) определены как абзацы с первым словом, равным целочисленному слову, тогда этот скрипт PHP будет делать то, что вам нужно.* Этот скрипт правильно обрабатывает данные вашего примера.

1 голос
/ 04 августа 2011

Немного аук может сделать трюк:

Создайте следующий скрипт (я назвал его add_endnote_tags.awk):

/^<h2>/ {
    i = 0;
    chapter_name = $0;
    gsub(/<[^>]+>/, "", chapter_name);
    chapter_name = tolower(chapter_name);
    gsub(/[^a-z]+/, "-", chapter_name);
    print;
}

/^<p>/ {
    i = i + 1;
    printf("<a name=\"endnote-%s-%d\"></a>%s\n", chapter_name, i, $0);
}

$0 !~ /^<h2>/ && $0 !~ /^<p>/ {
    print;
}

А затем используйте его для анализа вашего файла:

awk -f add_endnote_tags.awk < source_file.xml > dest_file.xml

Надеюсь, это поможет. Если вы работаете на платформе Windows, вам может потребоваться установить awk, установив cygwin и пакет awk, или загрузив gawk для Windows

...