Преобразование текста нумерованных списков во вложенные списки HTML - PullRequest
0 голосов
/ 23 марта 2012

ОБНОВЛЕНИЕ ВНУТРИ

Может быть, кто-то может помочь с этим ... боролся с этим в течение нескольких дней, и я заблокирован: /

Для решения по очистке контента, в котором я работаю, я пытаюсь преобразовать некоторые чистые текстовые нумерованные списки, например:

1 Foo
1.1 Foo 1
1.2 Foo 2
2 Bar
2.1 Bar 1
2.2 Bar 2
2.2.1 Bar 2.1
2.2.2 Bar 2.2
2.3 Bar 3
3 Z Another root item

... в правильные вложенные списки HTML ...

<ul>
    <li>Foo
        <ul>
            <li>Foo 1</li>
            <li>Foo 2</li>
        </ul>
    </li>
    <li>Bar
        <ul>
            <li>Bar 1</li>
            <li>Bar 2
                <ul>
                    <li>Bar 2.1</li>
                    <li>Bar 2.2</li>
                </ul>
            </li>
            <li>Bar 3</li>
        </ul>
    <li>Another root item</li>
</ul>

Некоторые вещи, которые могут помочь:

  • Нет необходимости корректно сдвигать результат, просто в окружении правильных HTML-тегов
  • Нет необходимости размещать список в другом тексте, можно предположить, что у меня уже есть только список
  • Нет необходимости в отличной производительности, регулярном выражении, итарации ... что бы ни работало нормально
  • Нет необходимости в специальном языковом решении, PHP, Python, Javascript, Pseudocode ... отлично
  • Может использовать "" (пробел) как единственный разделитель после текста списка "1.2.3"
  • Может принимать строки уже в правильном порядке, не нужно их вообще заказывать

ОБНОВЛЕНИЕ TLTR (Не домашнее задание, а использование в реальном мире)

Извините за то, что выглядело так "домашнее задание не выполнено", моя вина. Английский не мой язык, и я старался быть кратким. Я пытаюсь сделать так, чтобы мои коллеги по работе форматировали текст, исправляя HTML из неизвестных источников.

На сегодняшний день мне удалось (вы можете увидеть полный скриншот здесь http://twitpic.com/907aw5/, так как я не могу прикрепить изображения, так как это мой первый вопрос и нет репутации):

  • Я получаю оригинальный текст и делаю на нем метки strip_tags, чтобы удалить любой неправильный HTML, который он может иметь
  • Я вставляю его в текстовую область
  • Я интегрировал редактор Javascript (Codemirror http://codemirror.net) со спецификациями для HTML
  • Я ввел панель редактирования с наиболее распространенными тегами, которые мы используем, так как мои коллеги по работе не знают ни слова о HTML
  • Как часть опций очистки, я установил две горячие клавиши, которые делают ul / ol выделенного текста (разбивая символы \ n)
  • Когда пользователь сохраняет данные, я запускаю на нем HTMLTidy, чтобы он стал как можно более чистым (отступ, удаление тегов и т. Д.) *

Просто чтобы закончить, как вы можете видеть на скриншоте выше, у меня есть много текстов с "организацией" 1.2.3, и будет очень полезно иметь возможность получить решение из вложенного списка из этого вид текста.


ОБНОВЛЕНИЕ (Особые потребности)

Теперь объяснение «почему» я использовал так много пуль для предположений:

  • Нет необходимости, чтобы результат был правильно сдавлен, просто окружен правильными HTML-тегами (потому что после этого, когда пользователь нажимает кнопку Сохранить, я запускаю htmltidy для него, поэтому он получает отступ)
  • Нет необходимости размещать список в другом тексте, можно предположить, что у меня уже есть только список (потому что я запускаю код поверх текста, выбранного пользователем в редакторе, поэтому могу предположить, что он выбрал правильный список)
  • Нет необходимости в высокой производительности, регулярном выражении, итарации ... все, что работает хорошо (так как это использование человеком, щелчок по точке, щелчок по точке, я не против, если это займет 0,0001 секунды за использование, или 0,1 )
  • Нет необходимости в специальном языковом решении, PHP, Python, Javascript, Pseudocode ... это хорошо (я собираюсь использовать его в javascript / jQuery, но мне нужна только логика, так как я заблокирован ... я могу запятнать это, если решение на другом языке)
  • Может использовать "" (пробел) как единственный разделитель после текста списка "1.2.3" (так как это 99% моих текстовых случаев)
  • Может считать строки уже в правильном порядке, их вообще не нужно упорядочивать (как видно на скриншоте, этот текст вводится человеком, и я полагаю, они вставили его в правильном порядке)

Еще раз извините за то, что не достаточно ясно, просто мой первый вопрос в Stackoverflow, и я не осознавал, что это будет выглядеть как домашнее задание, моя вина.

1 Ответ

3 голосов
/ 23 марта 2012

Ради забавы, я решил написать вашу проблему, используя PHP:

function helper_func($m)
{
    static $r=0;
    $o='';
    $l=preg_match_all("#\d+#",$m[1],$n);
    while($l < $r)
    {
        $r--;
        $o .= '</li></ul>';
    }
    if($l == $r)return $l == 0?$o.$m[0]:$o.'</li><li>'.$m[0];
    else $o=$m[0];
    while($l > $r)
    {
        $r++;
        $o = '<ul><li>'.$o;
    }
    return $o;
}
echo preg_replace_callback("#^([0-9.]*).*$#m","helper_func",$input);

Однако, из-за того, что это домашнее задание, я включил преднамеренную ошибку: чтобы она получилась правильно, вам нужно внести одно небольшое изменение в $ input, прежде чем передать его ... Веселитесь :)

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