Как расширить Parsedown, чтобы добавить класс к табличным тегам

Я хочу написать расширение для Parsedown, чтобы я мог добавить класс по умолчанию для каждого из тегов таблицы. Я обнаружил, что могу успешно взломать исходный код, добавив строки для назначения атрибутов в blockTable функция (около строки 870):

$Block = array(
        'alignments' => $alignments,
        'identified' => true,
        'element' => array(
                'name' => 'table',
                'handler' => 'elements',
                'attributes' => array(
                        'class' => 'table',
                ),
        ),
);

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

Я пробовал:

class Extension extends Parsedown
{

        protected function blockTable($Line, array $Block = null)
        {
                $Block = parent::blockTable($Line, array $Block = null);

                $Block['table']['attributes']['class'] = 'table';

                return $Block;
        }

}   

но это не работает

3 ответа

Я не слишком уверен, что не так с вашим кодом, так как ваш код соответствует моему. Я просто добавил

'attributes' => array(
      'class' => 'table table-responsive'
),

для идентификации таблицы, в строке 850, чтобы она стала

        $Block = array(
            'alignments' => $alignments,
            'identified' => true,
            'element' => array(
                'name' => 'table',
                'handler' => 'elements',
                'attributes' => array(
                    'class' => 'table table-responsive',
                ),
            ),
        );

который прекрасно работает для меня. Но это похоже на то же самое для вас, без учета таблицы.

Какую версию ты используешь?

Я знаю, что это очень старый вопрос, заданный 5 лет, 3 месяца назад, но я наткнулся на этот ответ в поиске Google, поэтому подумал, что стоит ответить кодом, который выводит класс таблицы.

      class Extension extends Parsedown {

    protected function blockTable($Line, ?array $Block = null)
    {   
        $Block = parent::blockTable($Line, $Block);

        if(is_null($Block)){ return; }

        $Block['element']['attributes']['class'] = 'table table-responsive';
        return $Block;

    }

Я столкнулся с точно такой же проблемой с демонстрационным приложением Symfony. Наконец оказалось, что это не было разбором, потому что вывод был очищен html-sanitizer. Разрешение атрибута класса для таблиц решило проблему.

Для Symfony 4 демо-приложение добавить в config/packages/html_sanitizer.yaml:

html_sanitizer:
  #[...]
  sanitizers:
    default:
      # [...]
      tags:
        table:
          allowed_attributes:
           - "class"
Другие вопросы по тегам