26.4.12

Nauka angielskiego z Calcem

Niniejszy artykuł dystrybuowany jest na licencji Creative Commons Uznanie autorstwa-Bez utworów zależnych 3.0 Polska, a jego autorem jest Morfeusz888.

 

Nauka angielskiego z Calcem

Język angielski to przedmiot, który wymaga trochę innego podejścia. Nie da się go wyuczyć na pamięć jak np. biologii. Każdy z nas ma swój indywidualny sposób uczenia się. Jak chciałbym przedstawić swój, być może komuś to pomoże w przyszłości. Jedynie, to będziemy potrzebować to Calca.

 

O co chodzi?

Mój sposób polega na tym, że w jednym arkuszu znajdują się słówka po angielsku i tłumaczę je na polski, w drugim arkuszu na odwrót, trzeci zaś zawiera “bazę danych” Jeżeli dobrze przetłumaczę, pojawia mi się komunikat, że jest ok. i dostaję punkt. W innej komórce zaś zliczana jest suma procentowa zdobytych punktów wedle całości. Pozwala mi to dowiedzieć się na ile opanowałem dane słownictwo. Oczywiście w tej “mini aplikacji” wykorzystuję pewne już wbudowane w program formuły. Może brzmi strasznie, ale to nie jest nic trudnego.

 

Baza danych słówek i przygotowanie arkuszy

Uruchamiamy program Calc. Domyślnie tworzoną są trzy arkusze nazwane odpowiednio Arkusz1, Arkusz2 i Arkusz3. Klikamy prawym przyciskiem myszy na Arkusz3 i z menu wybieramy Zmień nazwę:


W nowym oknie wpisujemy jako nazwę slowka i klikamy na OK.


Przechodzimy do tego arkusza. Klikamy na komórkę np. B2 i wpiszemy Słówka po angielsku. Następnie zaznaczamy komórkę D2 i piszemy słówka po polsku. Następnie rozszerzamy kolumnę. Najeżdżamy na linię pomiędzy komórkami B i C, naciskamy i trzymamy lewy przycisk myszy i ciągniemy na prawo wedle naszego uznania.


Ok. Teraz wklejamy angielskie słówka i ich polskie tłumaczenie w ten sposób:


Bazę danych słówek mamy gotową. Teraz klikamy prawym przyciskiem myszy na Arkusz1, z menu wybieramy Zmień nazwę i jako nazwę wpisujemy ang-pl. Teraz sformatujemy odpowiednio nasz arkusz. W odpowiednich komórkach wpisujemy:

B1 - Słówka po angielsku
D1 - Tłumaczenie po polsku
F1 - Tak/Nie
H1 - Punkty
J1 - Zdobyte punkty
L1 - Maksymalna ilość punktów
N1 - Procenty


Teraz zaznaczamy wiersz 2 klikając na dwójkę i formatujemy go na szaro. Będzie to nam służyć jako rozdzielenie. Oto cały efekt prac to tej pory:


Teraz przechodzimy do arkusza o nazwie slowka i kopiujemy angielskie słówka do odpowiedniej kolumny w arkuszu ang-pl.

Ma to wyglądać tak:



Tyle jeżeli chodzi o wstępne formatowanie. Teraz przejdziemy na wyższy poziom i zajmiemy się funkcjami.

 

Funkcje

Teraz wbijemy wyższy level. Funkcję, to takie mini programy, które wykonują dane czynności. Nas będzie interesować funkcja JEŻELI. Posiada ona 3 argumenty:
-jaki warunek ma być spełniony
-co robić, jeżeli ten warunek jest spełniony
-co robić. Jeżeli ten warunek nie jest spełniony
Tyle teorii. Przechodzimy do praktycznej części. Ustawiamy się w komórce F4 i klikamy na pasek formuł:


Gdy już będziemy w tym pasku, to wpisujemy

=jeże

Pojawi nam się podpowiedź:


Naciskamy ENTER. W pasku formuł pojawi się coś takiego:

=JEŻELI()

Jest to funkcja jeżeli. Składnia funkcji jeżeli wygląda następująco:

=JEŻELI(test_logiczny;wartość_jeżeli_prawda;wartość_jeżeli_fałsz)

A mówiąc bardziej po ludzku:

test_logiczny

- podajemy warunek, który będziemy sprawdzać

wartość_jeżeli_prawda

- co ma zrobić funkcja, jeżeli warunek będzie spełniony

wartość_jeżeli_fałszy

- co ma zrobić funkcja, jeżeli warunek nie będzie spełniony
Dobra. Teraz bierzemy myszkę do ręki i ustawiamy kursor wpisywania tekstu pomiędzy nawiasami. Gdy się już tam znajdzie klikamy na komórkę D4. Zostanie ona dopisana do paska formuł.

=JEŻELI(D4)

Dopisujemy znak = więc formuła aktualnie ma taką postać:

=JEŻELI(D4=)

Klikamy teraz na arkusz o nazwie slowka i zaznaczamy komórkę D4. Składnia do tej pory ma wyglądać tak:

=JEŻELI(D4=slowka.D4)

