Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

PHP table of content

7 views
Skip to first unread message

DiVeRgEnT

unread,
Feb 24, 2017, 7:14:03 PM2/24/17
to
Zdravo drugovi.

Da nema mozda netko kakav php kod za pravljenje sadrzaja na stranici?

Prokleti mobiteli... :-)

Neke interesantne funkcije bi bile:

- da prikuplja sve H tagove unutar <article> taga i stvara od njih TOC
- da je moguce definirati koje H tagove da prikuplja (recimo ne H1)
- da je sadrzaj naravno klikabilan (jump to anchor)
- da anchor moze biti ID bilo kojeg (tj. u ovom slucaju H) elementa, a
ne da unutar H tagova moram stavljati <a name=...>, pa da bi skripta
skuzila gdje da skoci
- i ne znam da li to php moze, ali vidio sam rjesenja za javascript da
se tim H tagovima automatski dodjeljuje random ID ukoliko im ja nisam
jedan dodijelio

Evo, jedan ujutro, a guglam i pokusavam implementirati TOC jucer od 10
ujutro. Jaaako malo primjera na netu. Ili jednostavno ne guglam kljucne
izraze. Prvo sam trazio PHP, jer zelim tezinu ucitavanja prepustiti
serveru, ali valjda samo dva-tri primjera postoje. Jedan koji donekle
nudi od nabrojanog kod mene ne funkcionira. Ne znam, mozda trazi neku
noviju verziju PHP-a, a kod mene je 4.3. Ili 4.1, vise ni ne znam...

Onda sam probao i s javascript primjerima, koji uglavnom koriste
biblioteke, ali niti to ne radi kod mene. A i primjetio sam da se
stranica dosta tesko ucitava s tim. PHP bi bilo znatno privlacnije rjesenje.

Jedino sto sam do sada uspio upogoniti je ovaj zgodan jquery kod, ako
kome treba:

