LINUX.ORG.RU
ФорумTalks

[Теория] [Представление таблиц] Что почитать (на русском) по вопросу работы с табличными данными - вставка, удаление, объединение/разделение ячеек.

 


0

0

Здравствуйте!


Нужно реализовать на C/C++ поддержку работы с таблицами. Грубо говоря, есть продставление таблицы в HTML формате, образованное тегами <table>, <tr>, <td> с использованием свойств COLSPAN и ROWSPAN.

Нужно эту таблицу преобразовать в какой-то внутренний формат, над которым будет легко производить действия:

- вставку строки/столбца
- удаление строки/столбца
- объединение ячеек (merge cell)
- разделение ячеек по горизонтали и вертикали (split cell)

Причем, таблица должна иметь возможность принимать, например, вот такой вид:

http://i.piccy.info/i4/2f/ad/5e5d52cca540601877e6e72285ac.png

После выполненых действий, таблицу нужно из внутреннего формата обратно преобразовать в HTML.


Вопрос - что почитать на русском? А может есть готовые C/C++ либы с реализацией данной задачи?


Ответ на: комментарий от nu11

> gecko, webkit

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

Вопрос - в представлении таблиц. Эта задача очень узкая, и тянуть за собой движок браузера - это извините... Кроме того, gecko и webkit решают только вопросы отображения таблиц. А меня волнуют вопросы выполнения действий над структурой таблицы.

xintrea
() автор топика
Ответ на: комментарий от xintrea

> та задача очень узкая, и тянуть за собой движок браузера - это извините...

Это ынтырпрайз. Или сиди и жди, когда конкуре нты обойдут.

> А меня волнуют вопросы выполнения действий над структурой таблицы.

Дык DOM же есть. Через него и крути все необходимое.

EmStudio
()
Ответ на: комментарий от EmStudio

>> А меня волнуют вопросы выполнения действий над структурой таблицы.
> Дык DOM же есть. Через него и крути все необходимое.


Через DOM можно разделять/объединять ячейки таблицы???

xintrea
() автор топика
Ответ на: комментарий от nu11

>> Через DOM можно разделять/объединять ячейки таблицы???
> конечно можно http://files.getdropbox.com/u/998228/test/index.htm


Ну, это не то что нужно. Посмотри на рисунок http://i.piccy.info/i4/2f/ad/5e5d52cca540601877e6e72285ac.png, и скажи, можно ли через DOM так разделять/объединять ячейки.

В помощь могу дать ссылку на онлайновый WYSIWYG HTML редактор, в нем есть split/merge ячеек

http://editor.asbrusoft.com/page.jsp/id=3466?version=WCE

Вот и попробуй в этом редакторе сделать аналог приведенной таблицы.


ЗЫЖ

Даже еще прощще задача - есть таблица, ну пусть 3x3. Нужно одну (любую) ячейку разделить на 4 ячейки 2x2, вот так

http://i.piccy.info/i4/67/fd/cb42df687560e23d2e8d83b8c018.png

Как думаешь, можно ли это сделать через DOM?

xintrea
() автор топика
Ответ на: комментарий от xintrea

>Даже еще прощще задача - есть таблица, ну пусть 3x3. Нужно одну (любую) ячейку разделить на 4 ячейки 2x2, вот так

>http://i.piccy.info/i4/67/fd/cb42df687560e23d2e8d83b8c018.png


значит у тебя таблица 6x6 и в ней 8 ячеек 2x2 мне кажется разумным разбивать на более мелкие ячейки
да и что-то такое я видел в книге про css, когда просто листал

dimon555 ★★★★★
()
Ответ на: комментарий от EmStudio

> Вложенные таблицы, не?

Не. Результат должен представлятся единой таблицей. OpenOffice, кстати, это умеет - нарисуй такую таблицу и сохрани документ как HTML. Никаких вложенных таблиц не будет.

xintrea
() автор топика
Ответ на: комментарий от dimon555