Pierwszy krok za nami. Mamy ustalony warunek. Teraz wpisujemy znak ; (średnik). Oddziela nam to argumenty. Teraz musimy podać co się ma stać, jeżeli warunek będzie spełniony. Wpiszmy “Tak” (należy pamiętać o cudzysłowu). Takie wyrażenie sprawi, że jeżeli warunek będzie spełniony, w komórce wyświetli się wyraz Tak. Znów piszemy ; i teraz wpisujemy “Nie” i zamykamy nawias. Jeżeli warunek zaś nie będzie spełniony, w komórce zostanie wypisane słowo nie. Składnia do tej chwili ma wyglądać tak:

=JEŻELI(D4=slowka.D4;"Tak";"Nie")

Naciskamy Enter. Jeżeli program nie wypluł żadnego komunikatu, to wysoce prawdopodobne, że wpisana formuła będzie prawidłowo działać. Aktualnie w komórce F4 widnieje napis nie, ponieważ w komórce D4 nie ma nic wpisanego:


A wpiszmy tłumaczenie tego słówka:


Wartość komórki zmieniła się na Tak, więc wszystko działa elegancko. Teraz jak to zastosować do reszty słówek? Po prostu wystarczy przeciągnąć. Zaznaczamy zatem komórkę F4 i najeżdżamy kursorem na prawy dolny róg. Kursor zmieni swój kształt na taki krzyż. Naciskamy i trzymając lewy przycisk myszy ciągniemy kursor w dół. Gdy dobiegniemy do końca listy puszczamy:


Funkcja dla reszty będzie działać. Jakim cudem? Normalnym. Przeciągając pasek na dół program automatycznie dostosowuje sobie pewnie wartości funkcji. Przykład. Składania dla komórki F13 wygląda tak:

=JEŻELI(D13=slowka.D13;"Tak";"Nie")

Zaś dla F58 tak:

=JEŻELI(D58=slowka.D58;"Tak";"Nie")

Jeżeli byśmy tego nie chcieli, stosowalibyśmy symbol $ (dolarów), ale to nas dzisiaj nie interesuje.

 

Formatowanie warunkowe

Te komórki, które nas informują czy dane słówko jest wpisane poprawnie czy ni,e są dość smutne. Człowiek najlepiej reaguje na kolory. Zastosujemy zatem formatowanie warunkowe. Brzmi groźnie, ale to pozory. Formatowanie warunkowe działa na takiej zasadzie, że jeżeli taki warunek jest spełniony, to np. wypełnij komórkę kolorem zielonym. My właśnie takie coś teraz zrobimy.
Zaznaczamy komórkę F4, klikamy na przycisk Format i z menu wybieramy Formatowanie warunkowe:


Pojawi nam się nowe okno, które służy do dodawania formatowań:



Zaznaczamy ptaszka przy Warunek 1 w tym najdłuższym polu wpisujemy słowo Tak. Teraz w Styl komórki klikamy na Nowy styl:



W nowym oknie klikamy na zakładkę Tło i z palety barw wybieramy kolorek zielony.



Klikamy na OK. Teraz zaznaczamy ptaszka przy Warunek 2 i w najdłuższym polu wpisujemy słowo Nie. Gdy to już uczynimy klikamy na Nowy styl:



Znów klikamy na tło, ale tym razem wybieramy kolor czerwony. Klikamy we wszystkich oknach na ok.

Właśnie, zapomniałbym. Upewniamy się jeszcze, że w polu



Wybrana jest wartość równa.

UWAGA !!! PROGRAm MOŻE, ALE NIE MUSI PRZYJĄĆ WARTOŚCI BEZ CUDZYSŁOWU. JEŻELI PO WYKONANIU TEJ PORADY NIE MA FORMATOWANIA WARUNKOWEGO, DOPISZCIE CUDYSŁOWY JAK NA SCREENIE



Aby zastosować to do reszty komórek to przeciągamy podobnie jak dla funkcji.

 

Punkty

Teraz zajmiemy się funkcją, która będzie nam dawała punkt za każdą dobrą odpowiedź. Ustawiamy się w komórce H4 i na pasku formuł wpisujemy:

=JEŻELI(F4="Tak";1;0)

Oznacza to, że jeżeli w komórce F4 pojawi się słowo tak, to w komórce H4 wpis 1, jeżeli jest inaczej wpisz 0. Przeciągamy w dół, aby zastosować do reszty słówek:



Mamy punkty cząstkowe, teraz trzeba je podsumować. Ustawiamy się w komórce J4 i na pasku formuł wpisujemy:

=SUMA()

Ustawiamy kursor pisania pomiędzy nawiasami i zaznaczamy komórki H4 do H192. Naciskamy Enter.


Wszystko elegancko działa.

 

Procenty

Została nam ostatnia rzecz do zrobienia, a mianowicie wartości procentowe. Zaznaczamy komórkę N4 i w pasku formuł wpisujemy:

=J4/L4

Czyli po prostu dzieli zdobyte punktu z maksymalną ilością punktów do zdobycia. Ale w komórce pojawiają nam się liczby z kosmosu:


My czegoś takiego nie chcemy. Klikamy zatem prawym przyciskiem myszy i z menu wybieramy Formatuj komórki:



