vkocubinsky/SublimeTableEditor

Mediawiki tables

Closed this issue · 6 comments

Hi! Perfect plugin!
I want to integrate my plugin Mediawiker with TableEditor. I wrote a message to you on sublime forum about this. Please check it.

Hi,

I prefer discuss about integration Mediawiker and Table Editor in this place, because I like to keep all issues together.

You wrote:

1 Add mediawiki tables support to your plugin.

I am going to provide a way to simple add additional syntax to Table Editor plugin. For do this I am going to :

  • extract syntax specific features into modules like textile_syntax.py, multi_markdown_syntax.py, re_structured_text.py, simple_syntax.py, emacs_org_mode.py, pandoc.py
  • provide base_syntax.py module with contains key classes and methods

When it will be done, you can write a module mediawiker_syntax.py and then this 2 plugins can work together.

Currently table editor plugin keybinding run commands for lines that starts from '|' or '+'. Mediawiki tables can starts also from '!'. I can add '!' into keybinding, but probably you will create you own keybinding , because you have language file and mediawiki tables always starts from '{|' and ends with '|}'.

I quick looked on the mediawiki table syntax. Let's see on some example from http://www.mediawiki.org/wiki/Help:Tables

On the first example cells starts on new lines, each with its own single mark (|).

{| class="wikitable"
| Orange
| Apple
| align="right"| 12,333.00
|-
| Bread
| Pie
| align="right"| 500.00
|-
| Butter
| Ice cream
| align="right"| 1.00
|}

On the second example cells separated by double marks (||)

{| class="wikitable"
| Orange || Apple     || align="right" | 12,333.00
|-
| Bread  || Pie       || align="right" | 500.00
|-
| Butter || Ice cream || align="right" | 1.00
|}

I guess that Table Editor plugin can be helpful only for the second example.

2 Add commands from your plugin to my plugin. I want to convert tables on the fly from mediawiki format to (for example) Simple format on pages receive from wiki, and convert back on post.

You are going to convert tables
"on pages receive from wiki, and convert back on post" , it looks that it doesn't touch table editor.

Thanks!

Не заметил сразу пожелание про русский, можно обсуждать и на русском

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

По пункту 2 - идея была в том, чтобы при получении страницы из вики конвертировать wiki таблицы в формат понятный для TableEdit. Дальше автор может удобно работать с таблицей засчет функционала вашего плагина, а при сохранении - она будет конвертирована обратно в wiki. Просто проблема в том, что работать с wiki таблицей, как, например с Simple, мне кажется, не получится.
В примере "align="right" - это свойства ячейки, полноценный html. Html теги могут быть в шапке (class="wikitable"), в строке и в каждой ячейке - если пытаться это сохранить, то это будет уже не просто таблица с данными - простому редактору статьи это будет неудобно. А прелесть вашего плагина как раз в том, что он дает возможность работать с таблицей как в ворде :) А пока для mediawiki так и не сделали нормального WYSIWYG редактора - это очень существенная помощь.
Я у себя в плагине кое-как набросал конвертацию туда и обратно, для пробы, но недостатков еще очень много. Но мысли свелись к тому, чтобы:

  1. Если пытаться сохранить html-свойства wiki таблицы - то при конвертации ее можно раскладывать на две - одну со свойствами, другую - с текстом ячеек. После работы с таблицей - конвертировать обратно, объединением.
  2. Если не сохранять свойства - то достаточно просто конвертации - но тут или моих программистских навыков пока не хватает или Simple таблицы не всегда достаточно, чтобы четко отличать многострочную ячейку от нескольких ячеек :) Т.е. возможно, было бы достаточно реализовать тип таблицы с полной отрисовкой ячеек - не знаю насколько это сложно сделать в вашем плагине.

Прошу прощения, наверное много воды получилось :) Просто пока сам не знаю до конца как подступиться к wiki таблицам :) Они реально больше всего пугают людей, которые сталкиваются с wiki синтаксисом (по крайней мере, по моему опыту). А тут увидел ваш плагин и глаза загорелись :)

Мне кажется формат

