Archive for the 'tekst' Category

morizony, cluetrain i PR

Jest taka książka “Manifest Cluetrain”, wydana w polskiej wersji osiem lat temu (autorzy: R. Levine, Ch. Locke, D. Searls i D. Weinberger, tłumacz: Katarzyna Thomas i Małgorzata Cichy). Choć niezwykle wręcz przekonująca i bardzo humanistyczna mimo tematyki okołointernetowej, to jej przesłanie nie trafi do umysłów wielu szefów wielu firm przez wiele lat. Na pewno nie trafiło tam gdzie pracowałem do niedawna. Czemu się czepiam? Ano temu, że znalazłem przypadek przeciwny, dający otuchę i po prostu fajny. Do rzeczy: chodzi o język i sposób komunikowania się firmy ze światem. To, czego nie cierpię, to takie teksty: “prężnie rozwijającą się polska firma, przed którą rynek nie ma tajemnic tak w Polsce, jak i za granicą. Kompleksowe usługi i wszechstronność w działaniu wyróżnia X w branży.[...]” albo “Jesteśmy dynamicznie rozwijającą się firmą, działającą w najnowocześniejszych sektorach gospodarki. Przywiązujemy wielką wagę do bezpieczeństwa i wysokiej jakości swiadczonych usług…” Pierdu pierdu.

Dla kontrastu mam, jakby żywcem ze wspomnianego Manifestu wyjęty, blog pracowników firmy morizon.pl, nowego portalu nieruchomości. Szacunek za otwarty i swobodny sposób wyrażania się, za szerokie horyzonty i wreszcie gratulacje za sposób zarządzania współpracownikami, jaki opisują. Posty Moniki Rudnickiej czytam z przyjemnością i zainteresowaniem, nawet jeśli nie zawsze zgadzam się z Jej opinią (np. o nazwie morizon). Teksty Artura Jedlińskiego podobnie, zwłaszcza że akurat organizacja pracy zespołu to mój temat miesiąca. Oboje piszą we własnym imieniu i nie muszą podpierać się bełkotem pseudomarketingowym żeby dać odczuć w jak fajnej firmie pracują. Nie wiem czy ta firma fajna rzeczywiście jest - ale chodzi mi o jakość komunikatu, o to że wyraża prawdziwe emocje i zainteresowanie zamiast tępego tłuczenia “prężnością” i “dynamiką”.

wielokolumnowy układ tekstu w actionscript

Jest taki przykład w dokumentacji Flexa, jest też trochę o tym na blogu niejakiego Daniela. Jednak oba przykłady kończą się tam, gdzie zaczyna się próba przelewania HTMLa przez kilka ramek tekstowych. Dla zwykłego, czystego tekstu to proste - zobaczyć ile się nie zmieściło w ramce n i wlać to do ramki n+1, aż do ostatniej ramki albo końca tekstu.

W przypadku HTMLa jednak Flash nas nie oszczędza. Obliczenie pozycji, na której powinien nastąpić podział jest skomplikowane, bo trzeba uwzględnić - niewidoczne w ramce - tagi, w dodatku pamiętać o automatycznym zamykaniu ich i otwieraniu w kolejnych ramkach. Metody klasy TextField jak getLineOffset() zwracają pozycję w czystym tekście, a podział musi nastąpić w odpowiadającym jej miejscu HTMLa. Na dokładkę HTML, jaki naprawdę jest w obiekcie TextField zupełnie niekoniecznie przypomina ten, który przypisaliśmy do htmlText! Dlatego trzeba najpierw wlać tekst do ramki:

naszTextField.htmlText = nowyHtml;

potem pobrać go do zmiennej i dalej pracować już nad nim:

processedHtml = naszTextField.htmlText;

a oto procedurka przelewająca:

protected function flow():void
{
var lastSplit:                int     = 0;
var newSplit:                int     = 0;
var tb:                        VTextBox;
var tbNum:                    int        = linkedTextBoxes.length;
var tagsHeap:                Array      = new Array();
var opening:                String;
var closing:                String;
var tempText:                String;
var remainder:                String;
var remainLinesNum:            int;
var lastVisibleLineIndex:    int;
var cutIndex:                int;

// liczba stron, na jaką trzeba będzie podzielić tekst
pagesNum             = 0;
// pozycje podziału stron
splitIndices         = new Array();
splitIndices.push(0);
// pozostała do wlania część tekstu - najpierw cały
remainder = processedText;
textPieces = new Array();

while(remainder.length > 0) {
textPieces[pagesNum] = new Array();
for(var i:int = 0; i < tbNum; i++) {
// kolejna ramka tekstowa
tb = linkedTextBoxes[i];
trace(’strona ‘ + pagesNum + ‘, box nr ‘ + i);

// Jeśli tekst już się skończył, kolejne ramki bieżącej strony wypełniamy pustym tekstem.
// Jeśli tekst jeszcze jest, wlewamy pozostałą część i badamy ile się zmieściło
if(remainder.length == 0) {
textPieces[pagesNum][i] = ”;
} else {
// dodajemy na początek otwarcie wszystkich tagów kontynuowanych z poprzedniej ramki
opening                 = Html.getOpeningHtml(tagsHeap);
// wlewamy cały pozostały tekst
tb.htmlText             = opening + remainder;
// obliczamy, ile linii jest poza ramką
remainLinesNum             = tb.maxScrollV - 1;
trace(’poza ramką jest linii: ‘ + remainLinesNum);

if(remainLinesNum == 0) {
textPieces[pagesNum][i] = opening + remainder;
remainder = ”;
} else {
// obliczamy index ostatniej linii
lastVisibleLineIndex     = tb.numLines - remainLinesNum - 1;
trace(’indeks ostatniej linii: ‘ + lastVisibleLineIndex);
// pobieramy indeks ostatniego widocznego znaku
cutIndex                 = tb.getLineOffset(lastVisibleLineIndex) + tb.getLineLength(lastVisibleLineIndex) - 1;
trace(’cutIndex: ‘ + cutIndex);
trace(’cut rigth after …’ + tb.getLineText(lastVisibleLineIndex));
// pozostawiamy tylko mieszczącą się część tekstu
tempText                = remainder.substring(0, cutIndex);
remainder                = remainder.substr(cutIndex);
// uzupełniamy listę otwartych tagów
tagsHeap                 = Html.getTags(tempText, tagsHeap);
// pobieramy tagi do zamknięcia w ramce
closing = Html.getClosingHtml(tagsHeap);
textPieces[pagesNum][i] = opening + tempText + closing;
}
}
}
pagesNum++;
}

displayPage(0);
}

A oto link do video, w świetle którego całe powyższe rozważanie wkrótce straci sens.