W nowym oknie w karcie liczby wybieramy Procent i następnie obok w polu pierwszą wartość:



Klikamy na OK. Teraz wartości wyświetlane są tak jak chcemy.



Żeby jeszcze wszystko ładniej wyglądało, to ją warunkowo pokolorujemy. Zaznaczamy więc komórkę N4 i klikamy na Format i Formatowanie warunkowe.

Teraz przyjmijmy takie założenia. Od 0% do 50% kolor wypełniania będzie czerwony, od 51% do 70% będzie to żółty, zaś od 71% do 100% zielony. Tak więc na sam początek zaznaczamy wszystkie ptaszki, zamiast równa wybieramy między, wpisujemy odpowiednie wartości:



Możemy wpisać procenty, możemy wpisać tak jak ja tu podałem i klikając na Nowy styl wybieramy odpowiednie tło dla każdego warunku. Po zakończeniu klikamy na OK.

Komórka zostanie pokolorowana.

 Ochrona

To już ostatnie co wykonamy na naszym arkuszu. Aby nas rączką nie świerzbiła podczas nauki, zablokujemy wszystkie komórki oprócz tych, w których będziemy wpisywać tłumaczenie dla słówek. Domyślnie komórki w programie Calc mają wartość zablokowaną, więc musimy je odblokować.

Zaznaczamy zakres, w którym wpisujemy przetłumaczone słówka. U mnie jest to zakres od D4 do D192. Po zaznaczeniu klikamy prawym przyciskiem myszy i z menu wybieramy Formatuj komórki.

W nowym oknie przechodzimy do karty Ochrona komórek i odznaczamy ptaszka przy Chronione.


Klikamy na OK. Teraz klikamy na Narzędzia, Chroń dokument i wybieramy Arkusz:



W opcjach nie grzebiemy nic. Ustawiamy tylko hasło, które wpisujemy dwukrotnie.



Klikamy na OK. Teraz gdy będziemy chcieli coś zmienić w zablokowanej komórce, to program wyświetli taki komunikat:



Jeżeli chcemy zaś odblokować arkusz, to klikamy na Narzędzia, Chroń dokument, Arkusz, wpisujemy hasło i klikamy na ok.


Dokument przestanie być chroniony.

 

A co z drugim arkuszem?

Drugi arkusz robi się praktycznie tak samo, zmienia się tylko warunek przy wpisywaniu słówek. To jest zadanie dla Was :-)

 

Pliki do pobrania

Jakby ktoś chciał, to udostępniam wzór tego arkusza. Do pobrania pod tym linkiem. (format .ods)

4.6.10

Kody paskowe w OpenOffice.org


W dzisiejszych czasach kod paskowy (czy kod kreskowy, jeśli ktoś woli) musi znaleźć się na każdym towarze: książce, gazecie, płycie, jogurcie czy opakowaniu chleba. Dlatego coraz częściej potrzebujemy też wstawiać kody paskowe w dokumentach, aby móc je umieszczać na opakowaniach.
Rozwiązania komercyjne do tworzenia kodów paskowych potrafią kosztować nawet kilka tysięcy euro, chociaż z informatycznego punktu widzenia tworzenie ich jest sprawą banalną. Istnieje co prawda od lat pakiet GNU Barcode, który oczywiście jest bezpłatny, ale niestety, jego obsługa wymaga co najmniej znajomości wiersza poleceń, a w dodatku czasem pojawiają się problemy: niektóre kody nie są generowane poprawnie... Rozwój tego projektu zatrzymał się w roku 2002, więc małe szanse, że ktoś to poprawi.
Ale od czego OpenOffice.org i jego rozszerzenia? Istnieje rozszerzenie Barcode, które świetnie nadaje się do tego celu. Wystarczy pobrać plik ze strony (zielona ikonka "Get it"), kliknąć go dwa razy i zainstaluje się w programie OpenOffice.org Draw – trzeba oczywiście zaakceptować licencję. Następnie zamykamy OpenOffice.org (łącznie z modułem szybkiego uruchamiania) i otwieramy ponownie, wybierając aplikację Draw (lub opcję Rysunek z ekranu startowego).
W menu Wstaw zobaczymy nowe polecenie Barcode:

Wystarczy je wybrać, a pojawi się okienko, w którym wybiera się standard kodu:

Oto przykład - kod przepisany z zeszytu (a więc EAN-13, wybrałem obliczenie cyfry kontrolnej – a więc przepisałem tylko 12 cyferek, a proszę kod się zgadza):

Teraz mógłbym zapisać plik w formacie obsługiwanym przez Draw (lub wyeksportować do pliku PDF) i już miałbym piękny, dorodny kod kreskowy :) Ale to tylko przykład, więc efektu nie zapisałem.

5.4.10

Odblokowywanie dokumentu do edycji

Czasami po zakończeniu przenoszenia plików, lub po zmianie uprawnień, podczas otwarcia dokumentu wyskakuje komunikat informujący o zablokowaniu dokumentu do edycji przez innego użytkownika.

Komunikat ten w języku angielskim brzmi:

Document file nazwa_pliku.odt is locked for editing By użytkownik (DD.MM.YYYY HH:MM)