{| class="wikitable"
| Orange || Apple     || align="right" | 12,333.00
|-
| Bread  || Pie       || align="right" | 500.00
|-
| Butter || Ice cream || align="right" | 1.00

|}

можно сделать понятным для Table Editor. Я завел ишью Split syntax specific features into separate module. После того как это ишью будет зарезолвлено
для поддержки mediawiki таблиц можно будет сделать модуль mediawiki_syntax.py. mediawiki_syntax.py будет отвечать за разбиение строки на строки MediawikiRow и ячейки MediawikiColumn. Шапка таблицы
вовсе не касается Table Editor потому что с его точки зрения только строки которые начинаются с палочки
это таблица, в случае mediawiki таблиц также прийдется добавить что таблица может начинатся с (!)

Textile таблицы как и Mediawiki таблицы разрешают вставлять html кусочки. Посмотрите например на эту таблицу отформатированную в TableEditor.

|_>.                                                   header |_.      centered header      |
|>^.                                      right and top align | long text to show alignment |
|=\2.                                    centered colspan                                   |
|<>(red). justified                                           |~=.         centered         |
|{text-shadow:0 1px 1px black;}(highlight)<~. syntax overload | normal text                 |

На мой взгляд Sublime Text редактор это текстовый редактор, а вики это просто текст и по мне вполне нормально и удобно держать вместе и кусочки html и кусочки данных. Но все это решать вам я со своей стороны буду работать над ишью Split syntax specific features into separate module

Спасибо!

Хорошо, давайте попробуем так.
По вынесению типов таблиц в отдельные модули - понятно.
По wiki таблицам:
Еще стоит учитывать момент, что html свойства могуть быть указаны и для строк

|- style="font-style:italic;color:green;"

Textile таблицы я видел, но в них как раз и не нравится то, что они трудно-читаемы, а очень хотелось бы сделать удобный для редактирования вариант.

Еще остается вопрос - как быть с многострочными значениями в колонках - wiki разметка в этом случае просто перезжает на другую строку. Получится ли, сохраняя формат wiki, реализовать этот момент?

Можете попробовать. Я вынес особенности синтаксиса в отдельные модули. Безовые классы находятся в table_base. Я планирую еще менять интерфейс, но когда это будет я не знаю, я думаю не очень скоро.

Для примера можете смотреть например на table_textile_syntax.py и table_multi_markdown_syntax.py. Первое что нужно это сделать так чтобы плагины срабатывали на медиавики таблицы. В Table Editor это определено в .sublime-keymap файлах. Если у вас есть файл синтаксиса то можно сделать более акуратное распознавания строк таблицы так как медиавики таблицы имеют начало '{' и конец '}'. Если не писать '{|' на одной строке то достаточно добапвить распознавание символа '!' - заглавная ячейка. Начать можно с кастом .sublime-keymap.

Далее создайте модуль table_mediawiki.py. В модуле table_lib.py зарегестрируйте медиавики на подобии textile модуля. Далее вам понадобится

line_parser

Отвечает за рабиение одной строки на ячейки , существующий table_line_parser.LineParser должен подойти , в конструкторе передается регулярное выражение, в table_multi_markdown_syntax.py line_parser
опеределен как

self.line_parser = tparser.LineParser("(?:(?:\|\|+)|(?:(?:\+)|(?:\|)))")

table_parser

Отвечает за создание таблицы. В BaseTableParser есть все что нужно так здесь я полагаю достаточно будет создать Row и Column нужного типа. Например textile модуль определяет колонку TextileCellColumn и строку TextileRow а TextileTableParser выглядит

class TextileTableParser(tbase.BaseTableParser):

    def create_row(self, table, line):
        return TextileRow(table)

table_driver

Отвечает за конкретные операции. Например матод "editor_insert_row(self, table, table_pos)" вставляет строчку и определен как

    def editor_insert_row(self, table, table_pos):
        table.insert_empty_row(table_pos.row_num)
        return ("Row inserted",
                TablePos(table_pos.row_num, table_pos.field_num))

Вы можете добавить проверку условий или добавить какие то действия или запретить конкретные команды рутем бросания исключений

        raise TableException("Syntax {0} doesn't support insert single line"
                             .format(self.syntax.name))