Jak się dostać do zawartości
Natywnym formatem OpenOffice jest .ODF (Open Document Format). Nas będzie interesowało plik .ODT czyli plik zapisany w OpenOffice Writer. W rzeczywistości jest to archiwum, więc spróbujmy je rozpakować. Oto kolejne kroki:
- Zmieniamy rozszerzenie z .odt na .zip.
- Rozpakowujemy archiwum.
- Zaglądamy do środka.
Znajdziemy tam sporo rzeczy, dla nas najistotniejszy jest plik content.xml. Przy okazji dwa małe bonusy: 1. To samo można zrobić z plikami MS Office (tymi, które mają x na końcu rozszerzenia [.docx]). 2. Jeśli dostaliśmy plik, w którym są obrazki i tylko na nich nam zależy, to zamiast spod Writera / Worda zapisywać na dysk jeden po drugim, rozpakowujemy go i wszystko jest w katalogu media.
Zaglądamy do pliku XML
W OpenOffice Writer przygotowałem do testów prosty plik. Jak widać na załączonym obrazku są w nim style akapitowe dla tytułu 1. i 2. stopnia, styl podstawowy dla tekstu (body text) i style znakowe dla kursywy oraz pogrubienia. Dodatkowo, część tekstu jest sformatowana w oparciu o styl domyślny i lokalne formatowanie (mające naśladować tytuł 1. i 2. stopnia oraz kursywę i pogrubienie).
Po rozpakowaniu otwórzmy content.xml (powinien sobie z tym poradzić dowolny edytor tekstu, w moim przypadku Atom i SublimeText). i spróbujmy przyjrzeć się mu bliżej. To będzie prawdopodobnie główny plik, z którym będziemy pracować. Wygląda to tak:
Nie jest to zbyt czytelna postać. Poniżej ta sama zawartość tylko podzielona tak, żeby łatwiej było prześledzić jej strukturę (jedyne zmiany jakich dokonałem to podział na akapity i wcięcia).
Część, w której znajduje się nasz tekst to znacznik <office:text>.
Zobaczmy, jak prezentuje się schemat struktury całego dokumentu. Przygotowałem w tym celu stosowny rysunek (wyszedł całkiem spory).
Wyraźnie widać wszystkie zagnieżdzenia znaczników. Chociaż nie było to konieczne, dla poprawienia czytelności tekstu, stosowne zagnieżdżenia stylów znakowych oznaczyłem kolorowymi kropkami. Dzięki temu łatwiej zlokalizować ich pozycje w akapitach. Jest kilka niespodzianek, których się nie spodziewałem. Największą było zagnieżdżenie stylów znakowych wewnątrz innych stylów znakowych. Zakładałem, że takie coś się nie pojawi, czyli style znakowe będą bezpośrednimi dziećmi stylów akapitowych. W kilku miejscach (tam gdzie dodawałem style znakowe lub formatowałem tekst lokalnie) są dodatkowe style, które dodały się „ekstra”, ponieważ nie nadawałem ich podczas formatowania w OpenOffice.
Do przemyślenia
Jeszcze nie wiem, w jaki sposób uda mi się przerobić tą strukturę na markdown (zakładam, że będę musiał przeanalizować całą strukturę <office:text> i połączyć ja z informacjami z części, w której zdefiniowane są style). Specyfikacja formatu ODF ma bagatela prawie 900 stron i chyba będziemy musieli się zaprzyjaźnić. Analiza struktury wymusza kolejne pytania:
- Czy w definicji stylów italic i bold będą występowały zawsze, niezależnie od wersji językowej programu, czy może w polskim będzie kursywa i pogrubienie?
- W jaki sposób poszczególne style przekonwertować na markdown (jeśli w tekście mamy np. trzy warianty kursywy to czy w markdown powinna być to zawsze ta sama)?
- Czy nie lepszym rozwiązaniem będzie przekonwertowanie XML na plik tekstowy uwzględniający wszystkie warianty formatowania (żeby dokładnie odwzorować treść)?
- Jeśli finalnie miałby powstać plik tekstowy, to jak ustandaryzować znaczniki (a może zrobić w tym celu obiekt z konfiguracją, żeby każdy mógł sobie go dostosować).
- A może zrobić markdown i jego znaczników dodać jakoś dodatkowe informacje na temat stylów z XML, tak żeby łatwo je było ewentualnie usunąć?
Sytuacja zaczyna się komplikować. Z jednej strony będą trudności techniczne bo trzeba napisać kod, z drugiej opracować jakąś sensowną strategię przetwarzania XML na coś innego (na ile to możliwe markdown).