Co zostało przetłumaczone na "Plik dokument "nazwa_pliku.odt" w dniu 05.04.2010 01:12 został przez Ciebie na innym systemie zablokowany przed edycją".

Aby odzyskać do niego dostęp, należy w opcjach środowiska ustawić, aby system pokazywał pliki ukryte. Dla środowiska KDE będzie to skrót Alt+. (klawisz Alt + klawisz kropki), a dla środowiska GNOME będzie to kombinacja Ctrl+H.

Następnie szukamy przezroczystego pliku z nazwą .~lock.nazwa_pliku.odt# i zwyczajnie go usuwamy.

Bardziej zaawansowani użytkownicy mogą go wyedytować i odblokować dostęp tylko sobie, a zablokować go pozostałym grupom.

26.3.10

Poprawka dla autokorekty w OpenOffice 3.2

Autokorekta – poprawianie w czasie pisania – w OpenOffice.org 3.2 przestała działać z powodu drobnego błędu w pliku. Wystarczy otworzyć Narzędzia > Opcje autokorekty..., aby przekonać się, że na karcie Zamień nie ma żadnych wpisów.

Błąd udało się wykryć i zlikwidować, a tutaj udostępniam proste lekarstwo: wystarczy zapisać ten plik na dysku (po kliknięciu prawym przyciskiem myszy), a następnie kliknąć dwukrotnie (lub jednokrotnie w zależności od systemu). Po zainstalowaniu rozszerzenia (i być może też ponownym uruchomieniu OpenOffice.org) na karcie Zamień pojawią się wpisy.

Poprawka jest niepełna, bo nie można normalnie redagować takiej poprawionej autokorekty, ale lepszy rydz niż nic :)

4.3.10

Tworzymy i publikujemy blog z poziomu OpenOffice.org.

Co prawda OpenOffice.org jest przede wszystkim pakietem biurowym, możemy jednak wykorzystać jego zdolność łączenia się z zewnętrznymi systemami zarządzania bazami danych, jak MySQL, by stworzyć wygodne rozwiązania, rozszerzające jego funkcje poza zwyczajne redagowanie dokumentów. Możemy na przykład połączyć OpenOffice’a z bazą danych aplikacji do blogowania, co pozwoli pisać i publikować posty bezpośrednio z Writera. Brzmi to może jak zadanie dla zawodowego programisty, ale w rzeczywistości wystarczy kilka prostych makr.

Rysunek 1: Doskonałym kandydatem do naszego zadania będzie Bilboblog.

Elementy układanki

By ułatwić zrozumienie działania tego projektu, podzielę jego wykonanie na kilka kroków. Najpierw powinniśmy zainstalować i skonfigurować aplikację do blogowania. Teoretycznie do naszych celów nada się każda z nich, o ile korzysta z bazy danych MySQL. W praktyce powinniśmy jednak wybrać niezbyt skomplikowany program, posługujący się prostą bazą danych. W naszym przykładzie użyjemy nieco zmodyfikowanej wersji aplikacji do blogowania Bilboblog (Rysunek 1) [1]. Przechowuje ona treści w prostej tabeli z zaledwie trzema polami, dzięki czemu nadaje się idealnie do wykorzystania w naszym projekcie.

Będziemy również potrzebować serwera PHP / MySQL lub konta na odpowiednim serwisie, gdzie będziemy mogli zainstalować Bilbobloga. By to zrobić, wystarczy stworzyć bazę danych MySQL (na przykład bilboblog), pobrać najnowszą wersję aplikacji, rozpakować archiwum i przenieść jego zawartość (katalog bilboblog) do katalogu głównego na serwerze. Nadajemy mu prawa zapisu i poprzez przeglądarkę przechodzimy do http://twojserwer/bilboblog. Tu wypełniamy wymagane pola i klikamy Install.

Rysunek 2: Konfiguracja połączenia z MySQL-em za pomocą aplikacji Database Wizard.

Następnie musimy połączyć OpenOffice’a z bazą danych Bilbobloga. W tym celu potrzebujemy rozszerzenia Sun MySQL Connector dla OpenOffice.org [2], które integruje się bezpośrednio z naszym pakietem biurowym i umożliwia połączenie z bazą danych (Rysunek 2). By go zainstalować, pobierzmy najnowszą wersję rozszerzenia. W OpenOffice.org wchodzimy w Narzędzia | Menedżer rozszerzeń, wciskamy przycisk Dodaj i wybieramy pobrany plik .oxt. Teraz wystarczy zrestartować OpenOffice – i gotowe.

Rysunek 3: Struktura bazy danych bilboblog.

Na koniec tworzymy prosty plik bazy danych (Base), łączący pakiet biurowy z bazą danych Bilbobloga (domyślnie bilboblog). W tym celu w OpenOffice.org wybieramy Plik | Nowy | Baza danych, zaznaczamy opcję Połącz z istniejącą bazą danych i wyszukujemy na liście rozwijanej MySQL. Teraz wciskamy Dalej i zaznaczamy opcję Connect native. W kolejnym kroku określamy ustawienia połączenia z bazą danych i nazwę użytkownika, a następnie zaznaczamy pole Wymagane hasło.