> значит у тебя таблица 6x6 и в ней 8 ячеек 2x2

Посмотри HTML код такой таблицы и удивись http://paste.org.ru/?c6jxom


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


Вот мы и подошли к вопросу выполнения действий над таблицами. Можно сказать, что при разбитии ячейки, нужно преобразовывать все остальные ячейки в той же строке и в том же столбце. Каждую нужно разбить по горизонтали или вертикали на число, на которое разбивается обрабатываемая ячейка в данном направлении, и после такого разбития объединить опять в одну ячейку.

Дело осложняется тем, что неясно, как разбивать "объединенную" ячейку. Например, над одной "объединенной" ячейкой есть две обычные ячейки. Как "объединенную" разбить на 3 части по горизонтали?


> да и что-то такое я видел в книге про css, когда просто листал


Ни CSS, ни DOM не позволяют делать нужны мне естественные действия с ячейками таблицы. Прекращаем уже быть дельфи-программистами, которые вместо программирования занимаются поисками готовых компонент, а если компоненты нет то задача не имеет решения.


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

xintrea
() автор топика
Ответ на: комментарий от xintrea

> В исходники опенофиса страшно заглядывать, но видимо придется.

Мда, хотел упростить себе жизнь, и заглянуть в исходники KWrite, вроде бы прога не такая гигантская, как OOWrite. Оказалось, что KWrite не способен сделать такое

"...Дело осложняется тем, что неясно, как разбивать "объединенную" ячейку. Например, над одной "объединенной" ячейкой есть две обычные ячейки. Как "объединенную" разбить на 3 части по горизонтали?..."

А OOWrite способен.

Так что не все так просто, как хотелось бы, дорогие мои.

xintrea
() автор топика
Ответ на: комментарий от xintrea

> http://i.piccy.info/i4/67/fd/cb42df687560e23d2e8d83b8c018.png

Сделай массив ячеек, причем без привязки к самой таблице. Просто список и указатели на них. В данном случае 9 указателей.

Потом, когда мы добавили разделители в 1 ячейку, считаем уникальные горизонтали и вертикали. У нас будет 5 уникальных вертикалей и 5 уникальных горизонталей. По ним генерим HTML-код со всеми colspan/rowspan, проводя все разделители через всю таблицу, т.е. если верхняя-левая клетка соприкасается всего с 2 разделителями, то для нее rowspan=1 colspan=1 (т.е. их можно вообще не указывать), а для верхней-правой будет уже 3 вертикальных и 2 горизонтальных разделителя, т.е. colspan=2 rowspan=1. Как сгенерил таблицу - заполняй контент на основе указателей. На месте старого указателя можно создать структуру, которая будет адресовать новые ячейки, которые в свою очередь будут адресовать еще 4 указателя. Ну где-то так..

EmStudio
()
Ответ на: комментарий от EmStudio

Я тоже об этом раздумывал. Только в виде преобразования таблицы в прямоугольный массв, где объединенные ячейки имеют "главную" ячейку (например, левую верхнюю в объединении), и "пустые", В главной хранятся все данные по форматированию, ссылка на содержащиеся данные... В пустой - только флаг что она пустая. Такая структура позволяет быстро определять, что находится сверху-снизу-сбоку. (Ты не описал кстати, как определять, как соприкасаются ячейки). Но в конце концов понял, что такие размышления ограничиваются рамками "прямоугольной сетки".

В OOWriter разработчики знают какую-то фичу, которая позволяет на любой строке и в любом столбце иметь столько ячеек, сколько нужно, причем это разбиение не влияет на соседние ячейки, не заставляет их пересчитывать colspan и rowspan.

Более того, в OOWriter возможен "перехлест" разделительной линии. То есть, было две вертикальной линии в сложной таблице, одна под другой. Причем нижняя линия была левее верхней. Можно подвинуть нижнюю линию так, что она будет правее верхней. В прямоугольно-сеточной логике сделать такое весьма проблематично.

xintrea
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.