abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    včera 23:55 | Nová verze

    Byla vydána nová stabilní verze 24.05 linuxové distribuce NixOS (Wikipedie). Její kódové označení je Uakari. Podrobný přehled novinek v poznámkách k vydání. O balíčky se v NixOS stará správce balíčků Nix.

    Ladislav Hagara | Komentářů: 0
    včera 17:33 | Nová verze

    Byla vydána nová verze 1.48.0 sady nástrojů pro správu síťových připojení NetworkManager. Novinkám se v příspěvku na blogu NetworkManageru věnuje Fernando F. Mancera. Mimo jiné se v nastavení místo mac-address-blacklist nově používá mac-address-denylist.

    Ladislav Hagara | Komentářů: 10
    včera 17:11 | Komunita

    Před 25 lety, 31. května 1999, započal vývoj grafického editoru Krita (Wikipedie). Tenkrát ještě pod názvem KImageShop a později pod názvem Krayon.

    Ladislav Hagara | Komentářů: 3
    včera 12:55 | Nová verze

    Farid Abdelnour se v příspěvku na blogu rozepsal o novinkám v nejnovější verzi 24.05.0 editoru videa Kdenlive (Wikipedie). Ke stažení brzy také na Flathubu.

    Ladislav Hagara | Komentářů: 0
    včera 11:22 | Zajímavý článek

    David Revoy, autor mj. komiksu Pepper&Carrot, se rozepsal o své aktuální grafické pracovní stanici: Debian 12 Bookworm, okenní systém X11, KDE Plasma 5.27, …

    Ladislav Hagara | Komentářů: 9
    30.5. 22:44 | Nová verze

    Wayland (Wikipedie) byl vydán ve verzi 1.23.0. Z novinek lze vypíchnout podporu OpenBSD.

    Ladislav Hagara | Komentářů: 0
    30.5. 21:22 | Zajímavý článek

    Craig Loewen na blogu Microsoftu představil novinky ve Windows Subsystému pro Linux (WSL). Vypíchnout lze GUI aplikaci pro nastavování WSL nebo správu WSL z Dev Home.

    Ladislav Hagara | Komentářů: 0
    30.5. 12:44 | Pozvánky

    V sobotu 1. června lze navštívit Maker Faire Ostrava, festival plný workshopů, interaktivních činností a především nadšených a zvídavých lidí.

    Ladislav Hagara | Komentářů: 0
    30.5. 12:22 | Nová verze

    Webový server Caddy (Wikipedie) s celou řadou zajímavých vlastností byl vydán ve verzi 2.8 (𝕏). Přehled novinek na GitHubu.

    Ladislav Hagara | Komentářů: 13
    29.5. 22:11 | Nová verze

    Byla vydána verze 3.0 (@, 𝕏) svobodného softwaru HAProxy (The Reliable, High Performance TCP/HTTP Load Balancer; Wikipedie) řešícího vysokou dostupnost, vyvažování zátěže a reverzní proxy. Detailní přehled novinek v příspěvku na blogu společnosti HAProxy Technologies.

    Ladislav Hagara | Komentářů: 7
    Podle hypotézy Mrtvý Internet mj. tvoří většinu online interakcí boti.
     (90%)
     (3%)
     (4%)
     (4%)
    Celkem 1074 hlasů
     Komentářů: 17, poslední včera 15:31
    Rozcestník

    Užitečné skripty 3: automaticky generovaný obsah v HTML

    11.3.2007 21:49 | Přečteno: 2309× | Linux

    Dnešní téma nebude úplně linuxové, i když zkušený demagog by jistě zdůvodnil, že do linuxu patří. Podíváme se, jak udělat v HTML souboru obsah (table of content, abych předešel nedorozumnění), který se generuje úplně sám. Samozřejmě s pomocí Javascriptu.

    Abstrakt

    Určitě jste už někdy potřebovali napsat kratší návod nebo krátký technický dokument. Technická dokumentace by měla mít na začátku obsah (TOC). Musíme tedy najít takový formát, který umí obsah (TOC) vygenerovat sám, protože udržovat dokument i s obsahem (TOC) je mírně řečeno nešikovné.

    Popíšeme si tedy kousek Javascriptu, který umí vygenerovat a zobrazit klikací obsah v HTML. Někdy je totiž použití TeXu nevhodné (čtenář neocení krásné slitky fi, fl, ffi, ffl, vyrovnané mezery ve slově PLAVAT atd. Nehledě k tomu, že na Windows je GSView vzácnost. Stručně řečeno házíme perly sviním). Word nebo Swriter je je trošku jiná kategorie, hodně lidí s nimi nechce mít nic společného a navíc se moc nedá čekat, že příjemce uvidí dokument stejně jako my. (U HTML se to už vůbec nedá čekat, ale s tím se tak nějak počítá).

    Samotný skript

    Skript jsem nevymyslel sám, většinu jsem přebral z [2], ale poskládal jsem ho celý do stavu, ve kterém se dá hned použít. Zde je tedy prázdný dokument, který se bude sám udržovat obsah (TOC), stačí do něj jenom doplnit vlastní text.
    
    
    1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
    2. <html>
    3. <head>
    4. <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
    5. <META NAME="AUTHOR" CONTENT="Tomas Penicka">
    6. <!-- Based on http://www.quirksmode.org/dom/toc.html, but some changes were made-->
    7. <script type="text/javascript">
    8. function getElementsByTagNames(list,obj) {
    9. if (!obj) var obj = document;
    10. var tagNames = list.split(',');
    11. var resultArray = new Array();
    12. for (var i=0;i<tagNames.length;i++) {
    13. var tags = obj.getElementsByTagName(tagNames[i]);
    14. for (var j=0;j<tags.length;j++) {
    15. resultArray.push(tags[j]);
    16. }
    17. }
    18. var testNode = resultArray[0];
    19. if (!testNode) return [];
    20. if (testNode.sourceIndex) {
    21. resultArray.sort(function (a,b) {
    22. return a.sourceIndex - b.sourceIndex;
    23. });
    24. }
    25. else if (testNode.compareDocumentPosition) {
    26. resultArray.sort(function (a,b) {
    27. return 3 - (a.compareDocumentPosition(b) & 6);
    28. });
    29. }
    30. return resultArray;
    31. }
    32. function createTOC() {
    33. var y = document.createElement('div');
    34. y.id = 'innertoc';
    35. var a = y.appendChild(document.createElement('span'));
    36. a.onclick = showhideTOC;
    37. a.id = 'contentheader';
    38. a.innerHTML = 'hide page contents';
    39. var z = y.appendChild(document.createElement('div'));
    40. var toBeTOCced = getElementsByTagNames('h2,h3,h4,h5,h6');
    41. if (toBeTOCced.length < 2) return false;
    42. for (var i=0;i<toBeTOCced.length;i++) {
    43. var tmp = document.createElement('a');
    44. tmp.innerHTML = toBeTOCced[i].innerHTML;
    45. z.appendChild(tmp);
    46. tmp.className = 'indent' + toBeTOCced[i].nodeName.substring(1);
    47. var headerId = toBeTOCced[i].id || 'link' + i;
    48. tmp.href = '#' + headerId;
    49. toBeTOCced[i].id = headerId;
    50. }
    51. return y;
    52. }
    53. var TOCstate = 'block';
    54. function showhideTOC() {
    55. TOCstate = (TOCstate == 'none') ? 'block' : 'none';
    56. var newText = (TOCstate == 'none') ? 'show page contents' : 'hide page contents';
    57. document.getElementById('contentheader').innerHTML = newText;
    58. document.getElementById('contentheader').onclick = showhideTOC;
    59. document.getElementById('innertoc').lastChild.style.display = TOCstate;
    60. alert();
    61. }
    62. </script>
    63. <style type="text/css">
    64. #toc a {display: block; margin-top: 2pt; background-color: #EEEEEE;}
    65. #toc a:hover {background-color: #CCCCFF;}
    66. .indent2 {margin-left: 0em;}
    67. .indent3 {margin-left: 2em;}
    68. .indent4 {margin-left: 4em;}
    69. .indent5 {margin-left: 6em;}
    70. .indent6 {margin-left: 8em;}
    71. </style>
    72. <title></title>
    73. </head>
    74. <body onLoad="document.getElementById('toc').appendChild(createTOC());">
    75. <!-- The following DIV is exactly the place, where to TOC will be located, don't remove this -->
    76. <div id="toc"></div>
    77. </body>
    78. </html>
    Lehké vysvětlení: Skript jsem testoval ve Firefoxu (Linux i Windows) a IE6. V obojím funguje.

    Chtěl jsem ještě přidat odkaz na příklad, ale zápisek už jsem uložil. (To byl vtip, ve skutečnosti jsem chtěl přidat k zápisku přílohu dostal jsem chybovou hlášku "přístup odmítnout")

    Odkazy

    1. http://www.quirksmode.org/dom/getElementsByTagNames.html
    2. http://www.quirksmode.org/dom/toc.html

    Místa k vylepšení, otázky

    1. Odkazy v obsahu mají nepříjemnou vlastnost--aktivní je celý řádek, ne jenom text. Dá se to nějak snadno zlepšit?
    2. Uměl by někdo přidat automatické číslování?
    3. Nadpisy v HTML se dost špatně opticky odlišují. Šlo by zařídit, aby i text dokumentu byl odražený od levého kraje podobně jako položky obsahu?
           

    Hodnocení: 100 %

            špatnédobré        

    Anketa

    Shledali jste skript užitečným? (V případě záporného hodnocení napište důvody v diskusi)
     (15 %)
     (23 %)
     (15 %)
     (46 %)
    Celkem 13 hlasů

    Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

    Komentáře

    Vložit další komentář

    11.3.2007 22:49 anicka | blog: ze_zivota
    Rozbalit Rozbalit vše Re: Užitečné skripty 3: automaticky generovaný obsah v HTML
    Pokud jde o TeX, Windows a perly svinim: cspdftex mi vzdycky chodil docela pekne a psat v TeXu da IMHO min prace nez psat v cemkoliv jinem. Ale proti gustu... :-)
    ^D
    12.3.2007 09:40 botanicus | blog: Botanicusovi povzdechy | Prachatice
    Rozbalit Rozbalit vše Re: Užitečné skripty 3: automaticky generovaný obsah v HTML
    +1
    ... mam chut na jablicka ;)
    12.3.2007 11:55 Käyttäjä 11133 | skóre: 58 | blog: Ajattelee menneisyyttä
    Rozbalit Rozbalit vše Re: Užitečné skripty 3: automaticky generovaný obsah v HTML
    Spát v plaintextu je ještě méně práce, jinak taky LaTeX. :-)
    12.3.2007 13:22 Tomáš | skóre: 31 | blog: Tomik
    Rozbalit Rozbalit vše Re: Užitečné skripty 3: automaticky generovaný obsah v HTML
    Spát rozhodně. :-)

    TeX samozřejmě používám raději, mám plno svých maker pro plain (LaTeX moc nemusím). Někdy je ale lepší sáhnout po tom, co umí i kolegové, aby mohli opravovat chyby apod.

    11.3.2007 23:44 Ritchie | skóre: 27 | blog: Ritchie's | Berlin
    Rozbalit Rozbalit vše Re: Užitečné skripty 3: automaticky generovaný obsah v HTML
    Používat innerHTML je poněkud nečisté, co takhle zkusit metody cloneNode a replaceData?

    Ideální řešení by stavělo na DOM objektu NodeIterator. Bohužel jeho implementace v prohlížečích je problematická.

    Odpovědi na otázky

    1. Protože jste element a učinil blokovým elementem. Čisté řešení je použití zanořených seznamů a element a ponechat řádkovým.
    2. Elegantní řešení je obsaženo v předešlé odpovědi.
    3. Řešení spočívá v přiřazení záporného levého okraje nadpisům a kladného levého okraje předku všech textů.
    12.3.2007 08:56 Tomáš | skóre: 31 | blog: Tomik
    Rozbalit Rozbalit vše Re: Užitečné skripty 3: automaticky generovaný obsah v HTML
    Díky za odpovědi, ještě mám pár komentářů.
    1. Jak moc by to zkomplikovalo kód? Přeci jenom jsem se snažil o co nejjednodušší řešení
    2. A co číslování v textu?
    3. To je dobý hack. Až budu mít čas, tak si to přepíšu.
    12.3.2007 09:40 Ritchie | skóre: 27 | blog: Ritchie's | Berlin
    Rozbalit Rozbalit vše Re: Užitečné skripty 3: automaticky generovaný obsah v HTML
    1. Záleží, jak elegantně byste to napsal. ;-) Lze to napsat jako cyklus odhadem s 15–20 řádky kódu.
    2. Ideálně CSS 2.1 kapitola 12.4, v prohlížečích bohužel příliš nepodporováno. Jinak javascript na 10 řádků.
    12.3.2007 08:09 Zdeněk Burda | skóre: 61 | blog: Zdendův blog | Praha
    Rozbalit Rozbalit vše Re: Užitečné skripty 3: automaticky generovaný obsah v HTML
    Nemám rád zbytečný javascript. Ah, to není pravda, nenávidím ho! Proč při psaní dokumentu prostě nezvolit vhodný způsob, který ho vygeneruje automaticky? Používám Docbook, generuje číslování, toc a vše co potřebuju. Proti javascriptu má tu velkou výhodu, že funguje i v lynxu.
    -- Nezdar není hanbou, hanbou je strach z pokusu.
    12.3.2007 08:51 Tomáš | skóre: 31 | blog: Tomik
    Rozbalit Rozbalit vše Re: Užitečné skripty 3: automaticky generovaný obsah v HTML
    Plně souhlasím s námitkou (javascript taky moc nemusím), ale někdy prostě nemůžu použít pořádné řešení. První důvod je ten, že Docbook nemumím používat. Druhý důvod je, že dokument musí být univerzálně přenositelný a musí jít opravit odkudkoliv (ne všechny počítače mají nainstalovaný patřičný software). Třetí důvod je, si nemůžu vybírat programové prostředí. Prostě si na počítač nesmím instalovat všechno, na co si vzpomenu.
    Josef Kufner avatar 26.1.2012 18:45 Josef Kufner | skóre: 70
    Rozbalit Rozbalit vše Re: Užitečné skripty 3: automaticky generovaný obsah v HTML

    Založit nové vláknoNahoru

    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.