By sprawdzić, czy połączenie funkcjonuje prawidłowo, wciskamy przycisk Testuj połączenie, po czym upewniamy się, że zaznaczona jest opcja Tak, zarejestruj bazę danych, odznaczamy pole Otwórz bazę danych do edycji i zapisujemy efekt końcowy jako Bilboblog.odb. Powstały plik nie tylko łączy się z bazą danych bilbobloga, ale też pozwala przyjrzeć się jej strukturze. Otwórzmy Bilboblog.odb i przejdźmy do sekcji Tabele. Jeśli klikniemy dwukrotnie na bazę danych bilboblog, powinna pojawić się tabela articles (Rysunek 3). Jej strukturę także możemy podejrzeć poprzez podwójne kliknięcie.

Piszemy makra

Tabela articles składa się z trzech pól: num_article, gdzie znajdują się numery ID postów, article_pub z czasem publikacji oraz article_content, przechowująca treść postów. Na początek musimy napisać proste makro w języku OpenOffice.org Basic. Będzie ono tworzyć rekord w tabeli articles i zapisywać zawartość otwartego dokumentu Writer w polu article_content. Makro ma wykonywać trzy czynności: pobierać tekst z otwartego dokumentu Writer, łączyć się z bazą danych bilboblog i zapisywać tekst w polu article_content tabeli articles. Pierwszy krok – pobranie zawartości aktywnego dokumentu – wymaga trzech prostych linii kodu:

ThisDoc=ThisComponent
ThisText=ThisDoc.Text
Article=ThisText.String


Teraz musimy połączyć się z bazą danych. Tu również wystarczą trzy instrukcje:

DBContext=createUnoService ("com.sun.star.sdb.DatabaseContext")
DataSource=DBContext.getByName ("Bilboblog")
DB=DataSource.GetConnection ("użytkownik", "hasło")

W miejscu ciągów “użytkownik” i “hasło” wpisujemy nazwę użytkownika i hasło do bazy danych. Podanie tych elementów na stałe sprawia, że makro staje się mniej elastyczne (jeśli zmienimy któreś z nich, musimy ręcznie edytować makro), możemy więc pokusić się o zmodyfikowanie go tak, by samo pytało o dane do logowania. W takim wypadku kod umożliwiający połączenie z bazą danych przybierze następującą postać:

DBContext=createUnoService ("com.sun.star.sdb.DatabaseContext")
DataSource=DBContext.getByName("Bilboblog")
UserName=InputBox ("Użytkownik MySQL", "Attention")
UserPassword=InputBox ("Hasło", "Attention")
DB=DataSource.GetConnection (UserName, UserPassword)

Do manipulowania bazą danych OpenOffice.org Basic wykorzystuje zapytania SQL, więc aby zapisać pobrany tekst w polu article_content, makro posługuje się zapytaniem opartym na poleceniu INSERT INTO o następującym formacie:

INSERT INTO articles (pole1, pole2) VALUES ('wartość1', 'wartość2')

W naszym przypadku zapytanie INSERT INTO wyglądać będzie tak:

SQLQuery="INSERT INTO articles (article_content) VALUES ('" + Article + "')"

W języku OpenOffice.org Basic po zapytaniu INSERT INTO następują dwie instrukcje, służące do jego wykonania:

SQLStatement=DB.createStatement
Result=SQLStatement.executeQuery (SQLQuery)

Kiedy kwerenda zostanie już wykonana, makro sprząta po sobie, zamykając połączenie z bazą danych:

DB.close
DB.dispose

Cały kod przedstawiony jest w Listingu 1.

Sub PostToBilboblog
ThisDoc=ThisComponent
ThisText=ThisDoc.Text
Article=ThisText.String
DBContext=createUnoService("com.sun.star.sdb.DatabaseContext")
DataSource=DBContext.getByName("Bilboblog")
UserName=InputBox("Użytkownik MySQL", "Attention")
UserPassword=InputBox("Hasło", "Attention")
DB=DataSource.GetConnection (UserName, UserPassword)
SQLQuery="INSERT INTO articles (article_content) VALUES ('" + Article + "')"
SQLStatement=DB.createStatement
Result=SQLStatement.executeQuery (SQLQuery)
DB.close
DB.dispose
End Sub
Listing 1: Makro w języku OpenOffice.org Basic

Wszystko pięknie, ale powstałe makro ma jedno poważne ograniczenie: odziera tekst z wszelkiego formatowania, więc jeśli chcemy, by zachowane zostały pogrubienia, kursywa, podkreślenia i inne style tekstowe, będziemy potrzebować trochę więcej kodu. Bilboblog formatuje tekst za pomocą podzbioru znaczników BBCode, w tym pogrubienia (znaczniki [b] i [/b]), kursywy ([i] i [/i]) oraz podkreślenia ([u] i [/u]). Możemy oczywiście użyć tychże znaczników w trakcie pisania tekstu w Writerze, ale byłoby znacznie wygodniej, gdyby makro potrafiło przetworzyć tekst automatycznie, w momencie wstawiania jego zawartości do tabeli articles. W tym celu musimy zmodyfikować makro, aby odnajdywało wszystkie fragmenty sformatowane za pomocą pogrubienia, kursywy i podkreślenia i otaczało je odpowiednimi znacznikami. Bez zbędnych ceregieli przyjrzyjmy się Listingowi 2, który zawiera przykładowe makro wyszukujące pogrubione fragmenty tekstu i oznaczające je znacznikami [b] i [/b].

