Использование awk для обработки связанных с html вопросов Moodle в формате Gift. - PullRequest
1 голос
/ 01 декабря 2019

Это в основном вопрос awk, но речь идет об обработке данных для формата Moodle Gift , то есть тегов.

Я хочу отформатировать HTML-код ввопрос (Moodle «тестовая» деятельность), но мне нужно заменить <и> на соответствующие объекты, так как они будут интерпретироваться как «настоящий» html, а не печататься. Однако я хочу иметь возможность набирать вопрос обычным кодом и обрабатывать файл перед импортом в качестве подарка в Moodle.

Я подумал, что awk будет идеальным инструментом для этого.

Скажите, у меня есть этот вопрос (недействительный как таковой) Вопрос Moodle / Gift:

<code>::q1::[html]This is a question about HTML:
<pre>
<p>some text</p>
и какой-то тег: <img> {T}

Мне нужен скрипт, который переводит этов действительный вопрос подарка:

<code>::q1::[html]This is a question about HTML:
<pre>
&lt;p&gt;some text&lt;/p&gt;
и некоторый тег: &lt;img&gt; {T}

ключевой момент: замените <и> на &lt; и &gt;, когда:

  1. внутри блока <pre> - </pre> (при условии, что эти теги находятся на одной строке)
  2. между <code> и , с произвольной строкой между.

По первой части я в порядке. У меня есть скрипт оболочки, вызывающий awk (на самом деле gawk).

awk -f process_src2gift.awk $1.src >$1.gift

с process_src2gift.awk:

<code>BEGIN { print "// THIS IS A GENERATED FILE !" }
{
    if( $1=="<pre>" ) # opening a "code" block
    {
        code=1;
        print $0;
    }
    else
    {
        if( $1=="
") # закрывающий блок« code »{code = 0; print $ 0;} else {# if "code block", заменить <> на html-сущности if (code == 1) {gsub (">", "\\>"); gsub ("<", "\\ <");} print $ 0;}}} END {print "// END"} </code>

Однако я застрял со вторым требованием ..

Вопросы:

  1. Можно ли добавить в мой код сценария awk обработку кода hmtl внутри тегов <code>? Есть идеи? Я думал об использовании sed, но не видел, как это сделать.

  2. Может быть, awk не подходит для этого? Я открыт для любых предложений по другому (стандартному Linux) инструменту.

1 Ответ

1 голос
/ 02 декабря 2019

Ответ на собственный вопрос.

Я нашел решение, выполнив двухэтапный процесс awk:

  • первый шаг, как описано в вопросе
  • второй шаг, определив<code> или в качестве разделителя полей с использованием регулярного выражения и обработки замены строки на второй аргумент ($ 2).

Файл оболочки становится:

echo "Step 1"
awk -f process_src2gift.awk $1.src >$1.tmp

echo "Step 2"
awk -f process_src2gift_2.awk $1.tmp >$1.gift

rm $1.tmp

И второй awk-файл (process_src2gift_2.awk) будет:

BEGIN { FS="[<][/]?[c][o][d][e][>]"; }
{
    gsub(">","\\&gt;",$2);
    gsub("<","\\&lt;",$2);
    if( NF >= 3 )
        print $1 "<code>" $2 "</code>" $3
    else
        print $0
}

Конечно, есть ограничения:

  • нет атрибутов в теге <code>
  • только одна пара <code> в линии
  • возможно, другие ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...