// smooth scroll
$(function() {
$('a[href*="#"]:not([href="#"])').click(function() {
if (location.pathname.replace(/^\//,'') ==
this.pathname.replace(/^\//,'') && location.hostname == this.hostname) {
var target = $(this.hash);
target = target.length ? target : $('[name=' + this.hash.slice(1)
+']');
if (target.length) {
$('html, body').animate({
scrollTop: target.offset().top
}, 1000);
return false;
}
}
});
});

Pa kad kliknem link da skoci negdje dolje, on ne "otvori" stranicu na
sidru, negu ju brzinski skrola do sidra. Keeewl... :-)

--
Od kolijevke, pa do groba, za ispiranje mozga je doba.

http://zavjere.net (forum) | http://zavjere.com (blog)

DiVeRgEnT

unread,
Feb 25, 2017, 7:04:02 AM2/25/17
to
DiVeRgEnT wrote:
> Jedino sto sam do sada uspio upogoniti je ovaj zgodan jquery kod, ako
> kome treba:
>
> // smooth scroll
> $(function() {
> $('a[href*="#"]:not([href="#"])').click(function() {
> if (location.pathname.replace(/^\//,'') ==
> this.pathname.replace(/^\//,'') && location.hostname == this.hostname) {
> var target = $(this.hash);
> target = target.length ? target : $('[name=' + this.hash.slice(1)
> +']');
> if (target.length) {
> $('html, body').animate({
> scrollTop: target.offset().top
> }, 1000);
> return false;
> }
> }
> });
>
});
>
> Pa kad kliknem link da skoci negdje dolje, on ne "otvori" stranicu na sidru, negu ju brzinski skrola do sidra. Keeewl...


Ma jebemti mater i smooth skrolu da ti jebem... Napravio jutros "rucno"
TOC i radim sada highlights animacije na targetirane naslove i ne radi.
Pa ne radi i ne radi, jebemti i Bil Klintona i Bil Gejtsa i Džej
Ramanadovskog i Džej Kveri da ti jebem Džej Kveri... Ode još tri sata
života. Maknem linkove na Džej prokleti Kveri i eto radi bez beda. :-(
:-( :-(

DiVeRgEnT

unread,
Feb 25, 2017, 9:59:03 AM2/25/17
to
DiVeRgEnT wrote:
> Ma jebemti mater i smooth skrolu da ti jebem... Napravio jutros "rucno"
> TOC i radim sada highlights animacije na targetirane naslove i ne radi.
> Pa ne radi i ne radi, jebemti i Bil Klintona i Bil Gejtsa i Džej
> Ramanadovskog i Džej Kveri da ti jebem Džej Kveri... Ode još tri sata
> života. Maknem linkove na Džej prokleti Kveri i eto radi bez beda. :-(
> :-( :-(


html {
scroll-behavior: smooth;
}

...pas mater...

Radi na desktopu u FF i (pazi sad!) u IE10. Iron ne radi. Ne znam za ostale.

Na tabletu radi u FF. U Chrome-u i Android browseru ne radi.

DiVeRgEnT

unread,
Mar 9, 2017, 3:14:02 PM3/9/17
to
DiVeRgEnT wrote:
> Zdravo drugovi.
>
> Da nema mozda netko kakav php kod za pravljenje sadrzaja na stranici?
>
> Prokleti mobiteli... :-)
>
> Neke interesantne funkcije bi bile:
>
> - da prikuplja sve H tagove unutar <article> taga i stvara od njih TOC

Nasao, radi.


> - da je moguce definirati koje H tagove da prikuplja (recimo ne H1)

Nasao, radi.


> - da je sadrzaj naravno klikabilan (jump to anchor)

Nasao, radi, ali ne kako bih ja htio (slijedeca stavka).


> - da anchor moze biti ID bilo kojeg (tj. u ovom slucaju H) elementa, a
> ne da unutar H tagova moram stavljati <a name=...>, pa da bi skripta
> skuzila gdje da skoci

Nisam nasao.


> - i ne znam da li to php moze, ali vidio sam rjesenja za javascript da
> se tim H tagovima automatski dodjeljuje random ID ukoliko im ja nisam
> jedan dodijelio

Nisam nasao, ali nije toliko ni bitno.


Dakle najbolje sto sam dosad implementirao je mala, superfunkcionalna
skripta i izgleda ovako:

<?php
function TableOfContents($depth)
/*AutoTOC function written by Alex Freeman
* Released under CC-by-sa 3.0 license
* http://www.10stripe.com/ */
{
$filename = __FILE__;
//read in the file
$file = fopen($filename,"r");
$html_string = fread($file, filesize($filename));
fclose($file);

//get the headings down to the specified depth
$pattern = '/<h[2-'.$depth.']*[^>]*>.*?<\/h[2-'.$depth.']>/';
$whocares = preg_match_all($pattern,$html_string,$winners);

//reformat the results to be more usable
$heads = implode("\n",$winners[0]);
$heads = str_replace('<a name="','<a href="#',$heads);
$heads = str_replace('</a>','',$heads);
$heads = preg_replace('/<h([1-'.$depth.'])>/','<li class="toc$1">',$heads);
$heads = preg_replace('/<\/h[1-'.$depth.']>/','</a></li>',$heads);

//plug the results into appropriate HTML tags
$contents = '<div id="toc">
<p id="toc-header">Contents</p>
<ul>
'.$heads.'
</ul>
</div>';
echo $contents;
}
?>

I tablica se kreira pozivanjem:

<?php TableOfContents(3); ?>

Broj tri (3) definira koliko duboko da trazi podnaslove, uz uvjet da je
H1 izbacen. Znaci generira TOC od H2 i H3 tagova. Odlicno!

Uredno funkcionira, ali je to skripta od prije vise od 10 godina i htio
bih sitnije izmjene napraviti sukladne HTML5 standardima, ali je to za
mene visa matematika. Jer skripta skenira H tagove unutar linka, ili
linkove unutar H tagova, a nema nikakvog smisla da H tag bude unutar,
ili oko linka. Zasto bih od podnaslova teksta radio link? Na sta?? (osim
na naslovnici, ali u tom slucaju nema potrebe za TOC-om)

Medjutim, to trenutno cak ni ne smeta (osim visak koda i visak
procesiranja), jer i moje standardne naslove obavijene samo H tagom on
prepoznaje, nego skripta jednu drugu glupost radi. Tom H tag linku trazi
NAME, tako da kad kliknes na link unutar TOC-a, onda te baci dolje gdje
je sidro. Ali ja sidra kreiram ID-om od H taga, a ne NAME-om od A taga!
I zato nemam nikakve potrebe naslove obavijati u linkove.

Jos jedna glupost koju ova skripta radi je da kreira TOC u obliku
linkova, sto sasvim uredno radi, ali te linkove obavija u (gle cuda) H
TAGOVE!!?? Zasto bi linkovi u TOC-u bili u H tagovima!?? To mi samo daje
dizajnerske probleme, a vjerujem i zbunjuje google. ANCHOR tagovi su
sasvim dovoljni. (Pa i onaj ul-li je visak, ali ok, to znam rijesiti.)

Znaci molim pomoc za:

1) maknuti nepotrebne linije koda koje traze A tagove unutar ili oko H
taga. Treba samo traziti H tag
2) zamijeniti da kod trazi ID od H taga, a ne NAME od A taga.
3) izbaciti iz outputa da ne generira H tagove oko A taga.

Hvala unaprijed!!!!!!!!

megamusic

unread,
Mar 9, 2017, 7:01:03 PM3/9/17
to

"DiVeRgEnT" <mojNa...@mojaDomena.com> wrote in message
news:o9sctl$6uc$1...@lvpnews.vipnet.hr...
> DiVeRgEnT wrote:
>> Zdravo drugovi.
>>
>> Da nema mozda netko kakav php kod za pravljenje sadrzaja na stranici?
>>
>> Prokleti mobiteli... :-)
>>
>> Neke interesantne funkcije bi bile:
>>
>> - da prikuplja sve H tagove unutar <article> taga i stvara od njih TOC
>

Ajde probaj ovo:

function TableOfContents($depth, $content = null){
if(!$content){$content = @file_get_contents(__FILE__);}
if(!$content ||
!preg_match_all('/<h[2-'.$depth.']*[^>]*>(.*?)<\/h[2-'.$depth.']>/',
$content, $arr, PREG_SET_ORDER)){return;}
$content = '';
foreach ($arr as $hdr){
preg_match('/<.*?(?:(?:name="([^"]*)")|(?:id="([^"]*)")|(?:href="([^"]*)"))[^>]*>{1}/',
$hdr[0], $target);
unset($target[0]);
$target = implode($target);
if ($target){$content .='<li><a
href="#'.$target.'">'.strip_tags($hdr[1]).'</a></li>';}
}
//ako se ne koristi ul / li dovoljno je echo $content
if ($content) {echo '<ul>', $content ,'</ul>';}
}


DiVeRgEnT

unread,
Mar 9, 2017, 10:14:03 PM3/9/17
to
megamusic wrote:
> Ajde probaj ovo:
>
> function TableOfContents($depth, $content = null){
> if(!$content){$content = @file_get_contents(__FILE__);}
> if(!$content ||
> !preg_match_all('/<h[2-'.$depth.']*[^>]*>(.*?)<\/h[2-'.$depth.']>/',
> $content, $arr, PREG_SET_ORDER)){return;}
> $content = '';
> foreach ($arr as $hdr){
> preg_match('/<.*?(?:(?:name="([^"]*)")|(?:id="([^"]*)")|(?:href="([^"]*)"))[^>]*>{1}/',
> $hdr[0], $target);
> unset($target[0]);
> $target = implode($target);
> if ($target){$content .='<li><a
> href="#'.$target.'">'.strip_tags($hdr[1]).'</a></li>';}
> }
> //ako se ne koristi ul / li dovoljno je echo $content
> if ($content) {echo '<ul>', $content ,'</ul>';}
> }


Bez ijedne greske, radi sve iz prve! Svaka ti dala majstore...

Ima jedna samo omanja greska, ali moja. Krivo postavljen zadatak.
Napisao sam da nema smisla da unutar TOC-a linkovi budu unutar H tagova
i to i dalje stoji, ANCHOR tagovi su sasvim dovoljni, medjutim sada iz
TOC-a nije moguce znati koji naslov je vise glavni, a koji je manje
glavni, sto se dizajnom rjesava uvlacenjem naslova u - podnaslov.

Nije problem uvlacenje izvrsiti css-om, nego je problem targetirati
podnaslov CSS-om da bi ga mogao uvuci, jer sad vise nije poznato koji
link vodi na H2, H3, H4, itd. Nekada se to radilo ugnjezdjivanjem
ul-li-ova, ali to nema nikakvog smisla danas.

Na ovom jednom TOC-u koji sam rucno sastrikao dok sam dizajnirao TOC taj
problem sam rijesio davanjem klase A tagu koji predstavlja link na
podnaslov. <a class="uvuceno" (...)>Podnaslov</a>

E sad, kad bi to htjeli dinamizirati, pa da vrijedi i za vise levela
uvlacenja (podnaslova) onda bi ipak trebao onaj H tag, ali ne ubliku
taga, nego u obliku klase. Nesto u stilu:

<a href="#'.$target'". class="toc-link-'.$heading'

gdje bi $heading bio H tag pokupljen od tog (pod)naslova kao na
originaloj sripti, a iskoristen da output izgleda ovako:
class="toc-link-h3".

Mozes molim te se to ubaciti?

O majke ti mile, proslo 4 ujutro... :-(

DiVeRgEnT

unread,
Mar 10, 2017, 6:54:02 AM3/10/17
to
megamusic wrote:
> Ajde probaj ovo:

Imam jedan problem indirektno samo vezan za tu skriptu.

imam jednu global.inc.php datoteku koju inkludam na pocetku svake
stranice iznad HTML taga. tu bacam sve skriptice i varijable koje
koristim. Ako se skripte sastoje od funkcija, onda unutar funkcija moram
definirati globalne varijable da bi stvar funkcionirala na svakoj stranici.

Medjutim, ova skripta funkcionira samo ako se cijela stavi direkt na
stranicu.

Ako skriptu stavim u globaln.inc.php, a na stranici pozovem funkciju -
ne radi.

Ne znam koju varijablu da proglasim globalnom, jer na strnaici ne
pozivam varijablu nego cijelu funkciju.

Ako funkciju napravim globalnom tako da i skriptu i poziv funkcije
stavim u zaseban php file koji includam tako gdje hocu da se ispise TOC
- opet ne radi.

Radi samo ako i skripta i poziv funkcije stoje na stranici na kojoj se
ispisuje TOC.

Ne kuzim...?

DiVeRgEnT

unread,
Mar 10, 2017, 9:54:02 AM3/10/17
to
DiVeRgEnT wrote:
> Medjutim, ova skripta funkcionira samo ako se cijela stavi direkt na
> stranicu.
>
> Ako skriptu stavim u globaln.inc.php, a na stranici pozovem funkciju -
> ne radi.
>
> Ne znam koju varijablu da proglasim globalnom, jer na strnaici ne
> pozivam varijablu nego cijelu funkciju.
>
> Ako funkciju napravim globalnom tako da i skriptu i poziv funkcije
> stavim u zaseban php file koji includam tako gdje hocu da se ispise TOC
> - opet ne radi.


Stavio funkciju u zaseban php file, pa ju inkludao s pozivom funkcije -
ne radi.

Registrirao funkciju s auto prepend file u php.ini - ne radi.

Sad mi jedino jos ovo pada na pamet ali ne znam kako napraviti. Kako da
iz ovoga na kraju funkcije:

if ($content) {echo $content;}

napravim varijablu $content (ili neku drugu) koja se nece ispisati dok
ju u HTML-u ne pozovem da se ispise (umjesto da pozovem cijelu
funkciju)? Znaci umjesto da toc kreiram pozivanjem funkcije:

<?php toc() ?>

toc kreiram ispisom varijable $content (ili neke druge) koja sadrzi sve
sto je funkcija odradila:

<php echo $content ?>

A na pocetku funkcije $content proglasim globalnom varijablom i rijesio
sam problem.

DiVeRgEnT

unread,
Mar 10, 2017, 12:29:03 PM3/10/17
to
DiVeRgEnT wrote:
> DiVeRgEnT wrote:
>> Medjutim, ova skripta funkcionira samo ako se cijela stavi direkt na
>> stranicu.

Lijepo sam se napricao sam sa sobom...

I nakon 7 sati razbijanja glave otkrio i rijesio problem. Liniju:

if(!$content){$content = @file_get_contents(__FILE__);}

zaijenio sa:

if(!$content){$content =
@file_get_contents('http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF']);}

I sad radi gdje god da stavim funkciju. :-)

Mislim da trebam dvije zlatne medalje dobiti.

1) Za najneukijeg programera

2) Za najupornijeg programera

Ne znam po kojoj medalji sam veca budala...

megamusic

unread,
Mar 10, 2017, 1:01:02 PM3/10/17
to

"DiVeRgEnT" <mojNa...@mojaDomena.com> wrote in message
news:o9t5hb$obm$1...@lvpnews.vipnet.hr...
Evo nova verzija:

function TableOfContents($depth, $content = null){
if(!$content){$content = @file_get_contents(__FILE__);}
if(!$content ||
!preg_match_all('/<(h[2-'.$depth.'])*[^>]*>(.*?)<\/h[2-'.$depth.']>/',
$content, $arr, PREG_SET_ORDER)){
return;
}
$content = '';
foreach ($arr as $hdr){
preg_match('/<.*?(?:(?:name\s*=\s*"([^"]*)")|(?:id\s*=\s*"([^"]*)")|(?:href\s*=\s*"([^"]*)"))[^>]*>{1}/',
$hdr[0], $target);
unset($target[0]);
$target = implode($target);
if ($target){$content .='<li><a class="'.$hdr[1].'"
href="#'.$target.'">'.strip_tags($hdr[2]).'</a></li>';}

megamusic

unread,
Mar 10, 2017, 1:30:02 PM3/10/17
to

"DiVeRgEnT" <mojNa...@mojaDomena.com> wrote in message
news:o9u423$1ddf$1...@lvpnews.vipnet.hr...
> megamusic wrote:
>> Ajde probaj ovo:
>
> Imam jedan problem indirektno samo vezan za tu skriptu.
>
> imam jednu global.inc.php datoteku koju inkludam na pocetku svake stranice
> iznad HTML taga. tu bacam sve skriptice i varijable koje koristim. Ako se
> skripte sastoje od funkcija, onda unutar funkcija moram definirati
> globalne varijable da bi stvar funkcionirala na svakoj stranici.
>
> Medjutim, ova skripta funkcionira samo ako se cijela stavi direkt na
> stranicu.
>
> Ako skriptu stavim u globaln.inc.php, a na stranici pozovem funkciju - ne
> radi.
>
> Ne znam koju varijablu da proglasim globalnom, jer na strnaici ne pozivam
> varijablu nego cijelu funkciju.
>
> Ako funkciju napravim globalnom tako da i skriptu i poziv funkcije stavim
> u zaseban php file koji includam tako gdje hocu da se ispise TOC - opet ne
> radi.
>
> Radi samo ako i skripta i poziv funkcije stoje na stranici na kojoj se
> ispisuje TOC.
>
> Ne kuzim...?
>

Problem je u __FILE__ konstanti koja vraca ime datoteke u kojoj se funkcija
nalazi (u ovom slucaju global.inc.php).
Posto funkcija radi na nacin da obradjuje tu datoteku, stavljanjem funkcije
u included fajl rezultira trazenjem tagova u samom includanom fajlu bez
obzira gdje je pozvana.
Da bi funkcija mjenjala file koji je poziva __FILE__ konstanta bi se trebala
nalaziti u njemu samome, tj poziv funkcije trebao bi biti: <?php
TableOfContents(4, @file_get_contents(__FILE__));?>










DiVeRgEnT

unread,
Mar 10, 2017, 2:09:02 PM3/10/17
to
megamusic wrote:
> Evo nova verzija:
>
> function TableOfContents($depth, $content = null){
> if(!$content){$content = @file_get_contents(__FILE__);}
> if(!$content ||
> !preg_match_all('/<(h[2-'.$depth.'])*[^>]*>(.*?)<\/h[2-'.$depth.']>/',
> $content, $arr, PREG_SET_ORDER)){
> return;
> }
> $content = '';
> foreach ($arr as $hdr){
> preg_match('/<.*?(?:(?:name\s*=\s*"([^"]*)")|(?:id\s*=\s*"([^"]*)")|(?:href\s*=\s*"([^"]*)"))[^>]*>{1}/',
> $hdr[0], $target);
> unset($target[0]);
> $target = implode($target);
> if ($target){$content .='<li><a class="'.$hdr[1].'"
> href="#'.$target.'">'.strip_tags($hdr[2]).'</a></li>';}
> }
> //ako se ne koristi ul / li dovoljno je echo $content
> if ($content) {echo '<ul>', $content ,'</ul>';}
> }


Super, radi bez problema. Malo sam gledao koje promjene si radio, ali ja
to nista ne kuzim. :-) Da klasa bude cistog imena $hdr[1] bas i nije
dobro, ali ok, to mi je lagano, pa sam zamijenio da $hdr[1] bude samo
ekstenzija naziva klase ("toc-link-$hdr[1]").

Upogonio sam funkciju i na ostalim stranicama (sad kad sam rijesio
globalizaciju funkcije zamjenom onog __FILE__ iz file_get_contents), ali
na ostalim stranicama svejedno funkcija nije radila. Ali buduci da je na
ovoj prvoj stranici i dalje sve uredno radilo, srecom da sam brzo otkrio
"bug". Vjerojatno u preg_match dijelu funkcije gdje funkcija skenira
html i trazi H tagove, stavio si uvjet da H tag mora imati ID. A ID je
uvjet za klikabilnost headinga u TOC-u (jump to anchor), ne za
ispisivanje headinga u TOC (recimo sa href="#"). :-)

DiVeRgEnT

unread,
Mar 10, 2017, 2:39:03 PM3/10/17
to
megamusic wrote:

> Problem je u __FILE__ konstanti koja vraca ime datoteke u kojoj se funkcija
> nalazi (u ovom slucaju global.inc.php).
> Posto funkcija radi na nacin da obradjuje tu datoteku, stavljanjem funkcije
> u included fajl rezultira trazenjem tagova u samom includanom fajlu bez
> obzira gdje je pozvana.

Da, to sam nakon 7 sati i sam naucio. :-)


> Da bi funkcija mjenjala file koji je poziva __FILE__ konstanta bi se trebala
> nalaziti u njemu samome, tj poziv funkcije trebao bi biti: <?php
> TableOfContents(4, @file_get_contents(__FILE__));?>

Ma rjesio sam to sa $_SERVER varijablom.
0 new messages