Sub ReplaceBold
Dim SearchAttributes(0) As New com.sun.star.beans.PropertyValue
ThisDoc=ThisComponent
SearchAttributes(0).Name="CharWeight"
SearchAttributes(0).Value=com.sun.star.awt.FontWeight.BOLD
ReplaceObj=ThisDoc.createReplaceDescriptor
ReplaceObj.SearchStyles=false
ReplaceObj.SearchAll=true
ReplaceObj.SearchRegularExpression=true
ReplaceObj.SetSearchAttributes(SearchAttributes)
ReplaceObj.SearchString=".*"
ReplaceObj.ReplaceString="[b]&[/b]"
ThisDoc.replaceAll(ReplaceObj)
End Sub
Listing 2: Makro zachowujące pogrubienie

Makro zaczyna się od określenia atrybutów wyszukiwania name i value i stworzenia obiektu ReplaceObj. Jego parametry definiują operacje wyszukania i zastąpienia. Ustawienie opcji SearchStyles na false zapobiega wyszukiwaniu przez makro konkretnych stylów, zaś aktywowanie parametru SearchAll pozwala na przeszukanie całego dokumentu. SearchRegularExpression umożliwia wykorzystanie wyrażeń regularnych, więc makro może posłużyć się wartością .* opcji SearchString, by przeszukać cały tekst. Parametr ReplaceString definiuje ciąg, którym zostanie zastąpiony odnaleziony fragment tekstu. Następnie ThisDoc.replaceAll(ReplaceObj) przeprowadza operację wyszukania i zamiany.

By tak samo postąpić z tekstem kursywą, wystarczy następująco zmodyfikować wartości SearchAttributes(0).Name, SearchAttributes(0).Value i ReplaceObj.ReplaceString:

SearchAttributes(0).Name="CharPosture"
SearchAttributes(0).Value=com.sun.star.awt.FontSlant.ITALIC
ReplaceObj.ReplaceString="[i]&[/i]"

Zamiast pisać kilka podprocedur dla każdego stylu, możemy z łatwością zmienić makro w funkcję i wywołać ją z podprocedury głównej – wystarczy, że zastąpimy wartości zmiennymi (Listing 3).

Function MarkupStr(SearchAttrName, SearchAttrValue, ReplaceStr)
Dim SearchAttributes(0) As New com.sun.star.beans.PropertyValue
ThisDoc=ThisComponent
SearchAttributes(0).Name=SearchAttrName
SearchAttributes(0).Value=SearchAttrValue
ReplaceObj=ThisDoc.createReplaceDescriptor
ReplaceObj.SearchStyles=false
ReplaceObj.SearchAll=true
ReplaceObj.SearchRegularExpression=true
ReplaceObj.SetSearchAttributes(SearchAttributes)
ReplaceObj.SearchString=".*"
ReplaceObj.ReplaceString=ReplaceStr
ThisDoc.replaceAll(ReplaceObj)
End Function
Listing 3: Zmieniamy podprocedurę w funkcję

Teraz możemy wywołać funkcję w głównej podprocedurze i podać odpowiednie wartości. Poniższy fragment kodu wyszukuje pogrubione, podkreślone i przekreślone fragmenty tekstu oraz kursywę za pomocą funkcji MarkupStr i stosuje w nich odpowiednie znaczniki.

MarkupStr("CharWeight", com.sun.star.awt.FontWeight.BOLD, "[b]&[/b]")
MarkupStr("CharPosture", com.sun.star.awt.FontSlant.ITALIC, "[i]&[/i]")
MarkupStr("CharUnderline", com.sun.star.awt.FontUnderline.SINGLE, "[u]&[/u]")
MarkupStr("CharStrikeout", com.sun.star.awt.FontStrikeout.SINGLE, "[s]&[/s]")

Makro jest prawie gotowe, powinniśmy jednak naprawić jeszcze jeden niewielki mankament. Bilboblog zapisuje datę i czas w tak zwanym uniksowym formacie czasowym, określanym jako liczba sekund, które upłynęły od północy 1 stycznia 1970 roku. Jeśli wrzucimy do tabeli articles rekord bez podania właściwego znacznika czasu, domyślnie wyświetlony zostanie właśnie 1 stycznia 1970 roku, co nie jest zbyt praktyczne. By uniknąć tego problemu, powinniśmy dodać instrukcję, która przypomina o podaniu daty i czasu:

Timestamp=InputBox ("Podaj znacznik czasu", "Attention")

Musimy również zmodyfikować zapytanie SQL, by wpisywało pobraną wartość znacznika czasu w polu article_pub:

SQLQuery="INSERT INTO articles (article_content, article_pub) VALUES ('" + Article + "', '" + Timestamp + "')"

