Jeżeli artykuł skład się z samego tekstu problem nie jest zbyt skomplikowany. Da się go rozwiązać w sposób łopatologiczny, np.:
<?php function displayInColumn( $text, $columnNo = 2, $wordMaxLength = 21, $rowPattern = '%s ', $wordPattern = '<span style="word-spacing: -1px;">%s</span>' ) { // przygotowanie tekstu ///////////////////////////////////////////////////////////////////// foreach( $words as $key => $vals) { $tmpWord = ''; // długośc linijki rozbijany jest $tmpWord .= $words[$key][$i].' '; // które będą zamkniętę w specjalny } } // podział na linijki /////////////////////////////////////////////////////////////////////// // zawiera nie wiecej niż $wordMaxLength znaków; $linesNo = 0; // Liczba wszystkich linijek; foreach( $words as $word ) { if( $lettersNo + $wordLength < $wordMaxLength ) $lines[$linesNo] .= $word.' '; else if( $wordLength < $wordMaxLength ) { $lines[++$linesNo] .= $word.' '; } else { // (*) Zamykanie długiego wyrazu w teg $wordPattern; for( $i = 0; $i < $wordLength; ) { $i += $tmpLength + ($tmpLength % 2 == 0 ? 0 : 1); $linesNo++; } } } // podział na kolumny /////////////////////////////////////////////////////////////////////// $inColumn = (int)($linesNo / $columnNo); if( $inColumn * $columnNo < $linesNo ) // aby kolumna pierwsza była dłuższa niż ostatnia $inColumn += 1; $column = 0; foreach( $lines as $key => $val ) { if( $key % $inColumn == 0 ) $column++; // Zamknięcie poszczególnej linijki w tag $rowPattern. } return $columns; } ?>
i przykład zastosowania:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="pl" lang="pl"> <head> <title>Wyświetlenie treści artykułu w kilku kolumnach</title> <meta http-equiv="content-type" content="text/html; charset=UTF-8" /> <style type="text/css"> div.column { margin: 10px; width: 200px; overflow: hiiden; float: left; font-family:Times; font-size:12px; text-align: justify; word-spacing: 2px; } </style> </head> <body style="width: 900px;"> <?php $text = "Lorem ipsum dolor sit amet, consectetuer adipiscingadipiscingadipiscingadip
iscingadipiscing elit. Aenean vel eros. Lorem ipsum dolor sit amet, consectetuer
adipiscing elit. Nunc ut dolor sed mi ultrices pulvinar. Nam non ipsum et magna c
onsequat commodo. Quisque in risus in diam condimentum malesuada. Aenean commodo.
Donec in lacus. Quisque tortor nulla, mattis eu, congue ut, hendrerit ac, risus.
Etiam tellus arcu, viverra in, elementum eu, tincidunt vitae, magna. Fusce pelle
ntesque metus in leo ultricies molestie. Donec ullamcorper turpis sed pede. Donec
aliquet urna. Vestibulum luctus. Nullam enim. Phasellus id ante ut nisi lobortis
sagittis. Sed in sem. Nam felis nulla, faucibus vel, iaculis sit amet, sagittis
at, urna. Nullam laoreet faucibus dolor.". "Maecenas in eros vitae metus lobortis dictum. Integer gravida velit eu augu
e. Maecenas eget tortor. Proin dolor dolor, vehicula in, cursus nec, commodo et,
erat. Suspendisse potenti. Nunc vulputate quam molestie massa. Donec ut arcu. Sus
pendisse mollis. Cras fermentum. In diam justo, faucibus nec, commodo sit amet, h
endrerit nec, enim. Aliquam erat volutpat. Curabitur ut sapien. Fusce eu arcu vit
ae felis varius vehicula. Fusce massa massa, laoreet ac, ullamcorper non, tempor
eget, ligula. Nunc nec sem. Fusce mattis porttitor quam. Curabitur nibh nisl, tri
stique quis, fringilla sit amet, cursus non, odio. Sed tempor varius elit.". "Donec mollis turpis vel erat. Pellentesque et libero. Nam iaculis pharetra
ante. In hac habitasse platea dictumst. Suspendisse pede. Proin leo metus, vehicu
la semper, tincidunt eu, luctus in, ipsum. Curabitur non nibh. Integer eget leo.
In nunc. Maecenas condimentum pretium libero. Mauris mollis odio ac ipsum. Praese
nt adipiscing porta lorem. Duis porta lorem et ante. Fusce elit. Duis viverra iac
ulis odio. Duis vehicula tempus metus. Nullam nec risus. Vivamus ac nunc sed sem
rhoncus convallis. Morbi arcu risus, lacinia rutrum, vehicula quis, faucibus ut,
nunc. Nulla in odio sed urna dapibus convallis.". "Cras vehicula urna non neque. Morbi justo. Duis in enim. Quisque viverra so
llicitudin leo. Nunc ultricies, nibh non feugiat viverra, neque arcu ultrices nis
l, id gravida nunc felis vel turpis. Praesent bibendum nulla a magna. Nulla sit a
met quam. Cras mollis, justo non pellentesque viverra, lectus purus rutrum pede,
id elementum nunc nibh id diam. Fusce velit. Curabitur quis est.". "Sed elit. Integer bibendum felis ac ipsum. Maecenas ultricies. Nulla a ante
ut dolor mollis accumsan. Mauris sem felis, hendrerit eu, tincidunt non, feugiat
non, nunc. Proin posuere ipsum eget nisi. Duis a velit. In odio. Donec vitae lac
us. Sed porttitor, tortor ac egestas ornare, ante dui elementum nulla, ac volutpa
t tellus lorem rhoncus felis. Sed scelerisque venenatis risus. Etiam odio. Suspen
disse potenti. Fusce aliquam urna nec mi."; // przykład 1: każda linijka zamknięta w osobnym div'ie; $columnPattern1 = '<div class="column">%s</div>'; $rowPattern = '<div style="margin: 0px">%s</div>'; foreach( displayInColumn($text, 4, 36, $rowPattern) as $columnText ) // przykład 2: wyjustowany tekst $columnPattern2 = '<div class="column" style="width: 270px;">%s</div>'; foreach( displayInColumn($text, 3, 50) as $columnText ) ?> </body> </html>
No i teraz moje problemy (jeszcze nie rozwiązane), każda sugestia mile widziana:
1) Nie mam pomysłu jak sprytnie dodać myślniki przy wyrazach dzielonych pomiędzy linie. Jeżeli by założyć iż każda linia zamknięta jest w osobnym div'ie nie jest to super trudne o tyle przy założeniu justowania jak w przykładzie 2 nie mam zielonego pojęcia jak to zrobić.
2) Jak optymalnie obsłużyć tekst w którym są wykorzystane tagi HTML. Problem jest taki że przy dzieleniu dwu wyrazowego linku pomiędzy dwie linie, jak w przykładzie 1 (z div'ami) trzeba de facto zrobić dwa takie same linki.
3) W przypadku wyjustowanych kolumn kolumny się skracają - w sposób nie kontrolowany.
4) Jak obsłużyć wstawianie rysunków, co by odpowiednio się to dzieliło??