Правило номер N+0: не бойтесь копнуть глубже

Предыстория

Всем привет! Меня зовут Женя и я программист. Ничего особенного. Пока что.

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

Перед мной стояла одна из самых типичных задач: вывести данные в какой-то текстовый файл. Формат файла такой, чтобы открылся на любом настольном среднестатистическом устройстве. Я был уверен в простоте решения этой задачи. Но в эту неделю судьба решила преподать мне урок…

История

Всё началось с выбора библиотеки для облегчения жизни и выбора формата. Формат был выбран docx а библиотека OenTBS. Вроде бы всё в ней было как надо — и формат файла тот и использовать шаблон можно. Но как показали 3 дня работы, эта штука если и может работать с вложенными массивами, то таким не очевидным образом, что, возможно, нужно вступить в какую-то секту, что бы постичь сие. Я решил идти по пути наименьшего сопротивления и просто поделился с монитором своими мыслями по поводу этой библиотеки и начал искать другую.

Далее был простой инструмент под названием odtPHP. Чей сайт, похоже, не работает до сих пор. Как Вы уже догадались вместе с библиотекой пришлось сменить и формат — им стал odt. Если очень захотеть можно даже порадоваться — открытый формат и всё такое.

Вот тут и началось самое веселое. Документ генерируется из шаблона. Если сделать шаблон в LibreOffice (а именно он был у меня первым под рукой), то в Word`е он будет открываться только после вопроса о восстановлении. А если создать шаблон в Word`е? Тогда без восстановления. Но после минимальных правок в шаблоне odtPHP выдавал ошибку, мол в шаблоне не найдена переменная. Неистовый воплю и тыканье пальцем в название переменной в шаблоне делу не помогли. Странно. То есть получалось, что нужная переменная как бы прописана в шаблоне, но odtPHP не может найти эту переменную через регулярные выражение.

Начали закрадываться подозрения, что пробел/тире/любой-другой-символ в Word`e в самом исходнике может обозначаться как-то иначе. Так как я знал что odt, как и docx, это по простому архивированные XML я решил углубиться в этот вопрос и для пущей уверенности создал такой же odt-шаблон через Google Drive. После разархивирования odt-файлов от разных «создателей» получилась вот такая картина:

image


Стало очевидно что формат форматом, но у программ может быть разный на него взгляд. Как несложно догадаться, всё содержимое файла хранится в content.xml. Открываю. Ищу свои переменные. И, о чудо! Я на верном пути! Вот так моя переменная выглядит в Word`е (вариант созданный в Word`e):

image


А вот так этот фрагмент выглядит в content.xml:

image


А регулярное выражение было максимально простым:

$reg = '@\[!--\sBEGIN\s' . $string . '\s--\](.*)\[!--.+END\s' . $string . '\s--\]@smU';

Что такое <text:s/> узнать так и не удалось. Можно подумать, что это пробел, но почему он вставился именно тут, а в других местах просто пробел? Не понятно. Предугадать расстановку таких магических пробелов в Word`е не предоставилось возможным. Вот и получилось, что Word где-то вставляет пробел как пробел, а где-то как <text:s/>, что обламывает нахождение переменной по минимальному шаблону.

Вот так тривиальная задача превратилась в увлекательное довольно путешествие по структуре формата odt!

Мораль

Каким бы уровнем знаний вы не обладали и как низко бы не падала оценка собственных навыков, не бойтесь копнуть глубже! Если, конечно, вы не водитель экскаватора и рядом не визит табличка «Копать запрещено».

P.S. Было бы очень интересно почитать такие истории в формате Предыстория-История-Мораль от крутых разработчиков, которые потом можно было бы рассказывать в образовательных целях
AdBlock has stolen the banner, but banners are not teeth — they will be back

More
Ads

Comments 16

    +8
    Неистовый воплю и тыканье пальцем в название переменной в шаблоне делу не помогли.

    Скорее всего модель бубна давно не обновлял.

    вывести данные в какой-то текстовый файл

    А чем plain-text не устроил? Нормальный формат для «текстового файла»…
      +8
      csv
        +4
        > Формат файла такой, чтобы открылся на любом настольном среднестатистическом устройстве.
        .rtf чем не угодил?
        Сложной верстки в нем не сохранишь, но картинки/таблицы/стили текста поддерживает.
          +10
          Когда текст не надо обновлять, большие мальчики используют .PDF
          +8
          Всем привет! Меня зовут Женя и я программист.

          Здравствуй, Женя.
          /me хлопает в ладоши.
            0
            Женя, а Вы не пробовали использовать великолепную функцию printf? Зачем неделю бодаться с библиотеками в такой задаче?
              +2
              Ребята, пост вовсе не о том, как вывести текст в файл. А о том, что за форматами, кажущимися многим начинающим программистам сложными и «что туда лучше вообще не лезть, всё дело в подставь-любой-инструмент», скрывается вполне понятная структура. И о том, что можно и нужно пытаться углубляться и разбираться в чем-то, на первый взгляд, сложном и не постижимом
                +2
                Только разибраться лучше со спецификацией на формат, а не только на паре примеров.
                +1
                Нет, костыли — это не слишком интересный вариант для копания вглубь.
                А решение в виде docx кажется немного необоснованным.
                  +1
                  Понимаю, статья не о форматах, но HTML(MHTML) не проще?
                    0
                    А если его нечаянно отдать пользователю с расширением .doc, то пользователь с word ничего не заметит… Иногда полезный трюк, если не хочется возиться с, например, apache poi или другими аналогичными библиотеками, если они существуют.
                      –2
                      Может лучше LaTeX 1-> HTML 2-> PDF?
                      +2
                      Совсем недавно решал проблему просмотра документов размещенных на сайте. Перебрал кучу библиотек. У меня документы самых разных форматов, поэтому в целом — ничто не подошло. А остановился просто на онлайн-просмотрщике документов от майкрософт. Гуглдокс-просмотрщик немного не корректно отображает некоторые документы, хоть и знает больше форматов. Зато у гугл-докса API вроде даже позволяет создавать документы.

                      А по основной теме — старая русская пословица: у страха глаза велики (речь не о велосипедах). И на себе проверял много раз — задача кажется страшной и невыполнимой ровно до того момента пока ее не решишь. И это касается не только программирования. Я вот боялся сам на даче дом построить — но ничего, получилось. А ведь я программист, а не плотник.
                        +3
                        Каждый из нас занимается исследованиями на работе. И форматов, и документации, а кто-то и машинных кодов. Это часть работы. Вы посмотрели в файл и что-то там увидели? Молодец! Но к чему ваша статья?
                          0
                          не бойтесь копнуть глбуже author
                          0
                          Turowskiy
                          на Хабре был цикл статей «Текст любой ценой», где описывался формат файлов и извлечение из них текстовых данных. Почитайте, интересно

                          P.S. исправьте орфографическую ошибку в заголовке статьи

                          Only users with full accounts can post comments. Log in, please.