Sub PostToBilboblog
MarkupStr("CharWeight", com.sun.star.awt.FontWeight.BOLD, "[b]&[/b]")
MarkupStr("CharPosture", com.sun.star.awt.FontSlant.ITALIC, "[i]&[/i]")
MarkupStr("CharUnderline", com.sun.star.awt.FontUnderline.SINGLE, "[u]&[/u]")
MarkupStr("CharStrikeout", com.sun.star.awt.FontStrikeout.SINGLE, "[s]&[/s]")
ThisDoc=ThisComponent
ThisText=ThisDoc.Text
Article=ThisText.String
DBContext=createUnoService("com.sun.star.sdb.DatabaseContext")
DataSource=DBContext.getByName("Bilboblog")
UserName=InputBox("Użytkownik MySQL", "Attention")
UserPassword=InputBox("Hasło", "Attention")
DB=DataSource.GetConnection (UserName, UserPassword)
Timestamp=InputBox("Podaj znacznik czasu", "Attention")
SQLQuery="INSERT INTO articles (article_content, article_pub) VALUES ('" + Article + "', '" + Timestamp + "')"
SQLStatement=DB.createStatement
Result=SQLStatement.executeQuery (SQLQuery)
DB.close
DB.dispose
End Sub
Function MarkupStr(SearchAttrName, SearchAttrValue, ReplaceStr)
Dim SearchAttributes(0) As New com.sun.star.beans.PropertyValue
ThisDoc=ThisComponent
SearchAttributes(0).Name=SearchAttrName
SearchAttributes(0).Value=SearchAttrValue
ReplaceObj=ThisDoc.createReplaceDescriptor
ReplaceObj.SearchRegularExpression=true
ReplaceObj.searchStyles=false
ReplaceObj.searchAll=true
ReplaceObj.SetSearchAttributes(SearchAttributes)
ReplaceObj.SearchString=".*"
ReplaceObj.ReplaceString=ReplaceStr
ThisDoc.replaceAll(ReplaceObj)
End Function

Listing 4: Makro i funkcja

Na Listingu 4 znajduje się ostateczna wersja makra i dołączonej do niego funkcji. Pytanie brzmi: jak wyliczyć wartość znacznika czasu? Możemy wprawdzie napisać kod konwertujący bieżącą datę i czas na znacznik czasu w formacie uniksowym, ale może to być problematyczne. Najprostszym rozwiązaniem jest skorzystanie z polecenia date %s w terminalu lub zainstalowanie rozszerzenia TimeStamp Converter dla Firefoksa [3].

Ostateczny szlif

Na koniec przyjrzyjmy się makru, które analizuje linki w dokumencie Writer i nadaje im formatowanie Bilbobloga. W odróżnieniu od funkcji zajmującej się formatowaniem tekstu, makro przetwarzające hiperłącza wykorzystuje obiekt Enumeration, za pomocą którego możemy po kolei przejrzeć paragrafy dokumentu, pobrać wartości parametru HyperlinkURL, a następnie zastosować określone formatowanie (Listing 5).

Sub MarkupURL
ThisDoc=ThisComponent
ThisText=ThisDoc.Text
ParaEnum=ThisText.createEnumeration
While ParaEnum.hasmoreElements
Para=ParaEnum.nextElement
PortionEnum=Para.createEnumeration
While PortionEnum.hasMoreElements
Portion=PortionEnum.nextElement
If Portion.HyperlinkURL <> "" then
Portion.String = "[url=" + Portion.HyperlinkURL +"]" +Portion.String + "[/url]"
End if
Wend
Wend
End Sub

Listing 5: Analiza i formatowanie hiperłączy

By przetworzyć hiperłącza za pomocą tego makra, wystarczy wywołać je z głównej podprocedury PostToBilboblog.

Info


Artykuł znaleziono w serwisie czytelnia.ubuntu.pl. Jego autorem jest Dmitri Popov, a sam tekst jest przedrukiem z gazety Linux Magazine 1(71)/2010 i został opublikowany za zgodą redakcji.

5.9.09

Numbertext: liczby słownie (i jeszcze więcej)

2 lata temu na łamach tegoż poradnika opublikowałem wpis instruujący, jak za pomocą prostego makropolecenia zautomatyzować sobie pracę w Calcu. Wczoraj zaś odkryłem rozszerzenie, które robi to samo i jeszcze więcej!

Numbertext, bo tak brzmi jego nazwa, to dodatek, który nie tylko zmienia zapis liczbowy na słowny, ale również konwertuje liczby na walutę. Ponadto potrafi skonwertowaną walutę zapisać w nastu obcych językach! Kolejnym plusem tego dodatku jest jego forma. Dzięki dystrybucji w postaci rozszerzenia, każdy użytkownik poradzi sobie z jego integracją (instalacją) z OpenOffice.org.

Rozszerzenie Numbertext jest odpowiedzią na (ograniczoną) funkcję BAHTTEXT w Excelu. Zanim jeszcze przejdziemy do głównej części tego wpisu, dopowiem, że społeczność skupiona wokół tej funkcji usiłowała zastąpić nią BAHTTEXT w specyfikacji OpenDocumentFormat Formula (ODFF) w ODF 1.2.

Po instalacji dodatku, będziemy mogli w Calcu operować na dwóch nowych funkcjach. Na NUMBERTEXT oraz na MONEYTEXT.

