/convertor

Intelligent yuscii to unicode convertor for ODT files

Primary LanguagePythonGNU Affero General Public License v3.0AGPL-3.0

Опис на проблемот

Во годините кога компјутерите генерално не знаеле да работат со кирилица, IT секторот во Македонија проблемот го решиле со креирање на специјални фонтови во кои латичните букви биле цртани со соодветните кирилични знаци. Така на пример R било Р, V било В, Y било Ѕ, Q било Љ и така натаму. Бидејќи латиницата има помалку букви од кирилицата, некои додатни букви биле ставени на други знаци: { било Ш, } било Ѓ, итн.

Самата содржина, што се однесувало до компјутерите, била на латиница, но таквиот документ прикажан или испечатен со соодветниот фонт изгледал како напишан на кирилица.

Но ова квази-решение создава многу други проблеми со обработка на податоците. Неколку примери, програмите за обработка на текст го третирале сврзникот „и“ како латично „i“, па автоматски го менувале во големо I (според англискиот правопис). Понатаму, програмите не ги третираат Ш (т.е. {) и сличните како букви, туку како знаци, па не функционира автоматската поделба на зборовите на крајот од реченицата.

Суштината на овие проблеми е дека информацијата за содржината дека е напишана со кирилица се губи во моментот кога информацијата за фонтот е недостапна.

Секоја автоматска обработка или индексирање и пребарување на текстот драстично се усложнува.

Потребата за ова квази-решение е одамна надмината со појавата на оперативните системи кои имаат подршка за Unicode и со употребата на Unicode (UTF-8) во сите нови стандарди за формати на документи, и во програмите за складирање и обработка на податоци. Но, за жал и до ден денес сеуште ќе најдеме документи пишувани во вакви специфични (таканаречени YUSCII) фонтови, а и сеуште се пишуваат.

Со помош на овој програм можеме да ги конвертираме документите напишани со фонтови, во документи со правилна Unicode кирилица.

Анализа на ODF документ

Една ODF датотека е всушност zip архива во која се наоѓаат неколку посебни датотеки, меѓу кои: самата содржина на документот (content.xml); сликите и други слични прилози; и датотеки со мета-информации за самиот документ.

Логиката на програмот е:

  • прво, да ги најде сите дефинирани стилови во документот кои користат некој од проблематичните фонтови, и да ги смени стиловите да користат нормален фонт (според зададена релација);
  • второ, да ја најде содржината која ги користи овие стилови и да ја конвертира содржината од yuscii во utf-8.

Главни од интерес на програмов се styles.xml и content.xml, бидејќи и двете датотеки можат да содржат стилови за содржината. Стилови можат да наследуваат карактеристики од други стилови, па и тоа треба да се има предвид.

Структурата на content.xml упростено изгледа вака:

  <document-content>
    <automatic-styles>
      <style name="P1">
         <text-properties font-name="MAC C Swiss">
      ...
      <style name="P2" parent-name="P1">
    </automatic-styles>
    <body>
     <text>
       <p style-name="P1">jas sum glupa kirilica</p>
       <p>јас сум ок кирилица <span "P1>glupa<span></p>
       ...
     </text>
    </body>
  </document-content>

[http://en.wikipedia.org/wiki/OpenDocument_technical_specification]

Quick analysis code

pretty_print = lambda el: lxml.etree.tostring(el, pretty_print=True)
find = lxml.etree.XPath("//b")
tree = lxml.etree.parse(io.BytesIO(xml))
root = tree.getroot()
nsmap = root.nsmap
tree.xpath('.//style:font-face', namespaces=nsmap)
tree.xpath('.//style:text-properties', namespaces=nsmap)

Some XPaths:

  • //style:style[style:text-properties[@style:font-name|@style:font-name-complex]]
  • /office:document-content/office:body/office:text

Инсталација

pdm install
pdm run convertor

Резултатот би требало да биде нешто како:

usage: convertor [-h] [--convert FILE [FILE ...] | --webapp]

Convert ODF files from YUSCII to UTF-8. For each file `FILE.odt' will create a converted `FILE-NEW.odt' in the same directory.

options:
  -h, --help            show this help message and exit
  --convert FILE [FILE ...]
                        file(s) to convert
  --webapp              run a demo web app

За демо web апликацијата, треба да се инсталира Werkzeug, што е можно и со:

pdm install -G web
pdm run gunicorn --reload convertor.web_app:application

Docker / podman

podman build . -t convertor
podman run --rm -it -p 8000:8000 convertor

(замени podman со docker, ако само тоа имаш)