Przykład 1.
Aby zapisać liczbę 12345678 słownie, korzystamy z pierwszej funkcji, a zapisujemy ją następująco: =NUMBERTEXT(12345678)

Wynik: dwanaście milionów trzysta czterdzieści pięć tysięcy sześćset siedemdziesiąt osiem

Jeśli chcemy zapisać liczbę w obcym języku, używamy składni =NUMBERTEXT(1234567;"KOD_JĘZYKA"). Do testu użyłem języka domyślnego (polskiego), francuskiego (Szwajcaria), hiszpańskiego, niemieckiego, czeskiego, rosyjskiego i tajskiego. Kod dla poszczególnych języków to:

=NUMBERTEXT(12345678)
=NUMBERTEXT(12345678;"fr-CH")
=NUMBERTEXT(12345678;"es-ES")
=NUMBERTEXT(12345678;"de-DE")
=NUMBERTEXT(12345678;"cs-CZ")
=NUMBERTEXT(12345678;"ru-RU")
=NUMBERTEXT(12345678;"th-TH")

Wynik:
dwanaście milionów trzysta czterdzieści pięć tysięcy sześćset siedemdziesiąt osiem
douze millions trois cent quarante-cinq mille six cent septante-huit
doce millones trescientos cuarenta y cinco mil seiscientos setenta y ocho
zwölf Millionen dreihundertfünfundvierzigtausendsechshundertachtundsiebzig
dvanáct milionů tři sta čtyřicet pět tisíce šest set sedmdesát osm
двенадцать миллионов триста сорок пять тысяч шестьсот семьдесят восемь
สิบสองล้านสามแสนสี่หมื่นห้าพันหกร้อยเจ็ดสิบแปด

Przykład 2.
Aby skonwertować liczbę na walutę, wpisujemy funkcję =MONEYTEXT(50). Funkcja ta również doskonale sobie radzi z odmianą liczb po przecinku.

Wynik:
pięćdziesiąt złotych
pięćdziesiąt złotych osiemdziesiąt groszy
pięćdziesiąt złotych osiem groszy

Chcąc zaznaczyć, że chodzi nam obcą walutę, posługujemy się analogicznym zapisem: =MONEYTEXT(50;"KOD_WALUTY"). W tym przypadku użyłem "GBP" i "CNY" dla waluty Królestwa Wielkiej Brytanii i Chin.

Wynik:
pięćdziesiąt funtów szterlingów
pięćdziesiąt funtów szterlingów osiemdziesiąt pensów
pięćdziesiąt funtów szterlingów osiem pensów

pięćdziesiąt juanów
pięćdziesiąt juanów osiem jiao
pięćdziesiąt juanów osiem fenów

Natomiast jeśli chcemy zapisać słownie obcą walutę w obcym języku, korzystamy z funkcji =MONEYTEXT(50;"KOD_WALUTY";"KOD_KRAJU"). W ten oto sposób możemy zapisać zdanie "pięćdziesiąt funtów szterlingów" w języku mandaryńskim, lub też zdanie "pięćdziesiąt juanów" możemy zapisać po angielsku.

Kod:
=MONEYTEXT(50;"GBP";"zh-ZH")
=MONEYTEXT(50;"CNY";"en-GB")

Wynik:
五十英镑
fifty Chinese yuan

.

3.9.09

Writer2LaTeX - konwersja plików ODT do TEX

Czasami istnieje potrzeba konwersji OpenOffice'owskich plików ODT do plików TEX. Wprawdzie sam OpenOffice Writer posiada możliwość eksportu treści do plików TeX-a, ale ów eksport nie jest najlepszym z możliwych. Niestety OpenOffice generuje przy eksporcie strasznie skomplikowany kod wynikowy (wszędzie te formatowania...), który ciężko później wstawić do swojej pracy bez oczyszczania (a proces oczyszczania kodu trwa dłużej niż proces kopiuj-wklej tekst + dorób formatowanie w LaTeX-u). Na szczęście znalazłem niedawno lepszą alternatywę, a mianowicie program Writer2Latex. Zaletą programu Writer2Latex jest duża czystość generowanego kodu TeX-a przy konwersji plików ODT do TEX.

Writer2Latex jest konsolowym programem napisanym w Javie. Działa szybko i bezboleśnie. Radzi sobie z tabelkami i wzorami. Potrafi wyciągać obrazki z dokumentu ODT. Oprócz eksportu do formatu TEX, Writer2Latex pozwala także na eksport do plików BibTeX oraz XHTML i XHTML+MathML (tutaj także eksport z OO Calc).

Ponieważ, jak wspomniałem wcześniej Writer2Latex jest napisany w Javie. Ponieważ wpisywanie długich ścieżek mnie nudzi, przygotowałem mały skrypcik o nazwie w2l, umieszczony w /usr/local/bin, o treści:

#!/bin/bash
java -jar /usr/local/bin/writer2latex/writer2latex.jar $PWD/$1 $PWD/$2


I teraz wystarczy uruchomić Writer2Latex poleceniem:

w2l plik.odt plik.tex

Artykuł pochodzi z bloga Karola Kozioła i został opublikowany za jego zgodą.