Welcome to TiddlyWiki created by Jeremy Ruston, Copyright © 2007 UnaMesa Association
<html><p>!HUSK at ændre titelen til den aktuelle dato!!! -</p><p>Kopiér først resultatet - brug derefter wysiwyg til indskrivning i tabellen</p><p>!!Fredagssangtimen</p><table align="left" width="75%" class="sortable"><thead><tr class="evenRow"><td index="0">nr</td><td index="1">Titel</td><td index="2">Kilde</td><td index="3">nr/s</td><td index="4">Pianist</td><td index="5">Ny</td></tr></thead><tbody><tr class="oddRow"><td>1</td><td> </td><td> </td><td> </td><td> </td><td> </td></tr><tr class="evenRow"><td>2</td><td> </td><td> </td><td> </td><td> </td><td> </td></tr><tr class="oddRow"><td>3</td><td> </td><td> </td><td> </td><td> </td><td> </td></tr><tr class="evenRow"><td>4</td><td> </td><td> </td><td> </td><td> </td><td> </td></tr><tr class="oddRow"><td>5</td><td> </td><td> </td><td> </td><td> </td><td> </td></tr><tr class="evenRow"><td>6</td><td> </td><td> </td><td> </td><td> </td><td> </td></tr><tr class="oddRow"><td>7</td><td> </td><td> </td><td> </td><td> </td><td> </td></tr><tr class="evenRow"><td>8</td><td> </td><td> </td><td> </td><td> </td><td> </td></tr><tr class="oddRow"><td>9</td><td> </td><td> </td><td> </td><td> </td><td> </td></tr><tr class="evenRow"><td>10</td><td> </td><td> </td><td> </td><td> </td><td> </td></tr><tr class="oddRow"><td>11</td><td> </td><td> </td><td> </td><td> </td><td> </td></tr><tr class="evenRow"><td>12</td><td> </td><td> </td><td> </td><td> </td><td> </td></tr><tr class="oddRow"><td>13</td><td> </td><td> </td><td> </td><td> </td><td> </td></tr><tr class="evenRow"><td>14</td><td> </td><td> </td><td> </td><td> </td><td> </td></tr></tbody></table><p> </p></html>
Eller GoogleKalender eller et Google online regneark med det hele ... [[her|Oversigt - sangbogen - sangmappen]]
For det ikke skal være løgn kan man også kommentere sangtimeoversigten med tekst eller mikrofon mm [[her i dokumentet|Voicethread - med video eller audiokommentarer]]
|sortable|k
|DATO|SANGTIME|FORTÆLLING|EMNE|h
|07-01-09|JD + NT |LB|Nyt år – nyt blad – nyt…. Skilleveje|
|14-01-09|NT + SB |LB|Koncert Gospel sisters |
|21-01-09|SB + MM|LB|Nordisk tema :Norge ”Det tunge vand”|
|28-01-09|||Skitur|
|[[4-02-09|4 Februar 2009]]<<toggleTag Sang [[4 Februar 2009]] Aktuel >>+[[fredag|6 Februar 2009]]<<toggleTag Sang [[6 Februar 2009]] Aktuel >>|MM + JD |NT|Nordisk tema Grøndlandsekspeditioner|
|[[11-02-09|11 Februar 2009]]<<toggleTag Sang [[11 Februar 2009]] Aktuel >>+[[fredag|13 februar 2009]]<<toggleTag Sang [[13 Februar 2009]] Aktuel >>|JD + SB ||Nordisk tema Sverige|
|18-02-09|||Vinterferie|
|25-02-09|||Gym/terminsuge|
|[[04-03-09|4 marts 2009]]<<toggleTag Sang [[4 marts 2009]] Aktuel >>+[[fredag|6 marts 2009]]<<toggleTag Sang [[6 marts 2009]] Aktuel >>|SB + NT |LB|Nordisk tema Færøsk fortælling – sælkvinden|
|11-03-09|NT + MM ||Nordisk tema Islandske sagaer|
|18-03-09|MM + SB |LB|Historie Anton Sørensen|
|25-03-09|SB + JD |NT|Historie ?? evt. Leonora Christina|
|01-04-09|JD + NT |LB|Historie Himmerland - Gundestrupkarret|
|08-04-09|||Eksamensrettede værk.|
|15-04-09|NT + MM |NT|En god bog.. Jonathan Livingstone ..|
|22-04-09|MM + SB ||En god bog..|
|29-04-09|SB + JD ||En god bog..|
|06-05-09|||Prøve skr. dansk|
|13-05-09|JD + MM |NT|Rejse oplevelser|
|20-05-09|MM + SB |||
|27-05-09|SB + NT |||
#Dobbeltklik (eller klik på redigérknappen)
#Fjern "#" foran IncludeList i titlen
#Fjern tuborgklammerne omkring nedenstående tekst! //(De kan ses når du klikker redigér!!)//
*Nu hentes indholdet af DenMobileElevListe ind hver gang du opdaterer eller åbner denne SangWiki.
**Virker kun når denne fil findes lokalt på en pc eller usb...
{{{<<include "http://xn--mns-ula.dk/weekend/index.html">>}}}
<html><p>!HUSK at ændre titelen til den aktuelle dato!!! -</p><p>Kopiér først resultatet - brug derefter wysiwyg til indskrivning i tabellen</p><p>!!Sang/fortælling</p><table align="center" width="75%" class="sortable"><thead><tr class="evenRow"><td index="0">nr</td><td index="1">Titel</td><td index="2">Kilde</td><td index="3">nr/s</td><td index="4">Pianist</td><td index="5">Ny</td></tr></thead><tbody><tr class="oddRow"><td>1</td><td> </td><td> </td><td> </td><td> </td><td> </td></tr><tr class="evenRow"><td>2</td><td> </td><td> </td><td> </td><td> </td><td> </td></tr><tr class="oddRow"><td>3</td><td> </td><td> </td><td> </td><td> </td><td> </td></tr><tr class="evenRow"><td>4</td><td> </td><td> </td><td> </td><td> </td><td> </td></tr><tr class="oddRow"><td>5</td><td> </td><td> </td><td> </td><td> </td><td> </td></tr><tr class="evenRow"><td>6</td><td> </td><td> </td><td> </td><td> </td><td> </td></tr><tr class="oddRow"><td>7</td><td> </td><td> </td><td> </td><td> </td><td> </td></tr><tr class="evenRow"><td>8</td><td> </td><td> </td><td> </td><td> </td><td> </td></tr><tr class="oddRow"><td>9</td><td> </td><td> </td><td> </td><td> </td><td> </td></tr><tr class="evenRow"><td>10</td><td> </td><td> </td><td> </td><td> </td><td> </td></tr><tr class="oddRow"><td>11</td><td> </td><td> </td><td> </td><td> </td><td> </td></tr><tr class="evenRow"><td>12</td><td> </td><td> </td><td> </td><td> </td><td> </td></tr><tr class="oddRow"><td>13</td><td> </td><td> </td><td> </td><td> </td><td> </td></tr><tr class="evenRow"><td>14</td><td> </td><td> </td><td> </td><td> </td><td> </td></tr></tbody></table><p> </p></html>
!!Sang/fortælling
|sortable|k
|nr|Titel|Kilde|nr/s|Pianist|ny|h
|1|Er lyset for de lærde blot|| 91 |SB|
|2|Sat her i forvirringstiden|| 121|SB|
|3|Jeg plukker fløjlsgræs|| 149 |SB|
|4|De små børns smil| | 109 |SB|
|5|Du kom med alt det der var dig|| 194 |SB|
|6|Jeg fandt en sang på vejen|| 247 |SB|
|7|Tag del i det der er sin tid|| 269 |SB|
|8|Giv os lyset tilbage| M|10 |JD|ny|
|9|Vi har kun en sol| M| 8 |SB|
|10|With a little help| M| 25 |SB|
<html><p>Tiddleren '10 Februar 2009' findes ikke endnu. Dobbelt-klik for at lave den</p></html>
!Sangtime onsdag d. 11/2
|sortable|k
|Nr|Titel|Mappe/ny|Side|Piano|h
|1|Sång til friheten| M.|25| SB |
|2|Stjernefart| Ny|253| JD |
|3|[[Kringsat af fjender]]||101| SB |
|4|[[Du kom med alt det der var dig]]| (i D-dur)|194| SB |
|5|Til min Marie| (Ny)|203| SB |
|6|Hymne til sangen| M.|14| SB |
|7|Masser af succes|M (Ny)|54| SB |
|8|Cafe Måneskin||257| SB/NT |
|9|Tag del i det||269| SB |
|10|Tears in heaven||302| SB/NT |
Fredagssangtimen
|sortable|k
|Titel|Kilde|nr|h
|En sømand har sin enegang |(b) | 216|
|Vårvise |(b) | 255|
|Du kom med alt det der var dig |(b) | 194|
|Vi vil plante et træ |(b) | 230|
|Skipper Klements morgensang |(b) | 132|
|Mørkets sang |(b) | 273|
|This Is My Life|(m)| 21|
|Noget i dig selv|(m)| 26|
|Den gamle spillemand|(m)| 15|
|Jutlandia|(m)| 16|
|Joanna|(m)| 34|
|De smukke unge mennesker|(m)| 45|
!!Fredagssangtimen
|sortable|k
|Nr|SangBogen|Piano||Side|SangMappen|Piano|h
|257|Café Måneskin|NT||21|This is my life|SB|
|290|Yesterday|JD||22|Barndommens gade|NT|
|132|Skipper Clements morgensang|SB||55|Kære linedanser |NT|
|293|Hey Jude|JD||19|Inderst inde|NT|
|246|Det bedste, jeg ved|SB||38|Sådan nogen som os|NT?|
|300|What a wonderful world|SB||35|With a little help|NT|
Sang/fortælling
|sortable|k
|Titel|Kilde|nr|h
|Puff|m | 23 |
|Usigt i kikkert|m| 3 |
|Barndommens gade|m| 22 |
|Giv os lyset tilbage|m| 10 |
|Stand by me|m| 7 |
|En sang af sommer|m| 40 |
|Jeg mødte en sang|m| 41 |
|Go down Moses|m| 9 |
|café Måneskin|b| 257 |
|Sommerens ø|b| 167 |
|Vårvise|b| 255 |
!!Fredagssangtimen
|sortable|k
|nr|Titel|nr/s|ny|Pianist|h
|1|Nattergalen kender du den|154|| (SB) |
|2|Menneske din egen magt|20|| NT |
|3|Hilsen til forårssolen|156| X | (SB) |
|4|De smukke unge mennesker| M45|| (SB) |
|5|Og det blev vår|152| X | (SB) |
|6|Masser af succes|54| | SB |
|7|Vi har kun en sol| M8 | | (NT) |
|8|Vågner i natten| M48 | | (NT) |
|9|Den blå anemone|146| | (SB) |
|10|Vårvise|255|| SB |
|11|Yesterday|290| | JD |
|12|That's what friends are for|309|| (NT) |
<<tiddler [[13 Marts 2009 alternativ]]>>
!!Fredagssangtimen alternativ
|sortable|k
|nr|Titel|nr/s|ny|Pianist|h
|1|Nattergalen kender du den|154|| (SB) |
|2|Livstræet|20|| SB |
|3|Hilsen til forårssolen|156| X | (SB) |
|4|De smukke unge mennesker| M45|| (SB) |
|5|Og det blev vår|152| X | (SB) |
|6|Masser af succes|54| | SB |
|7|Nocturne| 24 | | (SB) |
|8|Gem et lille smil| M46 | | (SB) |
|9|Den blå anemone|146| | (SB) |
|10|Vårvise|255|| SB |
|11|Yesterday|290| | JD |
|12|den gamle spillemand| M15 || (SB) |
<<formTiddler OnsdagsTemplate>>
<<comments>><html><p><span><h1>HUSK at ændre titelen til den aktuelle dato!!! - Brug wysiwyg til indskrivning i tabellen</h1></span></p><p><span><h2>Fredagssangtimen</h2></span></p><table align="left" width="75%" class="sortable"><thead><tr class="evenRow"><td index="0"><span>nr</span></td><td index="1"><span>Titel</span></td><td index="2"><span>Kilde</span></td><td index="3"><span>nr/s</span></td><td index="4"><span>Pianist</span></td><td index="5"><span>Ny</span></td></tr></thead><tbody><tr class="oddRow"><td><span>1</span></td><td><span> </span></td><td><span> </span></td><td><span> </span></td><td><span> </span></td><td><span> </span></td></tr><tr class="evenRow"><td><span>2</span></td><td><span> </span></td><td><span> </span></td><td><span> </span></td><td><span> </span></td><td><span> </span></td></tr><tr class="oddRow"><td><span>3</span></td><td><span> </span></td><td><span> </span></td><td><span> </span></td><td><span> </span></td><td><span> </span></td></tr><tr class="evenRow"><td><span>4</span></td><td><span> </span></td><td><span> </span></td><td><span> </span></td><td><span> </span></td><td><span> </span></td></tr><tr class="oddRow"><td><span>5</span></td><td><span> </span></td><td><span> </span></td><td><span> </span></td><td><span> </span></td><td><span> </span></td></tr><tr class="evenRow"><td><span>6</span></td><td><span> </span></td><td><span> </span></td><td><span> </span></td><td><span> </span></td><td><span> </span></td></tr><tr class="oddRow"><td><span>7</span></td><td><span> </span></td><td><span> </span></td><td><span> </span></td><td><span> </span></td><td><span> </span></td></tr><tr class="evenRow"><td><span>8</span></td><td><span> </span></td><td><span> </span></td><td><span> </span></td><td><span> </span></td><td><span> </span></td></tr><tr class="oddRow"><td><span>9</span></td><td><span> </span></td><td><span> </span></td><td><span> </span></td><td><span> </span></td><td><span> </span></td></tr><tr class="evenRow"><td><span>10</span></td><td><span> </span></td><td><span> </span></td><td><span> </span></td><td><span> </span></td><td><span> </span></td></tr><tr class="oddRow"><td><span>11</span></td><td><span> </span></td><td><span> </span></td><td><span> </span></td><td><span> </span></td><td><span> </span></td></tr><tr class="evenRow"><td><span>12</span></td><td><span> </span></td><td><span> </span></td><td><span> </span></td><td><span> </span></td><td><span> </span></td></tr><tr class="oddRow"><td><span>13</span></td><td><span> </span></td><td><span> </span></td><td><span> </span></td><td><span> </span></td><td><span> </span></td></tr><tr class="evenRow"><td><span>14</span></td><td><span> </span></td><td><span> </span></td><td><span> </span></td><td><span> </span></td><td><span> </span></td></tr></tbody></table><p><formtiddler></formtiddler></p></html>
!!Sang/fortælling
|sortable|k
|nr|Titel|Kilde|nr/s|ny|h
|1|Ræven er ude med halen så lang |(b) | 202|x|
|2|Til ungdommen |(b) | 101||
|3|Yesterday |(b) | 290 ||
|4|Hilsen til forårssolen |(b) | 156|
|5|Har du visor min vän |(b) | 200|
|6|Sensommervise |(b) | 171|
|7|Som jorden sang sin første sang|(m)| 37|
|8|Jutlandia|(m)| 16|
|9|Hvor du sætter din fod|(m)| 39|
|10|Go Down Moses|(m)| 9|
|11|Can’t Help Falling In Love|(m)| 24|
|12|Dagen er din|(m)| 6|
<<comments text:"|sortable|k
|nr|Titel|Kilde|nr/s|Pianist|ny|h
|1|One hand One heart |(b) | 299|
|2|I dag er landet vort |(b) | 87|
|3|That's what friends are for |(b) | 309|
|4|Jeg elsker den brogede verden |(b) | 98||
|5|Der går i nat et glædesbud |(b) | 42|
|6|Tears in heaven |(b) | 302|
|7|Love Is A Matter Of Difference|(m)| 52|
|8|Fly Me To The Moon|(m)| 44||
|9|Andreas sang|(m)| 21|
|10|Hvor længe vil du ydmyge dig?|(m)| 28|
|11|Dagen er din|(m)| 6|
|12|Noget i dig selv|(m)| 26|
" textRows:10 tags:Sang" dateFormat:"MMM DD hh:0mm">>
!!Sang/fortælling
!HUSK at ændre titelen til den aktuelle dato!!!
!!Fredagssangtimen
|sortable|k
|nr|Titel|Kilde,nr/s|h
|Imagine |(b) | 292|
|Kald det kærlighed |(b) | 201|
|Sommerens ø |(b) | 167|
|Til ungdommen |(b) | 101|
|Jutlandia|(m)| 16|
|Kvinde min|(m)| 18|
|Kajs sang|(m)| 21|
|This Is My Life|(m)| 21|
|Kære linedanser|(m)| 55|
|Joanna|(m)| 34|
|Nattergalen kender du den |(b) | 154|
|Let it be |(b) | 291|
!!Fredagssangtimen
|sortable|k
|nr|Titel|Kilde|nr|h
|1|Nattergalen kender du den |(b) | 154|
|2|Er lyset for de lærde blot (A) |(b) | 91|
|3|Kirsten og vejen fra Gurre |(b) | 174|
|4|Jens vejmand |(b) | 220|
|5|Jeg plukker fløjlsgræs |(b) | 149|
|6|Udsigt i kikkert|(m)| 3|
|7|Go Down Moses|(m)| 9|
|8|Udsigt i kikkert|(m)| 3|
|9|Masser af succes|(m)| 59|
|10|Inderst inde|(m)| 19|
|11|Stand by me|(m)| 7|
|12|Let it be |(b) | 291|
!!Sang/fortælling
|sortable|k
|nr|Titel|nr/s|ny|Pianist|h
|1|Forårsdag|147||SB|
|3|Hilsen til forårssolen|156|R|SB|
|4|Let it grow|296||JD?|
|5|Og det blev vår|152|R|SB|
|6|Sång till friheten|25||SB|
|7|Vårvise|255||SB|
|8|Den gamle spillemand|M15||SB|
|9|Jeg fandt en sang på vejen|247||SB|
|10|Hvorfor går min elskede|208||SB|
Ekstra
<<tiddler [[Ekstra]]>>
|sortable|k
|Titel|Kilde|nr|h
|Lille Messias |(b) | 63|
|Santa Claus is comin' to town |(b) | 286|
|Dejlig er jorden |(b) | 52|
|Nu tændes tusind julelys |(b) | 51|
|Et barn er født i Betlehem |(b) | 55|
|Snemand Frost og frøken Tø (A) |(b) | 183|
|Happy Christmas (War is over) |(b) | 287|
|Det kimer nu til julefest |(b) | 53|
|Glade jul dejlige jul |(b) | 58|
|Højt fra træets grønne top|(b)| 60|
|Der går i nat et glædesbud |(b) | 42|
|Mørk er november |(b) | 178|
|Ind under jul hvor er det trist |(b) | 49|
Sangtime onsdag den 20. maj 2009
|sortable|k
|nr|nr|titel|pianør|ny/gl|h
|1|147|Forårsdag|SB||
|2|151|Jeg ved en lærkerede|SB||
|3|149|Jeg plukker fløjlsgræs|SB||
|4|159|Se, det summer af sol|SB|Rep|
|5|304|Take it easy|SB||
|6|302|Tears in heaven|SB||
|7|M 45|De smukke unge mennesker|SB||
|8|M 26|Noget i dig selv|SB||
|9|47|Elefantens vuggevise|SB||
|10|15|Den gamle spillemand|SB||
Fredagssangtimen
|sortable|k
|nr|Titel|Kilde|nr|h
|1|Kirsten og vejen fra Gurre |(b) | 174|
|2|Noget om helte (A) |(b) | 118|
|3|Hvem sidder der bag skærmen |(b) | 220|
|4|Visen om de atten svaner |(b) | 204|
|5|Æbler lyser rødt på træernes grene |(b) | 171|
|6|De små børns smil |(b) | 109|
|7|Dream A Little Dream of Me|(m)| 34|
|8|Go Down Moses|(m)| 9|
|9|Hører du nogen kalde|(m)| 31|
|10|Eight Days A Week|(m)| 13|
|11|Can’t Help Falling In Love|(m)| 24|
|12|Gi’ os lyset tilbage|(m)| 10|
!!Fredagssangtimen
|sortable|k
|nr|title|kilde|nr|h
|1|Det er i dag et vejr|b|136|
|2|Visen om de atten svaner|(b)|204|
|3|Nattergalen kender du den|b|154|
|4|Hymne til sangen|m|14|
|5|Kajs+Andreas sang|m|21|
|6|Æbler lyser rødt på træernes grene|(b)|171|
|7|De små børns smil|(b)|109|
|8|Papirsklip|b|256|
|9|Leaving on a Jet-plane|b|295|
|10|Hører du nogen kalde|(m)|31|
|11|Can’t Help Falling In Love|(m)|24|
|12|Skipper Clements forårssang|b|132|
|13|Let it be|b|291|
<<tiddler [[20 Marts 2009 - den det blev...]]>>
!!Sang/fortælling
|sortable|k
|nr|Titel|Kilde,nr/s|ny|h
|1|Anemonesangen|153||
|2|Nattergalen på sin gren|259||
|3|Og det blev vår|152||
|4|Sat her i forvirringstiden|121||
|5|Take it easy boy, boy|304||
|6|Nocturne|24||
|7|Til min Marie|203||
|8|Romeo|260||
|9|Sång til friheten|M 25||
|10|Du satte dig selv|M 12||
|11|En sang af sommer |M 40 |(Ny)|
|12|De smukke unge mennesker|M 45||
Sang/fortælling
|sortable|k
|nr|Titel|Kilde|nr|h
|2|Love is all around |(b) | 297|
|3|Mørkets sang |(b) | 273|
|1|Anemonesangen |(b) | 153|
|4|What a wonderful world |(b) | 300|
|5|Imagine |(b) | 292|
|6|Jeg vil male dagen blå |(b) | 228|
|7|Udsigt i kikkert|(m)| 3|
|8|Go Down Moses|(m)| 9|
|9|Jutlandia|(m)| 16|
|10|Dream A Little Dream of Me|(m)| 34|
|11|Eight Days A Week|(m)| 13|
|12|Sång till friheten|(m)| 25|
!!Sang/fortælling
|sortable|k
|nr|Titel|Mappe|side|ny|h
|1|Linedanser||55||
|2|Hymne til sangen| x |14|ny|
|3|Menneske din egen magt| x |20|NT|
|4|Andreas' og Kajs sang| x |21||
|5|Snemand Frost og Frøken Tø||173||
|6|Har du visor min vän||200||
|7|Du kom med alt det der var dig||194|D-dur|
|8|Til min Marie||203|ny|
|9|Stjernefart||253|ny|
|10|Sat her i forvirringstiden||121||
<<tiddler [[4 Februar 2009]]>>
!HUSK at ændre titelen til den aktuelle dato!!!
!!Sang/fortælling
|sortable|k
|nr|Titel|nr/s|Pianist|h
|1|Jeg ved en lærke rede|151|SB|
|2|Tag del i det|269|NT|
|3|Anemonesangen|153|NT|
|4|Den blå anemone|146|SB|
|5|Når vinteren rinder|142|SB|
|6|Forårsdag|147|SB|
|7|Hymne til sangen|M14|SB|
|8|Vågner i natten|48|NT|
|9|Let ot be|291|SB|
|10|Thats what friends|309|NT|
!!Fredagssangtimen
|sortable|k
|nr|Titel|Mappe|Side|Ny|Piano|h
|1|Love is a matter of ..| x |52|||
|2|Hymne til sangen| x |14|(Ny)||
|3|Menneske din egen magt| x |20||NT|
|4|Du satte dig selv| x |12|||
|5|Kvinde min| x |18|||
|6|Som jorden sang sin første sang| x |37|ny|NT|
|7|Masser af succes| x |54|ny|SB|
|8|Til min Marie||203|||
|9|Visen om de atten svaner||204|||
|10|At kende sig selv||205|||
|11|Ind til dig igen||206|||
|12|Stjernefart||253|||
|13|Cafe måneskin||257|||
|14|Tag del i det der er din tid||269|||
!!Fredagssangtimen
|sortable|k
|nr|Titel|nr/s|Pianist|h
|1|Vårvise|255|SB|
|2|Tusind stykker|282|SB|
|3|Det drømmende vand|232|SB|
|4|Når vinteren rinder|142|SB|
|5|Let it be|291|SB|
|6|Thats what friends|309|NT|
|7|Barndommens gade|M |NT|
|8|Hymne til sangen|M14|SB|
|9|Vågner i natten|M48|NT|
|10|Hører du nogen kalde|M|SB|
|11|This is my life|M|SB|
|12|Killing me softly|M|SB|
|13|Jutlandia|M|NT|
<<tiddler "6 Marts 2009">>
<html><p><span style="font-size: larger;"><span style="font-family: Comic Sans MS;">En selvbiografisk og gribende fortælling om en drengs opdragelse i ondskab, fra faderens mishandlinger til de brutale magtkampe i skolegården. Erik kommer fra en rig familie, han er dygtig i skolen og god til sport. Men hjemme i familien får han tæv af faderenen hver dag. </span></span></p><p><span style="font-size: larger;"><span style="font-family: Comic Sans MS;">Erik lærer at slås og klare mange tæv, men det giver ham problemer i skolen. Han bliver bortvist og sendt til en kostskole, hvor de ældre elevers systematiske undertrykkelse fører til en endeløs cirkel af provokationer og afstraffelser. Det eneste lyspunkt er vennen Pierre og hævnen, som han får til sidst. </span></span></p><p><span style="font-size: larger;"><span style="font-family: Comic Sans MS;"> Easy reader udgave af den oprindelige roman i serien Lette klassikere.</span></span></p></html>
/***
|''Name:''|AutoRefreshPlugin|
|''Version:''|1.0.1 (2007-01-20)|
|''Type:''|plugin|
|''Source:''|http://tiddlywiki.abego-software.de/#AutoRefreshPlugin|
|''Author:''|Udo Borkowski (ub [at] abego-software [dot] de)|
|''Documentation:''|[[AutoRefreshPlugin Documentation|http://tiddlywiki.abego-software.de/#%5B%5BAutoRefreshPlugin%20Documentation%5D%5D]]|
|''Licence:''|[[BSD open source license (abego Software)|http://www.abego-software.de/legal/apl-v10.html]]|
|''~CoreVersion:''|2.1.3|
|''Browser:''|Firefox 1.5.0.9 or better; Internet Explorer 6.0|
A tiddler containing the {{{<<autoRefresh...>>}}} macro is automatically refreshed (re-painted) whenever a tiddler changes.
!Syntax
{{{
<<autoRefresh [observeTiddler: tiddler ...]>>
}}}
|{{{observeTiddler}}}|(optional) when specified the refresh will only happen when one of the tiddlers specified is changed.|
!Source Code
***/
//{{{
if (!window.abego) window.abego = {};
// autoRefresh Macro =============================================================
//
(function() {
var REFRESHER_NAME = "abego_onEveryChange";
var tiddlersToRefresh = {}; // A set holding the names of tiddlers to be refreshed
var onEveryChangeRefresher = function(e,changeList) {
var tiddlerElem = story.findContainingTiddler(e);
if (!tiddlerElem) return false;
var title = tiddlerElem.getAttribute("tiddler");
if (!title) return false;
// if "observeTiddler" are specified we only refresh if one of the given
// tiddlers has changed.
var observedTiddlers = e.getAttribute("observedTiddlers");
if (observedTiddlers) {
var a = observedTiddlers.readBracketedList();
if (!changeList || !a.containsAny(changeList))
return;
}
// Refresh the tiddler asynchronously.
// This way we can avoid repeated refreshes (e.g. when a tiddler is renamed)
tiddlersToRefresh[title] = true;
setTimeout(function() {
// Refresh all tiddlers in tiddlersToRefresh
for(var title in tiddlersToRefresh)
story.refreshTiddler(title,null,true);
// We have refreshed all pending tiddlers. Clear the set.
tiddlersToRefresh = {};
}, 0);
return true;
}
config.refreshers[REFRESHER_NAME] = onEveryChangeRefresher;
config.macros.autoRefresh = {};
config.macros.autoRefresh.handler = function(place,macroName,params,wikifier,paramString,tiddler) {
params = paramString.parseParams("observeTiddler",null,true,false,true); // allowEval, cascadeDefaults, names allowed
var e = createTiddlyElement(place,"span");
e.setAttribute("refresh",REFRESHER_NAME);
var observedTiddlers = params[0]["observeTiddler"];
if (observedTiddlers && observedTiddlers.length) {
var s = "[["+observedTiddlers.join("]] [[")+"]]";
e.setAttribute("observedTiddlers",s);
}
};
})();
//}}}
People who have used ~TiddlyWiki before may wish to access TW features that I have hidden or changed:
#Use the StyleSheet to adjust colors, font-sizes, page layout tweaks and other design features.
#Use [[zzConfigOptions]] to change the settings for saving options, animations, toggle options, single page mode options (to view multiple tiddlers) and search options.
#Use ViewTemplate to restore tiddler subtitles and tagging boxes. Warning: you will need to carefully add lines of code from the original ViewTemplate at http://www.tiddlywiki.com.
[[Efter titel]]
[[Efter forfatter]]
[[Efter tema]]
[[Efter titel|By title]]
[[Efter forfatter|By author]]
[[Efter tema|By topic]]
Our other note-taking ~TiddlyWiki, called BibblyWiki, is better for creating bibliographies. But we include a simple bibliography feature here for those who want it.
#Click on 'new bib entry' in the right sidebar menu.
#Assign the tiddler a title and click 'done.'
#Fill in any form fields you wish, especially the first four fields.
##To remove a particular form field from all notes, open [[NewBibEntryTemplate]] and find and carefully remove the appropriate code.
#Open "Bibliography" in the left menu to see your entry in the three bibliographies.
|''URL:''|http://tiddlywiki.bidix.info/|
|''Description:''|Repository for BidiX's TiddlyWiki Extensions|
|''Author:''|BidiX|
{{tuduSlider{<<slider chkBookSummary Bibliografi 'Bibliografi »'>>}}}<<newTiddler label:"Ny bog/artikel" text:{{"<<formTiddler NewBibEntryTemplate\>\>"}} tag:"authorbook""Bøger">>
/***
|Name|CalendarPlugin|
|Source|http://www.TiddlyTools.com/#CalendarPlugin|
|Version|2008.06.17|
|Author|Eric Shulman|
|Original Author|SteveRumsby|
|License|unknown|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides||
|Options|##Configuration|
|Description|display monthly and yearly calendars|
NOTE: For enhanced date display (including popups), you must also install [[DatePlugin]]
!!!!!Usage:
<<<
|{{{<<calendar>>}}}|Produce a full-year calendar for the current year|
|{{{<<calendar year>>}}}|Produce a full-year calendar for the given year|
|{{{<<calendar year month>>}}}|Produce a one-month calendar for the given month and year|
|{{{<<calendar thismonth>>}}}|Produce a one-month calendar for the current month|
|{{{<<calendar lastmonth>>}}}|Produce a one-month calendar for last month|
|{{{<<calendar nextmonth>>}}}|Produce a one-month calendar for next month|
<<<
!!!!!Configuration:
<<<
|''First day of week:''<br>{{{config.options.txtCalFirstDay}}}|<<option txtCalFirstDay>>|(Monday = 0, Sunday = 6)|
|''First day of weekend:''<br>{{{config.options.txtCalStartOfWeekend}}}|<<option txtCalStartOfWeekend>>|(Monday = 0, Sunday = 6)|
<<option chkDisplayWeekNumbers>> Display week numbers //(note: Monday will be used as the start of the week)//
|''Week number display format:''<br>{{{config.options.txtWeekNumberDisplayFormat }}}|<<option txtWeekNumberDisplayFormat >>|
|''Week number link format:''<br>{{{config.options.txtWeekNumberLinkFormat }}}|<<option txtWeekNumberLinkFormat >>|
<<<
!!!!!Revisions
<<<
2008.06.17: added support for config.macros.calendar.todaybg
2008.02.27: in handler(), DON'T set hard-coded default date format, so that *customized* value (pre-defined in config.macros.calendar.journalDateFmt is used.
2008.02.17: in createCalendarYear(), fix next/previous year calculation (use parseInt() to convert to numeric value). Also, use journalDateFmt for date linking when NOT using [[DatePlugin]].
2008.02.16: in createCalendarDay(), week numbers now created as TiddlyLinks, allowing quick creation/navigation to 'weekly' journals (based on request from Kashgarinn)
2008.01.08: in createCalendarMonthHeader(), "month year" heading is now created as TiddlyLink, allowing quick creation/navigation to 'month-at-a-time' journals
2007.11.30: added "return false" to onclick handlers (prevent IE from opening blank pages)
2006.08.23: added handling for weeknumbers (code supplied by Martin Budden (see "wn**" comment marks). Also, incorporated updated by Jeremy Sheeley to add caching for reminders (see [[ReminderMacros]], if installed)
2005.10.30: in config.macros.calendar.handler(), use "tbody" element for IE compatibility. Also, fix year calculation for IE's getYear() function (which returns '2005' instead of '105'). Also, in createCalendarDays(), use showDate() function (see [[DatePlugin]], if installed) to render autostyled date with linked popup. Updated calendar stylesheet definition: use .calendar class-specific selectors, add text centering and margin settings
2006.05.29: added journalDateFmt handling
<<<
***/
/***
!!!!!Code section:
***/
//{{{
version.extensions.calendar = { major: 0, minor: 7, revision: 0, date: new Date(2008, 6, 17)};
if(config.options.txtCalFirstDay == undefined)
config.options.txtCalFirstDay = 0;
if(config.options.txtCalStartOfWeekend == undefined)
config.options.txtCalStartOfWeekend = 5;
if(config.options.chkDisplayWeekNumbers == undefined)//wn**
config.options.chkDisplayWeekNumbers = false;
if(config.options.chkDisplayWeekNumbers)
config.options.txtCalFirstDay = 0;
if(config.options.txtWeekNumberDisplayFormat == undefined)//wn**
config.options.txtWeekNumberDisplayFormat = "w0WW";
if(config.options.txtWeekNumberLinkFormat == undefined)//wn**
config.options.txtWeekNumberLinkFormat = "YYYY-w0WW";
config.macros.calendar = {};
config.macros.calendar.monthnames = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
config.macros.calendar.daynames = ["M", "T", "W", "T", "F", "S", "S"];
config.macros.calendar.todaybg = "#ccccff";
config.macros.calendar.weekendbg = "#c0c0c0";
config.macros.calendar.monthbg = "#e0e0e0";
config.macros.calendar.holidaybg = "#ffc0c0";
config.macros.calendar.journalDateFmt = "DD MMM YYYY";
config.macros.calendar.monthdays = [ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
config.macros.calendar.holidays = [ ]; // Not sure this is required anymore - use reminders instead
//}}}
//{{{
function calendarIsHoliday(date) // Is the given date a holiday?
{
var longHoliday = date.formatString("0DD/0MM/YYYY");
var shortHoliday = date.formatString("0DD/0MM");
for(var i = 0; i < config.macros.calendar.holidays.length; i++) {
if(config.macros.calendar.holidays[i] == longHoliday || config.macros.calendar.holidays[i] == shortHoliday)
return true;
}
return false;
}
//}}}
//{{{
config.macros.calendar.handler = function(place,macroName,params) {
var calendar = createTiddlyElement(place, "table", null, "calendar", null);
var tbody = createTiddlyElement(calendar, "tbody", null, null, null);
var today = new Date();
var year = today.getYear();
if (year<1900) year+=1900;
// get format for journal link by reading from SideBarOptions (ELS 5/29/06 - based on suggestion by Martin Budden)
var text = store.getTiddlerText("SideBarOptions");
var re = new RegExp("<<(?:newJournal)([^>]*)>>","mg"); var fm = re.exec(text);
if (fm && fm[1]!=null) { var pa=fm[1].readMacroParams(); if (pa[0]) this.journalDateFmt = pa[0]; }
if (params[0] == "thismonth") {
cacheReminders(new Date(year, today.getMonth(), 1, 0, 0), 31);
createCalendarOneMonth(tbody, year, today.getMonth());
}
else if (params[0] == "lastmonth") {
var month = today.getMonth()-1; if (month==-1) { month=11; year--; }
cacheReminders(new Date(year, month, 1, 0, 0), 31);
createCalendarOneMonth(tbody, year, month);
}
else if (params[0] == "nextmonth") {
var month = today.getMonth()+1; if (month>11) { month=0; year++; }
cacheReminders(new Date(year, month, 1, 0, 0), 31);
createCalendarOneMonth(tbody, year, month);
} else {
if (params[0]) year = params[0];
if(params[1]) {
cacheReminders(new Date(year, params[1]-1, 1, 0, 0), 31);
createCalendarOneMonth(tbody, year, params[1]-1);
} else {
cacheReminders(new Date(year, 0, 1, 0, 0), 366);
createCalendarYear(tbody, year);
}
}
window.reminderCacheForCalendar = null;
}
//}}}
//{{{
//This global variable is used to store reminders that have been cached
//while the calendar is being rendered. It will be renulled after the calendar is fully rendered.
window.reminderCacheForCalendar = null;
//}}}
//{{{
function cacheReminders(date, leadtime)
{
if (window.findTiddlersWithReminders == null) return;
window.reminderCacheForCalendar = {};
var leadtimeHash = [];
leadtimeHash [0] = 0;
leadtimeHash [1] = leadtime;
var t = findTiddlersWithReminders(date, leadtimeHash, null, 1);
for(var i = 0; i < t.length; i++) {
//just tag it in the cache, so that when we're drawing days, we can bold this one.
window.reminderCacheForCalendar[t[i]["matchedDate"]] = "reminder:" + t[i]["params"]["title"];
}
}
//}}}
//{{{
function createCalendarOneMonth(calendar, year, mon)
{
var row = createTiddlyElement(calendar, "tr", null, null, null);
createCalendarMonthHeader(calendar, row, config.macros.calendar.monthnames[mon] + " " + year, true, year, mon);
row = createTiddlyElement(calendar, "tr", null, null, null);
createCalendarDayHeader(row, 1);
createCalendarDayRowsSingle(calendar, year, mon);
}
//}}}
//{{{
function createCalendarMonth(calendar, year, mon)
{
var row = createTiddlyElement(calendar, "tr", null, null, null);
createCalendarMonthHeader(calendar, row, config.macros.calendar.monthnames[mon] + " " + year, false, year, mon);
row = createTiddlyElement(calendar, "tr", null, null, null);
createCalendarDayHeader(row, 1);
createCalendarDayRowsSingle(calendar, year, mon);
}
//}}}
//{{{
function createCalendarYear(calendar, year)
{
var row;
row = createTiddlyElement(calendar, "tr", null, null, null);
var back = createTiddlyElement(row, "td", null, null, null);
var backHandler = function() {
removeChildren(calendar);
createCalendarYear(calendar, parseInt(year)-1);
return false; // consume click
};
createTiddlyButton(back, "<", "Previous year", backHandler);
back.align = "center";
var yearHeader = createTiddlyElement(row, "td", null, "calendarYear", year);
yearHeader.align = "center";
yearHeader.setAttribute("colSpan",config.options.chkDisplayWeekNumbers?22:19);//wn**
var fwd = createTiddlyElement(row, "td", null, null, null);
var fwdHandler = function() {
removeChildren(calendar);
createCalendarYear(calendar, parseInt(year)+1);
return false; // consume click
};
createTiddlyButton(fwd, ">", "Next year", fwdHandler);
fwd.align = "center";
createCalendarMonthRow(calendar, year, 0);
createCalendarMonthRow(calendar, year, 3);
createCalendarMonthRow(calendar, year, 6);
createCalendarMonthRow(calendar, year, 9);
}
//}}}
//{{{
function createCalendarMonthRow(cal, year, mon)
{
var row = createTiddlyElement(cal, "tr", null, null, null);
createCalendarMonthHeader(cal, row, config.macros.calendar.monthnames[mon], false, year, mon);
createCalendarMonthHeader(cal, row, config.macros.calendar.monthnames[mon+1], false, year, mon);
createCalendarMonthHeader(cal, row, config.macros.calendar.monthnames[mon+2], false, year, mon);
row = createTiddlyElement(cal, "tr", null, null, null);
createCalendarDayHeader(row, 3);
createCalendarDayRows(cal, year, mon);
}
//}}}
//{{{
function createCalendarMonthHeader(cal, row, name, nav, year, mon)
{
var month;
if (nav) {
var back = createTiddlyElement(row, "td", null, null, null);
back.align = "center";
back.style.background = config.macros.calendar.monthbg;
var backMonHandler = function() {
var newyear = year;
var newmon = mon-1;
if(newmon == -1) { newmon = 11; newyear = newyear-1;}
removeChildren(cal);
cacheReminders(new Date(newyear, newmon , 1, 0, 0), 31);
createCalendarOneMonth(cal, newyear, newmon);
return false; // consume click
};
createTiddlyButton(back, "<", "Previous month", backMonHandler);
month = createTiddlyElement(row, "td", null, "calendarMonthname")
createTiddlyLink(month,name,true);
month.setAttribute("colSpan", config.options.chkDisplayWeekNumbers?6:5);//wn**
var fwd = createTiddlyElement(row, "td", null, null, null);
fwd.align = "center";
fwd.style.background = config.macros.calendar.monthbg;
var fwdMonHandler = function() {
var newyear = year;
var newmon = mon+1;
if(newmon == 12) { newmon = 0; newyear = newyear+1;}
removeChildren(cal);
cacheReminders(new Date(newyear, newmon , 1, 0, 0), 31);
createCalendarOneMonth(cal, newyear, newmon);
return false; // consume click
};
createTiddlyButton(fwd, ">", "Next month", fwdMonHandler);
} else {
month = createTiddlyElement(row, "td", null, "calendarMonthname", name)
month.setAttribute("colSpan",config.options.chkDisplayWeekNumbers?8:7);//wn**
}
month.align = "center";
month.style.background = config.macros.calendar.monthbg;
}
//}}}
//{{{
function createCalendarDayHeader(row, num)
{
var cell;
for(var i = 0; i < num; i++) {
if (config.options.chkDisplayWeekNumbers) createTiddlyElement(row, "td");//wn**
for(var j = 0; j < 7; j++) {
var d = j + (config.options.txtCalFirstDay - 0);
if(d > 6) d = d - 7;
cell = createTiddlyElement(row, "td", null, null, config.macros.calendar.daynames[d]);
if(d == (config.options.txtCalStartOfWeekend-0) || d == (config.options.txtCalStartOfWeekend-0+1))
cell.style.background = config.macros.calendar.weekendbg;
}
}
}
//}}}
//{{{
function createCalendarDays(row, col, first, max, year, mon) {
var i;
if (config.options.chkDisplayWeekNumbers){
if (first<=max) {
var ww = new Date(year,mon,first);
var td=createTiddlyElement(row, "td");//wn**
var link=createTiddlyLink(td,ww.formatString(config.options.txtWeekNumberLinkFormat),false);
link.appendChild(document.createTextNode(ww.formatString(config.options.txtWeekNumberDisplayFormat)));
}
else createTiddlyElement(row, "td", null, null, null);//wn**
}
for(i = 0; i < col; i++)
createTiddlyElement(row, "td", null, null, null);
var day = first;
for(i = col; i < 7; i++) {
var d = i + (config.options.txtCalFirstDay - 0);
if(d > 6) d = d - 7;
var daycell = createTiddlyElement(row, "td", null, null, null);
var isaWeekend = ((d == (config.options.txtCalStartOfWeekend-0) || d == (config.options.txtCalStartOfWeekend-0+1))? true:false);
if(day > 0 && day <= max) {
var celldate = new Date(year, mon, day);
// ELS 2005.10.30: use <<date>> macro's showDate() function to create popup
// ELS 5/29/06 - use journalDateFmt
if (window.showDate)
showDate(daycell,celldate,"popup","DD",config.macros.calendar.journalDateFmt,true, isaWeekend);
else {
if(isaWeekend) daycell.style.background = config.macros.calendar.weekendbg;
var title = celldate.formatString(config.macros.calendar.journalDateFmt);
if(calendarIsHoliday(celldate))
daycell.style.background = config.macros.calendar.holidaybg;
var now=new Date();
if ((now-celldate>=0) && (now-celldate<86400000)) // is today?
daycell.style.background = config.macros.calendar.todaybg;
if(window.findTiddlersWithReminders == null) {
var link = createTiddlyLink(daycell, title, false);
link.appendChild(document.createTextNode(day));
} else
var button = createTiddlyButton(daycell, day, title, onClickCalendarDate);
}
}
day++;
}
}
//}}}
//{{{
// We've clicked on a day in a calendar - create a suitable pop-up of options.
// The pop-up should contain:
// * a link to create a new entry for that date
// * a link to create a new reminder for that date
// * an <hr>
// * the list of reminders for that date
// NOTE: The following code is only used when [[DatePlugin]] is not present
function onClickCalendarDate(e)
{
var button = this;
var date = button.getAttribute("title");
var dat = new Date(date.substr(6,4), date.substr(3,2)-1, date.substr(0, 2));
date = dat.formatString(config.macros.calendar.journalDateFmt);
var popup = createTiddlerPopup(this);
popup.appendChild(document.createTextNode(date));
var newReminder = function() {
var t = store.getTiddlers(date);
displayTiddler(null, date, 2, null, null, false, false);
if(t) {
document.getElementById("editorBody" + date).value += "\n<<reminder day:" + dat.getDate() +
" month:" + (dat.getMonth()+1) + " year:" + (dat.getYear()+1900) + " title: >>";
} else {
document.getElementById("editorBody" + date).value = "<<reminder day:" + dat.getDate() +
" month:" + (dat.getMonth()+1) +" year:" + (dat.getYear()+1900) + " title: >>";
}
return false; // consume click
};
var link = createTiddlyButton(popup, "New reminder", null, newReminder);
popup.appendChild(document.createElement("hr"));
var t = findTiddlersWithReminders(dat, [0,14], null, 1);
for(var i = 0; i < t.length; i++) {
link = createTiddlyLink(popup, t[i].tiddler, false);
link.appendChild(document.createTextNode(t[i].tiddler));
}
return false; // consume click
}
//}}}
//{{{
function calendarMaxDays(year, mon)
{
var max = config.macros.calendar.monthdays[mon];
if(mon == 1 && (year % 4) == 0 && ((year % 100) != 0 || (year % 400) == 0)) max++;
return max;
}
//}}}
//{{{
function createCalendarDayRows(cal, year, mon)
{
var row = createTiddlyElement(cal, "tr", null, null, null);
var first1 = (new Date(year, mon, 1)).getDay() -1 - (config.options.txtCalFirstDay-0);
if(first1 < 0) first1 = first1 + 7;
var day1 = -first1 + 1;
var first2 = (new Date(year, mon+1, 1)).getDay() -1 - (config.options.txtCalFirstDay-0);
if(first2 < 0) first2 = first2 + 7;
var day2 = -first2 + 1;
var first3 = (new Date(year, mon+2, 1)).getDay() -1 - (config.options.txtCalFirstDay-0);
if(first3 < 0) first3 = first3 + 7;
var day3 = -first3 + 1;
var max1 = calendarMaxDays(year, mon);
var max2 = calendarMaxDays(year, mon+1);
var max3 = calendarMaxDays(year, mon+2);
while(day1 <= max1 || day2 <= max2 || day3 <= max3) {
row = createTiddlyElement(cal, "tr", null, null, null);
createCalendarDays(row, 0, day1, max1, year, mon); day1 += 7;
createCalendarDays(row, 0, day2, max2, year, mon+1); day2 += 7;
createCalendarDays(row, 0, day3, max3, year, mon+2); day3 += 7;
}
}
//}}}
//{{{
function createCalendarDayRowsSingle(cal, year, mon)
{
var row = createTiddlyElement(cal, "tr", null, null, null);
var first1 = (new Date(year, mon, 1)).getDay() -1 - (config.options.txtCalFirstDay-0);
if(first1 < 0) first1 = first1+ 7;
var day1 = -first1 + 1;
var max1 = calendarMaxDays(year, mon);
while(day1 <= max1) {
row = createTiddlyElement(cal, "tr", null, null, null);
createCalendarDays(row, 0, day1, max1, year, mon); day1 += 7;
}
}
//}}}
//{{{
setStylesheet(".calendar, .calendar table, .calendar th, .calendar tr, .calendar td { text-align:center; } .calendar, .calendar a { margin:0px !important; padding:0px !important; }", "calendarStyles");
//}}}
// // override cookie settings for CalendarPlugin:
//{{{
config.options.txtCalFirstDay=6;
config.options.txtCalStartOfWeekend=5;
//}}}
// // override internal default settings for CalendarPlugin:
//{{{
config.macros.calendar.journalDateFmt="DDD MMM 0DD YYYY";
//}}}
@@position:relative;+++^53em^@[[Chat|SangTimeLærerChat]] Tålmodighed! Ca 20 sek. NB!: Ved tryk på Reset - skal du logge på chatten igen!!|<<moveablePanel name:Chat>>
----
<<tiddler SangTimeLærerChat >>
===
@@
!!Fredagssangtimen
|sortable|k
|nr|Titel|Mappe|Side|Ny|Piano|h
|1|Love is a matter of ..| x |52|||
|2|Hymne til sangen| x |14|(Ny)||
|3|Menneske din egen magt| x |20||NT|
|4|Du satte dig selv| x |12|||
|5|Kvinde min| x |18|||
|6|Som jorden sang sin første sang| x |37|ny|NT|
|7|Masser af succes| x |54|ny|SB|
|8|Til min Marie||203|||
|9|Visen om de atten svaner||204|||
|10|At kende sig selv||205|||
|11|Ind til dig igen||206|||
|12|Stjernefart||253|||
|13|Cafe måneskin||257|||
|14|Tag del i det der er din tid||269|||
/%
|Name|CheckboxToggleTag|
|Source|http://www.TiddlyTools.com/#CheckboxToggleTag|
|Version|1.3.3|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|script|
|Requires|InlineJavascriptPlugin|
|Overrides||
|Description|toggle betwen two alternative tag values using HTML checkbox|
Usage:
<<tiddler CheckboxToggleTag with: tag1 tag2 TiddlerName>> text label goes here
where:
tag1 is the tag to use when the checkbox is set
tag2 is the tag to use when the checkbox is cleared
TiddlerName (optional) is the tiddler to be tagged
%/<html><input type="checkbox" onclick="
/* ONCLICK: toggle onTag/offTag based on checkbox state */
store.suspendNotifications();
var tid=this.getAttribute('tid');
var ontag=this.getAttribute('onTag');
var offtag=this.getAttribute('offTag');
if (ontag && ontag.length) store.setTiddlerTag(tid,this.checked,ontag);
if (offtag && offtag.length) store.setTiddlerTag(tid,!this.checked,offtag);
store.resumeNotifications();
store.notify(tid,true);
var here=story.findContainingTiddler(this);
if (here) story.refreshTiddler(here.getAttribute('tiddler'),null,true);
return false;
"><hide linebreaks></html><script>
/* ONINIT: save onTag/offTag and init checkbox based on current tag value (if any) */
var tid="$3";
if (tid=="$"+"3") {
var here=story.findContainingTiddler(place); if (!here) return;
var tid=here.getAttribute('tiddler');
}
if (!store.tiddlerExists(tid)) return;
var c=place.lastChild.firstChild;
if ("$1"!="$"+"1") c.setAttribute('onTag',"$1");
if ("$2"!="$"+"2") c.setAttribute('offTag',"$2");
c.setAttribute('tid',tid);
c.checked=store.getTiddler(tid).isTagged(c.getAttribute('onTag'));
</script>
/%
|Name|ChecklistScript|
|Source|http://www.TiddlyTools.com/#ChecklistScript|
|Version|1.2.0|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.4|
|Type|script|
|Requires|InlineJavascriptPlugin|
|Overrides||
|Description|sample HTML/script to create simple self-contained tag-based checklists|
IMPORTANT NOTE: for proper display, this tiddler requires either TiddlyWiki version 2.4 or above, or TiddlyTools' [[CoreTweaksArchive]] fix for ticket #578 (trims leading/trailing newlines from tiddler section content).
----- EDIT THIS SECTION ONLY ----- %/
Fem ting at nå hver dag:
<<<
<<tiddler ChecklistScript##toggletag with: spørgsmål>> Stil spørgsmål<<tiddler ChecklistScript##toggletag with: svar>> Søg svar
<<tiddler ChecklistScript##toggletag with: sjov>> Hav det sjovt
<<tiddler ChecklistScript##toggletag with: forskel>> Gør en forskel
<<tiddler ChecklistScript##toggletag with: smil>> Smil
----
<<tiddler ChecklistScript##toggleall with: "spørgsmål svar sjov forskel smil">> //slå alle til//
<<<
<<tiddler ChecklistScript##resetall with: "reset alle" "spørgsmål svar sjov forskel smil">>
/% ----- DO NOT EDIT BELOW THIS LINE -----
!toggletag
<html><hide linebreaks><form style="display:inline">
<input type="checkbox" name='c' onclick="
var tid=story.findContainingTiddler(this).getAttribute('tiddler');
store.setTiddlerTag(tid,this.checked,'$1');
">
</form></html><script>
var t=store.getTiddler(story.findContainingTiddler(place).getAttribute('tiddler'));
place.lastChild.getElementsByTagName('form')[0].c.checked=t.isTagged('$1');
</script>
!end toggletag
!toggleall
<html><hide linebreaks><form style="display:inline">
<input type="checkbox" name="c" onclick="
var tid=story.findContainingTiddler(this).getAttribute('tiddler');
var tags='$1'.readBracketedList();
store.suspendNotifications();
for (var t=0; t<tags.length; t++)
store.setTiddlerTag(tid,this.checked,tags[t]);
store.resumeNotifications();
story.refreshTiddler(tid,null,true);
">
</form></html><script>
var t=store.getTiddler(story.findContainingTiddler(place).getAttribute('tiddler'));
var tags='$1'.readBracketedList();
place.lastChild.getElementsByTagName('form')[0].c.checked=t.tags.containsAll(tags);
</script>
!end toggleall
!resetall
<html><hide linebreaks><form style="display:inline">
<input type="button" value="$1" onclick="
var tid=story.findContainingTiddler(this).getAttribute('tiddler');
var tags='$2'.readBracketedList();
store.suspendNotifications();
for (var t=0; t<tags.length; t++)
store.setTiddlerTag(tid,false,tags[t]);
store.resumeNotifications();
story.refreshTiddler(tid,null,true);
"></form></html>
!end resetall
%/
/***
| Name:|Clock2|
| Author:|Simon Baird|
| Description:|A skinnable, sizeable analog clock|
| Source:|http://tiddlyspot.com/mptw/#Clock2|
| Requires:|Firefox 1.5.x or maybe Safari|
| Version:|1.0.6|
| Date:|8-Jul-2008|
!!Note
* Does not work in IE or Opera due to lack of canvas support.
* If you make a nice skin send it to me and I will include it here.
*I'm not actively maintaining this plugin
* See also http://randomibis.com/coolclock/
!!Ideas
* Can we support IE with this? http://sourceforge.net/projects/excanvas
* Skin should specify order of drawing so things can be on top of other things
* Fix it so we can have filled and/or stroked elements
* Skin should allow any number of moving and static elements
* Make download and example for non-TW use
* Make floating draggable?
!!Examples
{{{
<<clock2 fancy>><<clock2 120>>
<<clock2 chunkySwiss>> <<clock2 60 chunkySwiss noSeconds>><<clock2 '{
outerBorder: { lineWidth: 60, radius:55, color: "#dd8877", alpha: 1 },
smallIndicator: { lineWidth: 4, startAt: 80, endAt: 95, color: "white", alpha: 1 },
largeIndicator: { lineWidth: 12, startAt: 77, endAt: 89, color: "#dd8877", alpha: 1 },
hourHand: { lineWidth: 15, startAt: -15, endAt: 50, color: "white", alpha: 1 },
minuteHand: { lineWidth: 10, startAt: 24, endAt: 200, color: "#771100", alpha: 0.6 },
secondHand: { lineWidth: 3, startAt: 22, endAt: 83, color: "green", alpha: 0 },
secondDecoration: { lineWidth: 1, startAt: 52, radius: 26, fillColor: "white", color: "red", alpha: 0.2 }
}'>>
}}}
<<clock2 fancy>><<clock2 120>>
<<clock2 chunkySwiss>> <<clock2 60 chunkySwiss noSeconds>><<clock2 '{
outerBorder: { lineWidth: 60, radius:55, color: "#dd8877", alpha: 1 },
smallIndicator: { lineWidth: 4, startAt: 80, endAt: 95, color: "white", alpha: 1 },
largeIndicator: { lineWidth: 12, startAt: 77, endAt: 89, color: "#dd8877", alpha: 1 },
hourHand: { lineWidth: 15, startAt: -15, endAt: 50, color: "white", alpha: 1 },
minuteHand: { lineWidth: 10, startAt: 24, endAt: 200, color: "#771100", alpha: 0.6 },
secondHand: { lineWidth: 3, startAt: 22, endAt: 83, color: "green", alpha: 0 },
secondDecoration: { lineWidth: 1, startAt: 52, radius: 26, fillColor: "white", color: "red", alpha: 0.2 }
}'>>
See also BigClock.
!!Code
***/
//{{{
window.CoolClock = function(canvasId,displayRadius,skinId,showSecondHand) {
return this.init(canvasId,displayRadius,skinId,showSecondHand);
}
CoolClock.config = {
clockTracker: {},
tickDelay: 1000,
longTickDelay: 15000,
defaultRadius: 85,
renderRadius: 100,
defaultSkin: "swissRail",
skins: {
// try making your own...
swissRail: {
outerBorder: { lineWidth: 1, radius:95, color: "black", alpha: 1 },
smallIndicator: { lineWidth: 2, startAt: 89, endAt: 93, color: "black", alpha: 1 },
largeIndicator: { lineWidth: 4, startAt: 80, endAt: 93, color: "black", alpha: 1 },
hourHand: { lineWidth: 8, startAt: -15, endAt: 50, color: "black", alpha: 1 },
minuteHand: { lineWidth: 7, startAt: -15, endAt: 75, color: "black", alpha: 1 },
secondHand: { lineWidth: 1, startAt: -20, endAt: 85, color: "red", alpha: 1 },
secondDecoration: { lineWidth: 1, startAt: 70, radius: 4, fillColor: "red", color: "red", alpha: 1 }
},
chunkySwiss: {
outerBorder: { lineWidth: 5, radius:97, color: "black", alpha: 1 },
smallIndicator: { lineWidth: 4, startAt: 89, endAt: 93, color: "black", alpha: 1 },
largeIndicator: { lineWidth: 8, startAt: 80, endAt: 93, color: "black", alpha: 1 },
hourHand: { lineWidth: 12, startAt: -15, endAt: 60, color: "black", alpha: 1 },
minuteHand: { lineWidth: 10, startAt: -15, endAt: 85, color: "black", alpha: 1 },
secondHand: { lineWidth: 4, startAt: -20, endAt: 85, color: "red", alpha: 1 },
secondDecoration: { lineWidth: 2, startAt: 70, radius: 8, fillColor: "red", color: "red", alpha: 1 }
},
fancy: {
outerBorder: { lineWidth: 5, radius:95, color: "green", alpha: 0.7 },
smallIndicator: { lineWidth: 1, startAt: 80, endAt: 93, color: "black", alpha: 0.4 },
largeIndicator: { lineWidth: 1, startAt: 30, endAt: 93, color: "black", alpha: 0.5 },
hourHand: { lineWidth: 8, startAt: -15, endAt: 50, color: "blue", alpha: 0.7 },
minuteHand: { lineWidth: 7, startAt: -15, endAt: 92, color: "red", alpha: 0.7 },
secondHand: { lineWidth: 10, startAt: 80, endAt: 85, color: "blue", alpha: 0.3 },
secondDecoration: { lineWidth: 1, startAt: 30, radius: 50, fillColor: "blue", color: "red", alpha: 0.15 }
}
}
};
CoolClock.prototype = {
init: function(canvasId,displayRadius,skinId,showSecondHand) {
this.canvasId = canvasId;
this.displayRadius = displayRadius || CoolClock.config.defaultRadius;
this.skinId = skinId || CoolClock.config.defaultSkin;
this.showSecondHand = typeof showSecondHand == "boolean" ? showSecondHand : true;
this.tickDelay = CoolClock.config[ this.showSecondHand ? "tickDelay" : "longTickDelay"];
this.canvas = document.getElementById(canvasId);
this.canvas.setAttribute("width",this.displayRadius*2);
this.canvas.setAttribute("height",this.displayRadius*2);
this.renderRadius = CoolClock.config.renderRadius;
var scale = this.displayRadius / this.renderRadius;
this.ctx = this.canvas.getContext("2d");
this.ctx.scale(scale,scale);
CoolClock.config.clockTracker[canvasId] = this;
this.tick();
return this;
},
fullCircle: function(skin) {
this.fullCircleAt(this.renderRadius,this.renderRadius,skin);
},
fullCircleAt: function(x,y,skin) {
with (this.ctx) {
save();
globalAlpha = skin.alpha;
lineWidth = skin.lineWidth;
if (!document.all)
beginPath();
arc(x, y, skin.radius, 0, 2*Math.PI, false);
if (skin.fillColor) {
fillStyle = skin.fillColor
fill();
}
else {
// XXX why not stroke and fill
strokeStyle = skin.color;
stroke();
}
restore();
}
},
radialLineAtAngle: function(angleFraction,skin) {
with (this.ctx) {
save();
translate(this.renderRadius,this.renderRadius);
rotate(Math.PI * (2 * angleFraction - 0.5));
globalAlpha = skin.alpha;
strokeStyle = skin.color;
lineWidth = skin.lineWidth;
if (skin.radius) {
this.fullCircleAt(skin.startAt,0,skin)
}
else {
beginPath();
moveTo(skin.startAt,0)
lineTo(skin.endAt,0);
stroke();
}
restore();
}
},
render: function(hour,min,sec) {
var skin = CoolClock.config.skins[this.skinId];
this.ctx.clearRect(0,0,this.renderRadius*2,this.renderRadius*2);
this.fullCircle(skin.outerBorder);
for (var i=0;i<60;i++)
this.radialLineAtAngle(i/60,skin[ i%5 ? "smallIndicator" : "largeIndicator"]);
this.radialLineAtAngle((hour+min/60)/12,skin.hourHand);
this.radialLineAtAngle((min+sec/60)/60,skin.minuteHand);
if (this.showSecondHand) {
this.radialLineAtAngle(sec/60,skin.secondHand);
this.radialLineAtAngle(sec/60,skin.secondDecoration);
}
},
nextTick: function() {
setTimeout("CoolClock.config.clockTracker['"+this.canvasId+"'].tick()",this.tickDelay);
},
stillHere: function() {
return document.getElementById(this.canvasId) != null;
},
refreshDisplay: function() {
var now = new Date();
this.render(now.getHours(),now.getMinutes(),now.getSeconds());
},
tick: function() {
if (this.stillHere()) {
this.refreshDisplay()
this.nextTick();
}
}
}
config.macros.clock2 = {
counter: 0,
handler: function (place,macroName,params,wikifier,paramString,tiddler) {
var size,skin,seconds,skinData;
for (var i=0;i<params.length;i++)
if (/^\d+$/.exec(params[i]))
size = params[i];
else if (params[i] == "noSeconds")
seconds = false;
else if (/^\{/.exec(params[i]))
eval("skinData = " + params[i]);
else
skin = params[i];
if (skinData) {
CoolClock.config.skins.customSkin = skinData;
skin = "customSkin";
}
var canvas = createTiddlyElement(place,"canvas","clockcanvas"+this.counter);
var clock = new CoolClock("clockcanvas"+this.counter,size,skin,seconds);
this.counter++;
}
}
//}}}
/***
|Name:|CloseOnCancelPlugin|
|Description:|Closes the tiddler if you click new tiddler then cancel. Default behaviour is to leave it open|
|Version:|3.0.1 ($Rev: 3861 $)|
|Date:|$Date: 2008-03-08 10:53:09 +1000 (Sat, 08 Mar 2008) $|
|Source:|http://mptw.tiddlyspot.com/#CloseOnCancelPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
***/
//{{{
merge(config.commands.cancelTiddler,{
handler_mptw_orig_closeUnsaved: config.commands.cancelTiddler.handler,
handler: function(event,src,title) {
this.handler_mptw_orig_closeUnsaved(event,src,title);
if (!store.tiddlerExists(title) && !store.isShadowTiddler(title))
story.closeTiddler(title,true);
return false;
}
});
//}}}
Background: #fff
Foreground: #000
PrimaryPale: #8cf
PrimaryLight: #110077
PrimaryMid: #110077
PrimaryDark: #014
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
Error: #f88
/*
TiddlyWiki Comments Plugin - Online demo at http://tiddlyguv.org/CommentsPlugin.html
TODO:
- Support Cascade comment delete when the top-level tiddler is deleted
- Support more than one <<comments>> per tiddler. This will probably entail creating an invisible root tiddler to
hold all the comments for a macro together. The user will need to provide an ID for this tiddler.
- Don't use global "macro" var (use "macro" param a la jquery)
*/
/***
|Name|CommentsPlugin|
|Description|Macro for nested comments, where each comment is a separate tiddler.|
|Source|http://tiddlyguv.org/CommentsPlugin.html#CommentsPlugin|
|Documentation|http://tiddlyguv.org/CommentsPlugin.html#CommentsPluginInfo|
|Version|0.1|
|Author|Michael Mahemoff, Osmosoft|
|''License:''|[[BSD open source license]]|
|~CoreVersion|2.2|
***/
/*{{{*/
if(!version.extensions.CommentsPlugin) {
version.extensions.CommentsPlugin = {installed:true};
var macro = config.macros.comments = {
init: function() {
var stylesheet = store.getTiddlerText(tiddler.title + "##StyleSheet");
config.shadowTiddlers["StyleSheetCommentsPlugin"] = stylesheet;
store.addNotification("StyleSheetCommentsPlugin", refreshStyles);
},
handler: function(place,macroName,params,wikifier,paramString,tiddler) {
macro.log(paramString);
var macroParams = paramString.parseParams();
macro.buildCommentsArea(tiddler, place, macroParams);
macro.refreshComments(story.getTiddler(tiddler.title).commentsEl, tiddler, macroParams);
// var macroParams = macroParams.parsemacroParams(null, "val", true);
},
buildCommentsArea: function(rootTiddler, place, macroParams) {
var suffix = "_" + rootTiddler.title.trim();
var commentsArea = createTiddlyElement(place, "div", null, "comments");
// var heading = createTiddlyElement(commentsArea, "h2", null, "", "Comments");
var comments = createTiddlyElement(commentsArea, "div", null, "");
story.getTiddler(rootTiddler.title).commentsEl = comments;
createTiddlyElement(commentsArea, "div");
var newCommentArea = createTiddlyElement(commentsArea, "div", null, "newCommentArea", "Ny kommentar:");
var newCommentEl = macro.makeTextArea(newCommentArea, macroParams);
var addComment = createTiddlyElement(newCommentArea, "button", null, "addComment", "Tilføj kommentar");
addComment.onclick = function() {
var comment = macro.createComment(newCommentEl.value, rootTiddler, macroParams);
newCommentEl.value = "";
};
},
makeTextArea: function(container, macroParams) {
var textArea = createTiddlyElement(container, "textarea");
textArea.rows = getParam(macroParams, "textRows") || 4;
textArea.cols = getParam(macroParams, "textCols") || 20;
textArea.value = getParam(macroParams, "text") || "";
return textArea;
},
refreshComments: function(daddyCommentsEl, tiddler, macroParams) {
var refreshedEl;
if (tiddler.fields.daddy) {
var commentEl = macro.buildCommentEl(daddyCommentsEl, tiddler, macroParams);
daddyCommentsEl.appendChild(commentEl);
refreshedEl = commentEl;
} else {
removeChildren(daddyCommentsEl);
refreshedEl = story.getTiddler(tiddler.title);
}
prev=null;
for (var child = store.getTiddler(tiddler.fields.firstchild); child; child = store.getTiddler(child.fields.nextchild)) {
if (prev==child) {
macro.log(prev, child, "breaking");
break;
}
macro.refreshComments(refreshedEl.commentsEl, child, macroParams);
prev = child;
}
},
buildCommentEl: function(daddyCommentsEl, comment, macroParams) {
// COMMENT ELEMENT
var commentEl = document.createElement("div");
commentEl.className = "comment";
// HEADING <- METAINFO AND DELETE
var headingEl = createTiddlyElement(commentEl, "div", null, "heading");
var metaInfoEl = createTiddlyElement(headingEl, "div", null, "commentTitle", comment.modifier + '@' + comment.modified.formatString(getParam(macroParams,"dateFormat") || "DDD, MMM DDth, YYYY hh12:0mm:0ss am"));
metaInfoEl.onclick = function() {
// story.closeAllTiddlers();
story.displayTiddler("top", comment.title, null, true);
// document.location.hash = "#" + comment.title;
};
var deleteEl = createTiddlyElement(headingEl, "div", null, "deleteComment", "X");
deleteEl.onclick = function() {
if (true || confirm("Delete this comment and all of its replies?")) {
macro.deleteTiddlerAndDescendents(comment);
commentEl.parentNode.removeChild(commentEl);
}
};
// TEXT
commentEl.text = createTiddlyElement(commentEl, "div", null, "commentText");
wikify(comment.text, commentEl.text);
// REPLY LINK
var replyLinkZone = createTiddlyElement(commentEl, "div", null, "replyLinkZone");
var replyLink = createTiddlyElement(replyLinkZone, "span", null, "replyLink", "besvar denne kommentar");
replyLink.onclick = function() { macro.openReplyLink(comment, commentEl, replyLink, macroParams); };
// var clearance = createTiddlyElement(commentEl, "clearance", null, "clearance");
// clearance.innerHTML = " ";
// COMMENTS AREA
commentEl.commentsEl = createTiddlyElement(commentEl, "div", null, "comments");
// RETURN
return commentEl;
},
openReplyLink: function(commentTiddler, commentEl, replyLink, macroParams) {
if (commentEl.replyEl) {
commentEl.replyEl.style.display = "block";
return;
}
commentEl.replyEl = document.createElement("div");
commentEl.replyEl.className = "reply";
replyLink.style.display = "none";
var newReplyHeading = createTiddlyElement(commentEl.replyEl, "div", null, "newReply");
createTiddlyElement(newReplyHeading, "div", null, "newReplyLabel", "New Reply:");
var closeNewReply = createTiddlyElement(newReplyHeading, "div", null, "closeNewReply", "close");
closeNewReply.onclick = function() {
commentEl.replyEl.style.display = "none";
replyLink.style.display = "block";
};
var replyText = macro.makeTextArea(commentEl.replyEl, macroParams)
var submitReply = createTiddlyElement(commentEl.replyEl, "button", null, null, "Reply");
submitReply.onclick = function() {
var newComment = macro.createComment(replyText.value, commentTiddler, macroParams);
replyText.value = "";
closeNewReply.onclick();
macro.refreshComments(commentEl.commentsEl, newComment, macroParams);
};
commentEl.insertBefore(commentEl.replyEl, commentEl.commentsEl);
},
createComment: function(text, daddy, macroParams) {
var newComment = macro.createCommentTiddler();// store.createTiddler(macro.generateCommentID());
// macro.copyFields(daddy, newComment,
// "server.bag", "server.host", /* "server.page.revision",*** "server.type", "server.workspace");
var fieldsParam = getParam(macroParams, "fields") || "";
var fields = fieldsParam.decodeHashMap();
macro.log("fields", fields);
macro.log(getParam(macroParams, "inheritedFields"));
var inheritedFields = (getParam(macroParams, "inheritedFields") || "").split(",");
macro.log("inheritedFields", inheritedFields);
macro.forEach(inheritedFields, function(field) {
macro.log("inherited", field);
if (field!="") fields[field] = daddy.fields[field];
});
var tagsParam = getParam(macroParams, "tags") || "comment";
var now = new Date();
newComment.set(null, text, config.options.txtUserName, now, tagsParam.split(","), now, fields);
// macro.copyFields(daddy, newComment, (getParam(macroParams, "inheritedFields") || "").split(","));
newComment.fields.daddy = daddy.title;
// macro.copyFields(daddy, newComment,
// "server.bag", "server.host", /* "server.page.revision", */"server.type", "server.workspace");
if (!daddy.fields.firstchild) {
daddy.fields.firstchild = newComment.title;
} else {
for (last = store.getTiddler(daddy.fields.firstchild); last.fields.nextchild; last = store.getTiddler(last.fields.nextchild))
{}
last.fields.nextchild = newComment.title;
store.saveTiddler(last.title);
}
store.saveTiddler(newComment.title);
store.saveTiddler(daddy.title);
autoSaveChanges(false);
return newComment;
},
deleteTiddlerAndDescendents: function(tiddler, doAutoSave) {
doAutoSave = (arguments.length==1 || doAutoSave);
var daddy = store.getTiddler(tiddler.fields.daddy);
if (daddy.fields.firstchild==tiddler.title) {
tiddler.fields.nextchild ? daddy.fields.firstchild = tiddler.fields.nextchild :
delete daddy.fields.firstchild;
store.saveTiddler(daddy.title);
} else {
for (prev = store.getTiddler(daddy.fields.firstchild); prev.fields.nextchild!=tiddler.title; prev = store.getTiddler(prev.fields.nextchild))
{}
tiddler.fields.nextchild ? prev.fields.nextchild = tiddler.fields.nextchild :
delete prev.fields.nextchild;
store.saveTiddler(prev.title);
}
var child = store.getTiddler(tiddler.fields.firstchild);
while (child) {
var nextchild = store.getTiddler(child.fields.nextchild);
macro.deleteTiddlerAndDescendents(child, false);
child = nextchild;
}
store.deleteTiddler(tiddler.title);
if (doAutoSave) autoSaveChanges(false); // Should only apply to top level
},
forEach: function(list, visitor) { for (var i=0; i<list.length; i++) visitor(list[i]); },
select: function(list, selector) {
var selection = [];
macro.forEach(list, function(currentItem) {
if (selector(currentItem)) { selection.push(currentItem); }
});
return selection;
},
map: function(list, mapper) {
var mapped = [];
macro.forEach(list, function(currentItem) { mapped.push(mapper(currentItem)); });
return mapped;
},
remove: function(list, unwantedItem) {
return macro.select(list,
function(currentItem) { return currentItem!=unwantedItem; });
},
// callers may replace this with their own ID generation algorithm
createCommentTiddler: function() {
if (!store.createGuidTiddler) return store.createTiddler("comment_"+((new Date()).getTime()));
return store.createGuidTiddler("comment_");
},
log: function() { if (console && console.firebug) console.log.apply(console, arguments); },
copyFields: function(fromTiddler, toTiddler, field1, field2, fieldN) {
for (var i=2; i<arguments.length; i++) {
fieldKey = arguments[i];
if (fromTiddler.fields[fieldKey]) toTiddler.fields[fieldKey] = fromTiddler.fields[fieldKey];
}
}
}
/***
!StyleSheet
.comments h1 { margin-bottom: 0; padding-bottom: 0; }
.comments { padding: 0; }
.comment .comments { margin-left: 1em; }
.comment { padding: 0 0 1em 0; margin: 1em 0 0; }
.comment .comment { margin 0; }
.comment .toolbar .button { border: 0; color: #9a4; }
.comment .heading { background: [[ColorPalette::PrimaryPale]]; color: [[ColorPalette::PrimaryDark]]; border-bottom: 1px solid [[ColorPalette::PrimaryLight]]; border-right: 1px solid [[ColorPalette::PrimaryLight]]; padding: 0.15em; height: 1.3em; }
.commentTitle { float: left; }
.commentTitle:hover { text-decoration: underline; cursor: pointer; }
.commentText { clear: both; padding: 1em 0; }
.deleteComment { float: right; cursor: pointer; text-decoration:underline; color:[[ColorPalette::SecondaryDark]]; padding-right: 0.3em; }
.comment .reply { margin-left: 1em; }
.comment .replyLink { color:[[ColorPalette::SecondaryDark]]; font-style: italic;
cursor: pointer; text-decoration: underline; margin: 0 0.0em; }
.comment .created { }
.comment .newReply { color:[[ColorPalette::SecondaryDark]]; margin-top: 1em; }
.newReplyLabel { float: left; }
.closeNewReply { cursor: pointer; float: right; text-decoration: underline; }
.comments textarea { width: 100%; }
.comments button { margin-top: 0.3em; }
.clearance { clear: both; }
!(end of StyleSheet)
***/
macro.init();
} // end of 'install only once'
/*}}}*/
/***
|Name|CopyTiddlerPlugin|
|Source|http://www.TiddlyTools.com/#CopyTiddlerPlugin|
|Version|3.2.2|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.3|
|Type|plugin|
|Requires||
|Overrides||
|Description|Quickly create a copy of any existing tiddler|
!!!Usage
<<<
This plugin automatically updates the default (shadow) ToolbarCommands slice definitions to insert the ''copyTiddler'' command (which appears as ''copy'' in the tiddler toolbar).
When you select the ''copy'' command, a new tiddler is opened with a title of "{{{TiddlerName (n)}}}" containing copies of the text/tags/fields from the original //source tiddler//, where ''(n)'' is the next available number (starting with 1, of course). Note: If you copy while //editing// a tiddler, the current values that are displayed in the existing tiddler editor are used (including any unsaved changes you may have made to those values), and the new tiddler is immediately opened for editing.
Note: if you are already using customized toolbar definitions, you will need to manually add the ''copyTiddler'' toolbar command to your existing ToolbarCommands tiddler, e.g.:
{{{
|EditToolbar|... copyTiddler ... |
}}}
The plugin also provides a macro that allows you to embed a ''copy'' command directly in specific tiddler content:
{{{
<<copyTiddler TidderName label:"..." prompt:"...">>
}}}
where
* ''TiddlerName'' (optional)<br>specifies the //source// tiddler to be copied. If omitted, the current containing tiddler (if any) will be copied.
* ''label:"..."'' (optional)<br>specifies text to use for the embedded link (default="copy TiddlerName")
* ''prompt:"..."'' (optional)<br>specifies mouseover 'tooltip' help text for link
//Note: to use non-default label/prompt values with the current containing tiddler, use "" for the TiddlerName//
<<<
!!!Revisions
<<<
2009.02.13 [3.2.2] in click(), fix calls to displayTiddler() to use current tiddlerElem and use getTiddlerText() to permit copying of shadow tiddler content
2009.01.30 [3.2.1] fixed handling for copying field values when in edit mode
2009.01.23 [3.2.0] refactored code and added {{{<<copyTiddler TiddlerName>>}}} macro
2008.12.18 [3.1.4] corrected code for finding next (n) value when 'sparse' handling is in effect (thanks to RussThomas for identifying and diagnosing the problem)
2008.11.14 [3.1.3] added optional 'sparse' setting (avoids 'filling in' missing numbers that may have been previously deleted)
2008.11.14 [3.1.2] added optional 'zeroPad' setting
2008.11.14 [3.1.1] moved hard-coded '(n)' regex into 'suffixPattern' object property so it can be customized
2008.09.26 [3.1.0] changed new title generation to use '(n)' suffix instead of 'Copy of' prefix
2008.05.20 [3.0.3] in handler, when copying from VIEW mode, create duplicate array from existing tags array before saving new tiddler.
2007.12.19 [3.0.2] in handler, when copying from VIEW mode, duplicate custom fields before saving new tiddler. Thanks to bug report from Ken Girard.
2007.09.26 [3.0.1] in handler, use findContainingTiddler(src) to get tiddlerElem (and title). Allows 'copy' command to find correct tiddler when transcluded using {{{<<tiddler>>}}} macro or enhanced toolbar inclusion (see [[CoreTweaks]])
2007.06.28 [3.0.0] complete re-write to handle custom fields and alternative view/edit templates
2007.05.17 [2.1.2] use store.getTiddlerText() to retrieve tiddler content, so that SHADOW tiddlers can be copied correctly when in VIEW mode
2007.04.01 [2.1.1] in copyTiddler.handler(), fix check for editor fields by ensuring that found field actually has edit=='text' attribute
2007.02.05 [2.1.0] in copyTiddler.handler(), if editor fields (textfield and/or tagsfield) can't be found (i.e., tiddler is in VIEW mode, not EDIT mode), then get text/tags values from stored tiddler instead of active editor fields. Allows use of COPY toolbar directly from VIEW mode (based on a request from LaurentCharles)
2006.12.12 [2.0.0] completely rewritten so plugin just creates a new tiddler EDITOR with a copy of the current tiddler EDITOR contents, instead of creating the new tiddler in the STORE by copying the current tiddler values from the STORE.
2005.xx.xx [1.0.0] original version by Tim Morgan
<<<
!!!Code
***/
//{{{
version.extensions.CopyTiddlerPlugin= {major: 3, minor: 2, revision: 2, date: new Date(2009,2,13)};
// automatically tweak shadow EditTemplate to add 'copyTiddler' toolbar command (following 'cancelTiddler')
config.shadowTiddlers.ToolbarCommands=config.shadowTiddlers.ToolbarCommands.replace(/cancelTiddler/,'cancelTiddler copyTiddler');
config.commands.copyTiddler = {
text: 'copy',
hideReadOnly: true,
tooltip: 'Make a copy of this tiddler',
handler: function(event,src,title) { return config.macros.copyTiddler.click(src,event); }
};
config.macros.copyTiddler = {
label: 'copy',
prompt: 'Make a copy of %0',
notitle: 'this tiddler',
prefix: '',
suffixText: ' (%0)',
suffixPattern: / \(([0-9]+)\)$/,
zeroPad: 0,
sparse: false,
handler: function(place,macroName,params,wikifier,paramString,tiddler) {
var title=params.shift();
params=paramString.parseParams('anon',null,true,false,false);
var label =getParam(params,'label',this.label+(title?' '+title:''));
var prompt =getParam(params,'prompt',this.prompt).format([title||this.notitle]);
var b=createTiddlyButton(place,label,prompt,
function(ev){return config.macros.copyTiddler.click(this,ev)});
b.setAttribute('from',title||'');
},
click: function(here,ev) {
var tiddlerElem=story.findContainingTiddler(here);
var template=tiddlerElem?tiddlerElem.getAttribute('template'):null;
var title=here.getAttribute('from');
if (!title || !title.length) {
if (!tiddlerElem) return false;
else title=tiddlerElem.getAttribute('tiddler');
}
var root=title.replace(this.suffixPattern,''); // title without suffix
// find last matching title
var last=title;
if (this.sparse) { // don't fill-in holes... really find LAST matching title
var tids=store.getTiddlers('title','excludeLists');
for (var t=0; t<tids.length; t++) if (tids[t].title.startsWith(root)) last=tids[t].title;
}
// get next number (increment from last matching title)
var n=1; var match=this.suffixPattern.exec(last); if (match) n=parseInt(match[1])+1;
var newTitle=this.prefix+root+this.suffixText.format([String.zeroPad(n,this.zeroPad)]);
// if not sparse mode, find the next hole to fill in...
while (store.tiddlerExists(newTitle)||document.getElementById(story.idPrefix+newTitle))
{ n++; newTitle=this.prefix+root+this.suffixText.format([String.zeroPad(n,this.zeroPad)]); }
if (!story.isDirty(title)) { // if tiddler is not being EDITED
// duplicate stored tiddler (if any)
var text=store.getTiddlerText(title,'');
var newtags=[]; var newfields={};
var tid=store.getTiddler(title); if (tid) {
for (var t=0; t<tid.tags.length; t++) newtags.push(tid.tags[t]);
store.forEachField(tid,function(t,f,v){newfields[f]=v;},true);
}
store.saveTiddler(newTitle,newTitle,text,
config.options.txtUserName,new Date(),newtags, newfields, true); // clear changecount
story.displayTiddler(tiddlerElem,newTitle,template);
} else {
story.displayTiddler(tiddlerElem,newTitle,template);
var fields=config.macros.copyTiddler.gatherFields(tiddlerElem); // get current editor fields
var newTiddlerElem=document.getElementById(story.idPrefix+newTitle);
for (var f=0; f<fields.length; f++) { // set fields in new editor
if (fields[f].name=='title') fields[f].value=newTitle; // rename title in new tiddler
var fieldElem=config.macros.copyTiddler.findField(newTiddlerElem,fields[f].name);
if (fieldElem) {
if (fieldElem.getAttribute('type')=='checkbox')
fieldElem.checked=fields[f].value;
else
fieldElem.value=fields[f].value;
}
}
}
story.focusTiddler(newTitle,'title');
return false;
},
findField: function(tiddlerElem,field) {
var inputs=tiddlerElem.getElementsByTagName('input');
for (var i=0; i<inputs.length; i++) {
if (inputs[i].getAttribute('type')=='checkbox' && inputs[i].field == field) return inputs[i];
if (inputs[i].getAttribute('type')=='text' && inputs[i].getAttribute('edit') == field) return inputs[i];
}
var tas=tiddlerElem.getElementsByTagName('textarea');
for (var i=0; i<tas.length; i++) if (tas[i].getAttribute('edit') == field) return tas[i];
var sels=tiddlerElem.getElementsByTagName('select');
for (var i=0; i<sels.length; i++) if (sels[i].getAttribute('edit') == field) return sels[i];
return null;
},
gatherFields: function(tiddlerElem) { // get field names and values from current tiddler editor
var fields=[];
// get checkboxes and edit fields
var inputs=tiddlerElem.getElementsByTagName('input');
for (var i=0; i<inputs.length; i++) {
if (inputs[i].getAttribute('type')=='checkbox')
if (inputs[i].field) fields.push({name:inputs[i].field,value:inputs[i].checked});
if (inputs[i].getAttribute('type')=='text')
if (inputs[i].getAttribute('edit')) fields.push({name:inputs[i].getAttribute('edit'),value:inputs[i].value});
}
// get textareas (multi-line edit fields)
var tas=tiddlerElem.getElementsByTagName('textarea');
for (var i=0; i<tas.length; i++)
if (tas[i].getAttribute('edit')) fields.push({name:tas[i].getAttribute('edit'),value:tas[i].value});
// get selection lists (droplist or listbox)
var sels=tiddlerElem.getElementsByTagName('select');
for (var i=0; i<sels.length; i++)
if (sels[i].getAttribute('edit')) fields.push({name:sels[i].getAttribute('edit'),value:sels[i].value});
return fields;
}
};
//}}}
/***
|''Name''|CrossIndexingMacro|
|''Version''|0.7|
|''Status''|@@beta@@|
|''Author''|FND|
|''Source''|[[FND's DevPad|http://devpad.tiddlyspot.com/#CrossIndexingMacro]]|
|''License''|[[Creative Commons Attribution-ShareAlike 3.0 License|http://creativecommons.org/licenses/by-sa/3.0/]]|
|''~CoreVersion''|2.1|
|''Type''|macro|
|''Requires''|N/A|
|''Overrides''|N/A|
|''Description''|[//TBD//]|
!Notes
Created [[for DaveG|http://groups.google.com/group/TiddlyWiki/browse_thread/thread/afa54bd105e791fa]]'s [[My Notes TiddlyWiki|http://www.giffmex.org/emptynotestw.html]].
!Usage
{{{
<<crossIndex [tag] [scope]>>
}}}
!Revision History
!!v0.5 (2008-02-08)
* initial release
!!v0.6 (2008-02-09)
* renamed to CrossIndexingMacro (from TiddlerHierarchyMacro)
* added listing of uncategorized items
* linkified headings
!!v0.7 (2008-02-10)
* added optional scope parameter
* fixed "uncategorized" listings
* minor code enhancements
!To Do
* rename
* documentation
* code sanitizing
!Code
***/
//{{{
config.macros.crossIndex = {};
config.macros.crossIndex.handler = function(place, macroName, params, wikifier, paramString, tiddler) {
var scope = params[1] || tiddler.title;
var index = this.getIndex(scope, params[0]);
var output = "";
var i;
for(topic in index) {
if(index[topic].length > 0) {
output += "![[" + topic + "]]\n";
for(i = 0; i < index[topic].length; i++) {
output += "* [[" + index[topic][i] + "]]\n";
}
}
}
wikify(output, place);
}
config.macros.crossIndex.getIndex = function(scope, category) {
// retrieve topics
var topics = store.getTaggedTiddlers(category).map(function(t) { return t.title });
// generate index
var index = {
uncategorized: []
};
for(i = 0; i < topics.length; i++) {
index[topics[i]] = [];
store.forEachTiddler(function(title, tiddler) {
if(tiddler.tags.containsAll([scope, topics[i]]))
index[topics[i]].push(title);
else if(tiddler.tags.contains(scope) && !tiddler.tags.containsAny(topics))
index.uncategorized.pushUnique(title);
});
}
return index;
}
//}}}
/***
|''Navn:''|DanishTranslationPlugin|
|''Beskrivelse:''|Translation of TiddlyWiki into Danish|
|''Forfatter:''|MartinBudden (mjbudden (at) gmail (dot) com)|
|''Kilde:''|www.example.com |
|''CodeRepository:''|http://svn.tiddlywiki.org/Trunk/association/locales/core/en/locale.en.js |
|''Version:''|0.3.7|
|''Dato:''|Jul 6, 2007|
|''Kommentarer:''|Please make comments at http://groups.google.co.uk/group/TiddlyWikiDev |
|''Licens:''|[[Creative Commons Attribution-ShareAlike 3.0 License|http://creativecommons.org/licenses/by-sa/3.0/]] |
|''~CoreVersion:''|2.4|
***/
//{{{
//--
//-- Translateable strings
//--
// Strings in "double quotes" should be translated; strings in 'single quotes' should be left alone
config.locale = "da"; // W3C language tag
if (config.options.txtUserName == 'YourName') // do not translate this line, but do translate the next line
merge(config.options,{txtUserName: "DitNavn"});
merge(config.tasks,{
save: {text: "gem", tooltip: "Gem dine ændringer til denne TiddlyWiki", action: saveChanges},
sync: {text: "synk", tooltip: "Synkronisér ændringer med andre TiddlyWiki filer og servere", content: '<<sync>>'},
importTask: {text: "importér", tooltip: "Importér tiddlers og plugins fra andre TiddlyWiki filer og servere", content: '<<importTiddlers>>'},
tweak: {text: "Tilpas", tooltip: "Tilpas TiddlyWikis udseende og opførsel", content: '<<options>>'},
upgrade: {text: "upgradér", tooltip: "Upgrader TiddlyWikis kerne kode", content: '<<upgrade>>'},
plugins: {text: "udvidelser", tooltip: "Administrér installerede udvidelser", content: '<<plugins>>'}
});
// Options that can be set in the options panel and/or cookies
merge(config.optionsDesc,{
txtUserName: "Brugernavn til signering af dine ændringer",
chkRegExpSearch: "Avend almindelige udtryk til søgninger",
chkCaseSensitiveSearch: "Forskel på store og små bogstaver",
chkIncrementalSearch: "Bogstav for bogstav-søgning",
chkAnimate: "Anvend animationer",
chkSaveBackups: "Gem en backupfil når der gemmes ændringer",
chkAutoSave: "Gem automatisk ændringer",
chkGenerateAnRssFeed: "Lav et RSS feed når der gemmes ændringer",
chkSaveEmptyTemplate: "Lav en tom skabelon når der gemmes ændringer",
chkOpenInNewWindow: "Åben internet links i et nyt vindue",
chkToggleLinks: "Når man klikker på et link i åbne tiddlers lukkes de",
chkHttpReadOnly: "Skjul redigeringsværktøjer når den vises over HTTP",
chkForceMinorUpdate: "Opdatér ikke brugernavn og dato når tiddlers bliver ændrede",
chkConfirmDelete: "Bed om bekræftelse før tiddlers slettes",
chkInsertTabs: "Brug tab tasten til at indsætte tab tegn istedet for at hoppe imellem felter",
txtBackupFolder: "Navn på mappe til brug for backups",
txtMaxEditRows: "Maximum antal af rækker i edit bokse",
txtFileSystemCharSet: "Default tegnsæt til at gemme ændringer (Kun i Firefox/Mozilla)"});
merge(config.messages,{
customConfigError: "Der opstod problemer ved loading af udvidelser. Se PluginManager for detaljer",
pluginError: "Fejl: %0",
pluginDisabled: "Ikke udført fordi det er slået fra via 'systemConfigDisable' tag",
pluginForced: "Udført fordi det er tvunget via 'systemConfigForce' tag",
pluginVersionError: "Ikke udført fordi denne udvidelse kræver en nyere udgave af TiddlyWiki",
nothingSelected: "Intet er valgt. Du er nødt til at vælge en eller flere ting først",
savedSnapshotError: "Det ser ud som om denne TiddlyWiki er blevet gemt forkert. Se venligst http://www.tiddlywiki.com/#DownloadSoftware for details",
subtitleUnknown: "(ukendt)",
undefinedTiddlerToolTip: "Tiddleren '%0' findes ikke endnu",
shadowedTiddlerToolTip: "Tiddleren '%0' findes ikke endnu, men har en foruddefineret skygge værdi",
tiddlerLinkTooltip: "%0 - %1, %2",
externalLinkTooltip: "Internet link til %0",
noTags: "Der er ingen taggede tiddlere",
notFileUrlError: "Du er nødt til at gemme denne TiddlyWiki til en fil før du kan gemme ændringer",
cantSaveError: "Det er ikke muligt at gemme ændringer. Mulige grunde indbefatter:\n- din browser understøtter det ikke (Firefox, Internet Explorer, Safari og Opera virker alle fint hvis de er konfigurerede korrekt)\n- stien til din TiddlyWiki fil indeholder ulovlige tegn\n- TiddlyWiki HTML filen er blevet flyttet eller omdøbt",
invalidFileError: "Den originale fil '%0' lader ikke til at være en rigtig TiddlyWiki",
backupSaved: "Backup gemt",
backupFailed: "Det lykkedes IKKE at gemme en backup fil",
rssSaved: "RSS feed gemt",
rssFailed: "Det lykkedes IKKE at gemme et RSS feed",
emptySaved: "Tom skabelon gemt",
emptyFailed: "Det lykkedes IKKE at gemme en tom skabelon",
mainSaved: "Hoved TiddlyWiki fil gemt",
mainFailed: "Det lykkedes IKKE at gemme hoved TiddlyWiki filen. Dine ændringer er IKKE blevet gemt",
macroError: "Fejl i makro <<\%0>>",
macroErrorDetails: "Fejl ved udførsel af makro <<\%0>>:\n%1",
missingMacro: "Ingen sådan makro",
overwriteWarning: "En tiddler med navnet '%0' findes allerede. Vælg OK for at overskrive den",
unsavedChangesWarning: "ADVARSEL! Der er ugemte æmdringer i TiddlyWikien\n\nVælg OK for at gemme\nVælg FORTRYD for at afvise",
confirmExit: "--------------------------------\n\nDer er ugemte ændringer i TiddlyWikien. Hvis du fortsætter vil du miste disse ændringer\n\n--------------------------------",
saveInstructions: "GemÆndringer",
unsupportedTWFormat: "Ikke understøttet TiddlyWiki format '%0'",
tiddlerSaveError: "Fejl ved forsøg på at gemme tiddler '%0'",
tiddlerLoadError: "Fejl ved load af tiddler '%0'",
wrongSaveFormat: "Kan ikke gemme med formatet '%0'. Bruger standard format til at gemme.",
invalidFieldName: "Ikke tilladt feltnavn %0",
fieldCannotBeChanged: "Felt '%0' kan ikke ændres",
loadingMissingTiddler: "Forsøger at hente tiddleren '%0' fra '%1' serveren ved:\n\n'%2' i arbejdsområdet '%3'",
upgradeDone: "Opgradering til version %0 er nu fuldført\n\nKlik 'OK' for at genopfriske den nyligt opgraderede TiddlyWiki"});
merge(config.messages.messageClose,{
text: "luk",
tooltip: "luk dette meddelelsesområde"});
config.messages.backstage = {
open: {text: "bagscenen", tooltip: "Åben bagsceneområdet for at ændre på nogle grundlæggende indstillinger"},
close: {text: "luk", tooltip: "Luk bagsceneområdet"},
prompt: "bagscenen: ",
decal: {
edit: {text: "edit", tooltip: "Redigér tiddleren '%0'"}
}
};
config.messages.listView = {
tiddlerTooltip: "Klik for at se hele denne tiddlers tekst",
previewUnavailable: "(forhåndsvisning er ikke tilgængelig)"
};
config.messages.dates.months = ["Januar", "Februar", "Marts", "April", "Maj", "Juni", "Juli", "August", "September", "Oktober", "November","December"];
config.messages.dates.days = ["Søndag", "Mandag", "Tirsdag", "Onsdag", "Torsdag", "Fredag", "Lørdag"];
config.messages.dates.shortMonths = ["Jan", "Feb", "Mar", "Apr", "Maj", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dec"];
config.messages.dates.shortDays = ["Søn", "Man", "Tir", "Ons", "Tor", "Fre", "Lør"];
// suffixes for dates, eg "1ste","2den","3die"..."30te","31te"
config.messages.dates.daySuffixes = ["ste","den","die","te","te","te","te","te","te","te",
"te","te","te","te","te","te","te","te","te","te",
"ste","den","die","te","te","te","te","te","te","te",
"te"];
config.messages.dates.am = "formiddag";
config.messages.dates.pm = "eftermiddag";
merge(config.messages.tiddlerPopup,{
});
merge(config.views.wikified.tag,{
labelNoTags: "ingen tags",
labelTags: "tags: ",
openTag: "Åben tag '%0'",
tooltip: "Vis tiddlere der er taggede med '%0'",
openAllText: "Åben alle",
openAllTooltip: "Åben alle disse tiddlere",
popupNone: "Ingen andre tiddlere er taggede med '%0'"});
merge(config.views.wikified,{
defaultText: "Tiddleren '%0' findes ikke endnu. Dobbelt-klik for at lave den",
defaultModifier: "(mangler)",
shadowModifier: "(indbygget skygge tiddler)",
dateFormat: "DD MMM YYYY", // use this to change the date format for your locale, eg "YYYY MMM DD", do not translate the Y, M or D
createdPrompt: "lavet"});
merge(config.views.editor,{
tagPrompt: "Skriv tags delt med mellemrum, [[brug 2 dobbelte firkantede klammer]] om nødvendigt, eller tilføj allerede eksisterende",
defaultText: "Skriv teksten til '%0'"});
merge(config.views.editor.tagChooser,{
text: "tags",
tooltip: "Vælg eksisterende tags som tilføjelse til denne tiddler",
popupNone: "Der er ikke defineret nogen tags",
tagTooltip: "Tilføj tagget '%0'"});
merge(config.messages,{
sizeTemplates:
[
{unit: 1024*1024*1024, template: "%0\u00a0GB"},
{unit: 1024*1024, template: "%0\u00a0MB"},
{unit: 1024, template: "%0\u00a0KB"},
{unit: 1, template: "%0\u00a0B"}
]});
merge(config.macros.search,{
label: "søg",
prompt: "Søg i denne TiddlyWiki",
accessKey: "F",
successMsg: "Der er fundet %0 tiddlere som matcher %1",
failureMsg: "Der er ikke fundet nogen tiddlere som matcher %0"});
merge(config.macros.tagging,{
label: "tagger: ",
labelNotTag: "tagger ikke",
tooltip: "Liste over tiddlere der er taggede med '%0'"});
merge(config.macros.timeline,{
dateFormat: "DD MMM YYYY"});// use this to change the date format for your locale, eg "YYYY MMM DD", do not translate the Y, M or D
merge(config.macros.allTags,{
tooltip: "Vis tiddlere der er taggede med '%0'",
noTags: "Der er ingen taggede tiddlere"});
config.macros.list.all.prompt = "Alle tiddlere i alfabetisk orden";
config.macros.list.missing.prompt = "Tiddlere der linkes til men som ikke er definerede";
config.macros.list.orphans.prompt = "Tiddlere som der ikke linkes til fra nogen andre tiddlere";
config.macros.list.shadowed.prompt = "Tiddlere som er skyggede med grundlæggende indhold";
config.macros.list.touched.prompt = "Tiddlere som er blevet ændret lokalt ";
merge(config.macros.closeAll,{
label: "luk alle",
prompt: "Luk alle viste tiddlere (untaget dem som er ved at blive redigerede)"});
merge(config.macros.permaview,{
label: "vis permalink",
prompt: "Lav et link til en URL som henter alle de netop nu synlige tiddlere"});
merge(config.macros.saveChanges,{
label: "gem ændringer",
prompt: "Gem alle tiddlere for at lave en ny TiddlyWiki",
accessKey: "S"});
merge(config.macros.newTiddler,{
label: "ny tiddler",
prompt: "Lav en ny tiddler",
title: "Ny Tiddler",
accessKey: "N"});
merge(config.macros.newJournal,{
label: "ny journal",
prompt: "Lav en ny tiddler ud fra nuværende dato og tid",
accessKey: "J"});
merge(config.macros.options,{
wizardTitle: "Tilpas avancerede muligheder",
step1Title: "Disse muligheder gemmes i cookies i din browser",
step1Html: "<input type='hidden' name='markList'></input><br><input type='checkbox' checked='false' name='chkUnknown'>Show unknown options</input>",
unknownDescription: "//(ukendt)//",
listViewTemplate: {
columns: [
{name: 'Option', field: 'option', title: "Option", type: 'String'},
{name: 'Description', field: 'description', title: "Description", type: 'WikiText'},
{name: 'Name', field: 'name', title: "Name", type: 'String'}
],
rowClasses: [
{className: 'lowlight', field: 'lowlight'}
]}
});
merge(config.macros.plugins,{
wizardTitle: "Administrer udvidelser",
step1Title: "Aktive udvidelser",
step1Html: "<input type='hidden' name='markList'></input>", // DO NOT TRANSLATE
skippedText: "(Denne udvidelse er ikke blevet aktiveret fordi den først er blevet tilføjet efter start)",
noPluginText: "Der er ikke installeret nogen udvidelser",
confirmDeleteText: "Er du sikker på at du vil slette disse udvidelser:\n\n%0",
removeLabel: "Fjern systemConfig tag",
removePrompt: "Fjern systemConfig tag",
deleteLabel: "slet",
deletePrompt: "Slet disse tiddlere permanent",
listViewTemplate: {
columns: [
{name: 'Selected', field: 'Selected', rowName: 'title', type: 'Selector'},
{name: 'Tiddler', field: 'tiddler', title: "Tiddler", type: 'Tiddler'},
{name: 'Size', field: 'size', tiddlerLink: 'size', title: "Size", type: 'Size'},
{name: 'Forced', field: 'forced', title: "Forced", tag: 'systemConfigForce', type: 'TagCheckbox'},
{name: 'Disabled', field: 'disabled', title: "Disabled", tag: 'systemConfigDisable', type: 'TagCheckbox'},
{name: 'Executed', field: 'executed', title: "Loaded", type: 'Boolean', trueText: "Yes", falseText: "No"},
{name: 'Startup Time', field: 'startupTime', title: "Startup Time", type: 'String'},
{name: 'Error', field: 'error', title: "Status", type: 'Boolean', trueText: "Error", falseText: "OK"},
{name: 'Log', field: 'log', title: "Log", type: 'StringList'}
],
rowClasses: [
{className: 'error', field: 'error'},
{className: 'warning', field: 'warning'}
]}
});
merge(config.macros.toolbar,{
moreLabel: "mere",
morePrompt: "Vis flere muligheder"
});
merge(config.macros.refreshDisplay,{
label: "genopfrisk",
prompt: "Genopfrisk hele TiddlyWikiens udseende"
});
merge(config.macros.importTiddlers,{
readOnlyWarning: "Du kan ikke importere til en låst TiddlyWiki fil. Prøv at åbne den fra en fil:// URL",
wizardTitle: "Importer tiddlere fra en anden fil eller server",
step1Title: "Trin 1: Find serveren eller TiddlyWiki filen",
step1Html: "Vælg servertypen: <select name='selTypes'><option value=''>Choose...</option></select><br>Enter the URL or pathname here: <input type='text' size=50 name='txtPath'><br>...or browse for a file: <input type='file' size=50 name='txtBrowse'><br><hr>...or select a pre-defined feed: <select name='selFeeds'><option value=''>Choose...</option></select>",
openLabel: "open",
openPrompt: "Åben forbindelsen til denne fil eller server",
openError: "Der var problemer med at hente tiddlywiki filen",
statusOpenHost: "Forbinder til hosten",
statusGetWorkspaceList: "Henter en liste over tilgængelige arbejdsområder",
step2Title: "Trin 2: Vælg arbejdsområde",
step2Html: "Indskriv et navn på arbejdsområdet: <input type='text' size=50 name='txtWorkspace'><br>...eller vælg et der allerede er der: <select name='selWorkspace'><option value=''>Choose...</option></select>",
cancelLabel: "fortryd",
cancelPrompt: "Fortryd denne import",
statusOpenWorkspace: "Åben arbejdsområdet",
statusGetTiddlerList: "Henter listen over tilgængelige tiddlere",
errorGettingTiddlerList: "Fejl ved hentning af liste over tiddlere, klik Fortryd for at prøve igen",
step3Title: "Trin 3: Vælg hvilke tiddlere der skal importeres",
step3Html: "<input type='hidden' name='markList'></input><br><input type='checkbox' checked='true' name='chkSync'>Keep these tiddlers linked to this server so that you can synchronise subsequent changes</input><br><input type='checkbox' name='chkSave'>Save the details of this server in a 'systemServer' tiddler called:</input> <input type='text' size=25 name='txtSaveTiddler'>",
importLabel: "importer",
importPrompt: "Importer disse tiddlere",
confirmOverwriteText: "Er du sikker på at du vil overskrive disse tiddlere:\n\n%0",
step4Title: "Trin 4: Importerer %0 tiddler(e)",
step4Html: "<input type='hidden' name='markReport'></input>", // DO NOT TRANSLATE
doneLabel: "udført",
donePrompt: "Luk denne wizard",
statusDoingImport: "Importerer tiddlere",
statusDoneImport: "Alle tiddlere er importede",
systemServerNamePattern: "%2 on %1",
systemServerNamePatternNoWorkspace: "%1",
confirmOverwriteSaveTiddler: "Tiddleren '%0' findes allerede. Klik 'OK' for at overskrive den med detaljerne fra denne server, eller 'Fortryd' for at efterlade uændret",
serverSaveTemplate: "|''Type:''|%0|\n|''URL:''|%1|\n|''Workspace:''|%2|\n\nDenne tiddler blev lavet automatisk for at skrive denne servers detaljer",
serverSaveModifier: "(System)",
listViewTemplate: {
columns: [
{name: 'Selected', field: 'Selected', rowName: 'title', type: 'Selector'},
{name: 'Tiddler', field: 'tiddler', title: "Tiddler", type: 'Tiddler'},
{name: 'Size', field: 'size', tiddlerLink: 'size', title: "Size", type: 'Size'},
{name: 'Tags', field: 'tags', title: "Tags", type: 'Tags'}
],
rowClasses: [
]}
});
merge(config.macros.upgrade,{
wizardTitle: "Opgrader TiddlyWikis kerne kode",
step1Title: "Opdater eller reparer denne TiddlyWiki til sidste nye udgivelse",
step1Html: "Du er ved at opgradere til sidste nye udgave af TiddlyWikis kerne kode (from <a href='%0' class='externalLink' target='_blank'>%1</a>). Dit indhold vil blive bibeholdt under opgraderinen.<br><br>Bemærk at opgraderinger kan konfikte med gamle udvidelser. Hvis du får problemer med den opgraderede fil se her <a href='http://www.tiddlywiki.org/wiki/CoreUpgrades' class='externalLink' target='_blank'>http://www.tiddlywiki.org/wiki/CoreUpgrades</a>",
errorCantUpgrade: "Kan ikke opgradere denne TiddlyWiki. Du kan kun opgradere en TiddlyWiki fil som er gemt lokalt på en pc",
errorNotSaved: "Du skal gemme ændringer før du kan gennemføre en opgradering",
step2Title: "Bekræft opgraderingsdetaljer",
step2Html_downgrade: "Du er ved at nedgradere til TiddlyWiki version %0 fra %1.<br><br>Nedgradering til en ældre udgave af kerne koden er IKKE tilrådeligt",
step2Html_restore: "Denne tiddlyWike bruger allerede den sidste nye kerne kode (%0).<br><br>Du kan fortsætte med opgraderingen for at sikre dig at koden ikke er blevet ødelagt",
step2Html_upgrade: "Du er ved at opgradere til TiddlyWiki version %0 fra %1",
upgradeLabel: "opgrader",
upgradePrompt: "Forbered opgraderingsprocessen",
statusPreparingBackup: "Forbereder backup",
statusSavingBackup: "Gemmer backup fil",
errorSavingBackup: "Der var problemer med at gemme backup filen",
statusLoadingCore: "Loader kernekoden",
errorLoadingCore: "Fejl ved load af kernekoden",
errorCoreFormat: "Fejl ved den nye kernekode",
statusSavingCore: "Gemmer den nye kernekode",
statusReloadingCore: "Genloader den nye kernekode",
startLabel: "start",
startPrompt: "Start opgraderingsprocessen",
cancelLabel: "fortryd",
cancelPrompt: "Fortryd opgraderingsprocessen",
step3Title: "Opgradering afbrudt",
step3Html: "Du har afbrudt opgraderingsprocessen"
});
merge(config.macros.sync,{
listViewTemplate: {
columns: [
{name: 'Selected', field: 'selected', rowName: 'title', type: 'Selector'},
{name: 'Tiddler', field: 'tiddler', title: "Tiddler", type: 'Tiddler'},
{name: 'Server Type', field: 'serverType', title: "Server type", type: 'String'},
{name: 'Server Host', field: 'serverHost', title: "Server host", type: 'String'},
{name: 'Server Workspace', field: 'serverWorkspace', title: "Server workspace", type: 'String'},
{name: 'Status', field: 'status', title: "Synchronisation status", type: 'String'},
{name: 'Server URL', field: 'serverUrl', title: "Server URL", text: "View", type: 'Link'}
],
rowClasses: [
],
buttons: [
{caption: "Synkronisér disse tiddlere", name: 'sync'}
]},
wizardTitle: "Synkroniser med internet servere og filer",
step1Title: "Vælg hvilke tiddlere du vil synkronisere",
step1Html: "<input type='hidden' name='markList'></input>", // DO NOT TRANSLATE
syncLabel: "synk",
syncPrompt: "Synkronisér disse tiddlere",
hasChanged: "Ændret imens den var koblet fra",
hasNotChanged: "Uændret imens den var koblet fra",
syncStatusList: {
none: {text: "...", color: "gennemsigtig", display:null},
changedServer: {text: "Ændret på serveren", color: '#8080ff', display:null},
changedLocally: {text: "Ændret imens den var koblet fra", color: '#80ff80', display:null},
changedBoth: {text: "ændret imens den var koblet fra også på serveren", color: '#ff8080', display:null},
notFound: {text: "Ikke fundet på serveren", color: '#ffff80', display:null},
putToServer: {text: "Gemt update på serveren", color: '#ff80ff', display:null},
gotFromServer: {text: "Hentet update fra serveren", color: '#80ffff', display:null}
}
});
merge(config.commands.closeTiddler,{
text: "luk",
tooltip: "Luk denne tiddler"});
merge(config.commands.closeOthers,{
text: "luk andre",
tooltip: "Luk alle andre tiddlere"});
merge(config.commands.editTiddler,{
text: "redigér",
tooltip: "Redigér denne tiddler",
readOnlyText: "se",
readOnlyTooltip: "Se denne tiddlers kilde"});
merge(config.commands.saveTiddler,{
text: "færdig",
tooltip: "Gem ændringer til denne tiddler"});
merge(config.commands.cancelTiddler,{
text: "fortryd",
tooltip: "Fortryd ændringer til denne tiddler",
warning: "Er du sikker på at du vil fortryde dine ændringer til '%0'?",
readOnlyText: "færdig",
readOnlyTooltip: "Se tiddlere normalt"});
merge(config.commands.deleteTiddler,{
text: "slet",
tooltip: "Slet denne tiddler",
warning: "Er du sikker på at du vil slette '%0'?"});
merge(config.commands.permalink,{
text: "permalink",
tooltip: "Permalink til denne tiddler"});
merge(config.commands.references,{
text: "referencer",
tooltip: "Vis tiddlere som linker til denne tiddler",
popupNone: "Ingen referencer"});
merge(config.commands.jump,{
text: "spring",
tooltip: "Spring til en anden tiddler"});
merge(config.commands.syncing,{
text: "synkroniserer",
tooltip: "Kontroller synkronisering af denne tiddler med en server eller en fil",
currentlySyncing: "<div>Currently syncing via <span class='popupHighlight'>'%0'</span> to:</"+"div><div>host: <span class='popupHighlight'>%1</span></"+"div><div>workspace: <span class='popupHighlight'>%2</span></"+"div>", // Note escaping of closing <div> tag
notCurrentlySyncing: "Sykroniserer ikke lige nu",
captionUnSync: "Stop synkronisering af denne tiddler",
chooseServer: "Synkronisér denne tiddler med en anden server:",
currServerMarker: "\u25cf ",
notCurrServerMarker: " "});
merge(config.commands.fields,{
text: "felter",
tooltip: "Vis denne tiddlers udvidede felter",
emptyText: "Der er ingen udvidede felter til rådighed for denne tiddler",
listViewTemplate: {
columns: [
{name: 'Field', field: 'field', title: "Field", type: 'String'},
{name: 'Value', field: 'value', title: "Value", type: 'String'}
],
rowClasses: [
],
buttons: [
]}});
merge(config.shadowTiddlers,{
DefaultTiddlers: "[[TranslatedGettingStarted]]",
MainMenu: "[[TranslatedGettingStarted]]\n\n\n^^~TiddlyWiki version <<version>>\n© 2007 [[UnaMesa|http://www.unamesa.org/]]^^",
TranslatedGettingStarted: "For at komme i gang med denne tomme tiddlywiki, skal du ændre på de følgende tiddlere:\n* SiteTitle & SiteSubtitle: Sidens titel og undertitel, som vist øverst (efter de er gemt, vil de også vise sig i browserens titelmenu)\n* MainMenu: er hovedmenuen (er oftest placeret til venstre)\n* DefaultTiddlers: Indeholder navnene på de tiddlere du vilhave skal starte op når du åbner TiddlyWiki\nDu skal også skrive dit brugernavn for at signere dine redigeringer: <<option txtUserName>>",
SiteTitle: "Min TiddlyWiki",
SiteSubtitle: "en genbrugelig ikke-liniær personlig web notesbog",
SiteUrl: "http://www.tiddlywiki.com/",
OptionsPanel: "Disse muligheder for at ændre på TiddlyWiki bliver gemt i din browser\n\nDit brugernavn til at signere dine ændringer. Skriv det som et WikiOrd (f.eks. PerPoulsen)\n<<option txtUserName>>\n\n<<option chkSaveBackups>> Save backups\n<<option chkAutoSave>> Auto save\n<<option chkRegExpSearch>> Regexp search\n<<option chkCaseSensitiveSearch>> Case sensitive search\n<<option chkAnimate>> Enable animations\n\n----\nAlso see [[TranslatedAdvancedOptions|AdvancedOptions]]",
SideBarOptions: '<<search>><<closeAll>><<permaview>><<newTiddler>><<newJournal "DD MMM YYYY" "journal">><<saveChanges>><<slider chkSliderOptionsPanel OptionsPanel "muligheder \u00bb" "Ændre på TiddlyWikis avancerede muligheder">>',
SideBarTabs: '<<tabs txtMainTab "Tidslinie" "Tidslinie" TabTimeline "Alle" "Alle tiddlere" TabAll "Tags" "Alle tags" TabTags "Flere" "Flere lister" TabMore>>',
TabMore: '<<tabs txtMoreTab "Manglende" "Manglende tiddlere" TabMoreMissing "Uden tilknytning" "Tiddlere" TabMoreOrphans "Skyggede" "Skyggede tiddlere" TabMoreShadowed>>'
});
merge(config.annotations,{
AdvancedOptions: "Denne skygge tiddler giver adgang til flere avancerede muligheder",
ColorPalette: "Disse værdier i denne skyggetiddler bestemmer hvilket farveskema, der bliver brugt til ~TiddlyWikis brugerflade",
DefaultTiddlers: "Tiddlere som er listede i denne skyggetiddler vil automatisk blive vist når ~TiddlyWiki starter op",
EditTemplate: "HTML skabelonen i denne skyggetiddler bestemmer hvordan tiddlere ser ud når de bliver redigerede",
GettingStarted: "Denne skyggetiddler giver instruktioner om grundlæggende anvendelse",
ImportTiddlers: "Denne skyggetiddler giver mulighed for at importere tiddlere",
MainMenu: "Denne tiddler bliver brugt til at definere indholdet af hoved menuen i venstre side af skærmen",
MarkupPreHead: "Denne tiddler bliver indsat i toppen af <head> sektionen på TiddlyWiki HTML filen",
MarkupPostHead: "Denne tiddler bliver indsat i bunden af <head> sektionen på TiddlyWiki HTML filen",
MarkupPreBody: "Denne tiddler bliver indsat i toppen af<body> sektionen på TiddlyWiki HTML filen",
MarkupPostBody: "Denne tiddler bliver indsat i slutningen af <body> sektionen på TiddlyWiki HTML filen umiddelbart efter script blokken",
OptionsPanel: "Denne skyggetiddler bliver brugt til indholdet af muligheder skydepanelet i højre side",
PageTemplate: "HTML skabelonen i denne skyggetiddler bestemmer det overordnede ~TiddlyWiki layout",
PluginManager: "Denne skyggetiddler giver adgang til udvidelsesadministrationen",
SideBarOptions: "Denne skyggetiddler bruges til indholdet af muligheder panelet i højre sidemenu",
SideBarTabs: "Denne skyggetiddler bruges til indholdet af fanebladspanelet i højre sidemenu",
SiteSubtitle: "Denne skyggetiddler bruges som anden del af sidens titel",
SiteTitle: "Denne skyggetiddler bruges som første del af sidens titel",
SiteUrl: "Denne skyggetiddler bør sættes til den fulde mål-URL til publikation",
StyleSheetColors: "Denne skyggetiddler indeholder CSS definitionerne der bestemmer farverne på side elementerne. ''REDIGÉR IKKE DENNE TIDDLER'', lav i stedet dine ændringer i StyleSheet skyggetiddleren",
StyleSheet: "Denne tiddler kan indeholde specialle CSS definitioner",
StyleSheetLayout: "Denne skyggetiddler indeholder CSS definitioner der bestemmer layoutet på side elementer. ''REDIGÉR IKKE DENNE TIDDLER'', lav i stedet dine ændringer i StyleSheet skyggetiddleren",
StyleSheetLocale: "Denne skyggetiddler indeholder CSS definitioner relateret til lokale oversættelser",
StyleSheetPrint: "Denne skyggetiddler indeholder CSS definitioner til print",
TabAll: "Denne skyggetiddler indeholder hvad der er i 'Alle' fanen i højre sidemenu",
TabMore: "Denne skyggetiddler indeholder hvad der er i 'Flere' fanen i højre sidemenu",
TabMoreMissing: "Denne skyggetiddler indeholder hvad der er i 'Mangler' fanen i højre sidemenu",
TabMoreOrphans: "Denne skyggetiddler indeholder hvad der er i 'Mangler tilknytning' fanen i højre sidemenu",
TabMoreShadowed: "Denne skyggetiddler indeholder hvad der er i 'Skyggede' fanen i højre sidemenu",
TabTags: "Denne skyggetiddler indeholder hvad der er i 'Tags' fanen i højre sidemenu",
TabTimeline: "Denne skyggetiddler indeholder hvad der er i 'Tidslinie' fanen i højre sidemenu",
ToolbarCommands: "Denne skyggetiddler bestemmer hvilke værktøjer der vises i tiddleres værktøjslinier",
ViewTemplate: "HTML skabelonen i denne skyggetiddler bestemmer hvordan tiddlere ser ud"
});
//}}}
/***
|''Name:''|DataTiddlerPlugin|
|''Version:''|1.0.6 (2006-08-26)|
|''Source:''|http://tiddlywiki.abego-software.de/#DataTiddlerPlugin|
|''Author:''|UdoBorkowski (ub [at] abego-software [dot] de)|
|''Licence:''|[[BSD open source license]]|
|''TiddlyWiki:''|1.2.38+, 2.0|
|''Browser:''|Firefox 1.0.4+; InternetExplorer 6.0|
!Description
Enhance your tiddlers with structured data (such as strings, booleans, numbers, or even arrays and compound objects) that can be easily accessed and modified through named fields (in JavaScript code).
Such tiddler data can be used in various applications. E.g. you may create tables that collect data from various tiddlers.
''//Example: "Table with all December Expenses"//''
{{{
<<forEachTiddler
where
'tiddler.tags.contains("expense") && tiddler.data("month") == "Dec"'
write
'"|[["+tiddler.title+"]]|"+tiddler.data("descr")+"| "+tiddler.data("amount")+"|\n"'
>>
}}}
//(This assumes that expenses are stored in tiddlers tagged with "expense".)//
<<forEachTiddler
where
'tiddler.tags.contains("expense") && tiddler.data("month") == "Dec"'
write
'"|[["+tiddler.title+"]]|"+tiddler.data("descr")+"| "+tiddler.data("amount")+"|\n"'
>>
For other examples see DataTiddlerExamples.
''Access and Modify Tiddler Data''
You can "attach" data to every tiddler by assigning a JavaScript value (such as a string, boolean, number, or even arrays and compound objects) to named fields.
These values can be accessed and modified through the following Tiddler methods:
|!Method|!Example|!Description|
|{{{data(field)}}}|{{{t.data("age")}}}|Returns the value of the given data field of the tiddler. When no such field is defined or its value is undefined {{{undefined}}} is returned.|
|{{{data(field,defaultValue)}}}|{{{t.data("isVIP",false)}}}|Returns the value of the given data field of the tiddler. When no such field is defined or its value is undefined the defaultValue is returned.|
|{{{data()}}}|{{{t.data()}}}|Returns the data object of the tiddler, with a property for every field. The properties of the returned data object may only be read and not be modified. To modify the data use DataTiddler.setData(...) or the corresponding Tiddler method.|
|{{{setData(field,value)}}}|{{{t.setData("age",42)}}}|Sets the value of the given data field of the tiddler to the value. When the value is {{{undefined}}} the field is removed.|
|{{{setData(field,value,defaultValue)}}}|{{{t.setData("isVIP",flag,false)}}}|Sets the value of the given data field of the tiddler to the value. When the value is equal to the defaultValue no value is set (and the field is removed).|
Alternatively you may use the following functions to access and modify the data. In this case the tiddler argument is either a tiddler or the name of a tiddler.
|!Method|!Description|
|{{{DataTiddler.getData(tiddler,field)}}}|Returns the value of the given data field of the tiddler. When no such field is defined or its value is undefined {{{undefined}}} is returned.|
|{{{DataTiddler.getData(tiddler,field,defaultValue)}}}|Returns the value of the given data field of the tiddler. When no such field is defined or its value is undefined the defaultValue is returned.|
|{{{DataTiddler.getDataObject(tiddler)}}}|Returns the data object of the tiddler, with a property for every field. The properties of the returned data object may only be read and not be modified. To modify the data use DataTiddler.setData(...) or the corresponding Tiddler method.|
|{{{DataTiddler.setData(tiddler,field,value)}}}|Sets the value of the given data field of the tiddler to the value. When the value is {{{undefined}}} the field is removed.|
|{{{DataTiddler.setData(tiddler,field,value,defaultValue)}}}|Sets the value of the given data field of the tiddler to the value. When the value is equal to the defaultValue no value is set (and the field is removed).|
//(For details on the various functions see the detailed comments in the source code.)//
''Data Representation in a Tiddler''
The data of a tiddler is stored as plain text in the tiddler's content/text, inside a "data" section that is framed by a {{{<data>...</data>}}} block. Inside the data section the information is stored in the [[JSON format|http://www.crockford.com/JSON/index.html]].
//''Data Section Example:''//
{{{
<data>{"isVIP":true,"user":"John Brown","age":34}</data>
}}}
The data section is not displayed when viewing the tiddler (see also "The showData Macro").
Beside the data section a tiddler may have all kind of other content.
Typically you will not access the data section text directly but use the methods given above. Nevertheless you may retrieve the text of the data section's content through the {{{DataTiddler.getDataText(tiddler)}}} function.
''Saving Changes''
The "setData" methods respect the "ForceMinorUpdate" and "AutoSave" configuration values. I.e. when "ForceMinorUpdate" is true changing a value using setData will not affect the "modifier" and "modified" attributes. With "AutoSave" set to true every setData will directly save the changes after a setData.
''Notifications''
No notifications are sent when a tiddler's data value is changed through the "setData" methods.
''Escape Data Section''
In case that you want to use the text {{{<data>}}} or {{{</data>}}} in a tiddler text you must prefix the text with a tilde ('~'). Otherwise it may be wrongly considered as the data section. The tiddler text {{{~<data>}}} is displayed as {{{<data>}}}.
''The showData Macro''
By default the data of a tiddler (that is stored in the {{{<data>...</data>}}} section of the tiddler) is not displayed. If you want to display this data you may used the {{{<<showData ...>>}}} macro:
''Syntax:''
|>|{{{<<}}}''showData '' [''JSON''] [//tiddlerName//] {{{>>}}}|
|''JSON''|By default the data is rendered as a table with a "Name" and "Value" column. When defining ''JSON'' the data is rendered in JSON format|
|//tiddlerName//|Defines the tiddler holding the data to be displayed. When no tiddler is given the tiddler containing the showData macro is used. When the tiddler name contains spaces you must quote the name (or use the {{{[[...]]}}} syntax.)|
|>|~~Syntax formatting: Keywords in ''bold'', optional parts in [...]. 'or' means that exactly one of the two alternatives must exist.~~|
!Revision history
* v1.0.6 (2006-08-26)
** Removed misleading comment
* v1.0.5 (2006-02-27) (Internal Release Only)
** Internal
*** Make "JSLint" conform
* v1.0.4 (2006-02-05)
** Bugfix: showData fails in TiddlyWiki 2.0
* v1.0.3 (2006-01-06)
** Support TiddlyWiki 2.0
* v1.0.2 (2005-12-22)
** Enhancements:
*** Handle texts "<data>" or "</data>" more robust when used in a tiddler text or as a field value.
*** Improved (JSON) error messages.
** Bugs fixed:
*** References are not updated when using the DataTiddler.
*** Changes to compound objects are not always saved.
*** "~</data>" is not rendered correctly (expected "</data>")
* v1.0.1 (2005-12-13)
** Features:
*** The showData macro supports an optional "tiddlername" argument to specify the tiddler containing the data to be displayed
** Bugs fixed:
*** A script immediately following a data section is deleted when the data is changed. (Thanks to GeoffS for reporting.)
* v1.0.0 (2005-12-12)
** initial version
!Code
***/
//{{{
//============================================================================
//============================================================================
// DataTiddlerPlugin
//============================================================================
//============================================================================
// Ensure that the DataTiddler Plugin is only installed once.
//
if (!version.extensions.DataTiddlerPlugin) {
version.extensions.DataTiddlerPlugin = {
major: 1, minor: 0, revision: 6,
date: new Date(2006, 7, 26),
type: 'plugin',
source: "http://tiddlywiki.abego-software.de/#DataTiddlerPlugin"
};
// For backward compatibility with v1.2.x
//
if (!window.story) window.story=window;
if (!TiddlyWiki.prototype.getTiddler) {
TiddlyWiki.prototype.getTiddler = function(title) {
var t = this.tiddlers[title];
return (t !== undefined && t instanceof Tiddler) ? t : null;
};
}
//============================================================================
// DataTiddler Class
//============================================================================
// ---------------------------------------------------------------------------
// Configurations and constants
// ---------------------------------------------------------------------------
function DataTiddler() {
}
DataTiddler = {
// Function to stringify a JavaScript value, producing the text for the data section content.
// (Must match the implementation of DataTiddler.parse.)
//
stringify : null,
// Function to parse the text for the data section content, producing a JavaScript value.
// (Must match the implementation of DataTiddler.stringify.)
//
parse : null
};
// Ensure access for IE
window.DataTiddler = DataTiddler;
// ---------------------------------------------------------------------------
// Data Accessor and Mutator
// ---------------------------------------------------------------------------
// Returns the value of the given data field of the tiddler.
// When no such field is defined or its value is undefined
// the defaultValue is returned.
//
// @param tiddler either a tiddler name or a tiddler
//
DataTiddler.getData = function(tiddler, field, defaultValue) {
var t = (typeof tiddler == "string") ? store.getTiddler(tiddler) : tiddler;
if (!(t instanceof Tiddler)) {
throw "Tiddler expected. Got "+tiddler;
}
return DataTiddler.getTiddlerDataValue(t, field, defaultValue);
};
// Sets the value of the given data field of the tiddler to
// the value. When the value is equal to the defaultValue
// no value is set (and the field is removed)
//
// Changing data of a tiddler will not trigger notifications.
//
// @param tiddler either a tiddler name or a tiddler
//
DataTiddler.setData = function(tiddler, field, value, defaultValue) {
var t = (typeof tiddler == "string") ? store.getTiddler(tiddler) : tiddler;
if (!(t instanceof Tiddler)) {
throw "Tiddler expected. Got "+tiddler+ "("+t+")";
}
DataTiddler.setTiddlerDataValue(t, field, value, defaultValue);
};
// Returns the data object of the tiddler, with a property for every field.
//
// The properties of the returned data object may only be read and
// not be modified. To modify the data use DataTiddler.setData(...)
// or the corresponding Tiddler method.
//
// If no data section is defined a new (empty) object is returned.
//
// @param tiddler either a tiddler name or a Tiddler
//
DataTiddler.getDataObject = function(tiddler) {
var t = (typeof tiddler == "string") ? store.getTiddler(tiddler) : tiddler;
if (!(t instanceof Tiddler)) {
throw "Tiddler expected. Got "+tiddler;
}
return DataTiddler.getTiddlerDataObject(t);
};
// Returns the text of the content of the data section of the tiddler.
//
// When no data section is defined for the tiddler null is returned
//
// @param tiddler either a tiddler name or a Tiddler
// @return [may be null]
//
DataTiddler.getDataText = function(tiddler) {
var t = (typeof tiddler == "string") ? store.getTiddler(tiddler) : tiddler;
if (!(t instanceof Tiddler)) {
throw "Tiddler expected. Got "+tiddler;
}
return DataTiddler.readDataSectionText(t);
};
// ---------------------------------------------------------------------------
// Internal helper methods (must not be used by code from outside this plugin)
// ---------------------------------------------------------------------------
// Internal.
//
// The original JSONError is not very user friendly,
// especially it does not define a toString() method
// Therefore we extend it here.
//
DataTiddler.extendJSONError = function(ex) {
if (ex.name == 'JSONError') {
ex.toString = function() {
return ex.name + ": "+ex.message+" ("+ex.text+")";
};
}
return ex;
};
// Internal.
//
// @param t a Tiddler
//
DataTiddler.getTiddlerDataObject = function(t) {
if (t.dataObject === undefined) {
var data = DataTiddler.readData(t);
t.dataObject = (data) ? data : {};
}
return t.dataObject;
};
// Internal.
//
// @param tiddler a Tiddler
//
DataTiddler.getTiddlerDataValue = function(tiddler, field, defaultValue) {
var value = DataTiddler.getTiddlerDataObject(tiddler)[field];
return (value === undefined) ? defaultValue : value;
};
// Internal.
//
// @param tiddler a Tiddler
//
DataTiddler.setTiddlerDataValue = function(tiddler, field, value, defaultValue) {
var data = DataTiddler.getTiddlerDataObject(tiddler);
var oldValue = data[field];
if (value == defaultValue) {
if (oldValue !== undefined) {
delete data[field];
DataTiddler.save(tiddler);
}
return;
}
data[field] = value;
DataTiddler.save(tiddler);
};
// Internal.
//
// Reads the data section from the tiddler's content and returns its text
// (as a String).
//
// Returns null when no data is defined.
//
// @param tiddler a Tiddler
// @return [may be null]
//
DataTiddler.readDataSectionText = function(tiddler) {
var matches = DataTiddler.getDataTiddlerMatches(tiddler);
if (matches === null || !matches[2]) {
return null;
}
return matches[2];
};
// Internal.
//
// Reads the data section from the tiddler's content and returns it
// (as an internalized object).
//
// Returns null when no data is defined.
//
// @param tiddler a Tiddler
// @return [may be null]
//
DataTiddler.readData = function(tiddler) {
var text = DataTiddler.readDataSectionText(tiddler);
try {
return text ? DataTiddler.parse(text) : null;
} catch(ex) {
throw DataTiddler.extendJSONError(ex);
}
};
// Internal.
//
// Returns the serialized text of the data of the given tiddler, as it
// should be stored in the data section.
//
// @param tiddler a Tiddler
//
DataTiddler.getDataTextOfTiddler = function(tiddler) {
var data = DataTiddler.getTiddlerDataObject(tiddler);
return DataTiddler.stringify(data);
};
// Internal.
//
DataTiddler.indexOfNonEscapedText = function(s, subString, startIndex) {
var index = s.indexOf(subString, startIndex);
while ((index > 0) && (s[index-1] == '~')) {
index = s.indexOf(subString, index+1);
}
return index;
};
// Internal.
//
DataTiddler.getDataSectionInfo = function(text) {
// Special care must be taken to handle "<data>" and "</data>" texts inside
// a data section.
// Also take care not to use an escaped <data> (i.e. "~<data>") as the start
// of a data section. (Same for </data>)
// NOTE: we are explicitly searching for a data section that contains a JSON
// string, i.e. framed with braces. This way we are little bit more robust in
// case the tiddler contains unescaped texts "<data>" or "</data>". This must
// be changed when using a different stringifier.
var startTagText = "<data>{";
var endTagText = "}</data>";
var startPos = 0;
// Find the first not escaped "<data>".
var startDataTagIndex = DataTiddler.indexOfNonEscapedText(text, startTagText, 0);
if (startDataTagIndex < 0) {
return null;
}
// Find the *last* not escaped "</data>".
var endDataTagIndex = text.indexOf(endTagText, startDataTagIndex);
if (endDataTagIndex < 0) {
return null;
}
var nextEndDataTagIndex;
while ((nextEndDataTagIndex = text.indexOf(endTagText, endDataTagIndex+1)) >= 0) {
endDataTagIndex = nextEndDataTagIndex;
}
return {
prefixEnd: startDataTagIndex,
dataStart: startDataTagIndex+(startTagText.length)-1,
dataEnd: endDataTagIndex,
suffixStart: endDataTagIndex+(endTagText.length)
};
};
// Internal.
//
// Returns the "matches" of a content of a DataTiddler on the
// "data" regular expression. Return null when no data is defined
// in the tiddler content.
//
// Group 1: text before data section (prefix)
// Group 2: content of data section
// Group 3: text behind data section (suffix)
//
// @param tiddler a Tiddler
// @return [may be null] null when the tiddler contains no data section, otherwise see above.
//
DataTiddler.getDataTiddlerMatches = function(tiddler) {
var text = tiddler.text;
var info = DataTiddler.getDataSectionInfo(text);
if (!info) {
return null;
}
var prefix = text.substr(0,info.prefixEnd);
var data = text.substr(info.dataStart, info.dataEnd-info.dataStart+1);
var suffix = text.substr(info.suffixStart);
return [text, prefix, data, suffix];
};
// Internal.
//
// Saves the data in a <data> block of the given tiddler (as a minor change).
//
// The "chkAutoSave" and "chkForceMinorUpdate" options are respected.
// I.e. the TiddlyWiki *file* is only saved when AutoSave is on.
//
// Notifications are not send.
//
// This method should only be called when the data really has changed.
//
// @param tiddler
// the tiddler to be saved.
//
DataTiddler.save = function(tiddler) {
var matches = DataTiddler.getDataTiddlerMatches(tiddler);
var prefix;
var suffix;
if (matches === null) {
prefix = tiddler.text;
suffix = "";
} else {
prefix = matches[1];
suffix = matches[3];
}
var dataText = DataTiddler.getDataTextOfTiddler(tiddler);
var newText =
(dataText !== null)
? prefix + "<data>" + dataText + "</data>" + suffix
: prefix + suffix;
if (newText != tiddler.text) {
// make the change in the tiddlers text
// ... see DataTiddler.MyTiddlerChangedFunction
tiddler.isDataTiddlerChange = true;
// ... do the action change
tiddler.set(
tiddler.title,
newText,
config.options.txtUserName,
config.options.chkForceMinorUpdate? undefined : new Date(),
tiddler.tags);
// ... see DataTiddler.MyTiddlerChangedFunction
delete tiddler.isDataTiddlerChange;
// Mark the store as dirty.
store.dirty = true;
// AutoSave if option is selected
if(config.options.chkAutoSave) {
saveChanges();
}
}
};
// Internal.
//
DataTiddler.MyTiddlerChangedFunction = function() {
// Remove the data object from the tiddler when the tiddler is changed
// by code other than DataTiddler code.
//
// This is necessary since the data object is just a "cached version"
// of the data defined in the data section of the tiddler and the
// "external" change may have changed the content of the data section.
// Thus we are not sure if the data object reflects the data section
// contents.
//
// By deleting the data object we ensure that the data object is
// reconstructed the next time it is needed, with the data defined by
// the data section in the tiddler's text.
// To indicate that a change is a "DataTiddler change" a temporary
// property "isDataTiddlerChange" is added to the tiddler.
if (this.dataObject && !this.isDataTiddlerChange) {
delete this.dataObject;
}
// call the original code.
DataTiddler.originalTiddlerChangedFunction.apply(this, arguments);
};
//============================================================================
// Formatters
//============================================================================
// This formatter ensures that "~<data>" is rendered as "<data>". This is used to
// escape the "<data>" of a data section, just in case someone really wants to use
// "<data>" as a text in a tiddler and not start a data section.
//
// Same for </data>.
//
config.formatters.push( {
name: "data-escape",
match: "~<\\/?data>",
handler: function(w) {
w.outputText(w.output,w.matchStart + 1,w.nextMatch);
}
} );
// This formatter ensures that <data>...</data> sections are not rendered.
//
config.formatters.push( {
name: "data",
match: "<data>",
handler: function(w) {
var info = DataTiddler.getDataSectionInfo(w.source);
if (info && info.prefixEnd == w.matchStart) {
w.nextMatch = info.suffixStart;
} else {
w.outputText(w.output,w.matchStart,w.nextMatch);
}
}
} );
//============================================================================
// Tiddler Class Extension
//============================================================================
// "Hijack" the changed method ---------------------------------------------------
DataTiddler.originalTiddlerChangedFunction = Tiddler.prototype.changed;
Tiddler.prototype.changed = DataTiddler.MyTiddlerChangedFunction;
// Define accessor methods -------------------------------------------------------
// Returns the value of the given data field of the tiddler. When no such field
// is defined or its value is undefined the defaultValue is returned.
//
// When field is undefined (or null) the data object is returned. (See
// DataTiddler.getDataObject.)
//
// @param field [may be null, undefined]
// @param defaultValue [may be null, undefined]
// @return [may be null, undefined]
//
Tiddler.prototype.data = function(field, defaultValue) {
return (field)
? DataTiddler.getTiddlerDataValue(this, field, defaultValue)
: DataTiddler.getTiddlerDataObject(this);
};
// Sets the value of the given data field of the tiddler to the value. When the
// value is equal to the defaultValue no value is set (and the field is removed).
//
// @param value [may be null, undefined]
// @param defaultValue [may be null, undefined]
//
Tiddler.prototype.setData = function(field, value, defaultValue) {
DataTiddler.setTiddlerDataValue(this, field, value, defaultValue);
};
//============================================================================
// showData Macro
//============================================================================
config.macros.showData = {
// Standard Properties
label: "showData",
prompt: "Display the values stored in the data section of the tiddler"
};
config.macros.showData.handler = function(place,macroName,params) {
// --- Parsing ------------------------------------------
var i = 0; // index running over the params
// Parse the optional "JSON"
var showInJSONFormat = false;
if ((i < params.length) && params[i] == "JSON") {
i++;
showInJSONFormat = true;
}
var tiddlerName = story.findContainingTiddler(place).id.substr(7);
if (i < params.length) {
tiddlerName = params[i];
i++;
}
// --- Processing ------------------------------------------
try {
if (showInJSONFormat) {
this.renderDataInJSONFormat(place, tiddlerName);
} else {
this.renderDataAsTable(place, tiddlerName);
}
} catch (e) {
this.createErrorElement(place, e);
}
};
config.macros.showData.renderDataInJSONFormat = function(place,tiddlerName) {
var text = DataTiddler.getDataText(tiddlerName);
if (text) {
createTiddlyElement(place,"pre",null,null,text);
}
};
config.macros.showData.renderDataAsTable = function(place,tiddlerName) {
var text = "|!Name|!Value|\n";
var data = DataTiddler.getDataObject(tiddlerName);
if (data) {
for (var i in data) {
var value = data[i];
text += "|"+i+"|"+DataTiddler.stringify(value)+"|\n";
}
}
wikify(text, place);
};
// Internal.
//
// Creates an element that holds an error message
//
config.macros.showData.createErrorElement = function(place, exception) {
var message = (exception.description) ? exception.description : exception.toString();
return createTiddlyElement(place,"span",null,"showDataError","<<showData ...>>: "+message);
};
// ---------------------------------------------------------------------------
// Stylesheet Extensions (may be overridden by local StyleSheet)
// ---------------------------------------------------------------------------
//
setStylesheet(
".showDataError{color: #ffffff;background-color: #880000;}",
"showData");
} // of "install only once"
// Used Globals (for JSLint) ==============
// ... TiddlyWiki Core
/*global createTiddlyElement, saveChanges, store, story, wikify */
// ... DataTiddler
/*global DataTiddler */
// ... JSON
/*global JSON */
/***
!JSON Code, used to serialize the data
***/
/*
Copyright (c) 2005 JSON.org
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The Software shall be used for Good, not Evil.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
*/
/*
The global object JSON contains two methods.
JSON.stringify(value) takes a JavaScript value and produces a JSON text.
The value must not be cyclical.
JSON.parse(text) takes a JSON text and produces a JavaScript value. It will
throw a 'JSONError' exception if there is an error.
*/
var JSON = {
copyright: '(c)2005 JSON.org',
license: 'http://www.crockford.com/JSON/license.html',
/*
Stringify a JavaScript value, producing a JSON text.
*/
stringify: function (v) {
var a = [];
/*
Emit a string.
*/
function e(s) {
a[a.length] = s;
}
/*
Convert a value.
*/
function g(x) {
var c, i, l, v;
switch (typeof x) {
case 'object':
if (x) {
if (x instanceof Array) {
e('[');
l = a.length;
for (i = 0; i < x.length; i += 1) {
v = x[i];
if (typeof v != 'undefined' &&
typeof v != 'function') {
if (l < a.length) {
e(',');
}
g(v);
}
}
e(']');
return;
} else if (typeof x.toString != 'undefined') {
e('{');
l = a.length;
for (i in x) {
v = x[i];
if (x.hasOwnProperty(i) &&
typeof v != 'undefined' &&
typeof v != 'function') {
if (l < a.length) {
e(',');
}
g(i);
e(':');
g(v);
}
}
return e('}');
}
}
e('null');
return;
case 'number':
e(isFinite(x) ? +x : 'null');
return;
case 'string':
l = x.length;
e('"');
for (i = 0; i < l; i += 1) {
c = x.charAt(i);
if (c >= ' ') {
if (c == '\\' || c == '"') {
e('\\');
}
e(c);
} else {
switch (c) {
case '\b':
e('\\b');
break;
case '\f':
e('\\f');
break;
case '\n':
e('\\n');
break;
case '\r':
e('\\r');
break;
case '\t':
e('\\t');
break;
default:
c = c.charCodeAt();
e('\\u00' + Math.floor(c / 16).toString(16) +
(c % 16).toString(16));
}
}
}
e('"');
return;
case 'boolean':
e(String(x));
return;
default:
e('null');
return;
}
}
g(v);
return a.join('');
},
/*
Parse a JSON text, producing a JavaScript value.
*/
parse: function (text) {
var p = /^\s*(([,:{}\[\]])|"(\\.|[^\x00-\x1f"\\])*"|-?\d+(\.\d*)?([eE][+-]?\d+)?|true|false|null)\s*/,
token,
operator;
function error(m, t) {
throw {
name: 'JSONError',
message: m,
text: t || operator || token
};
}
function next(b) {
if (b && b != operator) {
error("Expected '" + b + "'");
}
if (text) {
var t = p.exec(text);
if (t) {
if (t[2]) {
token = null;
operator = t[2];
} else {
operator = null;
try {
token = eval(t[1]);
} catch (e) {
error("Bad token", t[1]);
}
}
text = text.substring(t[0].length);
} else {
error("Unrecognized token", text);
}
} else {
token = operator = undefined;
}
}
function val() {
var k, o;
switch (operator) {
case '{':
next('{');
o = {};
if (operator != '}') {
for (;;) {
if (operator || typeof token != 'string') {
error("Missing key");
}
k = token;
next();
next(':');
o[k] = val();
if (operator != ',') {
break;
}
next(',');
}
}
next('}');
return o;
case '[':
next('[');
o = [];
if (operator != ']') {
for (;;) {
o.push(val());
if (operator != ',') {
break;
}
next(',');
}
}
next(']');
return o;
default:
if (operator !== null) {
error("Missing value");
}
k = token;
next();
return k;
}
}
next();
return val();
}
};
/***
!Setup the data serialization
***/
DataTiddler.format = "JSON";
DataTiddler.stringify = JSON.stringify;
DataTiddler.parse = JSON.parse;
//}}}
/***
|Name|DatePlugin|
|Source|http://www.TiddlyTools.com/#DatePlugin|
|Documentation|http://www.TiddlyTools.com/#DatePluginInfo|
|Version|2.7.0|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides||
|Options|##Configuration|
|Description|formatted dates plus popup menu with 'journal' link, changes and (optional) reminders|
There are quite a few calendar generators, reminders, to-do lists, 'dated tiddlers' journals, blog-makers and GTD-like schedule managers that have been built around TW. While they all have different purposes, and vary in format, interaction, and style, in one way or another each of these plugins displays and/or uses date-based information to make finding, accessing and managing relevant tiddlers easier. This plugin provides a general approach to embedding dates and date-based links/menus within tiddler content.
!!!!!Documentation
>see [[DatePluginInfo]]
!!!!!Configuration
<<<
<<option chkDatePopupHideCreated>> omit 'created' section from date popups
<<option chkDatePopupHideChanged>> omit 'changed' section from date popups
<<option chkDatePopupHideTagged>> omit 'tagged' section from date popups
<<option chkDatePopupHideReminders>> omit 'reminders' section from date popups
<<option chkShowJulianDate>> display Julian day number (1-365) below current date
see [[DatePluginConfig]] for additional configuration settings, for use in calendar displays, including:
*date formats
*color-coded backgrounds
*annual fixed-date holidays
*weekends
<<<
!!!!!Revisions
<<<
2008.03.08 [2.7.0] in addModifiedsToPopup(), if a tiddler was created on the specified date, don't list it in the 'changed' section of the popup. Based on a request from Kashgarinn.
|please see [[DatePluginInfo]] for additional revision details|
2005.10.30 [0.9.0] pre-release
<<<
!!!!!Code
***/
//{{{
version.extensions.date = {major: 2, minor: 7, revision: 0, date: new Date(2008,3,8)};
config.macros.date = {
format: "YYYY.0MM.0DD", // default date display format
linkformat: "YYYY.0MM.0DD", // 'dated tiddler' link format
linkedbg: "#babb1e", // "babble"
todaybg: "#ffab1e", // "fable"
weekendbg: "#c0c0c0", // "cocoa"
holidaybg: "#ffaace", // "face"
createdbg: "#bbeeff", // "beef"
modifiedsbg: "#bbeeff", // "beef"
remindersbg: "#c0ffee", // "coffee"
holidays: [ "01/01", "07/04", "07/24", "11/24" ], // NewYearsDay, IndependenceDay(US), Eric's Birthday (hooray!), Thanksgiving(US)
weekend: [ 1,0,0,0,0,0,1 ] // [ day index values: sun=0, mon=1, tue=2, wed=3, thu=4, fri=5, sat=6 ]
};
config.macros.date.handler = function(place,macroName,params)
{
// do we want to see a link, a popup, or just a formatted date?
var mode="display";
if (params[0]=="display") { mode=params[0]; params.shift(); }
if (params[0]=="popup") { mode=params[0]; params.shift(); }
if (params[0]=="link") { mode=params[0]; params.shift(); }
// get the date
var now = new Date();
var date = now;
if (!params[0] || params[0]=="today")
{ params.shift(); }
else if (params[0]=="filedate")
{ date=new Date(document.lastModified); params.shift(); }
else if (params[0]=="tiddler")
{ date=store.getTiddler(story.findContainingTiddler(place).id.substr(7)).modified; params.shift(); }
else if (params[0].substr(0,8)=="tiddler:")
{ var t; if ((t=store.getTiddler(params[0].substr(8)))) date=t.modified; params.shift(); }
else {
var y = eval(params.shift().replace(/Y/ig,(now.getYear()<1900)?now.getYear()+1900:now.getYear()));
var m = eval(params.shift().replace(/M/ig,now.getMonth()+1));
var d = eval(params.shift().replace(/D/ig,now.getDate()+0));
date = new Date(y,m-1,d);
}
// date format with optional custom override
var format=this.format; if (params[0]) format=params.shift();
var linkformat=this.linkformat; if (params[0]) linkformat=params.shift();
showDate(place,date,mode,format,linkformat);
}
window.showDate=showDate;
function showDate(place,date,mode,format,linkformat,autostyle,weekend)
{
if (!mode) mode="display";
if (!format) format=config.macros.date.format;
if (!linkformat) linkformat=config.macros.date.linkformat;
if (!autostyle) autostyle=false;
// format the date output
var title = date.formatString(format);
var linkto = date.formatString(linkformat);
// just show the formatted output
if (mode=="display") { place.appendChild(document.createTextNode(title)); return; }
// link to a 'dated tiddler'
var link = createTiddlyLink(place, linkto, false);
link.appendChild(document.createTextNode(title));
link.title = linkto;
link.date = date;
link.format = format;
link.linkformat = linkformat;
// if using a popup menu, replace click handler for dated tiddler link
// with handler for popup and make link text non-italic (i.e., an 'existing link' look)
if (mode=="popup") {
link.onclick = onClickDatePopup;
link.style.fontStyle="normal";
}
// format the popup link to show what kind of info it contains (for use with calendar generators)
if (autostyle) setDateStyle(place,link,weekend);
}
//}}}
//{{{
// NOTE: This function provides default logic for setting the date style when displayed in a calendar
// To customize the date style logic, please see[[DatePluginConfig]]
function setDateStyle(place,link,weekend) {
// alias variable names for code readability
var date=link.date;
var fmt=link.linkformat;
var linkto=date.formatString(fmt);
var cmd=config.macros.date;
if ((weekend!==undefined?weekend:isWeekend(date))&&(cmd.weekendbg!=""))
{ place.style.background = cmd.weekendbg; }
if (hasModifieds(date)||hasCreateds(date)||hasTagged(date,fmt))
{ link.style.fontStyle="normal"; link.style.fontWeight="bold"; }
if (hasReminders(date))
{ link.style.textDecoration="underline"; }
if (isToday(date))
{ link.style.border="1px solid black"; }
if (isHoliday(date)&&(cmd.holidaybg!=""))
{ place.style.background = cmd.holidaybg; }
if (hasCreateds(date)&&(cmd.createdbg!=""))
{ place.style.background = cmd.createdbg; }
if (hasModifieds(date)&&(cmd.modifiedsbg!=""))
{ place.style.background = cmd.modifiedsbg; }
if ((hasTagged(date,fmt)||store.tiddlerExists(linkto))&&(cmd.linkedbg!=""))
{ place.style.background = cmd.linkedbg; }
if (hasReminders(date)&&(cmd.remindersbg!=""))
{ place.style.background = cmd.remindersbg; }
if (isToday(date)&&(cmd.todaybg!=""))
{ place.style.background = cmd.todaybg; }
if (config.options.chkShowJulianDate) { // optional display of Julian date numbers
var m=[0,31,59,90,120,151,181,212,243,273,304,334];
var d=date.getDate()+m[date.getMonth()];
var y=date.getFullYear();
if (date.getMonth()>1 && (y%4==0 && y%100!=0) || y%400==0)
d++; // after February in a leap year
wikify("@@font-size:80%;<br>"+d+"@@",place);
}
}
//}}}
//{{{
function isToday(date) // returns true if date is today
{ var now=new Date(); return ((now-date>=0) && (now-date<86400000)); }
function isWeekend(date) // returns true if date is a weekend
{ return (config.macros.date.weekend[date.getDay()]); }
function isHoliday(date) // returns true if date is a holiday
{
var longHoliday = date.formatString("0MM/0DD/YYYY");
var shortHoliday = date.formatString("0MM/0DD");
for(var i = 0; i < config.macros.date.holidays.length; i++) {
var holiday=config.macros.date.holidays[i];
if (holiday==longHoliday||holiday==shortHoliday) return true;
}
return false;
}
//}}}
//{{{
// Event handler for clicking on a day popup
function onClickDatePopup(e)
{
if (!e) var e = window.event;
var theTarget = resolveTarget(e);
var popup = Popup.create(this);
if(popup) {
// always show dated tiddler link (or just date, if readOnly) at the top...
if (!readOnly || store.tiddlerExists(this.date.formatString(this.linkformat)))
createTiddlyLink(popup,this.date.formatString(this.linkformat),true);
else
createTiddlyText(popup,this.date.formatString(this.linkformat));
if (!config.options.chkDatePopupHideCreated)
addCreatedsToPopup(popup,this.date,this.format);
if (!config.options.chkDatePopupHideChanged)
addModifiedsToPopup(popup,this.date,this.format);
if (!config.options.chkDatePopupHideTagged)
addTaggedToPopup(popup,this.date,this.linkformat);
if (!config.options.chkDatePopupHideReminders)
addRemindersToPopup(popup,this.date,this.linkformat);
}
Popup.show(popup,false);
e.cancelBubble = true;
if (e.stopPropagation) e.stopPropagation();
return(false);
}
//}}}
//{{{
function indexCreateds() // build list of tiddlers, hash indexed by creation date
{
var createds= { };
var tiddlers = store.getTiddlers("title","excludeLists");
for (var t = 0; t < tiddlers.length; t++) {
var date = tiddlers[t].created.formatString("YYYY0MM0DD")
if (!createds[date])
createds[date]=new Array();
createds[date].push(tiddlers[t].title);
}
return createds;
}
function hasCreateds(date) // returns true if date has created tiddlers
{
if (!config.macros.date.createds) config.macros.date.createds=indexCreateds();
return (config.macros.date.createds[date.formatString("YYYY0MM0DD")]!=undefined);
}
function addCreatedsToPopup(popup,when,format)
{
var force=(store.isDirty() && when.formatString("YYYY0MM0DD")==new Date().formatString("YYYY0MM0DD"));
if (force || !config.macros.date.createds) config.macros.date.createds=indexCreateds();
var indent=String.fromCharCode(160)+String.fromCharCode(160);
var createds = config.macros.date.createds[when.formatString("YYYY0MM0DD")];
if (createds) {
createds.sort();
var e=createTiddlyElement(popup,"div",null,null,"created ("+createds.length+")");
for(var t=0; t<createds.length; t++) {
var link=createTiddlyLink(popup,createds[t],false);
link.appendChild(document.createTextNode(indent+createds[t]));
createTiddlyElement(popup,"br",null,null,null);
}
}
}
//}}}
//{{{
function indexModifieds() // build list of tiddlers, hash indexed by modification date
{
var modifieds= { };
var tiddlers = store.getTiddlers("title","excludeLists");
for (var t = 0; t < tiddlers.length; t++) {
var date = tiddlers[t].modified.formatString("YYYY0MM0DD")
if (!modifieds[date])
modifieds[date]=new Array();
modifieds[date].push(tiddlers[t].title);
}
return modifieds;
}
function hasModifieds(date) // returns true if date has modified tiddlers
{
if (!config.macros.date.modifieds) config.macros.date.modifieds = indexModifieds();
return (config.macros.date.modifieds[date.formatString("YYYY0MM0DD")]!=undefined);
}
function addModifiedsToPopup(popup,when,format)
{
var date=when.formatString("YYYY0MM0DD");
var force=(store.isDirty() && date==new Date().formatString("YYYY0MM0DD"));
if (force || !config.macros.date.modifieds) config.macros.date.modifieds=indexModifieds();
var indent=String.fromCharCode(160)+String.fromCharCode(160);
var mods = config.macros.date.modifieds[date];
if (mods) {
// if a tiddler was created on this date, don't list it in the 'changed' section
if (config.macros.date.createds && config.macros.date.createds[date]) {
var temp=[];
for(var t=0; t<mods.length; t++)
if (!config.macros.date.createds[date].contains(mods[t]))
temp.push(mods[t]);
mods=temp;
}
mods.sort();
var e=createTiddlyElement(popup,"div",null,null,"changed ("+mods.length+")");
for(var t=0; t<mods.length; t++) {
var link=createTiddlyLink(popup,mods[t],false);
link.appendChild(document.createTextNode(indent+mods[t]));
createTiddlyElement(popup,"br",null,null,null);
}
}
}
//}}}
//{{{
function hasTagged(date,format) // returns true if date is tagging other tiddlers
{
return store.getTaggedTiddlers(date.formatString(format)).length>0;
}
function addTaggedToPopup(popup,when,format)
{
var indent=String.fromCharCode(160)+String.fromCharCode(160);
var tagged=store.getTaggedTiddlers(when.formatString(format));
if (tagged.length) var e=createTiddlyElement(popup,"div",null,null,"tagged ("+tagged.length+")");
for(var t=0; t<tagged.length; t++) {
var link=createTiddlyLink(popup,tagged[t].title,false);
link.appendChild(document.createTextNode(indent+tagged[t].title));
createTiddlyElement(popup,"br",null,null,null);
}
}
//}}}
//{{{
function indexReminders(date,leadtime) // build list of tiddlers with reminders, hash indexed by reminder date
{
var reminders = { };
if(window.findTiddlersWithReminders!=undefined) { // reminder plugin is installed
// DEBUG var starttime=new Date();
var t = findTiddlersWithReminders(date, [0,leadtime], null, null, 1);
for(var i=0; i<t.length; i++) reminders[t[i].matchedDate]=true;
// DEBUG var out="Found "+t.length+" reminders in "+((new Date())-starttime+1)+"ms\n";
// DEBUG out+="startdate: "+date.toLocaleDateString()+"\n"+"leadtime: "+leadtime+" days\n\n";
// DEBUG for(var i=0; i<t.length; i++) { out+=t[i].matchedDate.toLocaleDateString()+" "+t[i].params.title+"\n"; }
// DEBUG alert(out);
}
return reminders;
}
function hasReminders(date) // returns true if date has reminders
{
if (window.reminderCacheForCalendar)
return window.reminderCacheForCalendar[date]; // use calendar cache
if (!config.macros.date.reminders)
config.macros.date.reminders = indexReminders(date,90); // create a 90-day leadtime reminder cache
return (config.macros.date.reminders[date]);
}
function addRemindersToPopup(popup,when,format)
{
if(window.findTiddlersWithReminders==undefined) return; // reminder plugin not installed
var indent = String.fromCharCode(160)+String.fromCharCode(160);
var reminders=findTiddlersWithReminders(when, [0,31],null,null,1);
createTiddlyElement(popup,"div",null,null,"reminders ("+(reminders.length||"none")+")");
for(var t=0; t<reminders.length; t++) {
link = createTiddlyLink(popup,reminders[t].tiddler,false);
var diff=reminders[t].diff;
diff=(diff<1)?"Today":((diff==1)?"Tomorrow":diff+" days");
var txt=(reminders[t].params["title"])?reminders[t].params["title"]:reminders[t].tiddler;
link.appendChild(document.createTextNode(indent+diff+" - "+txt));
createTiddlyElement(popup,"br",null,null,null);
}
if (readOnly) return; // omit "new reminder..." link
var link = createTiddlyLink(popup,indent+"new reminder...",true); createTiddlyElement(popup,"br");
var title = when.formatString(format);
link.title="add a reminder to '"+title+"'";
link.onclick = function() {
// show tiddler editor
story.displayTiddler(null, title, 2, null, null, false, false);
// find body 'textarea'
var c =document.getElementById("tiddler" + title).getElementsByTagName("*");
for (var i=0; i<c.length; i++) if ((c[i].tagName.toLowerCase()=="textarea") && (c[i].getAttribute("edit")=="text")) break;
// append reminder macro to tiddler content
if (i<c.length) {
if (store.tiddlerExists(title)) c[i].value+="\n"; else c[i].value="";
c[i].value += "<<reminder";
c[i].value += " day:"+when.getDate();
c[i].value += " month:"+(when.getMonth()+1);
c[i].value += " year:"+when.getFullYear();
c[i].value += ' title:"Enter a title" >>';
}
};
}
//}}}
/***
|Name|DatePluginConfig|
|Source|http://www.TiddlyTools.com/#DatePluginConfig|
|Documentation|http://www.TiddlyTools.com/#DatePluginInfo|
|Version|2.6.0|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides||
|Description|formats, background colors and other optional settings for DatePlugin|
***/
// // Default popup content display options (can be overridden by cookies)
//{{{
if (config.options.chkDatePopupHideCreated===undefined)
config.options.chkDatePopupHideCreated=false;
if (config.options.chkDatePopupHideChanged===undefined)
config.options.chkDatePopupHideChanged=false;
if (config.options.chkDatePopupHideTagged===undefined)
config.options.chkDatePopupHideTagged=false;
if (config.options.chkDatePopupHideReminders===undefined)
config.options.chkDatePopupHideReminders=false;
//}}}
// // show Julian date number below regular date
//{{{
if (config.options.chkShowJulianDate===undefined)
config.options.chkShowJulianDate=false;
//}}}
// // fixed-date annual holidays
//{{{
config.macros.date.holidays=[
"01/01", // NewYearsDay,
"07/04", // US Independence Day
"07/24" // Eric's Birthday (hooray!)
];
//}}}
// // weekend map (1=weekend, 0=weekday)
//{{{
config.macros.date.weekend=[ 1,0,0,0,0,0,1 ]; // day index values: sun=0, mon=1, tue=2, wed=3, thu=4, fri=5, sat=6
//}}}
// // date display/link formats
//{{{
config.macros.date.format="YYYY.0MM.0DD"; // default date display format
config.macros.date.linkformat="YYYY.0MM.0DD"; // 'dated tiddler' link format
//}}}
// // When displaying a calendar (see [[CalendarPlugin]]), you can customize the colors/styles that are applied to the calendar dates by modifying the values and/or functions below:
//{{{
// default calendar colors
config.macros.date.weekendbg="#c0c0c0";
config.macros.date.holidaybg="#ffaace";
config.macros.date.createdbg="#bbeeff";
config.macros.date.modifiedsbg="#bbeeff";
config.macros.date.linkedbg="#babb1e";
config.macros.date.remindersbg="#c0ffee";
// apply calendar styles
function setDateStyle(place,link,weekend) {
// alias variable names for code readability
var date=link.date;
var fmt=link.linkformat;
var linkto=date.formatString(fmt);
var cmd=config.macros.date;
if ((weekend!==undefined?weekend:isWeekend(date))&&(cmd.weekendbg!=""))
{ place.style.background = cmd.weekendbg; }
if (hasModifieds(date)||hasCreateds(date)||hasTagged(date,fmt))
{ link.style.fontStyle="normal"; link.style.fontWeight="bold"; }
if (hasReminders(date))
{ link.style.textDecoration="underline"; }
if (isToday(date))
{ link.style.border="1px solid black"; }
if (isHoliday(date)&&(cmd.holidaybg!=""))
{ place.style.background = cmd.holidaybg; }
if (hasCreateds(date)&&(cmd.createdbg!=""))
{ place.style.background = cmd.createdbg; }
if (hasModifieds(date)&&(cmd.modifiedsbg!=""))
{ place.style.background = cmd.modifiedsbg; }
if ((hasTagged(date,fmt)||store.tiddlerExists(linkto))&&(cmd.linkedbg!=""))
{ place.style.background = cmd.linkedbg; }
if (hasReminders(date)&&(cmd.remindersbg!=""))
{ place.style.background = cmd.remindersbg; }
if (isToday(date)&&(cmd.todaybg!=""))
{ place.style.background = cmd.todaybg; }
if (config.options.chkShowJulianDate) {
var m=[0,31,59,90,120,151,181,212,243,273,304,334];
var d=date.getDate()+m[date.getMonth()];
var y=date.getFullYear();
if (date.getMonth()>1 && (y%4==0 && y%100!=0) || y%400==0) d++; // after February in a leap year
wikify("@@font-size:80%;<br>"+d+"@@",place);
}
}
//}}}
|Name|DatePluginInfo|
|Source|http://www.TiddlyTools.com/#DatePlugin|
|Documentation|http://www.TiddlyTools.com/#DatePluginInfo|
|Version|2.7.0|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|documentation|
|Requires||
|Overrides||
|Description|documentation for DatePlugin|
There are quite a few calendar generators, reminders, to-do lists, 'dated tiddlers' journals, blog-makers and GTD-like schedule managers that have been built around TW. While they all have different purposes, and vary in format, interaction, and style, in one way or another each of these plugins displays and/or uses date-based information to make finding, accessing and managing relevant tiddlers easier. This plugin provides a general approach to embedding dates and date-based links/menus within tiddler content.
!!!!!Usage
<<<
This plugin display formatted dates, for the specified year, month, day using number values or mathematical expressions such as (Y+1) or (D+30). Optionally, you can create a link from the formatted output to a 'dated tiddler' for quick blogging or create a popup menu that includes the dated tiddler link plus links to tiddlers that were created/changed on that date, or are tagged with that date, as well as links to any pending reminders for the coming 31 days (if the RemindersPlugin is installed). This plugin also provides a public API for easily incorporating formatted date output (with or without the links/popups) into other plugins, such as calendar generators, etc.
This plugin defines a macro: {{{<<date [mode] [date] [format] [linkformat]>>}}}. All of the macro parameters are optional and, in it's simplest form, {{{<<date>>}}}, it is equivalent to the ~TiddlyWiki core macro, {{{<<today>>}}}.
However, where {{{<<today>>}}} simply inserts the current date/time in a predefined format (or custom format, using {{{<<today [format]>>}}}), the {{{<<date>>}}} macro's parameters take it much further than that:
* [mode] is either ''display'', ''link'' or ''popup''. If omitted, it defaults to ''display''. This param let's you select between simply displaying a formatted date, or creating a link to a specific 'date titled' tiddler or a popup menu containing a dated tiddler link, plus links to changes and reminders.
* [date] lets you enter ANY date (not just today) as ''year, month, and day values or simple mathematical expressions'' using pre-defined variables, Y, M, and D for the current year, month and day, repectively. You can display the modification date of the current tiddler by using the keyword: ''tiddler'' in place of the year, month and day parameters. Use ''tiddler://name-of-tiddler//'' to display the modification date of a specific tiddler. You can also use keywords ''today'' or ''filedate'' to refer to these //dynamically changing// date/time values.
* [format] and [linkformat] uses standard ~TiddlyWiki date formatting syntax. The default is "YYYY.0MM.0DD"
>^^''DDD'' - day of week in full (eg, "Monday"), ''DD'' - day of month, ''0DD'' - adds leading zero^^
>^^''MMM'' - month in full (eg, "July"), ''MM'' - month number, ''0MM'' - adds leading zero^^
>^^''YYYY'' - full year, ''YY'' - two digit year, ''hh'' - hours, ''mm'' - minutes, ''ss'' - seconds^^
>^^//note: use of hh, mm or ss format codes is only supported with ''tiddler'', ''today'' or ''filedate'' values//^^
* [linkformat] - specify an alternative date format so that the title of a 'dated tiddler' link can have a format that differs from the date's displayed format
In addition to the macro syntax, DatePlugin also provides a public javascript API so that other plugins that work with dates (such as calendar generators, etc.) can quickly incorporate date formatted links or popups into their output:
''{{{showDate(place, date, mode, format, linkformat, autostyle, weekend)}}}''
Note that in addition to the parameters provided by the macro interface, the javascript API also supports two optional true/false parameters:
* [autostyle] - when true, the font/background styles of formatted dates are automatically adjusted to show the date's status: 'today' is boxed, 'changes' are bold, 'reminders' are underlined, while weekends and holidays (as well as changes and reminders) can each have a different background color to make them more visibly distinct from each other.
* [weekend] - true indicates a weekend, false indicates a weekday. When this parameter is omitted, the plugin uses internal defaults to automatically determine when a given date falls on a weekend.
<<<
!!!!!Examples
<<<
The current date: <<date>>
The current time: <<date today "0hh:0mm:0ss">>
Today's blog: <<date link today "DDD, MMM DDth, YYYY">>
Recent blogs/changes/reminders: <<date popup Y M D-1 "yesterday">> <<date popup today "today">> <<date popup Y M D+1 "tomorrow">>
The first day of next month will be a <<date Y M+1 1 "DDD">>
This tiddler (DatePlugin) was last updated on: <<date tiddler "DDD, MMM DDth, YYYY">>
The SiteUrl was last updated on: <<date tiddler:SiteUrl "DDD, MMM DDth, YYYY">>
This document was last saved on <<date filedate "DDD, MMM DDth, YYYY at 0hh:0mm:0ss">>
<<date 2006 07 24 "MMM DDth, YYYY">> will be a <<date 2006 07 24 "DDD">>
<<<
!!!!!Revisions
<<<
2008.03.08 [2.7.0] in addModifiedsToPopup(), if a tiddler was created on the specified date, don't list it in the 'changed' section of the popup. Based on a request from Kashgarinn
2008.01.31 [2.6.0] refactored date style logic into separate setDateStyle() function so it can be overridden by a custom definition. See [[DatePluginConfig]].
2008.01.11 [2.5.0] added options to selectively suppress created/changes/tagged/reminders popup content
2008.01.08 [*.*.*] plugin size reduction: documentation moved to DatePluginInfo
2007.11.21 [2.4.0] added hasTagged() and addTaggedToPopup() to list any tiddlers that has been tagged using the title of the dated journal tiddler asa tag value (i.e., the tiddlers that will be listed in the standard "tagging" display when viewing the journal tiddler itself). Based on a request from Coby.
2007.06.20 [2.3.1] in onClickDatePopup(), use Popup.show() instead of deprecated ScrollToTiddlerPopup(). Fixes fatal error that prevents popups from being properly displayed
2007.05.31 [2.3.0] list "created" tiddlers in date popup. Also, force re-cache of created/modified indices when displaying current date and store.isDirty(), so that popup is kept in sync with tiddler changes.
2006.05.09 [2.2.1] added "todaybg" handling to set background color of current date. Also, honor excludeLists tag when getting lists of tiddlers. Based on suggestions by Mark Hulme.
2006.05.05 [2.2.0] added "linkedbg" handling to set background color when a 'dated tiddler' exists. Based on a suggestion by Mark Hulme.
2006.03.08 [2.1.2] add 'override leadtime' flag param in call to findTiddlersWithReminders(), and add "Enter a title" default text to new reminder handler. Thanks to Jeremy Sheeley for these additional tweaks.
2006.03.06 [2.1.0] hasReminders() nows uses window.reminderCacheForCalendar[] when present. If calendar cache is not present, indexReminders() now uses findTiddlersWithReminders() with a 90-day look ahead to check for reminders. Also, switched default background colors for autostyled dates: reminders are now greenish ("c0ffee") and holidays are now reddish ("ffaace").
2006.02.14 [2.0.5] when readOnly is set (by TW core), omit "new reminders..." popup menu item and, if a "dated tiddler" does not already exist, display the date as simple text instead of a link.
2006.02.05 [2.0.4] added var to variables that were unintentionally global. Avoids FireFox 1.5.0.1 crash bug when referencing global variables
2006.01.18 [2.0.3] In 1.2.x the tiddler editor's text area control was given an element ID=("tiddlerBody"+title), so that it was easy to locate this field and programmatically modify its content. With the addition of configuration templates in 2.x, the textarea no longer has an ID assigned. To find this control we now look through all the child nodes of the tiddler editor to locate a "textarea" control where attribute("edit") equals "text", and then append the new reminder to the contents of that control.
2006.01.11 [2.0.2] correct 'weekend' override detection logic in showDate()
2006.01.10 [2.0.1] allow custom-defined weekend days (default defined in config.macros.date.weekend[] array)
added flag param to showDate() API to override internal weekend[] array
2005.12.27 [2.0.0] Update for TW2.0
Added parameter handling for 'linkformat'
2005.12.21 [1.2.2] FF's date.getYear() function returns 105 (for the current year, 2005). When calculating a date value from Y M and D expressions, the plugin adds 1900 to the returned year value get the current year number. But IE's date.getYear() already returns 2005. As a result, plugin calculated date values on IE were incorrect (e.g., 3905 instead of 2005). Adding +1900 is now conditional so the values will be correct on both browsers.
2005.11.07 [1.2.1] added support for "tiddler" dynamic date parameter
2005.11.06 [1.2.0] added support for "tiddler:title" dynamic date parameter
2005.11.03 [1.1.2] when a reminder doesn't have a specified title parameter, use the title of the tiddler that contains the reminder as "fallback" text in the popup menu. Based on a suggestion from BenjaminKudria.
2005.11.03 [1.1.1] Temporarily bypass hasReminders() logic to avoid excessive overhead from generating the indexReminders() cache. While reminders can still appear in the popup menu, they just won't be indicated by auto-styling the date number that is displayed. This single change saves approx. 60% overhead (5 second delay reduced to under 2 seconds).
2005.11.01 [1.1.0] corrected logic in hasModifieds() and hasReminders() so caching of indexed modifieds and reminders is done just once, as intended. This should hopefully speed up calendar generators and other plugins that render multiple dates...
2005.10.31 [1.0.1] documentation and code cleanup
2005.10.31 [1.0.0] initial public release
2005.10.30 [0.9.0] pre-release
<<<
Her er den helt nemme (ligesom vi plejer):
*Klik på kalenderen på den dato sangtimen skal være.
*Klik på @@color(#0099cc):wysiwyg@@ ([[Læs om Wysiwyg her|Wysiwyg]])
*Lav en tabel eller skriv - som du plejer i et skriveprogram. (//@@color(#3366ff):wysiwyg@@ (What You See Is What You Get) ER et helt almindeligt skriveprogram//)
*Gem til nettet. //<<tiddler ToggleRightSidebar with: "(Sidepanel)">> <<upload http://sang.tiddlyspot.com/store.cgi index.html . . sang>> - husk koden: kultur <<option pasUploadPassword>> under <<slider chkSliderOptionsPanel OptionsPanel "Muligheder »" "Change TiddlyWiki advanced options">>//
!!Den sjove!!
*Klik <<newJournal label:"FredagsHjælp" text:{{"<<formTiddler FredagsTemplate\>\>"}} tag:"Sang">> eller <<newJournal label:"OnsdagsHjælp" text:{{"<<formTiddler OnsdagsTemplate\>\>"}} tag:"Sang">>
*Lav titlen om til den aktuelle dato
*Klik på sangtitlerne indtil du er tilfreds med resultatet //(NB!: De første 6 er fra bogen - de næste fra mappen - Du kan vælge at sortere mere blandet ved at klikke på kolonnetitlen - vil du starte forfra - klikker du reset)//
*Kopiér teksten i tabellen (uden at gå i redigér)
*Sæt ind i [[RegneArk]]et i arket "Indskrivningsskabelon"
*Udfyld manglende oplysninger
*Kopiér
**Klik <<newJournal label:"Ny FredagsSangtime" tag:"Sang" text:"!HUSK at ændre titelen til den aktuelle dato!!!
!!Fredagssangtimen
|sortable|k
" >> eller <<newJournal label:"Ny Sang/fortælling" tag:"Sang" text:"!HUSK at ændre titelen til den aktuelle dato!!!
!!Sang/fortælling
|sortable|k
" >>
** Ændre titlen til den aktuelle dato
** Indsæt regnearksinholdet under |sortable|k
** Markér det netop indkopierede
** Klik convert i QuickEditMenuen
** Vælg tab -> table (Slet evt overskydende || i bunden af resultatet)
** Færdig
** Nu har vi en sortérbar tabel med dd. og tagget Sang. (= Flueben i [[Aktuel|Sang]] er sat automatisk!)
!!! Husk at gemme!!
/%
|Name|DigitalClock|
|Source|http://www.TiddlyTools.com/#DigitalClock|
|Version|1.0.0|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|script|
|Requires|InlineJavascriptPlugin|
|Overrides||
|Description|display current time with automatic LIVE update|
Usage: <<tiddler DigitalClock with: format tick>>
where 'format' is any TiddlyWiki date/time formatting string
and 'tick' is the time in seconds between display updates (default=1sec)
For example, use:
<< ... "0hh:0mm" 60>>
to show hours and minutes only, updated once per minute
%/<script>
window.DigitalClock_tick=function(id){
var e=document.getElementById(id); if (!e) return;
e.title='click to '+(e.paused?'RESUME':'PAUSE')+' clock display';
if (e.paused) return;
e.innerHTML=new Date().formatString(e.fmt);
setTimeout('window.DigitalClock_tick('+id+')',e.tick*1000);
}
var e=createTiddlyElement(place,'a',new Date().getTime()+Math.random());
e.onclick=function(){this.paused=!this.paused;window.DigitalClock_tick(this.id);}
e.style.cursor='pointer';
e.fmt=('$1'=='$'+'1')?'hh12:0mm:0ss am':'$1';
e.tick=('$2'=='$'+'2')?'1':'$2';
window.DigitalClock_tick(e.id);
</script>
<html><iframe style="background-color:#ffffff; border-color:#ffffff; border:none;" width="415" height="372" frameborder="0"
scrolling="no" src="http://dr.dk/odp/player.aspx?uniqueid=&mt=livetab&st=liveTab_1&furl=/odp/live/live_DR1.html%3Fintermissionbg%3Danbefalede.jpg%23c0&surl=http%3A//simulcast.dr.dk/index.php%3Furl%3Dmms%3A//drcluster.jay.net/DR1"></iframe></html>
<html><iframe style="background-color:#ffffff; border-color:#ffffff; border:none;" width="415" height="372" frameborder="0"
scrolling="no" src="http://dr.dk/odp/player.aspx?uniqueid=&mt=livetab&st=liveTab_1&furl=/odp/live/live_DR2.html%3Fintermissionbg%3Danbefalede.jpg%23c0&surl=http%3A//simulcast.dr.dk/index.php%3Furl%3Dmms%3A//drcluster.jay.net/DR2"></iframe></html>
|Dr1|Dr2|h
|<<miniBrowser hidecontrols http://www.dr.dk/tjenester/programoversigten/w3c/inc/channel.aframe?channel=WODR1&seldate=0&seltime=1>>|<<miniBrowser hidecontrols http://www.dr.dk/tjenester/programoversigten/w3c/inc/channel.aframe?channel=WODR2&seldate=0&seltime=1>>|
[img(100%,+)[http://xn--mns-ula.dk/Billeder/images/DigiD.png]]
<html><div align="center"><iframe src="http://xn--mns-ula.dk/Billeder/images/DigiEb.png" frameborder="2" width="100%" height="700"></iframe></div></html>
<!--{{{-->
<div class='toolbar' macro='toolbar [[ToolbarCommands::EditToolbar]] wikibar'></div>
<div class='title' macro='view title'></div>
<div class='editor' macro='edit title'></div>
<div macro='annotations'></div>
<div macro='tiddler QuickEditToolbar'></div>
<div class='editor' macro='edit tags'></div>
<div macro='showWhen tiddler.tags.contains("Emner") || tiddler.title =="Skriv navnet på dit nye hovedemne her"'>[[TopicNote]]</div>
<div macro='showWhen tiddler.tags.contains("Note") || tiddler.title =="Ny Note"'>[[NoteNote]]</div>
<div class='editor' macro='edit text'></div>
<!--}}}-->
<<forEachTiddler
where
'tiddler.tags.contains("authorbook") && tiddler.data("author")'
sortBy 'tiddler.data("author")'
write
'"{{indent{"+tiddler.data("author")+".}}} {{indent{//"+tiddler.data("booktitle")+"//}}} {{indent{[[here|"+tiddler.title+"]]}}}<br>\n"'
>>
<<forEachTiddler
where 'tiddler.tags.contains("authorbook") && tiddler.data("primtopic")'
sortBy 'GroupTitle = tiddler.data("primtopic")+"###"+tiddler.data("booktitle")'
script 'function getGroupTitle(tiddler, context) {
if (!context.lastGroup || context.lastGroup != tiddler.data("primtopic"))
{
context.lastGroup = tiddler.data("primtopic");
return "!! {{{"+(context.lastGroup?context.lastGroup:"no categorizados")+"}}}\n";
} else return "";}'
write
'getGroupTitle(tiddler, context)+"** [["+tiddler.title+"]]\n"'
>>
<<forEachTiddler
where
'tiddler.tags.contains("authorbook") && tiddler.data("booktitle")'
sortBy 'tiddler.data("booktitle")'
write
'"#{{indent{//"+tiddler.data("booktitle")+"//}}} {{indent{"+tiddler.data("author")+".}}} {{indent{[[here|"+tiddler.title+"]]}}}<br>\n"'
>>
!!Sang/fortælling
|sortable|k
|Titel|Kilde|nr|h
|Wonderful tonight |(b) | 294|
|Dream A Little Dream of Me|(m)| 34|
|Go Down Moses|(m)| 9|
|Jutlandia|(m)| 16|
|Hører du nogen kalde|(m)| 31|
/%
|Beskrivelse|Lav sangtimetabellen i en Html-formular|
%/
{{small{
__Lav sangtimetabellen i en Html-formular__
The following HTML demonstrates a technique for using an HTML form, rendered in a tiddler, to input and create tiddlers with custom-formatted content
!!!!Try it:
{{smallform{
<html><hide linebreaks><!-- see HTMLFormattingPlugin --><form action="javascript:;"
onsubmit="
/* validate new title */
var t=this.title.value;
if (!t.length || t==this.title.defaultValue)
{ alert('A title is required'); this.title.focus(); return false; }
if (store.tiddlerExists(t) && !confirm(config.messages.overwriteWarning.format([t])))
{ this.title.focus(); return false; }
/* get current tiddler (if any) */
var tid=store.getTiddler(t);
var who=tid?tid.modifier:config.options.txtUserName;
var when=tid?tid.modified:new Date();
var txt=tid?tid.text:'';
var tags=tid?tid.tags:[];
var fields=tid?tid.fields:{};
/* get form values and construct new tiddler text */
var fmt='|%0|%1|\n%2\n';
var newtxt=fmt.format([this.field1.value,this.field2.value,this.field3.value,this.field4.value,this.field5.value,this.field6.value,this.field7.value,this.field8.value,this.field9.value,this.field10.value,this.field11.value,this.field12.value]);
/* insert new text at marker (or end, if no marker) */
var marker='/%MARKER%/';
if (txt.indexOf(marker)==-1) txt=txt+newtxt;
else txt=txt.replace(new RegExp(marker.escapeRegExp()),newtxt+marker);
/* get new tags and add to existing tags (if any) */
var newtags=this.tagsfield.value.readBracketedList();
for (var i=0; i<newtags.length; i++) tags.pushUnique(newtags[i]);
/* write and show tiddler */
store.saveTiddler(t,t,txt, who, when, tags, fields);
story.displayTiddler(story.findContainingTiddler(this),t);
return false;">
Title <input name="title" value="Skriv dato" onfocus="this.select()">
Sang1 <input name="field1" value="sortable|k\n" onfocus="this.select()">
Sang2 <input name="field2" value="Sang1 value" onfocus="this.select()">
Sang3 <input name="field3" value="Sang2 value" onfocus="this.select()">
Sang4 <input name="field4" value="Sang3 value" onfocus="this.select()">
Sang5 <input name="field5" value="Sang4 value" onfocus="this.select()">
Sang6 <input name="field6" value="Sang5 value" onfocus="this.select()">
Sang7 <input name="field7" value="Sang6 value" onfocus="this.select()">
Sang8 <input name="field8" value="Sang7 value" onfocus="this.select()">
Sang9 <input name="field9" value="Sang8 value" onfocus="this.select()">
Sang10 <input name="field10" value="Sang9 value" onfocus="this.select()">
Sang11 <input name="field11" value="Sang10 value" onfocus="this.select()">
Sang12 <input name="field12" value="Sang11 value" onfocus="this.select()"><br>
<textarea name="Kommentarer" rows=5 style="width:100%;">Kommentarer skrives her</textarea><br>
<input name="tagsfield" value="Sang" style="width:100%;"><br>
<input type="submit" value="create tiddler">
</form></html>
}}}
}}}
/***
|Name:|ExtentTagButtonPlugin|
|Description:|Adds a New tiddler button in the tag drop down|
|Version:|3.2 ($Rev: 3861 $)|
|Date:|$Date: 2008-03-08 10:53:09 +1000 (Sat, 08 Mar 2008) $|
|Source:|http://mptw.tiddlyspot.com/#ExtendTagButtonPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License|http://mptw.tiddlyspot.com/#TheBSDLicense|
***/
//{{{
window.onClickTag_mptw_orig = window.onClickTag;
window.onClickTag = function(e) {
window.onClickTag_mptw_orig.apply(this,arguments);
var tag = this.getAttribute("tag");
var title = this.getAttribute("tiddler");
// Thanks Saq, you're a genius :)
var popup = Popup.stack[Popup.stack.length-1].popup;
createTiddlyElement(createTiddlyElement(popup,"li",null,"listBreak"),"div");
wikify("<<newTiddler label:'New tiddler' tag:'"+tag+"'>>",createTiddlyElement(popup,"li"));
return false;
}
//}}}
/%
|Description|Creating tiddlers from HTML forms|
%/
{{small{
__Create tiddlers using custom-built HTML forms__
The following HTML demonstrates a technique for using an HTML form, rendered in a tiddler, to input and create tiddlers with custom-formatted content
!!!!Example HTML
{{{
<html><hide linebreaks><!-- see HTMLFormattingPlugin --><form action="javascript:;"
onsubmit="
/* validate new title */
var t=this.title.value;
if (!t.length || t==this.title.defaultValue)
{ alert('A title is required'); this.title.focus(); return false; }
if (store.tiddlerExists(t) && !confirm(config.messages.overwriteWarning.format([t])))
{ this.title.focus(); return false; }
/* get current tiddler (if any) */
var tid=store.getTiddler(t);
var who=tid?tid.modifier:config.options.txtUserName;
var when=tid?tid.modified:new Date();
var txt=tid?tid.text:'';
var tags=tid?tid.tags:[];
var fields=tid?tid.fields:{};
/* get form values and construct new tiddler text */
var fmt='|%0|%1|\n%2\n';
var newtxt=fmt.format([this.field1.value,this.field2.value,this.field3.value]);
/* insert new text at marker (or end, if no marker) */
var marker='/%MARKER%/';
if (txt.indexOf(marker)==-1) txt=txt+newtxt;
else txt=txt.replace(new RegExp(marker.escapeRegExp()),newtxt+marker);
/* get new tags and add to existing tags (if any) */
var newtags=this.tagsfield.value.readBracketedList();
for (var i=0; i<newtags.length; i++) tags.pushUnique(newtags[i]);
/* write and show tiddler */
store.saveTiddler(t,t,txt, who, when, tags, fields);
story.displayTiddler(story.findContainingTiddler(this),t);
return false;">
Title <input name="title" value="enter a title" onfocus="this.select()">
Field1 <input name="field1" value="field1 value" onfocus="this.select()">
Field2 <input name="field2" value="field2 value" onfocus="this.select()"><br>
<textarea name="field3" rows=5 style="width:100%;">field3 value goes here</textarea><br>
<input name="tagsfield" value="space-separated tags go here" style="width:100%;"><br>
<input type="submit" value="create tiddler">
</form></html>
}}}
!!!!Try it:
{{smallform{
<html><hide linebreaks><!-- see HTMLFormattingPlugin --><form action="javascript:;"
onsubmit="
/* validate new title */
var t=this.title.value;
if (!t.length || t==this.title.defaultValue)
{ alert('A title is required'); this.title.focus(); return false; }
if (store.tiddlerExists(t) && !confirm(config.messages.overwriteWarning.format([t])))
{ this.title.focus(); return false; }
/* get current tiddler (if any) */
var tid=store.getTiddler(t);
var who=tid?tid.modifier:config.options.txtUserName;
var when=tid?tid.modified:new Date();
var txt=tid?tid.text:'';
var tags=tid?tid.tags:[];
var fields=tid?tid.fields:{};
/* get form values and construct new tiddler text */
var fmt='|%0|%1|\n%2\n';
var newtxt=fmt.format([this.field1.value,this.field2.value,this.field3.value]);
/* insert new text at marker (or end, if no marker) */
var marker='/%MARKER%/';
if (txt.indexOf(marker)==-1) txt=txt+newtxt;
else txt=txt.replace(new RegExp(marker.escapeRegExp()),newtxt+marker);
/* get new tags and add to existing tags (if any) */
var newtags=this.tagsfield.value.readBracketedList();
for (var i=0; i<newtags.length; i++) tags.pushUnique(newtags[i]);
/* write and show tiddler */
store.saveTiddler(t,t,txt, who, when, tags, fields);
story.displayTiddler(story.findContainingTiddler(this),t);
return false;">
Title <input name="title" value="enter a title" onfocus="this.select()">
Field1 <input name="field1" value="field1 value" onfocus="this.select()">
Field2 <input name="field2" value="field2 value" onfocus="this.select()"><br>
<textarea name="field3" rows=5 style="width:100%;">field3 value goes here</textarea><br>
<input name="tagsfield" value="space-separated tags go here" style="width:100%;"><br>
<input type="submit" value="create tiddler">
</form></html>
}}}
}}}
/***
|''Name:''|FCKeditorPlugin|
|''Description:''|Wysiwyg editor for TiddlyWiki using FCKeditor.|
|''Version:''|1.1.1|
|''Date:''|Dec 21,2007|
|''Source:''|http://visualtw.ouvaton.org/VisualTW.html|
|''Author:''|Pascal Collin|
|''License:''|[[BSD open source license|License]]|
|''~CoreVersion:''|2.2.0|
|''Browser:''|Firefox 2.0; InternetExplorer 6.0, others|
!Demo:
On the plugin [[homepage|http://visualtw.ouvaton.org/VisualTW.html]], see and edit [[WysiwygDemo]].
!Installation:
#download and unzip [[FCKeditor|http://www.fckeditor.net/download]] (by default, in a wiki subfolder, such that the relative path "fckeditor/fckeditor.js" is right).
#import [[FCKeditorPlugin]] (systemConfig tagged)
#add the following text to MarkupPreHead : {{{<script type="text/javascript" src="fckeditor/fckeditor.js"></script>}}}
#customize FCKeditorPath if needed (in MarkupPreHead and in options below)
#save and reload
#use the <<toolbar editHtml>> button in the tiddler's toolbar (in default ViewTemplate) or add {{{editHtml}}} command in your own toolbar.
! Useful Addons
*[[HTMLFormattingPlugin|http://www.tiddlytools.com/#HTMLFormattingPlugin]] to embed wiki syntax in html tiddlers.<<br>>//__Tips__ : When this plugin is installed, you can use anchor syntax to link tiddlers in wysiwyg mode (example : #example). Anchors are converted back and from wiki syntax when editing.//
*[[TaggedTemplateTweak|http://www.TiddlyTools.com/#TaggedTemplateTweak]] to use alternative ViewTemplate/EditTemplate for tiddler's tagged with specific tag values.
!Configuration options :
|FCKeditor folder (absolute or relative)|<<option txtFCKeditorPath>> |
|FCKeditor custom configuration script path (relative or absolute)<<br>>[[Example|fckeditor/editor/custom_config.js]] : {{{ fckeditor/editor/custom_config.js}}}|<<option txtFCKCustomConfigScript>>|
|Toolbar name ("Default", "Basic" or custom)<<br>>See [[FCKeditor documentation|http://wiki.fckeditor.net/Developer%27s_Guide/Configuration/Toolbar]] for more information on custom toolbars|<<option txtFCKToolbar>>|
|FCKeditor default height (if blank = 500px)|<<option txtFCKheight>>|
|Template called by the {{{wysiwyg}}} button|EditHtmlTemplate|
!Code
***/
//{{{
config.options.txtFCKeditorPath = config.options.txtFCKeditorPath ? config.options.txtFCKeditorPath : "fckeditor/";
config.options.txtFCKCustomConfigScript = config.options.txtFCKCustomConfigScript ? config.options.txtFCKCustomConfigScript : "";
config.options.txtFCKToolbar = config.options.txtFCKToolbar ? config.options.txtFCKToolbar : "";
config.options.txtFCKheight = config.options.txtFCKheight ? config.options.txtFCKheight : "500px";
config.macros.editHtml = {
handler : function(place,macroName,params,wikifier,paramString,tiddler) {
var field = params[0];
var height = params[1] ? params[1] : config.options.txtFCKheight;
if (typeof FCKeditor=="undefined"){
displayMessage(config.macros.editHtml.FCKeditorUnavailable);
config.macros.edit.handler(place,macroName,params,wikifier,paramString,tiddler);
}
else if (field) {
var e = createTiddlyElement(null,"div");
var fckName = "FCKeditor"+ Math.random();
if(tiddler.isReadOnly())
e.setAttribute("readOnly","readOnly");
e.setAttribute("editHtml",field);
if (height) e.setAttribute("height",height);
e.setAttribute("fckName",fckName);
place.appendChild(e);
var fck = new FCKeditor(fckName);
fck.BasePath = config.options.txtFCKeditorPath;
if (config.options.txtFCKCustomConfigScript) fck.Config["CustomConfigurationsPath"] = config.options.txtFCKCustomConfigScript ;
if (config.options.txtFCKToolbar) fck.ToolbarSet = config.options.txtFCKToolbar;
fck.Height=height;
var re = /^<html>(.*)<\/html>$/m;
var fieldValue=store.getValue(tiddler,field);
var htmlValue = re.exec(fieldValue);
var value = (htmlValue && (htmlValue.length>0)) ? htmlValue[1] : fieldValue;
value=value.replace(/\[\[([^|\]]*)\|([^\]]*)]]/g,'<a href="#$2">$1</a>');
config.macros.editHtml.FCKvalues[fckName]=value;
e.innerHTML = fck.CreateHtml();
}
},
gather : function(e) {
var name = e.getAttribute("fckName");
var oEditor = window.FCKeditorAPI ? FCKeditorAPI.GetInstance(name) : null;
if (oEditor) {
var html = oEditor.GetHTML();
if (html!=null)
return "<html>"+html.replace(/<a href="#([^>]*)">([^<]*)<\/a>/gi,"[[$2|$1]]")+"</html>";
}
},
FCKvalues : {},
FCKeditorUnavailable : "FCKeditor kunne ikke hentes. Check om du har internet og evt. også plugin konfigurationen og genopfrisk."
}
window.FCKeditor_OnComplete= function( editorInstance ) {
var name=editorInstance.Name;
var value = config.macros.editHtml.FCKvalues[name];
delete config.macros.editHtml.FCKvalues[name];
oEditor = FCKeditorAPI.GetInstance(name);
if (value) oEditor.SetHTML(value);
}
Story.prototype.previousGatherSaveEditHtml = Story.prototype.previousGatherSaveEditHtml ? Story.prototype.previousGatherSaveEditHtml : Story.prototype.gatherSaveFields; // to avoid looping if this line is called several times
Story.prototype.gatherSaveFields = function(e,fields){
if(e && e.getAttribute) {
var f = e.getAttribute("editHtml");
if(f){
var newVal = config.macros.editHtml.gather(e);
if (newVal) fields[f] = newVal;
}
this.previousGatherSaveEditHtml(e, fields);
}
};
config.shadowTiddlers.EditHtmlTemplate = config.shadowTiddlers.EditTemplate.replace(/macro='edit text'/,"macro='editHtml text'");
config.commands.editHtml={
text: "wysiwyg",
tooltip: "redigér denne tiddler med en RichText editor",
readOnlyText: "",
handler : function(event,src,title) {
clearMessage();
var tiddlerElem = document.getElementById(story.idPrefix + title);
var fields = tiddlerElem.getAttribute("tiddlyFields");
story.displayTiddler(null,title,"EditHtmlTemplate",false,null,fields);
return false;
}
}
config.shadowTiddlers.ViewTemplate = config.shadowTiddlers.ViewTemplate.replace(/\+editTiddler/,"+editTiddler editHtml");
//}}}
/***
|FileDropPlugin|h
|author : BradleyMeck|
|version : 0.1.1|
|date : Nov 13 2006|
|usage : drag a file onto the TW to have it be made into a tiddler|
|browser(s) supported : Mozilla|
Note: this version has been 'tweaked' by Eric Shulman (http://www.TiddlyTools.com) to add suspend/resume notification handling to improve performance when multiple files are dropped at once.
!Trouble Shooting
*If the plugin does not seem to work, open up the page "about:config" (just type it in the address bar) and make sure @@color(blue):signed.applets.codebase_principal_support@@ is set to @@color(blue):true@@
!Revisions
*Multiple File Dropping API updated, to end all capturing events after yours return a value that makes if(myFunctionsReturnValue) evaluate to true
*Added support for multiple file drop handlers
**Use the config.macros.fileDrop.addEventListener(@@color(green):String Flavor@@, @@color(green):Function handler(nsiFile){}@@, @@color(green):Boolean addToFront@@) function
***Standard Flavor is "application/x-moz-file"
***addToFront gives your handler priority over all others at time of add
*Old plugin would disallow drops of text vetween applications because it didn't check if the transfer was a file.
!Example Handler
*Adds simple file import control, add this to a tiddler tagged {{{systemConfig}}} to make file dropping work
{{{
config.macros.fileDrop.addEventListener("application/x-moz-file",function(nsiFile)
{
if(
confirm("You have dropped the file \""+nsiFile.path+"\" onto the page, it will be imported as a tiddler. Is that ok?")
)
{
var newDate = new Date();
var title = prompt("what would you like to name the tiddler?");
store.saveTiddler(title,title,loadFile(nsiFile.path),config.options.txtUserName,newDate,[]);
}
return true;
})
}}}
!Example Handler without popups and opening the tiddler on load
*Adds simple file import control, add this to a tiddler tagged {{{systemConfig}}} to make file dropping work
{{{
config.macros.fileDrop.addEventListener("application/x-moz-file",function(nsiFile)
{
var newDate = new Date();
store.saveTiddler(nsiFile.path,nsiFile.path,loadFile(nsiFile.path),config.options.txtUserName,newDate,[]);
story.displayTiddler(null,nsiFile.path)
return true;
})
}}}
!Code
***/
//{{{
config.macros.fileDrop = {version : {major : 0, minor : 0, revision: 1}};
config.macros.fileDrop.customDropHandlers = [];
config.macros.fileDrop.dragDropHandler = function(evt) {
netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
// Load in the native DragService manager from the browser.
var dragService = Components.classes["@mozilla.org/widget/dragservice;1"].getService(Components.interfaces.nsIDragService);
// Load in the currently-executing Drag/drop session.
var dragSession = dragService.getCurrentSession();
// Create an instance of an nsITransferable object using reflection.
var transferObject = Components.classes["@mozilla.org/widget/transferable;1"].createInstance();
// Bind the object explicitly to the nsITransferable interface. We need to do this to ensure that
// methods and properties are present and work as expected later on.
transferObject = transferObject.QueryInterface(Components.interfaces.nsITransferable);
// I've chosen to add only the x-moz-file MIME type. Any type can be added, and the data for that format
// will be retrieved from the Drag/drop service.
transferObject.addDataFlavor("application/x-moz-file");
// Get the number of items currently being dropped in this drag/drop operation.
var numItems = dragSession.numDropItems;
// ELS 2007.12.03: performance improvement when dropping multiple files
if (numItems>1) {
clearMessage();
displayMessage("Reading "+numItems+" files...");
store.suspendNotifications();
}
for (var i = 0; i < numItems; i++)
{
// Get the data for the given drag item from the drag session into our prepared
// Transfer object.
dragSession.getData(transferObject, i);
// We need to pass in Javascript 'Object's to any XPConnect method which
// requires OUT parameters. The out value will then be saved as a new
// property called Object.value.
var dataObj = {};
var dropSizeObj = {};
for(var ind = 0; ind < config.macros.fileDrop.customDropHandlers.length; ind++)
{
var item = config.macros.fileDrop.customDropHandlers[ind];
if(dragSession.isDataFlavorSupported(item.flavor))
{
transferObject.getTransferData(item.flavor, dataObj, dropSizeObj);
var droppedFile = dataObj.value.QueryInterface(Components.interfaces.nsIFile);
// Display all of the returned parameters with an Alert dialog.
var result = item.handler.call(item,droppedFile);
// Since the event is handled, prevent it from going to a higher-level event handler.
evt.stopPropagation();
evt.preventDefault();
if(result){break;}
}
}
}
// ELS 2007.12.03: performance improvement and feedback after dropping multiple files
if (numItems>1) {
store.resumeNotifications();
store.notifyAll();
displayMessage(numItems+" files have been processed");
}
}
if(!window.event)
{
// Register the event handler, and set the 'capture' flag to true so we get this event
// before it bubbles up through the browser.
window.addEventListener("dragdrop", config.macros.fileDrop.dragDropHandler , true);
}
config.macros.fileDrop.addEventListener = function(paramflavor,func,inFront)
{
var obj = {};
obj.flavor = paramflavor;
obj.handler = func;
if(!inFront)
{config.macros.fileDrop.customDropHandlers.push(obj);}
else{config.macros.fileDrop.customDropHandlers.shift(obj);}
}
//}}}
/***
|Name|FileDropPluginConfig|
|Source|http://www.TiddlyTools.com/#FileDropPluginConfig|
|Version|1.5.1|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires|FileDropPlugin, AttachFilePlugin|
|Overrides||
|Options|##Configuration|
|Description|Adds drag-and-drop handlers for creating binary attachments or directory lists|
__TiddlyTools FileDrop+AttachFile extended handler:__
* use just filename instead of whole path as tiddler title
* check for existing tiddler and prompt for new name
* handle folder drops (drops each file or creates a file list in a tiddler)
* use AttachFilePlugin if MIME type is not text/plain
* autotag created tiddlers (e.g., "temporary", "dropped", etc.)
* option to suppress automatic display of newly created tiddlers
* suspend/resume notifications when handling multiple files (performance improvement)
!!!!!Configuration
<<<
<<option chkFileDropTrimFilename>> Omit file extensions from tiddler titles when creating new tiddlers
{{{usage: <<option chkFileDropTrimFilename>> }}}
<<option chkFileDropDisplay>> Automatically display newly created tiddlers
{{{usage: <<option chkFileDropDisplay>> }}}
Tag newly created tiddlers with: <<option txtFileDropTags>>
{{{usage: <<option txtFileDropTags>>}}}
__FileDrop+AttachFile configuration options:__
<<option chkFileDropAttachLocalLink>> Include reference to local path/filename
{{{usage: <<option chkFileDropAttachLocalLink>> }}}
<<option chkFileDropAttachEncodeData>> Include binary file data as encoded "base64" text
{{{usage: <<option chkFileDropAttachEncodeData>> }}}
...only if file is smaller than: <<option txtFileDropAttachDataLimit>> bytes
{{{usage: <<option txtFileDropAttachDataLimit>>}}}
See [[FileDropPlugin]] for more documentation on handler implementation specifics, including sample code for default drop handlers.
<<<
!!!!!Revisions
<<<
2008.08.11 [1.5.1] added chkFileDropAttachLocalLink option to allow suppression of local path/file link
2007.01.01 [0.9.9] initial release with extensions for AttachFilePlugin
<<<
!!!!!Code
***/
//{{{
if (config.options.chkFileDropAttachEncodeData==undefined)
config.options.chkFileDropAttachEncodeData=true;
if (config.options.chkFileDropAttachLocalLink==undefined)
config.options.chkFileDropAttachLocalLink=true;
if (config.options.txtFileDropAttachDataLimit==undefined)
config.options.txtFileDropAttachDataLimit=32768;
if (config.options.txtFileDropTags==undefined)
config.options.txtFileDropTags="";
if (config.options.chkFileDropDisplay==undefined)
config.options.chkFileDropDisplay=true;
if (config.options.chkFileDropTrimFilename==undefined)
config.options.chkFileDropTrimFilename=false;
config.macros.fileDrop.addEventListener("application/x-moz-file",function(nsiFile)
{
var header="Index of %0\n^^(as of %1)^^\n|!filename| !size | !modified |\n";
var item="|[[%0|%1]]| %2|%3|\n";
var footer="Total of %0 bytes in %1 files\n";
var now=new Date();
var files=[nsiFile];
if (nsiFile.isDirectory()) {
var folder=nsiFile.directoryEntries;
var files=[];
while (folder.hasMoreElements()) {
var f=folder.getNext().QueryInterface(Components.interfaces.nsILocalFile);
if (f instanceof Components.interfaces.nsILocalFile && !f.isDirectory()) files.push(f);
}
var msg=nsiFile.path.replace(/\\/g,"/")+"\n\n";
msg+="contains "+files.length+" files... ";
msg+="select OK to attach all files or CANCEL to create a list...";
if (!confirm(msg)) { // create a list in a tiddler
var title=nsiFile.leafName; // tiddler name is last directory name in path
while (title && title.length && store.tiddlerExists(title)) {
if (confirm(config.messages.overwriteWarning.format([title]))) break; // use existing title
title=prompt("Please enter a different tiddler title for this file",nsiFile.path.replace(/\\/g,"/"));
}
if (!title || !title.length) return true; // aborted by user... we're done!
var text=header.format([nsiFile.path.replace(/\\/g,"/"),now.toLocaleString()]);
var total=0;
for (var i=0; i<files.length; i++) { var f=files[i];
var name=f.leafName;
if (config.options.chkFileDropTrimFilename)
{ var p=name.split("."); if (p.length>1) p.pop(); name=p.join("."); }
var path="file:///"+f.path.replace(/\\/g,"/");
var size=f.fileSize; total+=size;
var when=new Date(f.lastModifiedTime).formatString("YYYY.0MM.0DD 0hh:0mm:0ss");
text+=item.format([name,path,size,when]);
}
text+=footer.format([total,files.length]);
var newtags=config.options.txtFileDropTags?config.options.txtFileDropTags.readBracketedList():[];
store.saveTiddler(null,title,text,config.options.txtUserName,now,newtags);
if (config.options.chkFileDropDisplay) story.displayTiddler(null,title);
return true;
}
}
if (files.length>1) store.suspendNotifications();
for (i=0; i<files.length; i++) {
var file=files[i];
if (file.isDirectory()) continue; // skip over nested directories
var type="text/plain";
var title=file.leafName; // tiddler name is file name
if (config.options.chkFileDropTrimFilename)
{ var p=title.split("."); if (p.length>1) p.pop(); title=p.join("."); }
var path=file.path;
var size=file.fileSize;
while (title && title.length && store.tiddlerExists(title)) {
if (confirm(config.messages.overwriteWarning.format([title]))) break; // use existing title
title=prompt("Please enter a different tiddler title for this file",path.replace(/\\/g,"/"));
}
if (!title || !title.length) continue; // cancelled by user... skip this file
if (config.macros.attach) {
type=config.macros.attach.getMIMEType(file.leafName,"");
if (!type.length)
type=prompt("Unrecognized file type. Please enter a MIME type for this file","text/plain");
if (!type||!type.length) continue; // cancelled by user... skip this file
}
var newtags=config.options.txtFileDropTags?config.options.txtFileDropTags.readBracketedList():[];
if (type=="text/plain")
store.saveTiddler(null,title,loadFile(path),config.options.txtUserName,now,newtags);
else {
// only encode data if enabled and file is smaller than limit. Default is 32768 (32K) bytes.
var embed=config.options.chkFileDropAttachEncodeData
&& file.fileSize<config.options.txtFileDropAttachDataLimit;
newtags.push("attachment"); newtags.push("excludeMissing");
var localfile="";
if (config.options.chkFileDropAttachLocalLink) {
// if file is in current document folder,
// remove path prefix and use relative reference
var localfile=path;
var h=document.location.href;
folder=getLocalPath(decodeURIComponent(h.substr(0,h.lastIndexOf("/")+1)));
if (localfile.substr(0,folder.length)==folder)
localfile='./'+localfile.substr(folder.length);
}
config.macros.attach.createAttachmentTiddler(path,
now.formatString(config.macros.timeline.dateFormat),
"attached by FileDropPlugin", newtags,
title, embed, config.options.chkFileDropAttachLocalLink, false,
localfile, "", type,!config.options.chkFileDropDisplay);
}
if (config.options.chkFileDropDisplay) story.displayTiddler(null,title);
}
if (files.length>1) { store.resumeNotifications(); store.notifyAll(); }
if (window.FFDEBUG) console.log(new Date()-now);
return true;
})
//}}}
/***
|Name|FlickrGreetingMacro|
|Created by|PeterKirkland|
|Version|1.0.1|
|Requires|~TW2.x|
!Description
It replicates the random greeting messages from
[[Flickr|http://www.flickr.com/]] in a TiddlyWiki macro.
!History
* 25-Mar-06, version 1.0.1, couple of tweaks by SimonBaird
** added flickrGreetingCookie
** made WelcomeMessage into array literal
** removed ! since I wanted "Hola and welcome to..."
* 24-Mar-06, version 1.0.0, first version
!Examples
|!Source|!Output|h
|{{{<<flickrGreeting>>}}}|<<flickrGreeting>>|
|{{{<<flickrGreetingCookie>>}}}|<<flickrGreetingCookie>>|
|{{{<<flickrGreeting Peter>>}}}|<<flickrGreeting Peter>>|
|{{{<<flickrGreeting 'Peter Kirkland'>>}}}|<<flickrGreeting 'Peter Kirkland'>>|
(You can use (single or double) quotes or double square brackets for
params with spaces)
!Notes
*I created this to re-create the international greetings that Flickr uses.
*I use it in a tiddler linked to my DefaultTiddlers to get a pleasant welcome message!
*To make the macro work you have to give this tiddler a tag of systemConfig then save and reload.
*Thanks to Simon Baird for his HelloWorldMacro which taught me how to use macros, and also for his [[MonkeyPirateTiddlyWiki|http://simonbaird.com/mptw/]]!
!Code
***/
//{{{
// this part is not actually required but useful to other people using your plugin
version.extensions.FlickrGreetingMacro = { major: 1, minor: 0, revision: 1, date: new Date(2006,3,24) };
config.macros.flickrGreetingCookie = {};
config.macros.flickrGreetingCookie.handler = function (place,name,params) {
wikify("<<flickrGreeting " + config.options.txtUserName + ">>", place);
}
config.macros.flickrGreeting = {};
config.macros.flickrGreeting.handler = function (place,name,params) {
//List of greetings:
var WelcomeMessage = [
"Hola",
"Hala",
"Shalom",
"Ni hao",
"Kumusta",
"'Allo",
"G'day",
"Hoi",
"Giorno",
"Hi",
"Hej",
"Olá",
"Ahoy",
"Salut",
"Hello",
"Hoi",
"Oi",
"Hoi",
"Aloha",
"Bonjour",
"Guten Tag",
"Yo",
"Shalom",
"Namaste",
"Ciao"
];
//randomness:
var index = Math.floor(Math.random() * WelcomeMessage.length);
//output:
var who = params.length > 0 ? (" "+params[0]) : "";
wikify(WelcomeMessage[index] + who /* + "!" */, place);
}
//}}}
config.fontSize={};
//configuration settings
config.fontSize.settings =
{
defaultSize : 100, // all sizes in %
maxSize : 200,
minSize : 40,
stepSize : 10
};
//startup code
var fontSettings = config.fontSize.settings;
if (!config.options.txtFontSize)
{config.options.txtFontSize = fontSettings.defaultSize;
saveOptionCookie("txtFontSize");}
setStylesheet(".tiddler .viewer {font-size:"+config.options.txtFontSize+"%;}\n","fontResizerStyles");
setStylesheet("#contentWrapper .fontResizer .button {display:inline;font-size:105%; font-weight:bold; margin:0 1px; padding: 0 3px; text-align:center !important;}\n .fontResizer {margin:0 0.5em;}","fontResizerButtonStyles");
//macro
config.macros.fontSize={};
config.macros.fontSize.handler = function (place,macroName,params,wikifier,paramString,tiddler)
{
var sp = createTiddlyElement(place,"span",null,"fontResizer");
sp.ondblclick=this.onDblClick;
if (params[0])
createTiddlyText(sp,params[0]);
createTiddlyButton(sp,"+","increase font-size",this.incFont);
createTiddlyButton(sp,"=","reset font-size",this.resetFont);
createTiddlyButton(sp,"–","decrease font-size",this.decFont);
}
config.macros.fontSize.onDblClick = function (e)
{
if (!e) var e = window.event;
e.cancelBubble = true;
if (e.stopPropagation) e.stopPropagation();
return false;
}
config.macros.fontSize.setFont = function ()
{
saveOptionCookie("txtFontSize");
setStylesheet(".tiddler .viewer {font-size:"+config.options.txtFontSize+"%;}\n","fontResizerStyles");
}
config.macros.fontSize.incFont=function()
{
if (config.options.txtFontSize < fontSettings.maxSize)
config.options.txtFontSize = (config.options.txtFontSize*1)+fontSettings.stepSize;
config.macros.fontSize.setFont();
}
config.macros.fontSize.decFont=function()
{
if (config.options.txtFontSize > fontSettings.minSize)
config.options.txtFontSize = (config.options.txtFontSize*1) - fontSettings.stepSize;
config.macros.fontSize.setFont();
}
config.macros.fontSize.resetFont=function()
{
config.options.txtFontSize=fontSettings.defaultSize;
config.macros.fontSize.setFont();
}
config.paramifiers.font =
{
onstart: function(v)
{
config.options.txtFontSize = v;
config.macros.fontSize.setFont();
}
};
/***
|Name|FontSizePlugin|
|Created by|SaqImtiaz|
|Location|http://tw.lewcid.org/#FontSizePlugin|
|Version|1.0|
|Requires|~TW2.x|
!Description:
Resize tiddler text on the fly. The text size is remembered between sessions by use of a cookie.
You can customize the maximum and minimum allowed sizes.
(only affects tiddler content text, not any other text)
Also, you can load a TW file with a font-size specified in the url.
Eg: http://tw.lewcid.org/#font:110
!Demo:
Try using the font-size buttons in the sidebar, or in the MainMenu above.
!Installation:
Copy the contents of this tiddler to your TW, tag with systemConfig, save and reload your TW.
Then put {{{<<fontSize "font-size:">>}}} in your SideBarOptions tiddler, or anywhere else that you might like.
!Usage
{{{<<fontSize>>}}} results in <<fontSize>>
{{{<<fontSize font-size: >>}}} results in <<fontSize font-size:>>
!Customizing:
The buttons and prefix text are wrapped in a span with class fontResizer, for easy css styling.
To change the default font-size, and the maximum and minimum font-size allowed, edit the config.fontSize.settings section of the code below.
!Notes:
This plugin assumes that the initial font-size is 100% and then increases or decreases the size by 10%. This stepsize of 10% can also be customized.
!History:
*27-07-06, version 1.0 : prevented double clicks from triggering editing of containing tiddler.
*25-07-06, version 0.9
!Code
***/
//{{{
config.fontSize={};
//configuration settings
config.fontSize.settings =
{
defaultSize : 100, // all sizes in %
maxSize : 200,
minSize : 40,
stepSize : 10
};
//startup code
var fontSettings = config.fontSize.settings;
if (!config.options.txtFontSize)
{config.options.txtFontSize = fontSettings.defaultSize;
saveOptionCookie("txtFontSize");}
setStylesheet(".tiddler .viewer {font-size:"+config.options.txtFontSize+"%;}\n","fontResizerStyles");
setStylesheet("#contentWrapper .fontResizer .button {display:inline;font-size:105%; font-weight:bold; margin:0 1px; padding: 0 3px; text-align:center !important;}\n .fontResizer {margin:0 0.5em;}","fontResizerButtonStyles");
//macro
config.macros.fontSize={};
config.macros.fontSize.handler = function (place,macroName,params,wikifier,paramString,tiddler)
{
var sp = createTiddlyElement(place,"span",null,"fontResizer");
sp.ondblclick=this.onDblClick;
if (params[0])
createTiddlyText(sp,params[0]);
createTiddlyButton(sp,"+","increase font-size",this.incFont);
createTiddlyButton(sp,"=","reset font-size",this.resetFont);
createTiddlyButton(sp,"–","decrease font-size",this.decFont);
}
config.macros.fontSize.onDblClick = function (e)
{
if (!e) var e = window.event;
e.cancelBubble = true;
if (e.stopPropagation) e.stopPropagation();
return false;
}
config.macros.fontSize.setFont = function ()
{
saveOptionCookie("txtFontSize");
setStylesheet(".tiddler .viewer {font-size:"+config.options.txtFontSize+"%;}\n","fontResizerStyles");
}
config.macros.fontSize.incFont=function()
{
if (config.options.txtFontSize < fontSettings.maxSize)
config.options.txtFontSize = (config.options.txtFontSize*1)+fontSettings.stepSize;
config.macros.fontSize.setFont();
}
config.macros.fontSize.decFont=function()
{
if (config.options.txtFontSize > fontSettings.minSize)
config.options.txtFontSize = (config.options.txtFontSize*1) - fontSettings.stepSize;
config.macros.fontSize.setFont();
}
config.macros.fontSize.resetFont=function()
{
config.options.txtFontSize=fontSettings.defaultSize;
config.macros.fontSize.setFont();
}
config.paramifiers.font =
{
onstart: function(v)
{
config.options.txtFontSize = v;
config.macros.fontSize.setFont();
}
};
//}}}
<<fontSize>>
Eksempel på fontstørrelse.
Klik på = for at få den oprindelige igen!!
/***
|''Name:''|ForEachTiddlerPlugin|
|''Version:''|1.0.8 (2007-04-12)|
|''Source:''|http://tiddlywiki.abego-software.de/#ForEachTiddlerPlugin|
|''Author:''|UdoBorkowski (ub [at] abego-software [dot] de)|
|''Licence:''|[[BSD open source license (abego Software)|http://www.abego-software.de/legal/apl-v10.html]]|
|''Copyright:''|© 2005-2007 [[abego Software|http://www.abego-software.de]]|
|''TiddlyWiki:''|1.2.38+, 2.0|
|''Browser:''|Firefox 1.0.4+; Firefox 1.5; InternetExplorer 6.0|
!Description
Create customizable lists, tables etc. for your selections of tiddlers. Specify the tiddlers to include and their order through a powerful language.
''Syntax:''
|>|{{{<<}}}''forEachTiddler'' [''in'' //tiddlyWikiPath//] [''where'' //whereCondition//] [''sortBy'' //sortExpression// [''ascending'' //or// ''descending'']] [''script'' //scriptText//] [//action// [//actionParameters//]]{{{>>}}}|
|//tiddlyWikiPath//|The filepath to the TiddlyWiki the macro should work on. When missing the current TiddlyWiki is used.|
|//whereCondition//|(quoted) JavaScript boolean expression. May refer to the build-in variables {{{tiddler}}} and {{{context}}}.|
|//sortExpression//|(quoted) JavaScript expression returning "comparable" objects (using '{{{<}}}','{{{>}}}','{{{==}}}'. May refer to the build-in variables {{{tiddler}}} and {{{context}}}.|
|//scriptText//|(quoted) JavaScript text. Typically defines JavaScript functions that are called by the various JavaScript expressions (whereClause, sortClause, action arguments,...)|
|//action//|The action that should be performed on every selected tiddler, in the given order. By default the actions [[addToList|AddToListAction]] and [[write|WriteAction]] are supported. When no action is specified [[addToList|AddToListAction]] is used.|
|//actionParameters//|(action specific) parameters the action may refer while processing the tiddlers (see action descriptions for details). <<tiddler [[JavaScript in actionParameters]]>>|
|>|~~Syntax formatting: Keywords in ''bold'', optional parts in [...]. 'or' means that exactly one of the two alternatives must exist.~~|
See details see [[ForEachTiddlerMacro]] and [[ForEachTiddlerExamples]].
!Revision history
* v1.0.8 (2007-04-12)
** Adapted to latest TiddlyWiki 2.2 Beta importTiddlyWiki API (introduced with changeset 2004). TiddlyWiki 2.2 Beta builds prior to changeset 2004 are no longer supported (but TiddlyWiki 2.1 and earlier, of cause)
* v1.0.7 (2007-03-28)
** Also support "pre" formatted TiddlyWikis (introduced with TW 2.2) (when using "in" clause to work on external tiddlers)
* v1.0.6 (2006-09-16)
** Context provides "viewerTiddler", i.e. the tiddler used to view the macro. Most times this is equal to the "inTiddler", but when using the "tiddler" macro both may be different.
** Support "begin", "end" and "none" expressions in "write" action
* v1.0.5 (2006-02-05)
** Pass tiddler containing the macro with wikify, context object also holds reference to tiddler containing the macro ("inTiddler"). Thanks to SimonBaird.
** Support Firefox 1.5.0.1
** Internal
*** Make "JSLint" conform
*** "Only install once"
* v1.0.4 (2006-01-06)
** Support TiddlyWiki 2.0
* v1.0.3 (2005-12-22)
** Features:
*** Write output to a file supports multi-byte environments (Thanks to Bram Chen)
*** Provide API to access the forEachTiddler functionality directly through JavaScript (see getTiddlers and performMacro)
** Enhancements:
*** Improved error messages on InternetExplorer.
* v1.0.2 (2005-12-10)
** Features:
*** context object also holds reference to store (TiddlyWiki)
** Fixed Bugs:
*** ForEachTiddler 1.0.1 has broken support on win32 Opera 8.51 (Thanks to BrunoSabin for reporting)
* v1.0.1 (2005-12-08)
** Features:
*** Access tiddlers stored in separated TiddlyWikis through the "in" option. I.e. you are no longer limited to only work on the "current TiddlyWiki".
*** Write output to an external file using the "toFile" option of the "write" action. With this option you may write your customized tiddler exports.
*** Use the "script" section to define "helper" JavaScript functions etc. to be used in the various JavaScript expressions (whereClause, sortClause, action arguments,...).
*** Access and store context information for the current forEachTiddler invocation (through the build-in "context" object) .
*** Improved script evaluation (for where/sort clause and write scripts).
* v1.0.0 (2005-11-20)
** initial version
!Code
***/
//{{{
//============================================================================
//============================================================================
// ForEachTiddlerPlugin
//============================================================================
//============================================================================
// Only install once
if (!version.extensions.ForEachTiddlerPlugin) {
if (!window.abego) window.abego = {};
version.extensions.ForEachTiddlerPlugin = {
major: 1, minor: 0, revision: 8,
date: new Date(2007,3,12),
source: "http://tiddlywiki.abego-software.de/#ForEachTiddlerPlugin",
licence: "[[BSD open source license (abego Software)|http://www.abego-software.de/legal/apl-v10.html]]",
copyright: "Copyright (c) abego Software GmbH, 2005-2007 (www.abego-software.de)"
};
// For backward compatibility with TW 1.2.x
//
if (!TiddlyWiki.prototype.forEachTiddler) {
TiddlyWiki.prototype.forEachTiddler = function(callback) {
for(var t in this.tiddlers) {
callback.call(this,t,this.tiddlers[t]);
}
};
}
//============================================================================
// forEachTiddler Macro
//============================================================================
version.extensions.forEachTiddler = {
major: 1, minor: 0, revision: 8, date: new Date(2007,3,12), provider: "http://tiddlywiki.abego-software.de"};
// ---------------------------------------------------------------------------
// Configurations and constants
// ---------------------------------------------------------------------------
config.macros.forEachTiddler = {
// Standard Properties
label: "forEachTiddler",
prompt: "Perform actions on a (sorted) selection of tiddlers",
// actions
actions: {
addToList: {},
write: {}
}
};
// ---------------------------------------------------------------------------
// The forEachTiddler Macro Handler
// ---------------------------------------------------------------------------
config.macros.forEachTiddler.getContainingTiddler = function(e) {
while(e && !hasClass(e,"tiddler"))
e = e.parentNode;
var title = e ? e.getAttribute("tiddler") : null;
return title ? store.getTiddler(title) : null;
};
config.macros.forEachTiddler.handler = function(place,macroName,params,wikifier,paramString,tiddler) {
// config.macros.forEachTiddler.traceMacroCall(place,macroName,params,wikifier,paramString,tiddler);
if (!tiddler) tiddler = config.macros.forEachTiddler.getContainingTiddler(place);
// --- Parsing ------------------------------------------
var i = 0; // index running over the params
// Parse the "in" clause
var tiddlyWikiPath = undefined;
if ((i < params.length) && params[i] == "in") {
i++;
if (i >= params.length) {
this.handleError(place, "TiddlyWiki path expected behind 'in'.");
return;
}
tiddlyWikiPath = this.paramEncode((i < params.length) ? params[i] : "");
i++;
}
// Parse the where clause
var whereClause ="true";
if ((i < params.length) && params[i] == "where") {
i++;
whereClause = this.paramEncode((i < params.length) ? params[i] : "");
i++;
}
// Parse the sort stuff
var sortClause = null;
var sortAscending = true;
if ((i < params.length) && params[i] == "sortBy") {
i++;
if (i >= params.length) {
this.handleError(place, "sortClause missing behind 'sortBy'.");
return;
}
sortClause = this.paramEncode(params[i]);
i++;
if ((i < params.length) && (params[i] == "ascending" || params[i] == "descending")) {
sortAscending = params[i] == "ascending";
i++;
}
}
// Parse the script
var scriptText = null;
if ((i < params.length) && params[i] == "script") {
i++;
scriptText = this.paramEncode((i < params.length) ? params[i] : "");
i++;
}
// Parse the action.
// When we are already at the end use the default action
var actionName = "addToList";
if (i < params.length) {
if (!config.macros.forEachTiddler.actions[params[i]]) {
this.handleError(place, "Unknown action '"+params[i]+"'.");
return;
} else {
actionName = params[i];
i++;
}
}
// Get the action parameter
// (the parsing is done inside the individual action implementation.)
var actionParameter = params.slice(i);
// --- Processing ------------------------------------------
try {
this.performMacro({
place: place,
inTiddler: tiddler,
whereClause: whereClause,
sortClause: sortClause,
sortAscending: sortAscending,
actionName: actionName,
actionParameter: actionParameter,
scriptText: scriptText,
tiddlyWikiPath: tiddlyWikiPath});
} catch (e) {
this.handleError(place, e);
}
};
// Returns an object with properties "tiddlers" and "context".
// tiddlers holds the (sorted) tiddlers selected by the parameter,
// context the context of the execution of the macro.
//
// The action is not yet performed.
//
// @parameter see performMacro
//
config.macros.forEachTiddler.getTiddlersAndContext = function(parameter) {
var context = config.macros.forEachTiddler.createContext(parameter.place, parameter.whereClause, parameter.sortClause, parameter.sortAscending, parameter.actionName, parameter.actionParameter, parameter.scriptText, parameter.tiddlyWikiPath, parameter.inTiddler);
var tiddlyWiki = parameter.tiddlyWikiPath ? this.loadTiddlyWiki(parameter.tiddlyWikiPath) : store;
context["tiddlyWiki"] = tiddlyWiki;
// Get the tiddlers, as defined by the whereClause
var tiddlers = this.findTiddlers(parameter.whereClause, context, tiddlyWiki);
context["tiddlers"] = tiddlers;
// Sort the tiddlers, when sorting is required.
if (parameter.sortClause) {
this.sortTiddlers(tiddlers, parameter.sortClause, parameter.sortAscending, context);
}
return {tiddlers: tiddlers, context: context};
};
// Returns the (sorted) tiddlers selected by the parameter.
//
// The action is not yet performed.
//
// @parameter see performMacro
//
config.macros.forEachTiddler.getTiddlers = function(parameter) {
return this.getTiddlersAndContext(parameter).tiddlers;
};
// Performs the macros with the given parameter.
//
// @param parameter holds the parameter of the macro as separate properties.
// The following properties are supported:
//
// place
// whereClause
// sortClause
// sortAscending
// actionName
// actionParameter
// scriptText
// tiddlyWikiPath
//
// All properties are optional.
// For most actions the place property must be defined.
//
config.macros.forEachTiddler.performMacro = function(parameter) {
var tiddlersAndContext = this.getTiddlersAndContext(parameter);
// Perform the action
var actionName = parameter.actionName ? parameter.actionName : "addToList";
var action = config.macros.forEachTiddler.actions[actionName];
if (!action) {
this.handleError(parameter.place, "Unknown action '"+actionName+"'.");
return;
}
var actionHandler = action.handler;
actionHandler(parameter.place, tiddlersAndContext.tiddlers, parameter.actionParameter, tiddlersAndContext.context);
};
// ---------------------------------------------------------------------------
// The actions
// ---------------------------------------------------------------------------
// Internal.
//
// --- The addToList Action -----------------------------------------------
//
config.macros.forEachTiddler.actions.addToList.handler = function(place, tiddlers, parameter, context) {
// Parse the parameter
var p = 0;
// Check for extra parameters
if (parameter.length > p) {
config.macros.forEachTiddler.createExtraParameterErrorElement(place, "addToList", parameter, p);
return;
}
// Perform the action.
var list = document.createElement("ul");
place.appendChild(list);
for (var i = 0; i < tiddlers.length; i++) {
var tiddler = tiddlers[i];
var listItem = document.createElement("li");
list.appendChild(listItem);
createTiddlyLink(listItem, tiddler.title, true);
}
};
abego.parseNamedParameter = function(name, parameter, i) {
var beginExpression = null;
if ((i < parameter.length) && parameter[i] == name) {
i++;
if (i >= parameter.length) {
throw "Missing text behind '%0'".format([name]);
}
return config.macros.forEachTiddler.paramEncode(parameter[i]);
}
return null;
}
// Internal.
//
// --- The write Action ---------------------------------------------------
//
config.macros.forEachTiddler.actions.write.handler = function(place, tiddlers, parameter, context) {
// Parse the parameter
var p = 0;
if (p >= parameter.length) {
this.handleError(place, "Missing expression behind 'write'.");
return;
}
var textExpression = config.macros.forEachTiddler.paramEncode(parameter[p]);
p++;
// Parse the "begin" option
var beginExpression = abego.parseNamedParameter("begin", parameter, p);
if (beginExpression !== null)
p += 2;
var endExpression = abego.parseNamedParameter("end", parameter, p);
if (endExpression !== null)
p += 2;
var noneExpression = abego.parseNamedParameter("none", parameter, p);
if (noneExpression !== null)
p += 2;
// Parse the "toFile" option
var filename = null;
var lineSeparator = undefined;
if ((p < parameter.length) && parameter[p] == "toFile") {
p++;
if (p >= parameter.length) {
this.handleError(place, "Filename expected behind 'toFile' of 'write' action.");
return;
}
filename = config.macros.forEachTiddler.getLocalPath(config.macros.forEachTiddler.paramEncode(parameter[p]));
p++;
if ((p < parameter.length) && parameter[p] == "withLineSeparator") {
p++;
if (p >= parameter.length) {
this.handleError(place, "Line separator text expected behind 'withLineSeparator' of 'write' action.");
return;
}
lineSeparator = config.macros.forEachTiddler.paramEncode(parameter[p]);
p++;
}
}
// Check for extra parameters
if (parameter.length > p) {
config.macros.forEachTiddler.createExtraParameterErrorElement(place, "write", parameter, p);
return;
}
// Perform the action.
var func = config.macros.forEachTiddler.getEvalTiddlerFunction(textExpression, context);
var count = tiddlers.length;
var text = "";
if (count > 0 && beginExpression)
text += config.macros.forEachTiddler.getEvalTiddlerFunction(beginExpression, context)(undefined, context, count, undefined);
for (var i = 0; i < count; i++) {
var tiddler = tiddlers[i];
text += func(tiddler, context, count, i);
}
if (count > 0 && endExpression)
text += config.macros.forEachTiddler.getEvalTiddlerFunction(endExpression, context)(undefined, context, count, undefined);
if (count == 0 && noneExpression)
text += config.macros.forEachTiddler.getEvalTiddlerFunction(noneExpression, context)(undefined, context, count, undefined);
if (filename) {
if (lineSeparator !== undefined) {
lineSeparator = lineSeparator.replace(/\\n/mg, "\n").replace(/\\r/mg, "\r");
text = text.replace(/\n/mg,lineSeparator);
}
saveFile(filename, convertUnicodeToUTF8(text));
} else {
var wrapper = createTiddlyElement(place, "span");
wikify(text, wrapper, null/* highlightRegExp */, context.inTiddler);
}
};
// ---------------------------------------------------------------------------
// Helpers
// ---------------------------------------------------------------------------
// Internal.
//
config.macros.forEachTiddler.createContext = function(placeParam, whereClauseParam, sortClauseParam, sortAscendingParam, actionNameParam, actionParameterParam, scriptText, tiddlyWikiPathParam, inTiddlerParam) {
return {
place : placeParam,
whereClause : whereClauseParam,
sortClause : sortClauseParam,
sortAscending : sortAscendingParam,
script : scriptText,
actionName : actionNameParam,
actionParameter : actionParameterParam,
tiddlyWikiPath : tiddlyWikiPathParam,
inTiddler : inTiddlerParam, // the tiddler containing the <<forEachTiddler ...>> macro call.
viewerTiddler : config.macros.forEachTiddler.getContainingTiddler(placeParam) // the tiddler showing the forEachTiddler result
};
};
// Internal.
//
// Returns a TiddlyWiki with the tiddlers loaded from the TiddlyWiki of
// the given path.
//
config.macros.forEachTiddler.loadTiddlyWiki = function(path, idPrefix) {
if (!idPrefix) {
idPrefix = "store";
}
var lenPrefix = idPrefix.length;
// Read the content of the given file
var content = loadFile(this.getLocalPath(path));
if(content === null) {
throw "TiddlyWiki '"+path+"' not found.";
}
var tiddlyWiki = new TiddlyWiki();
// Starting with TW 2.2 there is a helper function to import the tiddlers
if (tiddlyWiki.importTiddlyWiki) {
if (!tiddlyWiki.importTiddlyWiki(content))
throw "File '"+path+"' is not a TiddlyWiki.";
tiddlyWiki.dirty = false;
return tiddlyWiki;
}
// The legacy code, for TW < 2.2
// Locate the storeArea div's
var posOpeningDiv = content.indexOf(startSaveArea);
var posClosingDiv = content.lastIndexOf(endSaveArea);
if((posOpeningDiv == -1) || (posClosingDiv == -1)) {
throw "File '"+path+"' is not a TiddlyWiki.";
}
var storageText = content.substr(posOpeningDiv + startSaveArea.length, posClosingDiv);
// Create a "div" element that contains the storage text
var myStorageDiv = document.createElement("div");
myStorageDiv.innerHTML = storageText;
myStorageDiv.normalize();
// Create all tiddlers in a new TiddlyWiki
// (following code is modified copy of TiddlyWiki.prototype.loadFromDiv)
var store = myStorageDiv.childNodes;
for(var t = 0; t < store.length; t++) {
var e = store[t];
var title = null;
if(e.getAttribute)
title = e.getAttribute("tiddler");
if(!title && e.id && e.id.substr(0,lenPrefix) == idPrefix)
title = e.id.substr(lenPrefix);
if(title && title !== "") {
var tiddler = tiddlyWiki.createTiddler(title);
tiddler.loadFromDiv(e,title);
}
}
tiddlyWiki.dirty = false;
return tiddlyWiki;
};
// Internal.
//
// Returns a function that has a function body returning the given javaScriptExpression.
// The function has the parameters:
//
// (tiddler, context, count, index)
//
config.macros.forEachTiddler.getEvalTiddlerFunction = function (javaScriptExpression, context) {
var script = context["script"];
var functionText = "var theFunction = function(tiddler, context, count, index) { return "+javaScriptExpression+"}";
var fullText = (script ? script+";" : "")+functionText+";theFunction;";
return eval(fullText);
};
// Internal.
//
config.macros.forEachTiddler.findTiddlers = function(whereClause, context, tiddlyWiki) {
var result = [];
var func = config.macros.forEachTiddler.getEvalTiddlerFunction(whereClause, context);
tiddlyWiki.forEachTiddler(function(title,tiddler) {
if (func(tiddler, context, undefined, undefined)) {
result.push(tiddler);
}
});
return result;
};
// Internal.
//
config.macros.forEachTiddler.createExtraParameterErrorElement = function(place, actionName, parameter, firstUnusedIndex) {
var message = "Extra parameter behind '"+actionName+"':";
for (var i = firstUnusedIndex; i < parameter.length; i++) {
message += " "+parameter[i];
}
this.handleError(place, message);
};
// Internal.
//
config.macros.forEachTiddler.sortAscending = function(tiddlerA, tiddlerB) {
var result =
(tiddlerA.forEachTiddlerSortValue == tiddlerB.forEachTiddlerSortValue)
? 0
: (tiddlerA.forEachTiddlerSortValue < tiddlerB.forEachTiddlerSortValue)
? -1
: +1;
return result;
};
// Internal.
//
config.macros.forEachTiddler.sortDescending = function(tiddlerA, tiddlerB) {
var result =
(tiddlerA.forEachTiddlerSortValue == tiddlerB.forEachTiddlerSortValue)
? 0
: (tiddlerA.forEachTiddlerSortValue < tiddlerB.forEachTiddlerSortValue)
? +1
: -1;
return result;
};
// Internal.
//
config.macros.forEachTiddler.sortTiddlers = function(tiddlers, sortClause, ascending, context) {
// To avoid evaluating the sortClause whenever two items are compared
// we pre-calculate the sortValue for every item in the array and store it in a
// temporary property ("forEachTiddlerSortValue") of the tiddlers.
var func = config.macros.forEachTiddler.getEvalTiddlerFunction(sortClause, context);
var count = tiddlers.length;
var i;
for (i = 0; i < count; i++) {
var tiddler = tiddlers[i];
tiddler.forEachTiddlerSortValue = func(tiddler,context, undefined, undefined);
}
// Do the sorting
tiddlers.sort(ascending ? this.sortAscending : this.sortDescending);
// Delete the temporary property that holds the sortValue.
for (i = 0; i < tiddlers.length; i++) {
delete tiddlers[i].forEachTiddlerSortValue;
}
};
// Internal.
//
config.macros.forEachTiddler.trace = function(message) {
displayMessage(message);
};
// Internal.
//
config.macros.forEachTiddler.traceMacroCall = function(place,macroName,params) {
var message ="<<"+macroName;
for (var i = 0; i < params.length; i++) {
message += " "+params[i];
}
message += ">>";
displayMessage(message);
};
// Internal.
//
// Creates an element that holds an error message
//
config.macros.forEachTiddler.createErrorElement = function(place, exception) {
var message = (exception.description) ? exception.description : exception.toString();
return createTiddlyElement(place,"span",null,"forEachTiddlerError","<<forEachTiddler ...>>: "+message);
};
// Internal.
//
// @param place [may be null]
//
config.macros.forEachTiddler.handleError = function(place, exception) {
if (place) {
this.createErrorElement(place, exception);
} else {
throw exception;
}
};
// Internal.
//
// Encodes the given string.
//
// Replaces
// "$))" to ">>"
// "$)" to ">"
//
config.macros.forEachTiddler.paramEncode = function(s) {
var reGTGT = new RegExp("\\$\\)\\)","mg");
var reGT = new RegExp("\\$\\)","mg");
return s.replace(reGTGT, ">>").replace(reGT, ">");
};
// Internal.
//
// Returns the given original path (that is a file path, starting with "file:")
// as a path to a local file, in the systems native file format.
//
// Location information in the originalPath (i.e. the "#" and stuff following)
// is stripped.
//
config.macros.forEachTiddler.getLocalPath = function(originalPath) {
// Remove any location part of the URL
var hashPos = originalPath.indexOf("#");
if(hashPos != -1)
originalPath = originalPath.substr(0,hashPos);
// Convert to a native file format assuming
// "file:///x:/path/path/path..." - pc local file --> "x:\path\path\path..."
// "file://///server/share/path/path/path..." - FireFox pc network file --> "\\server\share\path\path\path..."
// "file:///path/path/path..." - mac/unix local file --> "/path/path/path..."
// "file://server/share/path/path/path..." - pc network file --> "\\server\share\path\path\path..."
var localPath;
if(originalPath.charAt(9) == ":") // pc local file
localPath = unescape(originalPath.substr(8)).replace(new RegExp("/","g"),"\\");
else if(originalPath.indexOf("file://///") === 0) // FireFox pc network file
localPath = "\\\\" + unescape(originalPath.substr(10)).replace(new RegExp("/","g"),"\\");
else if(originalPath.indexOf("file:///") === 0) // mac/unix local file
localPath = unescape(originalPath.substr(7));
else if(originalPath.indexOf("file:/") === 0) // mac/unix local file
localPath = unescape(originalPath.substr(5));
else // pc network file
localPath = "\\\\" + unescape(originalPath.substr(7)).replace(new RegExp("/","g"),"\\");
return localPath;
};
// ---------------------------------------------------------------------------
// Stylesheet Extensions (may be overridden by local StyleSheet)
// ---------------------------------------------------------------------------
//
setStylesheet(
".forEachTiddlerError{color: #ffffff;background-color: #880000;}",
"forEachTiddler");
//============================================================================
// End of forEachTiddler Macro
//============================================================================
//============================================================================
// String.startsWith Function
//============================================================================
//
// Returns true if the string starts with the given prefix, false otherwise.
//
version.extensions["String.startsWith"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};
//
String.prototype.startsWith = function(prefix) {
var n = prefix.length;
return (this.length >= n) && (this.slice(0, n) == prefix);
};
//============================================================================
// String.endsWith Function
//============================================================================
//
// Returns true if the string ends with the given suffix, false otherwise.
//
version.extensions["String.endsWith"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};
//
String.prototype.endsWith = function(suffix) {
var n = suffix.length;
return (this.length >= n) && (this.right(n) == suffix);
};
//============================================================================
// String.contains Function
//============================================================================
//
// Returns true when the string contains the given substring, false otherwise.
//
version.extensions["String.contains"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};
//
String.prototype.contains = function(substring) {
return this.indexOf(substring) >= 0;
};
//============================================================================
// Array.indexOf Function
//============================================================================
//
// Returns the index of the first occurance of the given item in the array or
// -1 when no such item exists.
//
// @param item [may be null]
//
version.extensions["Array.indexOf"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};
//
Array.prototype.indexOf = function(item) {
for (var i = 0; i < this.length; i++) {
if (this[i] == item) {
return i;
}
}
return -1;
};
//============================================================================
// Array.contains Function
//============================================================================
//
// Returns true when the array contains the given item, otherwise false.
//
// @param item [may be null]
//
version.extensions["Array.contains"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};
//
Array.prototype.contains = function(item) {
return (this.indexOf(item) >= 0);
};
//============================================================================
// Array.containsAny Function
//============================================================================
//
// Returns true when the array contains at least one of the elements
// of the item. Otherwise (or when items contains no elements) false is returned.
//
version.extensions["Array.containsAny"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};
//
Array.prototype.containsAny = function(items) {
for(var i = 0; i < items.length; i++) {
if (this.contains(items[i])) {
return true;
}
}
return false;
};
//============================================================================
// Array.containsAll Function
//============================================================================
//
// Returns true when the array contains all the items, otherwise false.
//
// When items is null false is returned (even if the array contains a null).
//
// @param items [may be null]
//
version.extensions["Array.containsAll"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};
//
Array.prototype.containsAll = function(items) {
for(var i = 0; i < items.length; i++) {
if (!this.contains(items[i])) {
return false;
}
}
return true;
};
} // of "install only once"
// Used Globals (for JSLint) ==============
// ... DOM
/*global document */
// ... TiddlyWiki Core
/*global convertUnicodeToUTF8, createTiddlyElement, createTiddlyLink,
displayMessage, endSaveArea, hasClass, loadFile, saveFile,
startSaveArea, store, wikify */
//}}}
/***
!Licence and Copyright
Copyright (c) abego Software ~GmbH, 2005 ([[www.abego-software.de|http://www.abego-software.de]])
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
Redistributions in binary form must reproduce the above copyright notice, this
list of conditions and the following disclaimer in the documentation and/or other
materials provided with the distribution.
Neither the name of abego Software nor the names of its contributors may be
used to endorse or promote products derived from this software without specific
prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
DAMAGE.
***/
The {{{<<formTiddler ...>>}}} macro defined by the FormTiddlerPlugin.
When a tiddler T1 references the (FormTemplate) tiddler T2 in the FormTiddlerMacro, the data of T1 can be edited through the INPUT elements defined by T2.
/***
<<checkForDataTiddlerPlugin>>
|''Name:''|FormTiddlerPlugin|
|''Version:''|1.0.6 (2007-06-24)|
|''Source:''|http://tiddlywiki.abego-software.de/#FormTiddlerPlugin|
|''Author:''|UdoBorkowski (ub [at] abego-software [dot] de)|
|''Licence:''|[[BSD open source license]]|
|''Macros:''|formTiddler, checkForDataTiddlerPlugin, newTiddlerWithForm|
|''Requires:''|DataTiddlerPlugin|
|''TiddlyWiki:''|1.2.38+, 2.0|
|''Browser:''|Firefox 1.0.4+; InternetExplorer 6.0|
!Description
Use form-based tiddlers to enter your tiddler data using text fields, listboxes, checkboxes etc. (All standard HTML Form input elements supported).
''Syntax:''
|>|{{{<<}}}''formTiddler'' //tiddlerName//{{{>>}}}|
|//tiddlerName//|The name of the FormTemplate tiddler to be used to edit the data of the tiddler containing the macro.|
|>|{{{<<}}}''newTiddlerWithForm'' //formTemplateName// //buttonLabel// [//titleExpression// [''askUser'']] {{{>>}}}|
|//formTemplateName//|The name of the tiddler that defines the form the new tiddler should use.|
|//buttonLabel//|The label of the button|
|//titleExpression//|A (quoted) JavaScript String expression that defines the title (/name) of the new tiddler.|
|''askUser''|Typically the user is not asked for the title when a title is specified (and not yet used). When ''askUser'' is given the user will be asked in any case. This may be used when the calculated title is just a suggestion that must be confirmed by the user|
|>|~~Syntax formatting: Keywords in ''bold'', optional parts in [...]. 'or' means that exactly one of the two alternatives must exist.~~|
For details and how to use the macros see the [[introduction|FormTiddler Introduction]] and the [[examples|FormTiddler Examples]].
!Revision history
* v1.0.6 (2007-06-24)
** Fixed problem when using SELECT component in Internet Explorer (thanks to MaikBoenig for reporting)
* v1.0.5 (2006-02-24)
** Removed "debugger;" instruction
* v1.0.4 (2006-02-07)
** Bug: On IE no data is written to data section when field values changed (thanks to KenGirard for reporting)
* v1.0.3 (2006-02-05)
** Bug: {{{"No form template specified in <<formTiddler>>"}}} when using formTiddler macro on InternetExplorer (thanks to KenGirard for reporting)
* v1.0.2 (2006-01-06)
** Support TiddlyWiki 2.0
* v1.0.1 (2005-12-22)
** Features:
*** Support InternetExplorer
*** Added newTiddlerWithForm Macro
* v1.0.0 (2005-12-14)
** initial version
!Code
***/
//{{{
//============================================================================
//============================================================================
// FormTiddlerPlugin
//============================================================================
//============================================================================
if (!window.abego) window.abego = {};
abego.getOptionsValue = function(element,i) {
var v = element.options[i].value;
if (!v && element.options[i].text)
v = element.options[i].text;
return v;
};
version.extensions.FormTiddlerPlugin = {
major: 1, minor: 0, revision: 5,
date: new Date(2006, 2, 24),
type: 'plugin',
source: "http://tiddlywiki.abego-software.de/#FormTiddlerPlugin"
};
// For backward compatibility with v1.2.x
//
if (!window.story) window.story=window;
if (!TiddlyWiki.prototype.getTiddler) TiddlyWiki.prototype.getTiddler = function(title) { return t = this.tiddlers[title]; return (t != undefined && t instanceof Tiddler) ? t : null; }
//============================================================================
// formTiddler Macro
//============================================================================
// -------------------------------------------------------------------------------
// Configurations and constants
// -------------------------------------------------------------------------------
config.macros.formTiddler = {
// Standard Properties
label: "formTiddler",
version: {major: 1, minor: 0, revision: 4, date: new Date(2006, 2, 7)},
prompt: "Edit tiddler data using forms",
// Define the "setters" that set the values of INPUT elements of a given type
// (must match the corresponding "getter")
setter: {
button: function(e, value) {/*contains no data */ },
checkbox: function(e, value) {e.checked = value;},
file: function(e, value) {try {e.value = value;} catch(e) {/* ignore, possibly security error*/}},
hidden: function(e, value) {e.value = value;},
password: function(e, value) {e.value = value;},
radio: function(e, value) {e.checked = (e.value == value);},
reset: function(e, value) {/*contains no data */ },
"select-one": function(e, value) {config.macros.formTiddler.setSelectOneValue(e,value);},
"select-multiple": function(e, value) {config.macros.formTiddler.setSelectMultipleValue(e,value);},
submit: function(e, value) {/*contains no data */},
text: function(e, value) {e.value = value;},
textarea: function(e, value) {e.value = value;}
},
// Define the "getters" that return the value of INPUT elements of a given type
// Return undefined to not store any data.
getter: {
button: function(e, value) {return undefined;},
checkbox: function(e, value) {return e.checked;},
file: function(e, value) {return e.value;},
hidden: function(e, value) {return e.value;},
password: function(e, value) {return e.value;},
radio: function(e, value) {return e.checked ? e.value : undefined;},
reset: function(e, value) {return undefined;},
"select-one": function(e, value) {return config.macros.formTiddler.getSelectOneValue(e);},
"select-multiple": function(e, value) {return config.macros.formTiddler.getSelectMultipleValue(e);},
submit: function(e, value) {return undefined;},
text: function(e, value) {return e.value;},
textarea: function(e, value) {return e.value;}
}
};
// -------------------------------------------------------------------------------
// The formTiddler Macro Handler
// -------------------------------------------------------------------------------
config.macros.formTiddler.handler = function(place,macroName,params,wikifier,paramString,tiddler) {
if (!config.macros.formTiddler.checkForExtensions(place, macroName)) {
return;
}
// --- Parsing ------------------------------------------
var i = 0; // index running over the params
// get the name of the form template tiddler
var formTemplateName = undefined;
if (i < params.length) {
formTemplateName = params[i];
i++;
}
if (!formTemplateName) {
config.macros.formTiddler.createErrorElement(place, "No form template specified in <<" + macroName + ">>.");
return;
}
// --- Processing ------------------------------------------
// Get the form template text.
// (This contains the INPUT elements for the form.)
var formTemplateTiddler = store.getTiddler(formTemplateName);
if (!formTemplateTiddler) {
config.macros.formTiddler.createErrorElement(place, "Form template '" + formTemplateName + "' not found.");
return;
}
var templateText = formTemplateTiddler.text;
if(!templateText) {
// Shortcut: when template text is empty we do nothing.
return;
}
// Get the name of the tiddler containing this "formTiddler" macro
// (i.e. the tiddler, that will be edited and that contains the data)
var tiddlerName = config.macros.formTiddler.getContainingTiddlerName(place);
// Append a "form" element.
var formName = "form"+formTemplateName+"__"+tiddlerName;
var e = document.createElement("form");
e.setAttribute("name", formName);
place.appendChild(e);
// "Embed" the elements defined by the templateText (i.e. the INPUT elements)
// into the "form" element we just created
wikify(templateText, e);
// Initialize the INPUT elements.
config.macros.formTiddler.initValuesAndHandlersInFormElements(formName, DataTiddler.getDataObject(tiddlerName));
}
// -------------------------------------------------------------------------------
// Form Data Access
// -------------------------------------------------------------------------------
// Internal.
//
// Initialize the INPUT elements of the form with the values of their "matching"
// data fields in the tiddler. Also setup the onChange handler to ensure that
// changes in the INPUT elements are stored in the tiddler's data.
//
config.macros.formTiddler.initValuesAndHandlersInFormElements = function(formName, data) {
// config.macros.formTiddler.trace("initValuesAndHandlersInFormElements(formName="+formName+", data="+data+")");
// find the form
var form = config.macros.formTiddler.findForm(formName);
if (!form) {
return;
}
try {
var elems = form.elements;
for (var i = 0; i < elems.length; i++) {
var c = elems[i];
var setter = config.macros.formTiddler.setter[c.type];
if (setter) {
var value = data[c.name];
if (value != null) {
setter(c, value);
}
c.onchange = onFormTiddlerChange;
} else {
config.macros.formTiddler.displayFormTiddlerError("No setter defined for INPUT element of type '"+c.type+"'. (Element '"+c.name+"' in form '"+formName+"')");
}
}
} catch(e) {
config.macros.formTiddler.displayFormTiddlerError("Error when updating elements with new formData. "+e);
}
}
// Internal.
//
// @return [may be null]
//
config.macros.formTiddler.findForm = function(formName) {
// We must manually iterate through the document's forms, since
// IE does not support the "document[formName]" approach
var forms = window.document.forms;
for (var i = 0; i < forms.length; i++) {
var form = forms[i];
if (form.name == formName) {
return form;
}
}
return null;
}
// Internal.
//
config.macros.formTiddler.setSelectOneValue = function(element,value) {
var n = element.options.length;
for (var i = 0; i < n; i++) {
element.options[i].selected = abego.getOptionsValue(element,i) == value;
}
}
// Internal.
//
config.macros.formTiddler.setSelectMultipleValue = function(element,value) {
var values = {};
for (var i = 0; i < value.length; i++) {
values[value[i]] = true;
}
var n = element.length;
for (var i = 0; i < n; i++) {
element.options[i].selected = !(!values[abego.getOptionsValue(element,i)]);
}
}
// Internal.
//
config.macros.formTiddler.getSelectOneValue = function(element) {
var i = element.selectedIndex;
return (i >= 0) ? abego.getOptionsValue(element,i) : null;
}
// Internal.
//
config.macros.formTiddler.getSelectMultipleValue = function(element) {
var values = [];
var n = element.length;
for (var i = 0; i < n; i++) {
if (element.options[i].selected) {
values.push(abego.getOptionsValue(element,i));
}
}
return values;
}
// -------------------------------------------------------------------------------
// Helpers
// -------------------------------------------------------------------------------
// Internal.
//
config.macros.formTiddler.checkForExtensions = function(place,macroName) {
if (!version.extensions.DataTiddlerPlugin) {
config.macros.formTiddler.createErrorElement(place, "<<" + macroName + ">> requires the DataTiddlerPlugin. (You can get it from http://tiddlywiki.abego-software.de/#DataTiddlerPlugin)");
return false;
}
return true;
}
// Internal.
//
// Displays a trace message in the "TiddlyWiki" message pane.
// (used for debugging)
//
config.macros.formTiddler.trace = function(s) {
displayMessage("Trace: "+s);
}
// Internal.
//
// Display some error message in the "TiddlyWiki" message pane.
//
config.macros.formTiddler.displayFormTiddlerError = function(s) {
alert("FormTiddlerPlugin Error: "+s);
}
// Internal.
//
// Creates an element that holds an error message
//
config.macros.formTiddler.createErrorElement = function(place, message) {
return createTiddlyElement(place,"span",null,"formTiddlerError",message);
}
// Internal.
//
// Returns the name of the tiddler containing the given element.
//
config.macros.formTiddler.getContainingTiddlerName = function(element) {
return story.findContainingTiddler(element).id.substr(7);
}
// -------------------------------------------------------------------------------
// Event Handlers
// -------------------------------------------------------------------------------
// This function must be called by the INPUT elements whenever their
// data changes. Typically this is done through an "onChange" handler.
//
function onFormTiddlerChange (e) {
// config.macros.formTiddler.trace("onFormTiddlerChange "+e);
if (!e) var e = window.event;
var target = resolveTarget(e);
var tiddlerName = config.macros.formTiddler.getContainingTiddlerName(target);
var getter = config.macros.formTiddler.getter[target.type];
if (getter) {
var value = getter(target);
DataTiddler.setData(tiddlerName, target.name, value);
} else {
config.macros.formTiddler.displayFormTiddlerError("No getter defined for INPUT element of type '"+target.type+"'. (Element '"+target.name+"' used in tiddler '"+tiddlerName+"')");
}
}
// ensure that the function can be used in HTML event handler
window.onFormTiddlerChange = onFormTiddlerChange;
// -------------------------------------------------------------------------------
// Stylesheet Extensions (may be overridden by local StyleSheet)
// -------------------------------------------------------------------------------
setStylesheet(
".formTiddlerError{color: #ffffff;background-color: #880000;}",
"formTiddler");
//============================================================================
// checkForDataTiddlerPlugin Macro
//============================================================================
config.macros.checkForDataTiddlerPlugin = {
// Standard Properties
label: "checkForDataTiddlerPlugin",
version: {major: 1, minor: 0, revision: 0, date: new Date(2005, 12, 14)},
prompt: "Check if the DataTiddlerPlugin exists"
}
config.macros.checkForDataTiddlerPlugin.handler = function(place,macroName,params) {
config.macros.formTiddler.checkForExtensions(place, config.macros.formTiddler.label);
}
//============================================================================
// newTiddlerWithForm Macro
//============================================================================
config.macros.newTiddlerWithForm = {
// Standard Properties
label: "newTiddlerWithForm",
version: {major: 1, minor: 0, revision: 1, date: new Date(2006, 1, 6)},
prompt: "Creates a new Tiddler with a <<formTiddler ...>> macro"
}
config.macros.newTiddlerWithForm.handler = function(place,macroName,params) {
// --- Parsing ------------------------------------------
var i = 0; // index running over the params
// get the name of the form template tiddler
var formTemplateName = undefined;
if (i < params.length) {
formTemplateName = params[i];
i++;
}
if (!formTemplateName) {
config.macros.formTiddler.createErrorElement(place, "No form template specified in <<" + macroName + ">>.");
return;
}
// get the button label
var buttonLabel = undefined;
if (i < params.length) {
buttonLabel = params[i];
i++;
}
if (!buttonLabel) {
config.macros.formTiddler.createErrorElement(place, "No button label specified in <<" + macroName + ">>.");
return;
}
// get the (optional) tiddlerName script and "askUser"
var tiddlerNameScript = undefined;
var askUser = false;
if (i < params.length) {
tiddlerNameScript = params[i];
i++;
if (i < params.length && params[i] == "askUser") {
askUser = true;
i++;
}
}
// --- Processing ------------------------------------------
if(!readOnly) {
var onClick = function() {
var tiddlerName;
if (tiddlerNameScript) {
try {
tiddlerName = eval(tiddlerNameScript);
} catch (ex) {
}
}
if (!tiddlerName || askUser) {
tiddlerName = prompt("Please specify a tiddler name.", askUser ? tiddlerName : "");
}
while (tiddlerName && store.getTiddler(tiddlerName)) {
tiddlerName = prompt("A tiddler named '"+tiddlerName+"' already exists.\n\n"+"Please specify a tiddler name.", tiddlerName);
}
// tiddlerName is either null (user canceled) or a name that is not yet in the store.
if (tiddlerName) {
var body = "<<formTiddler [["+formTemplateName+"]]>>";
var tags = [];
store.saveTiddler(tiddlerName,tiddlerName,body,config.options.txtUserName,new Date(),tags);
story.displayTiddler(null,tiddlerName,1);
}
}
createTiddlyButton(place,buttonLabel,buttonLabel,onClick);
}
}
//}}}
/***
!Licence and Copyright
Copyright (c) abego Software ~GmbH, 2005 ([[www.abego-software.de|http://www.abego-software.de]])
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
Redistributions in binary form must reproduce the above copyright notice, this
list of conditions and the following disclaimer in the documentation and/or other
materials provided with the distribution.
Neither the name of abego Software nor the names of its contributors may be
used to endorse or promote products derived from this software without specific
prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
DAMAGE.
***/
/***
|Name|FramedLinksPlugin|
|Source|http://www.TiddlyTools.com/#FramedLinksPlugin|
|Version|1.1.0|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides|createExternalLink|
|Options|##Configuration|
|Description|clicking an external link opens an IFRAME following the link instead of opening a new tab/window|
This plugin causes clicks on external links to be rendered into inline frames (~IFRAMEs) instead of opening them in new browser tabs/windows.
!!!!!Usage
<<<
Just place an external link into your tiddler content using standard TiddlyWiki syntax. When the {{{chkFramedLinks}}} checkbox is enabled or a tiddler is tagged with 'framedLinks' (see Configuration section, below), an IFRAME will be created dynamically whenever you click the external link. Clicking on the link again removes the IFRAME. You can hold down a modifier key (shift, control, or alt) while clicking a specific link to ''temporarily'' bypass the plugin-enhanced IFRAME handling and use the standard link handling behavior for that link.
<<<
!!!!!Configuration
<<<
<<option chkFramedLinks>> display inline frames for all external links
{{{usage: <<option chkFramedLinks>>}}}
<<option chkFramedLinksTag>> display inline frames for external links in tiddlers tagged with: <<option txtFramedLinksTag>>
{{{usage: <<option chkFramedLinksTag>> and <<option txtFramedLinksTag>>}}}
IFRAME size (CSS units: %, em, px, cm, in) - width: <<option txtFrameWidth>> height: <<option txtFrameHeight>>
{{{usage: <<option txtFrameWidth>> <<option txtFrameHeight>>}}}
<<<
!!!!!Examples
<<<
Try these links:
*http://www.TiddlyWiki.com
*http://www.TiddlyTools.com
*http://groups.google.com/group/TiddlyWiki/topics
<<<
!!!!!Revisions
<<<
2008.09.13 [1.1.0] added support to selectively enable embedded IFRAMEs if the containing tiddler is tagged with 'framedLinks'
2007.11.29 [1.0.5] added slider animation and improved CSS handling for IFRAME height/width to maximize display area
2007.11.29 [1.0.0] initial release
<<<
!!!!!Code
***/
//{{{
version.extensions.FramedLinksPlugin= {major: 1, minor: 1, revision: 0, date: new Date(2008,9,13)};
var co=config.options; // abbreviation
if (co.chkFramedLinks==undefined) co.chkFramedLinks=false;
if (co.chkFramedLinksTag==undefined) co.chkFramedLinksTag=true;
if (co.txtFramedLinksTag==undefined) co.txtFramedLinksTag="framedLinks";
if (co.txtFrameWidth==undefined) co.txtFrameWidth="100%";
if (co.txtFrameHeight==undefined) co.txtFrameHeight="80%";
window.framedLinks_createExternalLink=createExternalLink;
window.createExternalLink=function(place,url)
{
var link=this.framedLinks_createExternalLink.apply(this,arguments);
link.onclick=function(ev) { var e=ev?ev:window.event;
var co=config.options; // abbreviation
var here=story.findContainingTiddler(this);
var enabled=co.chkFramedLinks || co.chkFramedLinksTag && here
&& store.getTiddler(here.getAttribute("tiddler")).isTagged(co.txtFramedLinksTag);
if (!enabled || e.ctrlKey || e.shiftKey || e.altKey) return; // BYPASS
var p=this.parentNode;
var f=this.nextSibling?this.nextSibling.firstChild:null; // get the IFRAME... maybe...
var w=co.txtFrameWidth; if (!w || !w.length) w="100%";
var h=co.txtFrameHeight; if (!h || !h.length) h="80%";
if (h.indexOf("%")) h=(findWindowHeight()*h.replace(/%/,"")/100)+"px"; // calc height as % of window
var showing=f && f.nodeName.toUpperCase()=="IFRAME"; // does IFRAME really exist?
var stretchCell=p.nodeName.toUpperCase()=="TD" && w.indexOf("%")!=-1 && w.replace(/%/,"")>=100;
if (!showing) { // create an iframe
link.style.display="block"; // force IFRAME onto line following link
if (stretchCell) { p.setAttribute("savedWidth",p.style.width); p.style.width="100%"; } // adjust TD so IFRAME stretches
var wrapper=createTiddlyElement(null,"span"); // wrapper for slider animation
wrapper.setAttribute("url",this.href); // for async loading of frame after animation completes
var f=createTiddlyElement(wrapper,"iframe"); // create IFRAME
f.style.backgroundColor="#fff"; f.style.width=w; f.style.height=h;
p.insertBefore(wrapper,this.nextSibling);
function loadURL(wrapper) { var f=wrapper.firstChild; var url=wrapper.getAttribute("url");
var d=f.contentDocument?f.contentDocument:(f.contentWindow?f.contentWindow.document:f.document);
d.open(); d.writeln("<html>connecting to "+url+"</html>"); d.close();
try { f.src=url; } // if the iframe can't handle the href
catch(e) { alert(e.description?e.description:e.toString()); } // ... then report the error
window.scrollTo(0,ensureVisible(wrapper));
}
if (!co.chkAnimate) loadURL(wrapper);
else {
var morph=new Slider(wrapper,true);
morph.callback=loadURL;
morph.properties.push({style: 'width', start: 0, end: 100, template: '%0%'});
anim.startAnimating(morph);
}
} else { // remove iframe
link.style.display="inline"; // restore link style
if (stretchCell) p.style.width=p.getAttribute("savedWidth"); // restore previous width of TD
if (!co.chkAnimate) p.removeChild(f.parentNode);
else {
var morph=new Slider(f.parentNode,false,false,"all");
morph.properties.push({style: 'width', start: 100, end: 0, template: '%0%'});
anim.startAnimating(morph);
}
}
e.cancelBubble=true; if (e.stopPropagation) e.stopPropagation(); return false;
}
return link;
}
//}}}
!HUSK at ændre titelen til den aktuelle dato!!!
NB! Titlerne ændres når du tagger eller åbner igen!! - Hvis du vil beholde forslaget skal du kopiere (Ctrl+C) og sætte ind igen -
(redigér eller wysiwyg) så bliver det ved med at være det samme..
Ved kopiering:
Erstat titellinien med:
!!Fredagssangtimen
{{{|sortable|k}}}
{{{|Titel|Kilde|nr|h}}}
Brug <<tiddler QuickEdit_convert>> på resten af teksten (commas to table)
<<tiddler KlikSelv>>
/***
|Name|FullScreenPlugin|
|Created by|SaqImtiaz|
|Location|http://tw.lewcid.org/#FullScreenPlugin|
|Version|1.1|
|Requires|~TW2.x|
!Description:
Toggle between viewing tiddlers fullscreen and normally. Very handy for when you need more viewing space.
!Demo:
Click the ↕ button in the toolbar for this tiddler. Click it again to turn off fullscreen.
!Installation:
Copy the contents of this tiddler to your TW, tag with systemConfig, save and reload your TW.
Edit the ViewTemplate to add the fullscreen command to the toolbar.
!History:
*25-07-06: ver 1.1
*20-07-06: ver 1.0
!Code
***/
//{{{
var lewcidFullScreen = false;
config.commands.fullscreen =
{
text:" ↕ ",
tooltip:"Fullscreen mode"
};
config.commands.fullscreen.handler = function (event,src,title)
{
if (lewcidFullScreen == false)
{
lewcidFullScreen = true;
setStylesheet('#sidebar, .header, #mainMenu{display:none;} #displayArea{margin:0em 0 0 0 !important;}',"lewcidFullScreenStyle");
}
else
{
lewcidFullScreen = false;
setStylesheet(' ',"lewcidFullScreenStyle");
}
}
config.macros.fullscreen={};
config.macros.fullscreen.handler = function(place,macroName,params,wikifier,paramString,tiddler)
{
var label = params[0]||" ↕ ";
var tooltip = params[1]||"Fullscreen mode";
createTiddlyButton(place,label,tooltip,config.commands.fullscreen.handler);
}
var lewcid_fullscreen_closeTiddler = Story.prototype.closeTiddler;
Story.prototype.closeTiddler =function(title,animate,slowly)
{
lewcid_fullscreen_closeTiddler.apply(this,arguments);
if (story.isEmpty() && lewcidFullScreen == true)
config.commands.fullscreen.handler();
}
Slider.prototype.lewcidStop = Slider.prototype.stop;
Slider.prototype.stop = function()
{
this.lewcidStop();
if (story.isEmpty() && lewcidFullScreen == true)
config.commands.fullscreen.handler();
}
//}}}
<html><p align="center"><iframe src="//www.google.com/calendar/embed?title=Sang/fortælling HU 08/09&mode=AGENDA&height=600&wkst=2&bgcolor=%23FFFFFF&src=80qpmmfmkvjoosrrnddc9m8ua8%40group.calendar.google.com&color=%237A367A&ctz=Europe%2FCopenhagen" style=" border-width:0 " width="300" height="630" frameborder="0" scrolling="no"></iframe></html>
Du kan:
#Ændre titelen ved at klikke på [[SideTitel|SiteTitle]] og skriv en ny titel.
#Ændre eller fjerne undertitlen ved at klikke på [[UnderTitel|SiteSubtitle]] og gør hvad du vil med den.
#Bestemme hvad der viser sig når du åbner Simple Noter ved at åbne DefaultTiddlers og udskifte {{{[[Instruktioner]]}}} med en notetitel omkranset af dobblete firkantede paranteser.
#Når du er sikker på at du ikke længere har brug for dem, kan du slette [[Eksempel emne]], [[Eksempel underemne]] og [[Eksempel note]], [[Avanceret tilpasning]], og denne note, [[Grundlæggende tilpasning]].
[[GæsteKort|GæsteKort2]]@@position:relative;+++^40em^@[[GæsteKort|GæsteKort2]]<<moveablePanel name:GæsteKort>>
----
| <<tiddler GæsteKort2>> |
===
@@
<html><br><a href="http://www.maploco.com/view.php?id=3244946"><img border=0 src="http://www.maploco.com/vmap/3244946.png" alt="Visitor Map"></a><br><a href="http://www.maploco.com/">Create your own visitor map!</a><br><img style="visibility:hidden;width:0px;height:0px;" border=0 width=0 height=0 src="http://counters.gigya.com/wildfire/IMP/CXNID=2000002.0NXC/bT*xJmx*PTEyMzYwMjYyNDg2MjUmcHQ9MTIzNjAyNjI2NTk4NCZwPTMyMzAwMiZkPSZnPTEmdD*mbz1kNmFjZjk5Y2QyZGU*MzFiODljZmU2NjY1NWYwNDNhZQ==.gif" /></html>
/***
|Name|HTMLFormattingPlugin|
|Source|http://www.TiddlyTools.com/#HTMLFormattingPlugin|
|Documentation|http://www.TiddlyTools.com/#HTMLFormattingPluginInfo|
|Version|2.3.0|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides|'HTML' formatter|
|Description|embed wiki syntax formatting inside of HTML content|
The ~HTMLFormatting plugin allows you to ''mix wiki-style formatting syntax within HTML formatted content'' by extending the action of the standard TiddlyWiki formatting handler.
!!!!!Documentation
>see [[HTMLFormattingPluginInfo]]
!!!!!Revisions
<<<
2008.10.02 [2.3.0] added use of {{{<nowiki>}}} marker to bypass all wikification inside a specific HTML block
2008.09.19 [2.2.0] in wikifyTextNodes(), don't wikify the contents of STYLE nodes (thanks to MorrisGray for bug report)
| see [[HTMLFormattingPluginInfo]] for additional revision details |
2005.06.26 [1.0.0] Initial Release (as code adaptation - pre-dates TiddlyWiki plugin architecture!!)
<<<
!!!!!Code
***/
//{{{
version.extensions.HTMLFormattingPlugin= {major: 2, minor: 3, revision: 0, date: new Date(2008,10,2)};
// find the formatter for HTML and replace the handler
initHTMLFormatter();
function initHTMLFormatter()
{
for (var i=0; i<config.formatters.length && config.formatters[i].name!="html"; i++);
if (i<config.formatters.length) config.formatters[i].handler=function(w) {
if (!this.lookaheadRegExp) // fixup for TW2.0.x
this.lookaheadRegExp = new RegExp(this.lookahead,"mg");
this.lookaheadRegExp.lastIndex = w.matchStart;
var lookaheadMatch = this.lookaheadRegExp.exec(w.source)
if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {
var html=lookaheadMatch[1];
// if <nowiki> is present, just let browser handle it!
if (html.indexOf('<nowiki>')!=-1)
createTiddlyElement(w.output,"span").innerHTML=html;
else {
// if <hide linebreaks> is present, suppress wiki-style literal handling of newlines
if (html.indexOf('<hide linebreaks>')!=-1) html=html.replace(/\n/g,' ');
// remove all \r's added by IE textarea and mask newlines and macro brackets
html=html.replace(/\r/g,'').replace(/\n/g,'\\n').replace(/<</g,'%%(').replace(/>>/g,')%%');
// create span, let browser parse HTML
var e=createTiddlyElement(w.output,"span"); e.innerHTML=html;
// then re-render text nodes as wiki-formatted content
wikifyTextNodes(e);
}
w.nextMatch = this.lookaheadRegExp.lastIndex; // continue parsing
}
}
}
// wikify #text nodes that remain after HTML content is processed (pre-order recursion)
function wikifyTextNodes(theNode)
{
function unmask(s) { return s.replace(/\%%\(/g,'<<').replace(/\)\%%/g,'>>').replace(/\\n/g,'\n'); }
switch (theNode.nodeName.toLowerCase()) {
case 'style': case 'option': case 'select':
theNode.innerHTML=unmask(theNode.innerHTML);
break;
case 'textarea':
theNode.value=unmask(theNode.value);
break;
case '#text':
var txt=unmask(theNode.nodeValue);
var newNode=createTiddlyElement(null,"span");
theNode.parentNode.replaceChild(newNode,theNode);
wikify(txt,newNode);
break;
default:
for (var i=0;i<theNode.childNodes.length;i++)
wikifyTextNodes(theNode.childNodes.item(i)); // recursion
break;
}
}
//}}}
|Name|HTMLFormattingPluginInfo|
|Source|http://www.TiddlyTools.com/#HTMLFormattingPlugin|
|Documentation|http://www.TiddlyTools.com/#HTMLFormattingPluginInfo|
|Version|2.3.0|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|documentation|
|Requires||
|Overrides||
|Description|documentation for HTMLFormattingPlugin|
The ~HTMLFormatting plugin allows you to freely ''mix wiki-style formatting syntax within HTML formatted content'' by extending the action of the standard TiddlyWiki formatting handler.
!!!!!Usage
<<<
The shorthand Wiki-style formatting syntax of ~TiddlyWiki is very convenient and enables most content to be reasonably well presented. However, there are times when tried-and-true HTML formatting syntax allows more more precise control of the content display.
When a tiddler is about to be displayed, ~TiddlyWiki looks for tiddler content contained within {{{<html>}}} and {{{</html>}}} markers. When present, the TiddlyWiki core simply passes this content directly to the browser's internal "rendering engine" to process as ~HTML-formatted content. However, TiddlyWiki does not also process the HTML source content for any embedded wiki-formatting syntax it may contain. This means that while you can use HTML formatted content, you cannot mix wiki-formatted content within the HTML formatting.
This plugin extends the TiddlyWiki core processing so that, after the HTML formatting has been processed, all the pieces of text occuring within the HTML block are then processed one piece at a time, so that normal wiki-style formatting can be applied to the individual text pieces.
Note: To bypass this extended processing for a specific section of HTML content, embed ''{{{<nowiki>}}}'' //anywhere// inside the {{{<html>...</html>}}} delimiters, and wiki formatting will not be applied to that content.
<<<
!!!!!Line breaks
<<<
One major difference between Wiki formatting and HTML formatting is how "line breaks" are processed. Wiki formatting treats all line breaks as literal content to be displayed //as-is//. However, because HTML normally ignores line breaks and actually processes them as simple "word separators" instead, many people who write HTML include extra line breaks in their documents, just to make the "source code" easier to read.
Even though you can use HTML tags within your tiddler content, the default treatment for line breaks still follows the Wiki-style rule (i.e., all new lines are displayed as-is). When adding HTML content to a tiddler (especially if you cut-and-paste it from another web page), you should take care to avoid adding extra line breaks to the text.
If removing all the extra line breaks from your HTML content would be a big hassle, you can quickly //override the default Wiki-style line break rule// so that the line breaks use the standard HTML rules, by placing ''{{{<hide linebreaks>}}}'' //anywhere// within the HTML content. This automatically converts all line breaks to spaces before rendering the content, so that the literal line breaks will be processed as simple word-breaks instead.
Note: this does //not// alter the actual tiddler content that is stored in the document, just the manner in which it is displayed. Any line breaks contained in the tiddler will still be there when you edit its content. Also, to include a literal line break when the ''<{{{hide linebreaks}}}>'' tag is present, you will need to use a ''<{{{br}}}>'' or ''<{{{p}}}>'' HTML tag instead of simply typing a line break.
<<<
!!!!!How it works
<<<
The TW core support for HTML does not let you put ANY wiki-style syntax (including TW macros) *inside* the {{{<html>...</html>}}} block. Everything between {{{<html>}}} and {{{</html>}}} is handed to the browser for processing and that is it.
However, not all wiki syntax can be safely passed through the browser's parser. Specifically, any TW macros inside the HTML will get 'eaten' by the browser since the macro brackets, {{{<<...>>}}} use the "<" and ">" that normally delimit the HTML/XML syntax recognized by the browser's parser.
Similarly, you can't use InlineJavascript within the HTML because the {{{<script>...</script>}}} syntax will also be consumed by the browser and there will be nothing left to process afterward. Note: unfortunately, even though the browser removes the {{{<script>...</script>}}} sequence, it doesn't actually execute the embedded javascript code that it removes, so any scripts contained inside of <html> blocks in TW are currently being ignored. :-(
As a work-around to allow TW *macros* (but not inline scripts) to exist inside of <html> formatted blocks of content, the plugin first converts the {{{<<}}} and {{{>>}}} into "%%(" and ")%%", making them "indigestible" so they can pass unchanged through the belly of the beast (the browser's HTML parser).
After the browser has done its job, the wiki syntax sequences (including the "undigested" macros) are contained in #text nodes in the browser-generated DOM elements. The plugin then recursively locates and processes each #text node, converts the %%( and )%% back into {{{<<}}} and {{{>>}}}, passes the result to wikify() for further rendering of the wiki-formatted syntax into a containing SPAN that replaces the previous #text node. At the end of this process, none of the encoded %%( and )%% sequences remain in the rendered tiddler output.
<<<
!!!!!Revisions
<<<
2008.10.02 [2.3.0] added use of {{{<nowiki>}}} marker to bypass all wikification inside a specific HTML block
2008.09.19 [2.2.0] in wikifyTextNodes(), don't wikify the contents of STYLE nodes (thanks to MorrisGray for bug report)
2008.04.26 [*.*.*] plugin size reduction: more documentation moved to HTMLFormattingInfo
2008.01.08 [*.*.*] plugin size reduction: documentation moved to HTMLFormattingInfo
2007.12.04 [*.*.*] update for TW2.3.0: replaced deprecated core functions, regexps, and macros
2007.06.14 [2.1.5] in formatter, removed call to e.normalize(). Creates an INFINITE RECURSION error in Safari!!!!
2006.09.10 [2.1.4] update formatter for 2.1 compatibility (use this.lookaheadRegExp instead of temp variable)
2006.05.28 [2.1.3] in wikifyTextNodes(), decode the *value* of TEXTAREA nodes, but don't wikify() its children. (thanks to "ayj" for bug report)
2006.02.19 [2.1.2] in wikifyTextNodes(), put SPAN element into tiddler DOM (replacing text node), BEFORE wikifying the text content. This ensures that the 'place' passed to any macros is correctly defined when the macro is evaluated, so that calls to story.findContainingTiddler(place) will work as expected. (Thanks for bug report from GeoffSlocock)
2006.02.05 [2.1.1] wrapped wikifier hijack in init function to eliminate globals and avoid FireFox 1.5.0.1 crash bug when referencing globals
2005.12.01 [2.1.0] don't wikify #TEXT nodes inside SELECT and TEXTAREA elements
2005.11.06 [2.0.1] code cleanup
2005.10.31 [2.0.0] replaced hijack wikify() with hijack config.formatters["html"] and simplified recursive WikifyTextNodes() code
2005.10.09 [1.0.2] combined documentation and code into a single tiddler
2005.08.05 [1.0.1] moved HTML and CSS definitions into plugin code instead of using separate tiddlers
2005.07.26 [1.0.1] Re-released as a plugin. Added <{{{html}}}>...</{{{nohtml}}}> and <{{{hide newlines}}}> handling
2005.06.26 [1.0.0] Initial Release (as code adaptation - pre-dates TiddlyWiki plugin architecture!!)
<<<
/***
|Name:|HideWhenPlugin|
|Description:|Allows conditional inclusion/exclusion in templates|
|Version:|3.1 ($Rev: 3919 $)|
|Date:|$Date: 2008-03-13 02:03:12 +1000 (Thu, 13 Mar 2008) $|
|Source:|http://mptw.tiddlyspot.com/#HideWhenPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
For use in ViewTemplate and EditTemplate. Example usage:
{{{<div macro="showWhenTagged Task">[[TaskToolbar]]</div>}}}
{{{<div macro="showWhen tiddler.modifier == 'BartSimpson'"><img src="bart.gif"/></div>}}}
***/
//{{{
window.hideWhenLastTest = false;
window.removeElementWhen = function(test,place) {
window.hideWhenLastTest = test;
if (test) {
removeChildren(place);
place.parentNode.removeChild(place);
}
};
merge(config.macros,{
hideWhen: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
removeElementWhen( eval(paramString), place);
}},
showWhen: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
removeElementWhen( !eval(paramString), place);
}},
hideWhenTagged: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
removeElementWhen( tiddler.tags.containsAll(params), place);
}},
showWhenTagged: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
removeElementWhen( !tiddler.tags.containsAll(params), place);
}},
hideWhenTaggedAny: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
removeElementWhen( tiddler.tags.containsAny(params), place);
}},
showWhenTaggedAny: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
removeElementWhen( !tiddler.tags.containsAny(params), place);
}},
hideWhenTaggedAll: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
removeElementWhen( tiddler.tags.containsAll(params), place);
}},
showWhenTaggedAll: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
removeElementWhen( !tiddler.tags.containsAll(params), place);
}},
hideWhenExists: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
removeElementWhen( store.tiddlerExists(params[0]) || store.isShadowTiddler(params[0]), place);
}},
showWhenExists: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
removeElementWhen( !(store.tiddlerExists(params[0]) || store.isShadowTiddler(params[0])), place);
}},
hideWhenTitleIs: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
removeElementWhen( tiddler.title == params[0], place);
}},
showWhenTitleIs: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
removeElementWhen( tiddler.title != params[0], place);
}},
'else': { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
removeElementWhen( !window.hideWhenLastTest, place);
}}
});
//}}}
/***
|''Name:''|HistoryPlugin|
|''Description:''|Limits to only one tiddler open. Manages an history stack and provides macro to navigate in this history (<<history>><<back>><<forward>>).|
|''Version:''|1.0.0|
|''Date:''|2008-03-23|
|''Source:''|http://tiddlywiki.bidix.info/#HistoryPlugin|
|''Author:''|BidiX (BidiX (at) bidix (dot) info)|
|''[[License]]:''|[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D ]]|
|''~CoreVersion:''|2.3.0|
***/
//{{{
Story.prototype.tiddlerHistory = [];
Story.prototype.historyCurrentPos = -1;
Story.prototype.currentTiddler = null;
Story.prototype.maxPos = 11;
Story.prototype.old_history_displayTiddler = Story.prototype.displayTiddler;
Story.prototype.displayTiddler = function(srcElement,title,template,animate,slowly)
{
title = ((typeof title === "string") ? title : title.title);
//SinglePageMode
if (this.currentTiddler) this.closeTiddler(this.currentTiddler);
if (template == 2) {
//switch to Edit mode : don't manage
story.old_history_displayTiddler(null,title,template,animate,slowly);
return;
}
// if same tiddler no change
if (this.tiddlerHistory[this.historyCurrentPos] == title) {
this.currentTiddler = title;
story.old_history_displayTiddler(null,title,template,animate,slowly);
return;
}
if (this.historyCurrentPos == this.tiddlerHistory.length -1) {
// bottom of stack
this.tiddlerHistory.push(title);
if (this.tiddlerHistory.length > 11) {
this.tiddlerHistory.shift();
} else {
this.historyCurrentPos += 1;
}
} else {
// middle of stack
this.historyCurrentPos += 1;
if (this.tiddlerHistory[this.historyCurrentPos] != title) {
// path change => cut history
this.tiddlerHistory[this.historyCurrentPos] = title;
var a = [];
for(var i = 0; i <= this.historyCurrentPos;i++) {
a[i] = this.tiddlerHistory[i];
}
this.tiddlerHistory = a;
}
}
this.currentTiddler = title;
story.old_history_displayTiddler(null,title,template,animate,true);
scrollTo(0, 1);
}
Story.prototype.old_history_closeTiddler = Story.prototype.closeTiddler;
Story.prototype.closeTiddler = function(title,animate,slowly)
{
this.currentTiddler = null;
story.old_history_closeTiddler.apply(this,arguments);
}
config.macros.history = {};
config.macros.history.action = function(event) {
var popup = Popup.create(this);
if(popup)
{
if (!story.tiddlerHistory.length)
createTiddlyText(popup,"No history");
else
{
var c = story.tiddlerHistory.length;
for (i=0; i<c;i++ )
{
var elmt = createTiddlyElement(popup,"li");
var btn = createTiddlyButton(elmt,story.tiddlerHistory[i],story.tiddlerHistory[i],config.macros.history.onClick);
btn.setAttribute("historyPos",i);
}
}
}
Popup.show(popup,false);
event.cancelBubble = true;
if (event.stopPropagation) event.stopPropagation();
return false;
}
config.macros.history.handler = function(place,macroName,params)
{
createTiddlyButton(place, 'history', 'history', config.macros.history.action);
}
config.macros.history.onClick = function(ev)
{
var e = ev ? ev : window.event;
var historyPos = this.getAttribute("historyPos");
story.historyCurrentPos = historyPos -1;
story.displayTiddler(null,story.tiddlerHistory[historyPos]);
return false;
};
config.macros.back = {};
config.macros.back.action = function() {
if (story.historyCurrentPos > 0) {
if (story.currentTiddler) story.closeTiddler(story.currentTiddler);
story.historyCurrentPos = story.historyCurrentPos -2;
story.displayTiddler(null,story.tiddlerHistory[story.historyCurrentPos+1]);
} else {
//if (story.currentTiddler) story.old_history_displayTiddler(null,story.currentTiddler);
};
return false;
}
config.macros.back.handler = function(place,macroName,params)
{
createTiddlyButton(place, '◄', 'back', config.macros.back.action,"backButton");
}
config.macros.forward = {};
config.macros.forward.action = function() {
if (story.historyCurrentPos < story.tiddlerHistory.length -1) {
if (story.currentTiddler) story.closeTiddler(story.currentTiddler);
//story.historyCurrentPos = story.historyCurrentPos;
story.displayTiddler(null,story.tiddlerHistory[story.historyCurrentPos+1]);
} else {
//if (story.currentTiddler) story.old_history_displayTiddler(null,story.currentTiddler);
}
return false;
}
config.macros.forward.handler = function(place,macroName,params)
{
createTiddlyButton(place, '►', 'forward', config.macros.forward.action, "ibutton");
}
//}}}
<<siteMap [[Hjælp]] . sliders>>
<<top>>
<<slider chkSlider SearchMenu ?>>
<<slider chkChat SangTimeLærerChat "C»">>
/***
|Name|HoverMenuPlugin|
|Created by|SaqImtiaz|
|Location|http://tw.lewcid.org/#HoverMenuPlugin|
|Version|1.11|
|Requires|~TW2.x|
!Description:
Provides a hovering menu on the edge of the screen for commonly used commands, that scrolls with the page.
!Demo:
Observe the hovering menu on the right edge of the screen.
!Installation:
Copy the contents of this tiddler to your TW, tag with systemConfig, save and reload your TW.
To customize your HoverMenu, edit the HoverMenu shadow tiddler.
To customize whether the menu sticks to the right or left edge of the screen, and its start position, edit the HoverMenu configuration settings part of the code below. It's well documented, so don't be scared!
The menu has an id of hoverMenu, in case you want to style the buttons in it using css.
!Notes:
Since the default HoverMenu contains buttons for toggling the side bar and jumping to the top of the screen and to open tiddlers, the ToggleSideBarMacro, JumpMacro and the JumpToTopMacro are included in this tiddler, so you dont need to install them separately. Having them installed separately as well could lead to complications.
If you dont intend to use these three macros at all, feel free to remove those sections of code in this tiddler.
!To Do:
* rework code to allow multiple hovering menus in different positions, horizontal etc.
* incorporate code for keyboard shortcuts that correspond to the buttons in the hovermenu
!History:
*03-08-06, ver 1.1.2: compatibility fix with SelectThemePlugin
*03-08-06, ver 1.11: fixed error with button tooltips
*27-07-06, ver 1.1 : added JumpMacro to hoverMenu
*23-07-06
!Code
***/
/***
start HoverMenu plugin code
***/
//{{{
config.hoverMenu={};
//}}}
/***
HoverMenu configuration settings
***/
//{{{
config.hoverMenu.settings={
align: 'right', //align menu to right or left side of screen, possible values are 'right' and 'left'
x: 24, // horizontal distance of menu from side of screen, increase to your liking.
y: 340 //vertical distance of menu from top of screen at start, increase or decrease to your liking
};
//}}}
//{{{
//continue HoverMenu plugin code
config.hoverMenu.handler=function()
{
if (!document.getElementById("hoverMenu"))
{
var theMenu = createTiddlyElement(document.getElementById("contentWrapper"), "div","hoverMenu");
theMenu.setAttribute("refresh","content");
theMenu.setAttribute("tiddler","HoverMenu");
var menuContent = store.getTiddlerText("HoverMenu");
wikify(menuContent,theMenu);
}
var Xloc = this.settings.x;
Yloc =this.settings.y;
var ns = (navigator.appName.indexOf("Netscape") != -1);
function SetMenu(id)
{
var GetElements=document.getElementById?document.getElementById(id):document.all?document.all[id]:document.layers[id];
if(document.layers)GetElements.style=GetElements;
GetElements.sP=function(x,y){this.style[config.hoverMenu.settings.align]=x +"px";this.style.top=y +"px";};
GetElements.x = Xloc;
GetElements.y = findScrollY();
GetElements.y += Yloc;
return GetElements;
}
window.LoCate_XY=function()
{
var pY = findScrollY();
ftlObj.y += (pY + Yloc - ftlObj.y)/15;
ftlObj.sP(ftlObj.x, ftlObj.y);
setTimeout("LoCate_XY()", 10);
}
ftlObj = SetMenu("hoverMenu");
LoCate_XY();
};
window.old_lewcid_hovermenu_restart = restart;
restart = function()
{
window.old_lewcid_hovermenu_restart();
config.hoverMenu.handler();
};
setStylesheet(
"#hoverMenu .imgLink, #hoverMenu .imgLink:hover {border:none; padding:0px; float:right; margin-bottom:2px; margin-top:0px;}\n"+
"#hoverMenu .button, #hoverMenu .tiddlyLink {border:none; font-weight:bold; background:#18f; color:#FFF; padding:0 5px; float:right; min-width:2em; text-align:center; margin-bottom:4px;}\n"+
"#hoverMenu .button:hover, #hoverMenu .tiddlyLink:hover {border:none; font-weight:bold; background:#000; color:#FFF; padding:0 5px; float:right; min-width:2em; text-align:center; margin-bottom:4px;}\n"+
"#hoverMenu .sliderPanel {font-weight:bold; border:none; background:#18f; float:right; margin-bottom:7px; min-width:6em;}\n"+
"#hoverMenu .sliderPanel .txtOptionInput{font-weight:bold; border:none; background:#fff; float:right; margin:4px; padding:4px;}\n"+
"#hoverMenu .sliderPanel .searchButton {font-weight:bold; color:#fff; margin:4px;}\n"+
"#hoverMenu .sliderPanel .searchButton:hover {font-weight:bold; color:#fff; background:#000}\n"+
"#hoverMenu .sliderPanel .button #hoverMenu .sliderPanel .tiddlyLink {width:100&; font-weight:bold; background:#18f; border:none; text-align:center}\n"+
"#hoverMenu .sliderPanel .button:hover #hoverMenu .sliderPanel .tiddlyLink:hover{font-weight:bold; background:#000; border:none; text-align:center}\n"+
"#hoverMenu { position:absolute; width:7px;}\n"+
"\n","hoverMenuStyles");
config.macros.renameButton={};
config.macros.renameButton.handler = function(place,macroName,params,wikifier,paramString,tiddler)
{
if (place.lastChild.tagName!="BR")
{
place.lastChild.firstChild.data = params[0];
if (params[1]) {place.lastChild.title = params[1];}
}
};
config.shadowTiddlers["HoverMenu"]="<<top>>\n<<toggleSideBar>><<renameButton '>' >>\n<<jump j '' top>>\n<<saveChanges>><<renameButton s 'Save TiddlyWiki'>>\n<<newTiddler>><<renameButton n>>\n";
//}}}
//end HoverMenu plugin code
//Start ToggleSideBarMacro code
//{{{
config.macros.toggleSideBar={};
config.macros.toggleSideBar.settings={
styleHide : "#sidebar { display: none;}\n"+"#contentWrapper #displayArea { margin-right: 1em;}\n"+"",
styleShow : " ",
arrow1: "«",
arrow2: "»"
};
config.macros.toggleSideBar.handler=function (place,macroName,params,wikifier,paramString,tiddler)
{
var tooltip= params[1]||'toggle sidebar';
var mode = (params[2] && params[2]=="hide")? "hide":"show";
var arrow = (mode == "hide")? this.settings.arrow1:this.settings.arrow2;
var label= (params[0]&¶ms[0]!='.')?params[0]+" "+arrow:arrow;
var theBtn = createTiddlyButton(place,label,tooltip,this.onToggleSideBar,"button HideSideBarButton");
if (mode == "hide")
{
(document.getElementById("sidebar")).setAttribute("toggle","hide");
setStylesheet(this.settings.styleHide,"ToggleSideBarStyles");
}
};
config.macros.toggleSideBar.onToggleSideBar = function(){
var sidebar = document.getElementById("sidebar");
var settings = config.macros.toggleSideBar.settings;
if (sidebar.getAttribute("toggle")=='hide')
{
setStylesheet(settings.styleShow,"ToggleSideBarStyles");
sidebar.setAttribute("toggle","show");
this.firstChild.data= (this.firstChild.data).replace(settings.arrow1,settings.arrow2);
}
else
{
setStylesheet(settings.styleHide,"ToggleSideBarStyles");
sidebar.setAttribute("toggle","hide");
this.firstChild.data= (this.firstChild.data).replace(settings.arrow2,settings.arrow1);
}
return false;
}
setStylesheet(".HideSideBarButton .button {font-weight:bold; padding: 0 5px;}\n","ToggleSideBarButtonStyles");
//}}}
//end ToggleSideBarMacro code
//start JumpToTopMacro code
//{{{
config.macros.top={};
config.macros.top.handler=function(place,macroName)
{
createTiddlyButton(place,"^","jump to top",this.onclick);
}
config.macros.top.onclick=function()
{
window.scrollTo(0,0);
};
config.commands.top =
{
text:" ^ ",
tooltip:"jump to top"
};
config.commands.top.handler = function(event,src,title)
{
window.scrollTo(0,0);
}
//}}}
//end JumpToStartMacro code
//start JumpMacro code
//{{{
config.macros.jump= {};
config.macros.jump.handler = function (place,macroName,params,wikifier,paramString,tiddler)
{
var label = (params[0] && params[0]!=".")? params[0]: 'jump';
var tooltip = (params[1] && params[1]!=".")? params[1]: 'jump to an open tiddler';
var top = (params[2] && params[2]=='top') ? true: false;
var btn =createTiddlyButton(place,label,tooltip,this.onclick);
if (top==true)
btn.setAttribute("top","true")
}
config.macros.jump.onclick = function(e)
{
if (!e) var e = window.event;
var theTarget = resolveTarget(e);
var top = theTarget.getAttribute("top");
var popup = Popup.create(this);
if(popup)
{
if(top=="true")
{createTiddlyButton(createTiddlyElement(popup,"li"),'Top ↑','Top of TW',config.macros.jump.top);
createTiddlyElement(popup,"hr");}
story.forEachTiddler(function(title,element) {
createTiddlyLink(createTiddlyElement(popup,"li"),title,true);
});
}
Popup.show(popup,false);
e.cancelBubble = true;
if (e.stopPropagation) e.stopPropagation();
return false;
}
config.macros.jump.top = function()
{
window.scrollTo(0,0);
}
//}}}
//end JumpMacro code
//utility functions
//{{{
Popup.show = function(unused,slowly)
{
var curr = Popup.stack[Popup.stack.length-1];
var rootLeft = findPosX(curr.root);
var rootTop = findPosY(curr.root);
var rootHeight = curr.root.offsetHeight;
var popupLeft = rootLeft;
var popupTop = rootTop + rootHeight;
var popupWidth = curr.popup.offsetWidth;
var winWidth = findWindowWidth();
if (isChild(curr.root,'hoverMenu'))
var x = config.hoverMenu.settings.x;
else
var x = 0;
if(popupLeft + popupWidth+x > winWidth)
popupLeft = winWidth - popupWidth -x;
if (isChild(curr.root,'hoverMenu'))
{curr.popup.style.right = x + "px";}
else
curr.popup.style.left = popupLeft + "px";
curr.popup.style.top = popupTop + "px";
curr.popup.style.display = "block";
addClass(curr.root,"highlight");
if(config.options.chkAnimate)
anim.startAnimating(new Scroller(curr.popup,slowly));
else
window.scrollTo(0,ensureVisible(curr.popup));
}
window.isChild = function(e,parentId) {
while (e != null) {
var parent = document.getElementById(parentId);
if (parent == e) return true;
e = e.parentNode;
}
return false;
};
//}}}
Kan du li' ''~No-Brainer Notes''? Hvis du kan, kan du hjælpe os på denne måde:
* [[Besøg vores hjemmeside|http://www.giffmex.org]]
* [[Læs om den missions agency vi tilhører, CRWM|http://www.crcna.org/pages/crwm.cfm]]
* [[Donér til CRWM|http://www.crcna.org/pages/crwm_donate_online.cfm]]
* [[Vores Amazon ønskeliste|https://www.amazon.com/gp/registry/wishlist/1OTJM9IE7SPVS/ref=wl_web/]]
* PayPal til vores hjemmeside:<html><form action="https://www.paypal.com/cgi-bin/webscr" method="post"> <input name="cmd" type="hidden" value="_s-xclick" /> <input alt="PayPal - The safer, easier way to pay online!" name="submit" src="https://www.paypal.com/en_US/i/btn/btn_donate_LG.gif" type="image" /><img src="https://www.paypal.com/en_US/i/scr/pixel.gif" border="0" alt="" width="1" height="1" />
<input name="encrypted" type="hidden" value="-----BEGIN PKCS7-----MIIHRwYJKoZIhvcNAQcEoIIHODCCBzQCAQExggEwMIIBLAIBADCBlDCBjjELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAkNBMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRQwEgYDVQQKEwtQYXlQYWwgSW5jLjETMBEGA1UECxQKbGl2ZV9jZXJ0czERMA8GA1UEAxQIbGl2ZV9hcGkxHDAaBgkqhkiG9w0BCQEWDXJlQHBheXBhbC5jb20CAQAwDQYJKoZIhvcNAQEBBQAEgYCDOphPrfxixGLSFLAVYRgOAIIMNkhG/fVpBpfPkFZ+/otUKEu2UHrY0szrTCsf73EmPs1hEqXAevosf4f3wmMQGaQ/+dxpooMXJJjv4Y2b74SuehERvjBeBrIOJ6eVVJyTRqTYVACX48cdtp9K8u/qFPEf389dSFw79O0qSSw2YDELMAkGBSsOAwIaBQAwgcQGCSqGSIb3DQEHATAUBggqhkiG9w0DBwQIvazyO9DMtDGAgaCV7RZqlbC45beBnYKwrZ/t12EFK0DQViCLvSD1OMX0VNiCuXK2lxtlpTzi0ZujHXrRjPZg6zZc5dMsL//Ervy+zUBl6jpsQg5UxqponKYcNnWXjErastgJdYP3Yy5l95L1MwsHnxzhvANg3cIuYhVOsvDNxc933cEdwMSBKI2Q9Kg6oixC49A6FTYW/Xgp2xfdINr7ema6Vgk9V3pge1xjoIIDhzCCA4MwggLsoAMCAQICAQAwDQYJKoZIhvcNAQEFBQAwgY4xCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJDQTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEUMBIGA1UEChMLUGF5UGFsIEluYy4xEzARBgNVBAsUCmxpdmVfY2VydHMxETAPBgNVBAMUCGxpdmVfYXBpMRwwGgYJKoZIhvcNAQkBFg1yZUBwYXlwYWwuY29tMB4XDTA0MDIxMzEwMTMxNVoXDTM1MDIxMzEwMTMxNVowgY4xCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJDQTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEUMBIGA1UEChMLUGF5UGFsIEluYy4xEzARBgNVBAsUCmxpdmVfY2VydHMxETAPBgNVBAMUCGxpdmVfYXBpMRwwGgYJKoZIhvcNAQkBFg1yZUBwYXlwYWwuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDBR07d/ETMS1ycjtkpkvjXZe9k+6CieLuLsPumsJ7QC1odNz3sJiCbs2wC0nLE0uLGaEtXynIgRqIddYCHx88pb5HTXv4SZeuv0Rqq4+axW9PLAAATU8w04qqjaSXgbGLP3NmohqM6bV9kZZwZLR/klDaQGo1u9uDb9lr4Yn+rBQIDAQABo4HuMIHrMB0GA1UdDgQWBBSWn3y7xm8XvVk/UtcKG+wQ1mSUazCBuwYDVR0jBIGzMIGwgBSWn3y7xm8XvVk/UtcKG+wQ1mSUa6GBlKSBkTCBjjELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAkNBMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRQwEgYDVQQKEwtQYXlQYWwgSW5jLjETMBEGA1UECxQKbGl2ZV9jZXJ0czERMA8GA1UEAxQIbGl2ZV9hcGkxHDAaBgkqhkiG9w0BCQEWDXJlQHBheXBhbC5jb22CAQAwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQUFAAOBgQCBXzpWmoBa5e9fo6ujionW1hUhPkOBakTr3YCDjbYfvJEiv/2P+IobhOGJr85+XHhN0v4gUkEDI8r2/rNk1m0GA8HKddvTjyGw/XqXa+LSTlDYkqI8OwR8GEYj4efEtcRpRYBxV8KxAW93YDWzFGvruKnnLbDAF6VR5w/cCMn5hzGCAZowggGWAgEBMIGUMIGOMQswCQYDVQQGEwJVUzELMAkGA1UECBMCQ0ExFjAUBgNVBAcTDU1vdW50YWluIFZpZXcxFDASBgNVBAoTC1BheVBhbCBJbmMuMRMwEQYDVQQLFApsaXZlX2NlcnRzMREwDwYDVQQDFAhsaXZlX2FwaTEcMBoGCSqGSIb3DQEJARYNcmVAcGF5cGFsLmNvbQIBADAJBgUrDgMCGgUAoF0wGAYJKoZIhvcNAQkDMQsGCSqGSIb3DQEHATAcBgkqhkiG9w0BCQUxDxcNMDgwMzIzMTU0MDU4WjAjBgkqhkiG9w0BCQQxFgQUN7zDTYDrAL6cj3fOJ2lKbzKgmcIwDQYJKoZIhvcNAQEBBQAEgYAsUnYV6vvQecisJkhmmfNmG2xemtFm7FfXCJZe+5sNDBiIgy/By44dLPor/j3KAmFsH27u4ORRVGgaYkG0/0Ga7ch1AZaMNCnrXQ8Yw6//ltBN+DPl7RWQ3hbgcPwbVarqkNM67LQ/Scfb22CKMAnKt4vjIeaWAnPySHVsYcqcpg==-----END PKCS7-----" /></form></html>
/***
|Name|ImageSizePlugin|
|Source|http://www.TiddlyTools.com/#ImageSizePlugin|
|Version|1.1.0|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin,formatter|
|Requires||
|Overrides|'image' formatter|
|Description|extends image syntax to add optional CSS width/height values|
!!!!!Usage
<<<
Extends standard TiddlyWiki image syntax, ''{{{[img[...]]}}}'', so you can specify CSS width/height values.
The extended syntax is:
>''{{{[img(x,y)[...]]}}}''
>where x and y are the desired width and height of the image, specified using CSS units of measurement (e.g., px, em, cm, in, or %). Use ''auto'' for either the width or height to scale image proportionally (i.e., maintain aspect ratio). You may also calculate a CSS value on-the-fly by using //evaluated javascript//, enclosed between """{{""" and """}}""", e.g, {{{({{widthFunction()}},{{heightFunction()}})}}}.
Note: this plugin also includes enhancements to support:
*[[AttachFilePluginFormatters]] (embed image files as text-encoded tiddlers)
* [[ImagePathPlugin]] (fallback locations for missing images)
Please refer to those plugins for details...
<<<
!!!!!Examples
<<<
{{{
[<img(34%,auto)[images/meow.gif]]
[<img(21%,auto)[images/meow.gif]]
[<img(13%,auto)[images/meow.gif]]
[<img(8%,auto)[images/meow.gif]]
[<img(5%,auto)[images/meow.gif]]
[<img(3%,auto)[images/meow.gif]]
[<img(2%,auto)[images/meow.gif]]
[img(1%,auto)[images/meow.gif]]
}}}
[<img(34%,auto)[images/meow.gif]]
[<img(21%,auto)[images/meow.gif]]
[<img(13%,auto)[images/meow.gif]]
[<img(8%,auto)[images/meow.gif]]
[<img(5%,auto)[images/meow.gif]]
[<img(3%,auto)[images/meow.gif]]
[<img(2%,auto)[images/meow.gif]]
[img(1%,auto)[images/meow.gif]]
{{clear block{}}}
<<<
!!!!!Revisions
<<<
2008.01.19 [1.1.0] added support for evaluated width/height values!!
2008.01.18 [1.0.1] code cleanup plus improved regexp for matching "(width,height)" by eliminating hard-coded recognition of [px,em,cm,in,%] CSS units. Syntax now accepts ANY values for width/height, and leaves it to the browser's CSS processing to handle any invalid values.
2008.01.17 [1.0.0] initial release
<<<
!!!!!Code
***/
//{{{
version.extensions.imageSize = {major: 1, minor: 1, revision: 0, date: new Date(2008,1,19)};
// replace standard handler for image formatter
// note: includes modifications for [[AttachFilePluginFormatters]] AND [[ImagePathPlugin]]
var f=config.formatters.findByField("name","image");
config.formatters[f].match="\\[[<>]?[Ii][Mm][Gg](?:\\([^,]*,[^\\)]*\\))?\\[";
config.formatters[f].lookaheadRegExp=/\[([<]?)(>?)[Ii][Mm][Gg](\([^,]*,[^\)]*\))?\[(?:([^\|\]]+)\|)?([^\[\]\|]+)\](?:\[([^\]]*)\])?\]/mg;
config.formatters[f].handler=function(w) {
this.lookaheadRegExp.lastIndex = w.matchStart;
var lookaheadMatch = this.lookaheadRegExp.exec(w.source)
if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {
var floatLeft=lookaheadMatch[1];
var floatRight=lookaheadMatch[2];
var XY=lookaheadMatch[3];
var tooltip=lookaheadMatch[4];
var src=lookaheadMatch[5];
var link=lookaheadMatch[6];
// Simple bracketted link
var e = w.output;
if(link) { // LINKED IMAGE
if (config.formatterHelpers.isExternalLink(link)) {
if (config.macros.attach && config.macros.attach.isAttachment(link)) {
// see [[AttachFilePluginFormatters]]
e = createExternalLink(w.output,link);
e.href=config.macros.attach.getAttachment(link);
e.title = config.macros.attach.linkTooltip + link;
} else
e = createExternalLink(w.output,link);
} else
e = createTiddlyLink(w.output,link,false,null,w.isStatic);
addClass(e,"imageLink");
}
var img = createTiddlyElement(e,"img");
if(floatLeft) img.align="left"; else if(floatRight) img.align="right"; // FLOAT LEFT/RIGHT
if(XY) { // CUSTOM SIZE with optional EVAL'ED width/height ({{...}},{{...}})
var parts=XY.replace(/[\(\)]/g,'').split(","); var x=parts[0]; var y=parts[1];
if (x.substr(0,2)=="{{") {
try{img.style.width=eval(x.substr(2,x.length-4));}
catch(e){displayMessage(e.description||e.toString())}
} else img.style.width=x;
if (y.substr(0,2)=="{{") {
try{img.style.height=eval(y.substr(2,y.length-4));}
catch(e){displayMessage(e.description||e.toString())}
} else img.style.height=y;
}
if(tooltip) img.title = tooltip; // TOOLTIP
// GET IMAGE SOURCE (get attachment or resolve fallback path as needed)
if (config.macros.attach && config.macros.attach.isAttachment(src))
src=config.macros.attach.getAttachment(src); // see [[AttachFilePluginFormatters]]
else if (config.formatterHelpers.resolvePath) { // see [[ImagePathPlugin]]
// Note: IE and Safari use onError to call resolvePath() only if initial lookup fails
// (avoids security messages for initial filesystem access)... otherwise, attempt to
// resolve the original path/file before initial rendering
if (config.browser.isIE || config.browser.isSafari) {
img.onerror=(function(){
this.src=config.formatterHelpers.resolvePath(this.src,false);
return false;
});
} else
src=config.formatterHelpers.resolvePath(lookaheadMatch[5],true);
}
img.src=src; // RENDER IMAGE
w.nextMatch = this.lookaheadRegExp.lastIndex;
}
}
//}}}
Use ~TiddlyWiki built-in importer (below) or, <<importTiddlers link 'Use ImportTiddlersPlugin control panel...'>>
<<importTiddlers core>>
/***
|Name|ImportTiddlersPlugin|
|Source|http://www.TiddlyTools.com/#ImportTiddlersPlugin|
|Documentation|http://www.TiddlyTools.com/#ImportTiddlersPluginInfo|
|Version|4.3.3|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides|config.macros.importTiddlers.handler|
|Description|interactive controls for import/export with filtering.|
This plugin lets you selectively combine tiddlers from any two TiddlyWiki documents. An interactive control panel lets you pick a document to import from, and then select which tiddlers to import, with prompting for skip, rename, merge or replace actions when importing tiddlers that match existing titles. Automatically add tags to imported tiddlers so they are easy to find later on. Generates a detailed report of import 'history' in ImportedTiddlers.
!!!!!Documentation
<<<
see [[ImportTiddlersPluginInfo]] for details
<<<
!!!!!interactive control panel:
<<<
<<importTiddlers inline>>
{{clear{
^^(see also: [[ImportTiddlers]] shadow tiddler)^^}}}
<<<
!!!!!Installation Notes
<<<
* As of 6/27/2007, "patch" functions that provide backward-compatibility with TW2.1.x and earlier have been split into a separate [[ImportTiddlersPluginPatch]] tiddler to reduce installation overhead for //this// plugin. You only need to install the additional plugin tiddler when using ImportTiddlersPlugin in documents using TW2.1.x or earlier.
* As of 3/21/2007, the interactive {{{<<importTiddlers>>}}} and non-interactive {{{<<loadTiddlers>>}}} macro definitions and related code have been split into separate [[ImportTiddlersPlugin]] and [[LoadTiddlersPlugin]] to permit selective installation of either the interactive and/or non-interactive macro functions.
* Quick Installation Tip: If you are using an unmodified version of TiddlyWiki (core release version <<version>>), you can get a new, empty TiddlyWiki with the Import Tiddlers plugin pre-installed (''[[download from here|TW+ImportExport.html]]''), and then simply import all your content from your old document into this new, empty document.
<<<
!!!!!Revisions
<<<
2008.08.12 [4.3.3] rewrite backstage and shadow tiddler definitions for easier customization
|please see [[ImportTiddlersPluginInfo]] for additional revision details|
2005.07.20 [1.0.0] Initial Release
<<<
!!!!!Code
***/
//{{{
version.extensions.ImportTiddlersPlugin= {major: 4, minor: 3, revision: 3, date: new Date(2008,8,12)};
//}}}
//{{{
// IE needs explicit global scoping for functions/vars called from browser events
window.onClickImportButton=onClickImportButton;
window.refreshImportList=refreshImportList;
// default cookie/option values
if (!config.options.chkImportReport) config.options.chkImportReport=true;
// default shadow definition
config.shadowTiddlers.ImportTiddlers="Use ~TiddlyWiki built-in importer (below) or, ";
config.shadowTiddlers.ImportTiddlers+="<<importTiddlers link 'Use ImportTiddlersPlugin control panel...'>>\n";
config.shadowTiddlers.ImportTiddlers+="<<importTiddlers core>>";
// use shadow tiddler content in backstage panel
if (config.tasks) config.tasks.importTask.content="<<tiddler ImportTiddlers>>" // TW2.2 or above
// $(...) function: 'shorthand' convenience syntax for document.getElementById()
if (typeof($)=="undefined") { // avoid redefinition
function $() {
var elements=new Array();
for (var i=0; i<arguments.length; i++) {
var element=arguments[i];
if (typeof element=='string') element=document.getElementById(element);
if (arguments.length==1) return element;
elements.push(element);
}
return elements;
}
}
//}}}
//{{{
merge(config.macros.importTiddlers,{
label: "import tiddlers",
prompt: "Copy tiddlers from another document",
openMsg: "Opening %0",
openErrMsg: "Could not open %0 - error=%1",
readMsg: "Read %0 bytes from %1",
foundMsg: "Found %0 tiddlers in %1",
filterMsg: "Filtered %0 tiddlers matching '%1'",
summaryMsg: "%0 tiddler%1 in the list",
summaryFilteredMsg: "%0 of %1 tiddler%2 in the list",
plural: "s are",
single: " is",
countMsg: "%0 tiddlers selected for import",
processedMsg: "Processed %0 tiddlers",
importedMsg: "Imported %0 of %1 tiddlers from %2",
loadText: "please load a document...",
closeText: "close", // text for close button when file is loaded
doneText: "done", // text for close button when file is not loaded
startText: "import", // text for import button
stopText: "stop", // text for import button while importing
local: true, // default to import from local file
src: "", // path/filename or URL of document to import (retrieved from SiteUrl tiddler)
proxy: "", // URL for remote proxy script (retrieved from SiteProxy tiddler)
useProxy: false, // use specific proxy script in front of remote URL
inbound: null, // hash-indexed array of tiddlers from other document
newTags: "", // text of tags added to imported tiddlers
addTags: true, // add new tags to imported tiddlers
listsize: 10, // # of lines to show in imported tiddler list
importTags: true, // include tags from remote source document when importing a tiddler
keepTags: true, // retain existing tags when replacing a tiddler
sync: false, // add 'server' fields to imported tiddlers (for sync function)
lastFilter: "", // most recent filter (URL hash) applied
lastAction: null, // most recent collision button performed
index: 0, // current processing index in import list
sort: "" // sort order for imported tiddler listbox
});
//}}}
//{{{
// replace core macro handler
if (config.macros.importTiddlers.coreHandler==undefined)
config.macros.importTiddlers.coreHandler=config.macros.importTiddlers.handler; // save built-in handler
config.macros.importTiddlers.handler = function(place,macroName,params,wikifier,paramString,tiddler) {
if (!params[0] || params[0].toLowerCase()=='core') { // default to built in
if (config.macros.importTiddlers.coreHandler)
config.macros.importTiddlers.coreHandler.apply(this,arguments);
else
createTiddlyButton(place,this.label,this.prompt,onClickImportMenu);
} else if (params[0]=='link') { // show link to floating panel
createTiddlyButton(place,params[1]||this.label,params[2]||this.prompt,onClickImportMenu);
} else if (params[0]=='inline') {// show panel as INLINE tiddler content
createImportPanel(place);
$("importPanel").style.position="static";
$("importPanel").style.display="block";
} else if (config.macros.loadTiddlers)
config.macros.loadTiddlers.handler(place,macroName,params); // any other params: loadtiddlers
}
//}}}
//{{{
// Handle link click to create/show/hide control panel
function onClickImportMenu(e)
{
if (!e) var e = window.event;
var parent=resolveTarget(e).parentNode;
var panel = $("importPanel");
if (panel==undefined || panel.parentNode!=parent)
panel=createImportPanel(parent);
var isOpen = panel.style.display=="block";
if(config.options.chkAnimate)
anim.startAnimating(new Slider(panel,!isOpen,e.shiftKey || e.altKey,"none"));
else
panel.style.display = isOpen ? "none" : "block" ;
e.cancelBubble = true;
if (e.stopPropagation) e.stopPropagation();
return(false);
}
//}}}
//{{{
// Create control panel: HTML, CSS
function createImportPanel(place) {
var cmi=config.macros.importTiddlers; // abbreviation
var panel=$("importPanel");
if (panel) { panel.parentNode.removeChild(panel); }
setStylesheet(cmi.css,"importTiddlers");
panel=createTiddlyElement(place,"span","importPanel",null,null)
panel.innerHTML=cmi.html;
refreshImportList();
var siteURL=store.getTiddlerText("SiteUrl"); if (!siteURL) siteURL="";
$("importSourceURL").value=siteURL;
cmi.src=siteURL;
var siteProxy=store.getTiddlerText("SiteProxy"); if (!siteProxy) siteProxy="SiteProxy";
$("importSiteProxy").value=siteProxy;
cmi.proxy=siteProxy;
if (config.browser.isGecko) { // FF3 FIXUP
$("fileImportSource").style.display="none";
$("importLocalPanelFix").style.display="block";
}
return panel;
}
//}}}
//{{{
config.macros.importTiddlers.css = '\
#importPanel {\
display: none; position:absolute; z-index:11; width:35em; right:105%; top:3em;\
background-color: #eee; color:#000; font-size: 8pt; line-height:110%;\
border:1px solid black; border-bottom-width: 3px; border-right-width: 3px;\
padding: 0.5em; margin:0em; -moz-border-radius:1em;\
}\
#importPanel a, #importPanel td a { color:#009; display:inline; margin:0px; padding:1px; }\
#importPanel table { width:100%; border:0px; padding:0px; margin:0px; font-size:8pt; line-height:110%; background:transparent; }\
#importPanel tr { border:0px;padding:0px;margin:0px; background:transparent; }\
#importPanel td { color:#000; border:0px;padding:0px;margin:0px; background:transparent; }\
#importPanel select { width:100%;margin:0px;font-size:8pt;line-height:110%;}\
#importPanel input { width:98%;padding:0px;margin:0px;font-size:8pt;line-height:110%}\
#importPanel .box { border:1px solid #000; background-color:#eee; padding:3px 5px; margin-bottom:5px; -moz-border-radius:5px;}\
#importPanel .topline { border-top:1px solid #999; padding-top:2px; margin-top:2px; }\
#importPanel .rad { width:auto; }\
#importPanel .chk { width:auto; margin:1px;border:0; }\
#importPanel .btn { width:auto; }\
#importPanel .btn1 { width:98%; }\
#importPanel .btn2 { width:48%; }\
#importPanel .btn3 { width:32%; }\
#importPanel .btn4 { width:23%; }\
#importPanel .btn5 { width:19%; }\
#importPanel .importButton { padding: 0em; margin: 0px; font-size:8pt; }\
#importPanel .importListButton { padding:0em 0.25em 0em 0.25em; color: #000000; display:inline }\
#backstagePanel #importPanel { left:10%; right:auto; }\
';
//}}}
//{{{
config.macros.importTiddlers.html = '\
<!-- source and report -->\
<table><tr><td align=left>\
import from\
<input type="radio" class="rad" name="importFrom" id="importFromFile" value="file" CHECKED\
onclick="onClickImportButton(this,event)" title="show file controls"> local file\
<input type="radio" class="rad" name="importFrom" id="importFromWeb" value="http"\
onclick="onClickImportButton(this,event)" title="show web controls"> web server\
</td><td align=right>\
<input type=checkbox class="chk" id="chkImportReport" checked\
onClick="config.options[\'chkImportReport\']=this.checked;"> create report\
</td></tr></table>\
\
<div class="box" id="importSourcePanel" style="margin:.5em">\
<div id="importLocalPanel" style="display:block;margin-bottom:2px;"><!-- import from local file -->\
enter or browse for source path/filename<br>\
<input type="file" id="fileImportSource" size=57 style="width:100%"\
onKeyUp="config.macros.importTiddlers.src=this.value"\
onChange="config.macros.importTiddlers.src=this.value;$(\'importLoad\').onclick()">\
<div id="importLocalPanelFix" style="display:none"><!-- FF3 FIXUP -->\
<input type="text" id="fileImportSourceFix" style="width:90%"\
title="Enter a path/file to import"\
onKeyUp="config.macros.importTiddlers.src=this.value"\
onChange="config.macros.importTiddlers.src=this.value; $(\'importLoad\').onclick()">\
<input type="button" id="fileImportSourceFixButton" style="width:7%" value="..."\
title="Select a path/file to import"\
onClick="var r=config.macros.importTiddlers.askForFilename(this); if (!r||!r.length) return;\
$(\'fileImportSourceFix\').value=r;\
config.macros.importTiddlers.src=r;\
$(\'importLoad\').onclick()">\
</div><!--end FF3 FIXUP-->\
</div><!--end local-->\
<div id="importHTTPPanel" style="display:none;margin-bottom:2px;"><!-- import from http server -->\
<table><tr><td align=left>\
enter a URL or <a href="javascript:;" id="importSelectFeed"\
onclick="onClickImportButton(this,event)" title="select a pre-defined \'systemServer\' URL">\
select a server</a><br>\
</td><td align=right>\
<input type="checkbox" class="chk" id="importUsePassword"\
onClick="config.macros.importTiddlers.usePassword=this.checked;\
config.macros.importTiddlers.showPanel(\'importIDPWPanel\',this.checked,true);">password\
<input type="checkbox" class="chk" id="importUseProxy"\
onClick="config.macros.importTiddlers.useProxy=this.checked;\
config.macros.importTiddlers.showPanel(\'importSiteProxy\',this.checked,true);">proxy\
</td></tr></table>\
<input type="text" id="importSiteProxy" style="display:none;margin-bottom:1px" onfocus="this.select()" value="SiteProxy"\
onKeyUp="config.macros.importTiddlers.proxy=this.value"\
onChange="config.macros.importTiddlers.proxy=this.value;">\
<input type="text" id="importSourceURL" onfocus="this.select()" value="SiteUrl"\
onKeyUp="config.macros.importTiddlers.src=this.value"\
onChange="config.macros.importTiddlers.src=this.value;">\
<div id="importIDPWPanel" style="text-align:center;margin-top:2px;display:none";>\
username: <input type=text id="txtImportID" style="width:25%" \
onChange="config.options.txtRemoteUsername=this.value;">\
password: <input type=password id="txtImportPW" style="width:25%" \
onChange="config.options.txtRemotePassword=this.value;">\
</div><!--end idpw-->\
</div><!--end http-->\
</div><!--end source-->\
\
<div class="box" id="importSelectPanel" style="display:none;margin:.5em;">\
<table><tr><td align=left>\
select:\
<a href="javascript:;" id="importSelectAll"\
onclick="onClickImportButton(this);return false;" title="SELECT all tiddlers">\
all</a>\
<a href="javascript:;" id="importSelectNew"\
onclick="onClickImportButton(this);return false;" title="SELECT tiddlers not already in destination document">\
added</a>\
<a href="javascript:;" id="importSelectChanges"\
onclick="onClickImportButton(this);return false;" title="SELECT tiddlers that have been updated in source document">\
changes</a>\
<a href="javascript:;" id="importSelectDifferences"\
onclick="onClickImportButton(this);return false;" title="SELECT tiddlers that have been added or are different from existing tiddlers">\
differences</a>\
</td><td align=right>\
<a href="javascript:;" id="importListSmaller"\
onclick="onClickImportButton(this);return false;" title="SHRINK list size">\
– </a>\
<a href="javascript:;" id="importListLarger"\
onclick="onClickImportButton(this);return false;" title="GROW list size">\
+ </a>\
<a href="javascript:;" id="importListMaximize"\
onclick="onClickImportButton(this);return false;" title="MAXIMIZE/RESTORE list size">\
= </a>\
</td></tr></table>\
<select id="importList" size=8 multiple\
onchange="setTimeout(\'refreshImportList(\'+this.selectedIndex+\')\',1)">\
<!-- NOTE: delay refresh so list is updated AFTER onchange event is handled -->\
</select>\
<div style="text-align:center">\
<a href="javascript:;"\
title="click for help using filters..."\
onclick="alert(\'A filter consists of one or more space-separated combinations of:\\n\\ntiddler titles\\ntag:[[tagvalue]]\\ntag:[[tag expression]] (requires MatchTagsPlugin)\\nstory:[[TiddlerName]]\\nsearch:[[searchtext]]\\n\\nUse a blank filter for all tiddlers.\')"\
>filter</a>\
<input type="text" id="importLastFilter" style="margin-bottom:1px; width:65%"\
title="Enter a combination of one or more filters. Use a blank filter for all tiddlers."\
onfocus="this.select()" value=""\
onKeyUp="config.macros.importTiddlers.lastFilter=this.value"\
onChange="config.macros.importTiddlers.lastFilter=this.value;">\
<input type="button" id="importApplyFilter" style="width:20%" value="apply"\
title="filter list of tiddlers to include only those that match certain criteria"\
onclick="onClickImportButton(this)">\
</div>\
</div><!--end select-->\
\
<div class="box" id="importOptionsPanel" style="text-align:center;margin:.5em;display:none;">\
apply tags: <input type=checkbox class="chk" id="chkImportTags" checked\
onClick="config.macros.importTiddlers.importTags=this.checked;">from source \
<input type=checkbox class="chk" id="chkKeepTags" checked\
onClick="config.macros.importTiddlers.keepTags=this.checked;">keep existing \
<input type=checkbox class="chk" id="chkAddTags" \
onClick="config.macros.importTiddlers.addTags=this.checked;\
config.macros.importTiddlers.showPanel(\'txtNewTags\',this.checked,true);\
if (this.checked) $(\'txtNewTags\').focus();">add tags<br>\
<input type=text id="txtNewTags" style="margin-top:4px;display:none;" size=15\ onfocus="this.select()" \
title="enter tags to be added to imported tiddlers" \
onKeyUp="config.macros.importTiddlers.newTags=this.value;\
$(\'chkAddTags\').checked=this.value.length>0;" autocomplete=off>\
<nobr><input type=checkbox class="chk" id="chkSync" \
onClick="config.macros.importTiddlers.sync=this.checked;">\
link imported tiddlers to source document (for sync later)</nobr>\
</div><!--end options-->\
\
<div id="importButtonPanel" style="text-align:center">\
<input type=button id="importLoad" class="importButton btn3" value="open"\
title="load listbox with tiddlers from source document"\
onclick="onClickImportButton(this)">\
<input type=button id="importOptions" class="importButton btn3" value="options..."\
title="set options for tags, sync, etc."\
onclick="onClickImportButton(this)">\
<input type=button id="importStart" class="importButton btn3" value="import"\
title="start/stop import of selected source tiddlers into current document"\
onclick="onClickImportButton(this)">\
<input type=button id="importClose" class="importButton btn3" value="done"\
title="clear listbox or hide control panel"\
onclick="onClickImportButton(this)">\
</div>\
\
<div class="none" id="importCollisionPanel" style="display:none;margin:.5em 0 .5em .5em;">\
<table><tr><td style="width:65%" align="left">\
<table><tr><td align=left>\
tiddler already exists:\
</td><td align=right>\
<input type=checkbox class="chk" id="importApplyToAll" \
onclick="$(\'importRename\').disabled=this.checked;"\
checked>apply to all\
</td></tr></table>\
<input type=text id="importNewTitle" size=15 autocomplete=off">\
</td><td style="width:34%" align="center">\
<input type=button id="importMerge"\
class="importButton" style="width:47%" value="merge"\
title="append the incoming tiddler to the existing tiddler"\
onclick="onClickImportButton(this)"><!--\
--><input type=button id="importSkip"\
class="importButton" style="width:47%" value="skip"\
title="do not import this tiddler"\
onclick="onClickImportButton(this)"><!--\
--><br><input type=button id="importRename"\
class="importButton" style="width:47%" value="rename"\
title="rename the incoming tiddler"\
onclick="onClickImportButton(this)"><!--\
--><input type=button id="importReplace"\
class="importButton" style="width:47%" value="replace"\
title="discard the existing tiddler"\
onclick="onClickImportButton(this)">\
</td></tr></table>\
</div><!--end collision-->\
';
//}}}
//{{{
// process control interactions
function onClickImportButton(which,event)
{
var cmi=config.macros.importTiddlers; // abbreviation
var list = $('importList');
if (!list) return;
var thePanel = $('importPanel');
var theCollisionPanel = $('importCollisionPanel');
var theNewTitle = $('importNewTitle');
var count=0;
switch (which.id)
{
case 'importFromFile': // show local panel
case 'importFromWeb': // show HTTP panel
cmi.local=(which.id=='importFromFile');
cmi.showPanel('importLocalPanel',cmi.local);
cmi.showPanel('importHTTPPanel',!cmi.local);
break;
case 'importOptions': // show/hide options panel
cmi.showPanel('importOptionsPanel',$('importOptionsPanel').style.display=='none');
break;
case 'fileImportSource':
case 'importLoad': // load import source into hidden frame
importReport(); // if an import was in progress, generate a report
cmi.inbound=null; // clear the imported tiddler buffer
refreshImportList(); // reset/resize the listbox
if (cmi.src=="") break;
// Load document, read it's DOM and fill the list
cmi.loadRemoteFile(cmi.src,cmi.filterTiddlerList);
break;
case 'importSelectFeed': // select a pre-defined systemServer feed URL
var p=Popup.create(which); if (!p) return;
var tids=store.getTaggedTiddlers('systemServer');
if (!tids.length)
createTiddlyText(createTiddlyElement(p,'li'),'no pre-defined server feeds');
for (var t=0; t<tids.length; t++) {
var u=store.getTiddlerSlice(tids[t].title,"URL");
var d=store.getTiddlerSlice(tids[t].title,"Description");
if (!d||!d.length) d=store.getTiddlerSlice(tids[t].title,"description");
if (!d||!d.length) d=u;
createTiddlyButton(createTiddlyElement(p,'li'),tids[t].title,d,
function(){
var u=this.getAttribute('url');
$('importSourceURL').value=u;
config.macros.importTiddlers.src=u;
$('importLoad').onclick();
},
null,null,null,{url:u});
}
Popup.show(p,false);
event.cancelBubble = true;
if (event.stopPropagation) event.stopPropagation();
return(false);
// create popup with feed list
// onselect, insert feed URL into input field.
break;
case 'importSelectAll': // select all tiddler list items (i.e., not headings)
importReport(); // if an import was in progress, generate a report
for (var t=0,count=0; t < list.options.length; t++) {
if (list.options[t].value=="") continue;
list.options[t].selected=true;
count++;
}
clearMessage(); displayMessage(cmi.countMsg.format([count]));
$('importStart').disabled=!count;
break;
case 'importSelectNew': // select tiddlers not in current document
importReport(); // if an import was in progress, generate a report
for (var t=0,count=0; t < list.options.length; t++) {
list.options[t].selected=false;
if (list.options[t].value=="") continue;
list.options[t].selected=!store.tiddlerExists(list.options[t].value);
count+=list.options[t].selected?1:0;
}
clearMessage(); displayMessage(cmi.countMsg.format([count]));
$('importStart').disabled=!count;
break;
case 'importSelectChanges': // select tiddlers that are updated from existing tiddlers
importReport(); // if an import was in progress, generate a report
for (var t=0,count=0; t < list.options.length; t++) {
list.options[t].selected=false;
if (list.options[t].value==""||!store.tiddlerExists(list.options[t].value)) continue;
for (var i=0; i<cmi.inbound.length; i++) // find matching inbound tiddler
{ var inbound=cmi.inbound[i]; if (inbound.title==list.options[t].value) break; }
list.options[t].selected=(inbound.modified-store.getTiddler(list.options[t].value).modified>0); // updated tiddler
count+=list.options[t].selected?1:0;
}
clearMessage(); displayMessage(cmi.countMsg.format([count]));
$('importStart').disabled=!count;
break;
case 'importSelectDifferences': // select tiddlers that are new or different from existing tiddlers
importReport(); // if an import was in progress, generate a report
for (var t=0,count=0; t < list.options.length; t++) {
list.options[t].selected=false;
if (list.options[t].value=="") continue;
if (!store.tiddlerExists(list.options[t].value)) { list.options[t].selected=true; count++; continue; }
for (var i=0; i<cmi.inbound.length; i++) // find matching inbound tiddler
{ var inbound=cmi.inbound[i]; if (inbound.title==list.options[t].value) break; }
list.options[t].selected=(inbound.modified-store.getTiddler(list.options[t].value).modified!=0); // changed tiddler
count+=list.options[t].selected?1:0;
}
clearMessage(); displayMessage(cmi.countMsg.format([count]));
$('importStart').disabled=!count;
break;
case 'importApplyFilter': // filter list to include only matching tiddlers
importReport(); // if an import was in progress, generate a report
clearMessage();
if (!cmi.all) // no tiddlers loaded = "0 selected"
{ displayMessage(cmi.countMsg.format([0])); return false; }
var hash=$('importLastFilter').value;
cmi.inbound=cmi.filterByHash("#"+hash,cmi.all);
refreshImportList(); // reset/resize the listbox
break;
case 'importStart': // initiate the import processing
importReport(); // if an import was in progress, generate a report
$('importApplyToAll').checked=false;
$('importStart').value=cmi.stopText;
if (cmi.index>0) cmi.index=-1; // stop processing
else cmi.index=importTiddlers(0); // or begin processing
importStopped();
break;
case 'importClose': // unload imported tiddlers or hide the import control panel
// if imported tiddlers not loaded, close the import control panel
if (!cmi.inbound) { thePanel.style.display='none'; break; }
importReport(); // if an import was in progress, generate a report
cmi.inbound=null; // clear the imported tiddler buffer
refreshImportList(); // reset/resize the listbox
break;
case 'importSkip': // don't import the tiddler
cmi.lastAction=which;
var theItem = list.options[cmi.index];
for (var j=0;j<cmi.inbound.length;j++)
if (cmi.inbound[j].title==theItem.value) break;
var theImported = cmi.inbound[j];
theImported.status='skipped after asking'; // mark item as skipped
theCollisionPanel.style.display='none';
cmi.index=importTiddlers(cmi.index+1); // resume with NEXT item
importStopped();
break;
case 'importRename': // change name of imported tiddler
cmi.lastAction=which;
var theItem = list.options[cmi.index];
for (var j=0;j<cmi.inbound.length;j++)
if (cmi.inbound[j].title==theItem.value) break;
var theImported = cmi.inbound[j];
theImported.status = 'renamed from '+theImported.title; // mark item as renamed
theImported.set(theNewTitle.value,null,null,null,null); // change the tiddler title
theItem.value = theNewTitle.value; // change the listbox item text
theItem.text = theNewTitle.value; // change the listbox item text
theCollisionPanel.style.display='none';
cmi.index=importTiddlers(cmi.index); // resume with THIS item
importStopped();
break;
case 'importMerge': // join existing and imported tiddler content
cmi.lastAction=which;
var theItem = list.options[cmi.index];
for (var j=0;j<cmi.inbound.length;j++)
if (cmi.inbound[j].title==theItem.value) break;
var theImported = cmi.inbound[j];
var theExisting = store.getTiddler(theItem.value);
var theText = theExisting.text+'\n----\n^^merged from: ';
theText +='[['+cmi.src+'#'+theItem.value+'|'+cmi.src+'#'+theItem.value+']]^^\n';
theText +='^^'+theImported.modified.toLocaleString()+' by '+theImported.modifier+'^^\n'+theImported.text;
var theDate = new Date();
var theTags = theExisting.getTags()+' '+theImported.getTags();
theImported.set(null,theText,null,theDate,theTags);
theImported.status = 'merged with '+theExisting.title; // mark item as merged
theImported.status += ' - '+theExisting.modified.formatString("MM/DD/YYYY 0hh:0mm:0ss");
theImported.status += ' by '+theExisting.modifier;
theCollisionPanel.style.display='none';
cmi.index=importTiddlers(cmi.index); // resume with this item
importStopped();
break;
case 'importReplace': // substitute imported tiddler for existing tiddler
cmi.lastAction=which;
var theItem = list.options[cmi.index];
for (var j=0;j<cmi.inbound.length;j++)
if (cmi.inbound[j].title==theItem.value) break;
var theImported = cmi.inbound[j];
var theExisting = store.getTiddler(theItem.value);
theImported.status = 'replaces '+theExisting.title; // mark item for replace
theImported.status += ' - '+theExisting.modified.formatString("MM/DD/YYYY 0hh:0mm:0ss");
theImported.status += ' by '+theExisting.modifier;
theCollisionPanel.style.display='none';
cmi.index=importTiddlers(cmi.index); // resume with THIS item
importStopped();
break;
case 'importListSmaller': // decrease current listbox size, minimum=5
if (list.options.length==1) break;
list.size-=(list.size>5)?1:0;
cmi.listsize=list.size;
break;
case 'importListLarger': // increase current listbox size, maximum=number of items in list
if (list.options.length==1) break;
list.size+=(list.size<list.options.length)?1:0;
cmi.listsize=list.size;
break;
case 'importListMaximize': // toggle listbox size between current and maximum
if (list.options.length==1) break;
list.size=(list.size==list.options.length)?cmi.listsize:list.options.length;
break;
}
}
//}}}
//{{{
config.macros.importTiddlers.showPanel=function(place,show,skipAnim) {
if (typeof place == "string") var place=$(place);
if (!place||!place.style) return;
if(!skipAnim && anim && config.options.chkAnimate) anim.startAnimating(new Slider(place,show,false,"none"));
else place.style.display=show?"block":"none";
}
//}}}
//{{{
function refreshImportList(selectedIndex)
{
var cmi=config.macros.importTiddlers; // abbreviation
var list = $("importList");
if (!list) return;
// if nothing to show, reset list content and size
if (!cmi.inbound)
{
while (list.length > 0) { list.options[0] = null; }
list.options[0]=new Option(cmi.loadText,"",false,false);
list.size=cmi.listsize;
// toggle buttons and panels
$('importLoad').disabled=false;
$('importLoad').style.display='inline';
$('importStart').disabled=true;
$('importOptions').disabled=true;
$('importOptions').style.display='none';
$('fileImportSource').disabled=false;
$('importFromFile').disabled=false;
$('importFromWeb').disabled=false;
$('importStart').value=cmi.startText;
$('importClose').value=cmi.doneText;
$('importSelectPanel').style.display='none';
$('importOptionsPanel').style.display='none';
return;
}
// there are inbound tiddlers loaded...
// toggle buttons and panels
$('importLoad').disabled=true;
$('importLoad').style.display='none';
$('importOptions').style.display='inline';
$('importOptions').disabled=false;
$('fileImportSource').disabled=true;
$('importFromFile').disabled=true;
$('importFromWeb').disabled=true;
$('importClose').value=cmi.closeText;
if ($('importSelectPanel').style.display=='none')
cmi.showPanel('importSelectPanel',true);
// get the sort order
if (!selectedIndex) selectedIndex=0;
if (selectedIndex==0) cmi.sort='title'; // heading
if (selectedIndex==1) cmi.sort='title';
if (selectedIndex==2) cmi.sort='modified';
if (selectedIndex==3) cmi.sort='tags';
if (selectedIndex>3) {
// display selected tiddler count
for (var t=0,count=0; t < list.options.length; t++) {
if (!list.options[t].selected) continue;
if (list.options[t].value!="")
count+=1;
else { // if heading is selected, deselect it, and then select and count all in section
list.options[t].selected=false;
for ( t++; t<list.options.length && list.options[t].value!=""; t++) {
list.options[t].selected=true;
count++;
}
}
}
clearMessage(); displayMessage(cmi.countMsg.format([count]));
}
$('importStart').disabled=!count;
if (selectedIndex>3) return; // no refresh needed
// get the alphasorted list of tiddlers
var tiddlers=cmi.inbound;
tiddlers.sort(function (a,b) {if(a['title'] == b['title']) return(0); else return (a['title'] < b['title']) ? -1 : +1; });
// clear current list contents
while (list.length > 0) { list.options[0] = null; }
// add heading and control items to list
var i=0;
var indent=String.fromCharCode(160)+String.fromCharCode(160);
if (cmi.all.length==tiddlers.length)
var summary=cmi.summaryMsg.format([tiddlers.length,(tiddlers.length!=1)?cmi.plural:cmi.single]);
else
var summary=cmi.summaryFilteredMsg.format([tiddlers.length,cmi.all.length,(cmi.all.length!=1)?cmi.plural:cmi.single]);
list.options[i++]=new Option(summary,"",false,false);
list.options[i++]=new Option(((cmi.sort=="title" )?">":indent)+' [by title]',"",false,false);
list.options[i++]=new Option(((cmi.sort=="modified")?">":indent)+' [by date]',"",false,false);
list.options[i++]=new Option(((cmi.sort=="tags")?">":indent)+' [by tags]',"",false,false);
// output the tiddler list
switch(cmi.sort) {
case "title":
for(var t = 0; t < tiddlers.length; t++)
list.options[i++] = new Option(tiddlers[t].title,tiddlers[t].title,false,false);
break;
case "modified":
// sort descending for newest date first
tiddlers.sort(function (a,b) {if(a['modified'] == b['modified']) return(0); else return (a['modified'] > b['modified']) ? -1 : +1; });
var lastSection = "";
for(var t = 0; t < tiddlers.length; t++) {
var tiddler = tiddlers[t];
var theSection = tiddler.modified.toLocaleDateString();
if (theSection != lastSection) {
list.options[i++] = new Option(theSection,"",false,false);
lastSection = theSection;
}
list.options[i++] = new Option(indent+indent+tiddler.title,tiddler.title,false,false);
}
break;
case "tags":
var theTitles = {}; // all tiddler titles, hash indexed by tag value
var theTags = new Array();
for(var t=0; t<tiddlers.length; t++) {
var title=tiddlers[t].title;
var tags=tiddlers[t].tags;
if (!tags || !tags.length) {
if (theTitles["untagged"]==undefined) { theTags.push("untagged"); theTitles["untagged"]=new Array(); }
theTitles["untagged"].push(title);
}
else for(var s=0; s<tags.length; s++) {
if (theTitles[tags[s]]==undefined) { theTags.push(tags[s]); theTitles[tags[s]]=new Array(); }
theTitles[tags[s]].push(title);
}
}
theTags.sort();
for(var tagindex=0; tagindex<theTags.length; tagindex++) {
var theTag=theTags[tagindex];
list.options[i++]=new Option(theTag,"",false,false);
for(var t=0; t<theTitles[theTag].length; t++)
list.options[i++]=new Option(indent+indent+theTitles[theTag][t],theTitles[theTag][t],false,false);
}
break;
}
list.selectedIndex=selectedIndex; // select current control item
if (list.size<cmi.listsize) list.size=cmi.listsize;
if (list.size>list.options.length) list.size=list.options.length;
}
//}}}
//{{{
// re-entrant processing for handling import with interactive collision prompting
function importTiddlers(startIndex)
{
var cmi=config.macros.importTiddlers; // abbreviation
if (!cmi.inbound) return -1;
var list = $('importList');
if (!list) return;
var t;
// if starting new import, reset import status flags
if (startIndex==0)
for (var t=0;t<cmi.inbound.length;t++)
cmi.inbound[t].status="";
for (var i=startIndex; i<list.options.length; i++)
{
// if list item is not selected or is a heading (i.e., has no value), skip it
if ((!list.options[i].selected) || ((t=list.options[i].value)==""))
continue;
for (var j=0;j<cmi.inbound.length;j++)
if (cmi.inbound[j].title==t) break;
var inbound = cmi.inbound[j];
var theExisting = store.getTiddler(inbound.title);
// avoid redundant import for tiddlers that are listed multiple times (when 'by tags')
if (inbound.status=="added")
continue;
// don't import the "ImportedTiddlers" history from the other document...
if (inbound.title=='ImportedTiddlers')
continue;
// if tiddler exists and import not marked for replace or merge, stop importing
if (theExisting && (inbound.status.substr(0,7)!="replace") && (inbound.status.substr(0,5)!="merge"))
return i;
// assemble tags (remote + existing + added)
var newTags = "";
if (cmi.importTags)
newTags+=inbound.getTags() // import remote tags
if (cmi.keepTags && theExisting)
newTags+=" "+theExisting.getTags(); // keep existing tags
if (cmi.addTags && cmi.newTags.trim().length)
newTags+=" "+cmi.newTags; // add new tags
inbound.set(null,null,null,null,newTags.trim());
// set the status to 'added' (if not already set by the 'ask the user' UI)
inbound.status=(inbound.status=="")?'added':inbound.status;
// set sync fields
if (cmi.sync) {
if (!inbound.fields) inbound.fields={}; // for TW2.1.x backward-compatibility
inbound.fields["server.page.revision"]=inbound.modified.convertToYYYYMMDDHHMM();
inbound.fields["server.type"]="file";
inbound.fields["server.host"]=(cmi.local?"file://":"")+cmi.src;
}
// do the import!
store.suspendNotifications();
store.saveTiddler(inbound.title, inbound.title, inbound.text, inbound.modifier, inbound.modified, inbound.tags, inbound.fields, true, inbound.created);
store.fetchTiddler(inbound.title).created = inbound.created; // force creation date to imported value (needed for TW2.1.x and earlier)
store.resumeNotifications();
}
return(-1); // signals that we really finished the entire list
}
function importStopped()
{
var cmi=config.macros.importTiddlers; // abbreviation
var list = $('importList');
var theNewTitle = $('importNewTitle');
if (!list) return;
if (cmi.index==-1){
$('importStart').value=cmi.startText;
importReport(); // import finished... generate the report
} else {
// import collision...
// show the collision panel and set the title edit field
$('importStart').value=cmi.stopText;
cmi.showPanel('importCollisionPanel',true);
theNewTitle.value=list.options[cmi.index].value;
if ($('importApplyToAll').checked
&& cmi.lastAction
&& cmi.lastAction.id!="importRename") {
onClickImportButton(cmi.lastAction);
}
}
}
//}}}
//{{{
function importReport()
{
var cmi=config.macros.importTiddlers; // abbreviation
if (!cmi.inbound) return;
// if import was not completed, the collision panel will still be open... close it now.
var panel=$('importCollisionPanel'); if (panel) panel.style.display='none';
// get the alphasorted list of tiddlers
var tiddlers = cmi.inbound;
// gather the statistics
var count=0; var total=0;
for (var t=0; t<tiddlers.length; t++) {
if (!tiddlers[t].status || !tiddlers[t].status.trim().length) continue;
if (tiddlers[t].status.substr(0,7)!="skipped") count++;
total++;
}
// generate a report
if (total) displayMessage(cmi.processedMsg.format([total]));
if (count && config.options.chkImportReport) {
// get/create the report tiddler
var theReport = store.getTiddler('ImportedTiddlers');
if (!theReport) { theReport= new Tiddler(); theReport.title = 'ImportedTiddlers'; theReport.text = ""; }
// format the report content
var now = new Date();
var newText = "On "+now.toLocaleString()+", "+config.options.txtUserName
newText +=" imported "+count+" tiddler"+(count==1?"":"s")+" from\n[["+cmi.src+"|"+cmi.src+"]]:\n";
if (cmi.addTags && cmi.newTags.trim().length)
newText += "imported tiddlers were tagged with: \""+cmi.newTags+"\"\n";
newText += "<<<\n";
for (var t=0; t<tiddlers.length; t++) if (tiddlers[t].status) newText += "#[["+tiddlers[t].title+"]] - "+tiddlers[t].status+"\n";
newText += "<<<\n";
// update the ImportedTiddlers content and show the tiddler
theReport.text = newText+((theReport.text!="")?'\n----\n':"")+theReport.text;
theReport.modifier = config.options.txtUserName;
theReport.modified = new Date();
store.saveTiddler(theReport.title, theReport.title, theReport.text, theReport.modifier, theReport.modified, theReport.tags, theReport.fields);
story.displayTiddler(null,theReport.title,1,null,null,false);
story.refreshTiddler(theReport.title,1,true);
}
// reset status flags
for (var t=0; t<cmi.inbound.length; t++) cmi.inbound[t].status="";
// mark document as dirty and let display update as needed
if (count) { store.setDirty(true); store.notifyAll(); }
// always show final message when tiddlers were actually loaded
if (count) displayMessage(cmi.importedMsg.format([count,tiddlers.length,cmi.src.replace(/%20/g," ")]));
}
//}}}
//{{{
// // File and XMLHttpRequest I/O
config.macros.importTiddlers.askForFilename=function(here) {
var msg=here.title; // use tooltip as dialog box message
var path=getLocalPath(document.location.href);
var slashpos=path.lastIndexOf("/"); if (slashpos==-1) slashpos=path.lastIndexOf("\\");
if (slashpos!=-1) path = path.substr(0,slashpos+1); // remove filename from path, leave the trailing slash
var file="";
var result="";
if(window.Components) { // moz
try {
netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
var nsIFilePicker = window.Components.interfaces.nsIFilePicker;
var picker = Components.classes['@mozilla.org/filepicker;1'].createInstance(nsIFilePicker);
picker.init(window, msg, nsIFilePicker.modeOpen);
var thispath = Components.classes['@mozilla.org/file/local;1'].createInstance(Components.interfaces.nsILocalFile);
thispath.initWithPath(path);
picker.displayDirectory=thispath;
picker.defaultExtension='html';
picker.defaultString=file;
picker.appendFilters(nsIFilePicker.filterAll|nsIFilePicker.filterText|nsIFilePicker.filterHTML);
if (picker.show()!=nsIFilePicker.returnCancel) var result=picker.file.persistentDescriptor;
}
catch(e) { alert('error during local file access: '+e.toString()) }
}
else { // IE
try { // XPSP2 IE only
var s = new ActiveXObject('UserAccounts.CommonDialog');
s.Filter='All files|*.*|Text files|*.txt|HTML files|*.htm;*.html|';
s.FilterIndex=3; // default to HTML files;
s.InitialDir=path;
s.FileName=file;
if (s.showOpen()) var result=s.FileName;
}
catch(e) { // fallback
var result=prompt(msg,path+file);
}
}
return result;
}
config.macros.importTiddlers.loadRemoteFile = function(src,callback) {
if (src==undefined || !src.length) return null; // filename is required
var original=src; // URL as specified
var hashpos=src.indexOf("#"); if (hashpos!=-1) src=src.substr(0,hashpos); // URL with #... suffix removed (needed for IE)
clearMessage();
displayMessage(this.openMsg.format([src.replace(/%20/g," ")]));
if (src.substr(0,5)!="http:" && src.substr(0,5)!="file:") { // if not a URL, read from local filesystem
var txt=loadFile(src);
if (!txt) { // file didn't load, might be relative path.. try fixup
var pathPrefix=document.location.href; // get current document path and trim off filename
var slashpos=pathPrefix.lastIndexOf("/"); if (slashpos==-1) slashpos=pathPrefix.lastIndexOf("\\");
if (slashpos!=-1 && slashpos!=pathPrefix.length-1) pathPrefix=pathPrefix.substr(0,slashpos+1);
src=pathPrefix+src;
if (pathPrefix.substr(0,5)!="http:") src=getLocalPath(src);
var txt=loadFile(src);
}
if (!txt) { // file still didn't load, report error
displayMessage(config.macros.importTiddlers.openErrMsg.format([src.replace(/%20/g," "),"(filesystem error)"]));
} else {
displayMessage(config.macros.importTiddlers.readMsg.format([txt.length,src.replace(/%20/g," ")]));
if (callback) callback(true,original,convertUTF8ToUnicode(txt),src,null);
}
} else {
var name=config.options.txtRemoteUsername; var pass=config.options.txtRemotePassword;
var xhr=doHttp("GET",src,null,null,name,pass,callback,original,null)
if (!xhr) displayMessage(config.macros.importTiddlers.openErrMsg.format([src,"(XMLHTTPRequest error)"]));
}
}
config.macros.importTiddlers.readTiddlersFromHTML=function(html)
{
var remoteStore=new TiddlyWiki();
remoteStore.importTiddlyWiki(html);
return remoteStore.getTiddlers("title");
}
config.macros.importTiddlers.filterTiddlerList=function(success,params,txt,src,xhr) {
var cmi=config.macros.importTiddlers; // abbreviation
var src=src.replace(/%20/g," ");
if (!success) { displayMessage(cmi.openErrMsg.format([src,xhr.status])); return; }
cmi.all = cmi.readTiddlersFromHTML(txt);
var count=cmi.all?cmi.all.length:0;
var querypos=src.lastIndexOf("?"); if (querypos!=-1) src=src.substr(0,querypos);
displayMessage(cmi.foundMsg.format([count,src]));
cmi.inbound=cmi.filterByHash(params,cmi.all); // use full URL including hash (if any)
$("importLastFilter").value=cmi.lastFilter;
window.refreshImportList(0);
}
config.macros.importTiddlers.filterByHash=function(src,tiddlers)
{
var hashpos=src.lastIndexOf("#"); if (hashpos==-1) return tiddlers;
var hash=src.substr(hashpos+1); if (!hash.length) return tiddlers;
var tids=[];
var params=hash.parseParams("anon",null,true,false,false);
for (var p=1; p<params.length; p++) {
switch (params[p].name) {
case "anon":
case "open":
tids.pushUnique(params[p].value);
break;
case "tag":
if (store.getMatchingTiddlers) { // for boolean expressions - see MatchTagsPlugin
var r=store.getMatchingTiddlers(params[p].value,null,tiddlers);
for (var t=0; t<r.length; t++) tids.pushUnique(r[t].title);
} else for (var t=0; t<tiddlers.length; t++)
if (tiddlers[t].isTagged(params[p].value))
tids.pushUnique(tiddlers[t].title);
break;
case "story":
for (var t=0; t<tiddlers.length; t++)
if (tiddlers[t].title==params[p].value) {
tiddlers[t].changed();
for (var s=0; s<tiddlers[t].links.length; s++)
tids.pushUnique(tiddlers[t].links[s]);
break;
}
break;
case "search":
for (var t=0; t<tiddlers.length; t++)
if (tiddlers[t].text.indexOf(params[p].value)!=-1)
tids.pushUnique(tiddlers[t].title);
break;
}
}
var matches=[];
for (var t=0; t<tiddlers.length; t++)
if (tids.contains(tiddlers[t].title))
matches.push(tiddlers[t]);
displayMessage(config.macros.importTiddlers.filterMsg.format([matches.length,hash]));
config.macros.importTiddlers.lastFilter=hash;
return matches;
}
//}}}
/***
|Name|ImportTiddlersPluginInfo|
|Source|http://www.TiddlyTools.com/#ImportTiddlersPlugin|
|Documentation|http://www.TiddlyTools.com/#ImportTiddlersPluginInfo|
|Version|4.3.3|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|documentation|
|Requires||
|Overrides||
|Description|documentation for ImportTiddlersPlugin|
This plugin lets you selectively combine tiddlers from any two TiddlyWiki documents. An interactive control panel lets you pick a document to import from, and then select which tiddlers to import, with prompting for skip, rename, merge or replace actions when importing tiddlers that match existing titles. Automatically add tags to imported tiddlers so they are easy to find later on. Generates a detailed report of import 'history' in ImportedTiddlers.
!!!!!Usage
<<<
{{{<<importTiddlers>>}}} or {{{<<importTiddlers core>>}}}
invokes the built-in importTiddlers macro (TW2.1.x+). If installed in documents using TW2.0.x or earlier, fallback is to use 'link' display (see below)
{{{<<importTiddlers link label tooltip>>}}}
The ''link'' keyword creates an "import tiddlers" link that when clicked to show/hide import control panel. ''label'' and ''tooltip'' are optional text parameters (enclosed in quotes or {{{[[...]]}}}, and allow you to override the default display text for the link and the mouseover help text, respectively.
{{{<<importTiddlers inline>>}}}
creates import control panel directly in tiddler content
<<importTiddlers inline>>
Press ''[browse]'' to select a TiddlyWiki document file to import, and then press ''[open]''. Alternatively, you can type in the path/filename or a remote document URL (starting with http://). When you have entered the desired source location, press ''[load]'' to retrieve the tiddlers from the remote source. //Note: There may be some delay to permit the browser time to access and load the document before updating the listbox with the titles of all tiddlers that are available to be imported.//
Select one or more titles from the listbox (hold CTRL or SHIFT while clicking to add/remove the highlight from individual list items). You can press ''[select all]'' to quickly highlight all tiddler titles in the list. Use the ''[-]'', ''[+]'', or ''[=]'' links to adjust the listbox size so you can view more (or less) tiddler titles at one time. When you have chosen the tiddlers you want to import and entered any extra tags, press ''[import]'' to begin copying them to the current TiddlyWiki document.
''select: all, new, changes, or differences''
You can click on ''all'', ''new'', ''changes'', or ''differences'' to automatically select a subset of tiddlers from the list. This makes it very quick and easy to find and import just the updated tiddlers you are interested in:
>''"all"'' selects ALL tiddlers from the import source document, even if they have not been changed.
>''"new"'' selects only tiddlers that are found in the import source document, but do not yet exist in the destination document
>''"changes"'' selects only tiddlers that exist in both documents but that are newer in the source document
>''"differences"'' selects all new and existing tiddlers that are different from the destination document (even if destination tiddler is newer)
''Import Tagging:''
Tiddlers that have been imported can be automatically tagged, so they will be easier to find later on, after they have been added to your document. New tags are entered into the "add tags" input field, and then //added// to the existing tags for each tiddler as it is imported.
''Skip, Rename, Merge, or Replace:''
When importing a tiddler whose title is identical to one that already exists, the import process pauses and the tiddler title is displayed in an input field, along with four push buttons: ''[skip]'', ''[rename]'', ''[merge]'' and ''[replace]''.
To bypass importing this tiddler, press ''[skip]''. To import the tiddler with a different name (so that both the tiddlers will exist when the import is done), enter a new title in the input field and then press ''[rename]''. Press ''[merge]'' to combine the content from both tiddlers into a single tiddler. Press ''[replace]'' to overwrite the existing tiddler with the imported one, discarding the previous tiddler content.
//Note: if both the title ''and'' modification date/////time match, the imported tiddler is assumed to be identical to the existing one, and will be automatically skipped (i.e., not imported) without asking.//
''Import Report History''
When tiddlers are imported, a report is generated into ImportedTiddlers, indicating when the latest import was performed, the number of tiddlers successfully imported, from what location, and by whom. It also includes a list with the title, date and author of each tiddler that was imported.
When the import process is completed, the ImportedTiddlers report is automatically displayed for your review. If more tiddlers are subsequently imported, a new report is //added// to ImportedTiddlers, above the previous report (i.e., at the top of the tiddler), so that a reverse-chronological history of imports is maintained.
If a cumulative record is not desired, the ImportedTiddlers report may be deleted at any time. A new ImportedTiddlers report will be created the next time tiddlers are imported.
Note: You can prevent the ImportedTiddlers report from being generated for any given import activity by clearing the "create a report" checkbox before beginning the import processing.
<<<
!!!!!Revisions
<<<
2008.08.12 [4.3.3] rewrite backstage and shadow tiddler definitions for easier customization
2008.08.05 [4.3.2] rewrote loadRemoteFile() to eliminate use of platform-specific fileExists() function
2008.06.29 [4.3.1] More layout/animation work for simpler sequential interaction. Code reduction/cleanup
2008.06.28 [4.3.0] HTML and CSS cleanup and tweaks to layout. Added animation to panels
2008.06.22 [4.2.0] For FireFox, use HTML with separate text+button control instead of type='file' control
2008.06.05 [4.1.0] in filterByHash(), added support for boolean tag expressions using getMatchingTiddlers() (defined by MatchTagsPlugin)
2008.05.12 [4.0.2] automatically tweak the backstage "import" task to add the ImportTiddlers control panel as an optional alternative to the standard import wizard. (Moved from BackstageTweaks).
2008.04.30 [4.0.1] trim #... suffix for loading files/URLs in IE
2008.04.30 [4.0.0] added source filtering (using URL paramifiers). Also, abbreviations for code-size reduction.
2008.04.13 [3.9.0] added 'apply to all' checkbox for collision processing
2008.03.26 [3.8.0] added support for selecting pre-defined systemServer URLs
2008.03.25 [3.7.0] added support for setting 'server' fields on imported tiddlers (for later synchronizing of changes)
2008.01.03 [3.6.0] in loadRemoteFile(), use lower-level doHttp() instead of loadRemoteFile() in order to support username/password access to remote server
2007.10.30 [3.5.6] update [[ImportTiddlers]] shadow tiddler definition to include "inline" link, so the plugin control panel is displayed instead of the standard core interface.
2007.06.27 [3.5.5] added missing 'fields' params to saveTiddler() calls. Fixes problem where importing tiddlers would lose the custom fields. Also, moved functions for backward-compatibility with TW2.1.x to separate [[ImportTiddlersPluginPatch2.1.x]] tiddler, reducing the size of //this// plugin tiddler by a significant amount.
2007.06.25 [3.5.4] added calls to store.suspendNotifications() and store.resumeNotifications(). Eliminates redisplay processing overhead DURING import activities
2007.04.29 [3.5.3] if refreshImportList() when inbound tiddlers are loaded, change "close" button to "done", and disable certain controls to creates a modal condition, so that actions that reload tiddlers cannot be performed unless "done" is first pressed to end the mode..
2007.04.28 [3.5.2] in handler(), added param support for custom link label/prompt
2007.04.19 [3.5.1] in readTiddlersFromHTML(), for TW2.2 and above, use importTiddlyWiki() (new core functionality) to get tiddlers from remote file content. Also, copied updated TW21Loader.prototype.internalizeTiddler() definition from TW2.2b5 so plugin can read tiddlers from TW2.2+ even when running under TW2.1.x
2007.03.22 [3.5.0] in refreshImportList(), add handling for 'select section' when a heading is selected. Makes it really easy to import by tag or date!
2007.03.21 [3.4.0] split loadTiddlers functionality into separate plugin (see [[LoadTiddlersPlugin]])
2007.03.20 [3.3.1] tweak to previous change to allow relative file references via http: (bypasses getLocalPath() so remote URL will be used)
2007.03.20 [3.3.0] added support for local, relative file references: in loadRemoteFile(), check for fileExists(). If not found, prepend relative path location and try again. Allows use of simple "foo.html" file references with importTiddlers and/or loadTiddlers macros
2007.02.24 [3.2.1] re-labeled control panel "open" button to "load" to avoid confusion with "open" button in system-provided Browse... dialog. (i.e., "browse, open, open" becomes "browse, open, load")
2007.02.09 [3.2.0] loadTiddlers: added support for "noReload" tag (prevents overwriting existing tiddler, even if inbound tiddler is newer)
2007.02.08 [3.1.3] loadTiddlers: added missing code and documentation for "newTags" handling (a feature change from long, long ago that somehow got lost!)
2006.11.14 [3.1.2] fix macro handler parameter declaration (double-pasted param list corrupts IE)
2006.11.13 [3.1.1] use apply() method to invoke hijacked core handler
2006.11.13 [3.1.0] hijack TW2.1 built-in importTiddlers.handler() so it can co-exist with the plugin interface 'panel'. Use macro without params (or use 'core' keyword) to display built-in core interface. Use new "link" param to embed "import tiddlers" link that shows floating panel when clicked. Renamed a few plugin utility functions so they don't collide with core internal functions. More code restructuring to come.
2006.10.12 [3.0.8] in readTiddlersFromHTML(), fallback to find end of store area by matching "/body" when POST-BODY-START is not present (backward compatibility for older documents)
2006.09.10 [3.0.7] in readTiddlersFromHTML(), find end of store area by matching "POST-BODY-START" instead of "/body"
2006.08.16 [3.0.6] Use higher-level store.saveTiddler() instead of store.addTiddler() to avoid conflicts with ZW and other adaptations that hijack low-level tiddler handling. Also, in CreateImportPanel(), no longer register notify to "refresh listbox after every tiddler change" (left over from old 'auto-filtered' list handling). Thanks to Bob McElrath for report/solution.
2006.07.29 [3.0.5] added noChangeMsg to loadTiddlers processing. if not 'quiet' mode, reports skipped tiddlers.
2006.04.18 [3.0.4] in loadTiddlers.handler, fixed parsing of "prompt:" param. Also, corrected parameters mismatch in loadTiddlers() callback function definition (order of params was wrong, resulting in filters NOT being applied)
2006.04.12 [3.0.3] moved many display messages to macro properties for easier L10N translations via 'lingo' definitions.
2006.04.12 [3.0.2] additional refactoring of 'core candidate' code. Proposed API now defines "loadRemoteFile()" for XMLHttpRequest processing with built in fallback for handling local filesystem access, and readTiddlersFromHTML() to process the resulting source HTML content.
2006.04.04 [3.0.1] in refreshImportList(), when using [by tags], tiddlers without tags are now included in a new "untagged" psuedo-tag list section
2006.04.04 [3.0.0] Separate non-interactive {{{<<importTiddlers...>>}}} macro functionality for incorporation into TW2.1 core and renamed as {{{<<loadTiddlers>>}}} macro. New parameters for loadTiddlers: ''label:text'' and ''prompt:text'' for link creation, ''ask'' for filename/URL, ''tag:text'' for filtering, "confirm" for accept/reject of individual inbound tiddlers. Also, ImportedTiddlers report generator output has been simplified and "importReplace/importPublic" tags and associated "force" param (which were rarely, if ever, used) has been dropped.
2006.03.30 [2.9.1] when extracting store area from remote URL, look for "</body>" instead of "</body>\n</html>" so it will match even if the "\n" is absent from the source.
2006.03.30 [2.9.0] added optional 'force' macro param. When present, autoImportTiddlers() bypasses the checks for importPublic and importReplace. Based on a request from Tom Otvos.
2006.03.28 [2.8.1] in loadImportFile(), added checks to see if 'netscape' and 'x.overrideMimeType()' are defined (IE does *not* define these values, so we bypass this code)
Also, when extracting store area from remote URL, explicitly look for "</body>\n</html>" to exclude any extra content that may have been added to the end of the file by hosting environments such as GeoCities. Thanks to Tom Otvos for finding these bugs and suggesting some fixes.
2006.02.21 [2.8.0] added support for "tiddler:TiddlerName" filtering parameter in auto-import processing
2006.02.21 [2.7.1] Clean up layout problems with IE. (Use tables for alignment instead of SPANs styled with float:left and float:right)
2006.02.21 [2.7.0] Added "local file" and "web server" radio buttons for selecting dynamic import source controls in ImportPanel. Default file control is replaced with URL text input field when "web server" is selected. Default remote document URL is defined in SiteURL tiddler. Also, added option for prepending SiteProxy URL as prefix to remote URL to mask cross-domain document access (requires compatible server-side script)
2006.02.17 [2.6.0] Removed "differences only" listbox display mode, replaced with selection filter 'presets': all/new/changes/differences. Also fixed initialization handling for "add new tags" so that checkbox state is correctly tracked when panel is first displayed.
2006.02.16 [2.5.4] added checkbox options to control "import remote tags" and "keep existing tags" behavior, in addition to existing "add new tags" functionality.
2006.02.14 [2.5.3] FF1501 corrected unintended global 't' (loop index) in importReport() and autoImportTiddlers()
2006.02.10 [2.5.2] corrected unintended global variable in importReport().
2006.02.05 [2.5.1] moved globals from window.* to config.macros.importTiddlers.* to avoid FireFox 1.5.0.1 crash bug when referencing globals
2006.01.18 [2.5.0] added checkbox for "create a report". Default is to create/update the ImportedTiddlers report. Clear the checkbox to skip this step.
2006.01.15 [2.4.1] added "importPublic" tag and inverted default so that auto sharing is NOT done unless tagged with importPublic
2006.01.15 [2.4.0] Added support for tagging individual tiddlers with importSkip, importReplace, and/or importPrivate to control which tiddlers can be overwritten or shared with others when using auto-import macro syntax. Defaults are to SKIP overwriting existing tiddlers with imported tiddlers, and ALLOW your tiddlers to be auto-imported by others.
2006.01.15 [2.3.2] Added "ask" parameter to confirm each tiddler before importing (for use with auto-importing)
2006.01.15 [2.3.1] Strip TW core scripts from import source content and load just the storeArea into the hidden IFRAME. Makes loading more efficient by reducing the document size and by preventing the import document from executing its TW initialization (including plugins). Seems to resolve the "Found 0 tiddlers" problem. Also, when importing local documents, use convertUTF8ToUnicode() to convert the file contents so support international characters sets.
2006.01.12 [2.3.0] Reorganized code to use callback function for loading import files to support event-driven I/O via an ASYNCHRONOUS XMLHttpRequest. Let's processing continue while waiting for remote hosts to respond to URL requests. Added non-interactive 'batch' macro mode, using parameters to specify which tiddlers to import, and from what document source. Improved error messages and diagnostics, plus an optional 'quiet' switch for batch mode to eliminate //most// feedback.
2006.01.11 [2.2.0] Added "[by tags]" to list of tiddlers, based on code submitted by BradleyMeck
2006.01.09 [2.1.1] When a URL is typed in, and then the "open" button is pressed, it generates both an onChange event for the file input and a click event for open button. This results in multiple XMLHttpRequest()'s which seem to jam things up quite a bit. I removed the onChange handling for file input field. To open a file (local or URL), you must now explicitly press the "open" button in the control panel.
2006.01.08 [2.1.0] IMPORT FROM ANYWHERE!!! re-write getImportedTiddlers() logic to either read a local file (using local I/O), OR... read a remote file, using a combination of XML and an iframe to permit cross-domain reading of DOM elements. Adapted from example code and techniques courtesy of Jonny LeRoy.
2006.01.06 [2.0.2] When refreshing list contents, fixed check for tiddlerExists() when "show differences only" is selected, so that imported tiddlers that don't exist in the current file will be recognized as differences and included in the list.
2006.01.04 [2.0.1] When "show differences only" is NOT checked, import all tiddlers that have been selected even when they have a matching title and date.
2005.12.27 [2.0.0] Update for TW2.0
Defer initial panel creation and only register a notification function when panel first is created
2005.12.22 [1.3.1] tweak formatting in importReport() and add 'discard report' link to output
2005.12.03 [1.3.0] Dynamically create/remove importPanel as needed to ensure only one instance of interface elements exists, even if there are multiple instances of macro embedding. Also, dynamically create/recreate importFrame each time an external TW document is loaded for importation (reduces DOM overhead and ensures a 'fresh' frame for each document)
2005.11.29 [1.2.1] fixed formatting of 'detail info' in importReport()
2005.11.11 [1.2.0] added 'inline' param to embed controls in a tiddler
2005.11.09 [1.1.0] only load HTML and CSS the first time the macro handler is called. Allows for redundant placement of the macro without creating multiple instances of controls with the same ID's.
2005.10.25 [1.0.5] fixed typo in importReport() that prevented reports from being generated
2005.10.09 [1.0.4] combined documentation with plugin code instead of using separate tiddlers
2005.08.05 [1.0.3] moved CSS and HTML definitions into plugin code instead of using separate tiddlers
2005.07.27 [1.0.2] core update 1.2.29: custom overlayStyleSheet() replaced with new core setStylesheet()
2005.07.23 [1.0.1] added parameter checks and corrected addNotification() usage
2005.07.20 [1.0.0] Initial Release
<<<
On 2. november 2008 00:31:39, DitNavn imported 16 tiddlers from
[[C:\Documents and Settings\mama\Dokumenter\Arbejde\Guitar\GuitarScrapBog.html|C:\Documents and Settings\mama\Dokumenter\Arbejde\Guitar\GuitarScrapBog.html]]:
<<<
#[[Anmeldelse]] - added
#[[Bibliografi]] - added
#[[Bibliography]] - added
#[[Bibliography feature]] - added
#[[BogArkiv]] - added
#[[DataTiddlerPlugin]] - added
#[[Efter forfatter]] - added
#[[Efter tema]] - added
#[[Efter titel]] - added
#[[FormTiddlerMacro]] - added
#[[FormTiddlerPlugin]] - added
#[[NewBibEntryTemplate]] - added
#[[NewTopicTemplate]] - added
#[[Ondskaben]] - added
#[[SideBarOptions]] - replaces SideBarOptions - 10/26/2008 19:15:00 by DitNavn
#[[TiddlyHomeMenu]] - added
<<<
----
On 26. oktober 2008 23:41:52, DitNavn imported 1 tiddler from
[[http://www.giffmex.org/nttag/1petertags.html|http://www.giffmex.org/nttag/1petertags.html]]:
<<<
#[[TagCloudPlugin]] - added
<<<
----
On 26. oktober 2008 21:19:36, DitNavn imported 1 tiddler from
[[$url$|$url$]]:
<<<
#[[Tiddlyspot]] - added
<<<
----
On 26. oktober 2008 21:17:46, DitNavn imported 1 tiddler from
[[C:\Documents and Settings\mama\Skrivebord\Udtalelser\mms.html|C:\Documents and Settings\mama\Skrivebord\Udtalelser\mms.html]]:
<<<
#[[TspotSetupPlugin]] - added
<<<
----
On 26. oktober 2008 19:00:23, DitNavn imported 2 tiddlers from
[[C:\Documents and Settings\mama\Skrivebord\Udtalelser\mms.html|C:\Documents and Settings\mama\Skrivebord\Udtalelser\mms.html]]:
<<<
#[[SnapshotPlugin]] - added
#[[SnapshotPluginInfo]] - added
<<<
----
On 26. oktober 2008 18:50:05, DitNavn imported 52 tiddlers from
[[C:\Documents and Settings\mama\Skrivebord\NBN\nobrainernotes.html|C:\Documents and Settings\mama\Skrivebord\NBN\nobrainernotes.html]]:
<<<
#[[Acknowledgements & license]] - added
#[[Advanced customization]] - added
#[[Basic customization]] - added
#[[CloseOnCancelPlugin]] - added
#[[ColorPalette]] - added
#[[DefaultTiddlers]] - replaces DefaultTiddlers - 10/13/2008 23:29:00 by DitNavn
#[[EditTemplate]] - added
#[[ExtendTagButtonPlugin]] - added
#[[ForEachTiddlerPlugin]] - added
#[[HideWhenPlugin]] - added
#[[HistoryPlugin]] - added
#[[How you can help]] - added
#[[InlineJavascriptPlugin]] - added
#[[Instructions]] - added
#[[MainMenu]] - replaces MainMenu - 10/13/2008 23:29:00 by DitNavn
#[[NestedSlidersPlugin(withGiffmexTweak)]] - added
#[[NewHerePlugin]] - added
#[[NoteNote]] - added
#[[PageTemplate]] - added
#[[QuickEditPlugin]] - added
#[[QuickEditToolbar]] - added
#[[QuickEdit_align]] - added
#[[QuickEdit_color]] - added
#[[QuickEdit_font]] - added
#[[QuickEdit_fontList]] - added
#[[QuickEdit_format]] - added
#[[QuickEdit_image]] - added
#[[QuickEdit_link]] - added
#[[QuickOpenTagPlugin]] - added
#[[Sample note]] - added
#[[Sample subtopic]] - added
#[[Sample topic]] - added
#[[SaveCloseTiddlerPlugin]] - added
#[[SearchOptions plugin tweaks]] - added
#[[SearchOptionsPlugin]] - added
#[[SearchOptionsPlugin tweaks]] - added
#[[SearchResults]] - added
#[[SideBarOptions]] - added
#[[SinglePageModePlugin]] - added
#[[SiteMapMacro]] - added
#[[SiteSubtitle]] - added
#[[SiteTitle]] - added
#[[SliderFrame]] - added
#[[StyleSheet]] - added
#[[TagglyTaggingPlugin]] - added
#[[ToggleRightSidebar]] - added
#[[ToggleTagPlugin]] - added
#[[ToolbarCommands]] - added
#[[TopMenu]] - added
#[[TopicNote]] - added
#[[ViewTemplate]] - replaces ViewTemplate - 10/15/2008 01:40:00 by DitNavn
#[[zzConfigOptions]] - added
<<<
----
On 17. oktober 2008 18:46:58, DitNavn imported 8 tiddlers from
[[C:\Documents and Settings\mama\Dokumenter\Arbejde\Wikis oversat\TiddlyHomePackage_0.1.3\Templates til nettet\empty.html|C:\Documents and Settings\mama\Dokumenter\Arbejde\Wikis oversat\TiddlyHomePackage_0.1.3\Templates til nettet\empty.html]]:
<<<
#[[LoadRemoteFileThroughProxy]] - replaces LoadRemoteFileThroughProxy - 3/18/2007 22:55:00 by BidiX
#[[PasswordOptionPlugin]] - replaces PasswordOptionPlugin - 2/24/2008 11:23:00 by BidiX
#[[TiddlyHomeSetupPlugin]] - replaces TiddlyHomeSetupPlugin - 8/4/2007 22:27:00 by BidiX
#[[TiddlyHomeSystemTW]] - replaces TiddlyHomeSystemTW - 5/29/2007 13:22:00 by BidiX
#[[UploadPlugin]] - replaces UploadPlugin - 8/12/2008 07:46:00 by BDi
#[[UploadTiddlerPlugin]] - replaces UploadTiddlerPlugin - 8/20/2008 21:58:00 by BidiX
#[[UploadToHomeMacro]] - replaces UploadToHomeMacro - 5/29/2007 15:25:00 by BidiX
#[[admin]] - replaces admin - 7/28/2007 17:49:00 by BidiX
<<<
----
On 15. oktober 2008 14:43:30, DitNavn imported 2 tiddlers from
[[C:\Documents and Settings\mama\Dokumenter\Arbejde\Wikis oversat\TiddlyHomePackage_0.1.3\Templates til nettet\Templates med Wysiwyg\buksetrolden_wysiwyg.html|C:\Documents and Settings\mama\Dokumenter\Arbejde\Wikis oversat\TiddlyHomePackage_0.1.3\Templates til nettet\Templates med Wysiwyg\buksetrolden_wysiwyg.html]]:
<<<
#[[FramedLinksPlugin]] - added
#[[FullScreenPlugin]] - added
<<<
----
On 15. oktober 2008 14:40:11, DitNavn imported 1 tiddler from
[[C:\Documents and Settings\mama\Dokumenter\Arbejde\Wikis oversat\TiddlyHomePackage_0.1.3\Templates til nettet\Templates med Wysiwyg\buksetrolden_wysiwyg.html|C:\Documents and Settings\mama\Dokumenter\Arbejde\Wikis oversat\TiddlyHomePackage_0.1.3\Templates til nettet\Templates med Wysiwyg\buksetrolden_wysiwyg.html]]:
<<<
#[[SplashScreenPlugin]] - added
<<<
/***
|''Name:''|abego.IncludePlugin|
|''Version:''|1.0.1 (2007-04-30)|
|''Type:''|plugin|
|''Source:''|http://tiddlywiki.abego-software.de/#IncludePlugin|
|''Author:''|Udo Borkowski (ub [at] abego-software [dot] de)|
|''Documentation:''|[[IncludePlugin Documentation|http://tiddlywiki.abego-software.de/#%5B%5BIncludePlugin%20Documentation%5D%5D]]|
|''Community:''|([[del.icio.us|http://del.icio.us/post?url=http://tiddlywiki.abego-software.de/index.html%23IncludePlugin]]) ([[Support|http://groups.google.com/group/TiddlyWiki]])|
|''Copyright:''|© 2007 [[abego Software|http://www.abego-software.de]]|
|''Licence:''|[[BSD open source license (abego Software)|http://www.abego-software.de/legal/apl-v10.html]]|
|''~CoreVersion:''|2.1.3|
|''Browser:''|Firefox 1.5.0.9 or better; Internet Explorer 6.0|
***/
/***
This plugin's source code is compressed (and hidden). Use this [[link|http://tiddlywiki.abego-software.de/archive/IncludePlugin/Plugin-Include-src.1.0.0.js]] to get the readable source code.
***/
///%
if(!window.abego){window.abego={};}var invokeLater=function(_1,_2,_3){return abego.invokeLater?abego.invokeLater(_1,_2,_3):setTimeout(_1,_2);};abego.loadFile=function(_4,_5,_6){var _7=function(_8,_9,_a,_b,_c){return _8?_5(_a,_b,_9):_5(undefined,_b,_9,"Error loading %0".format([_b]));};if(_4.search(/^((http(s)?)|(file)):/)!=0){if(_4.search(/^((.\:\\)|(\\\\)|(\/))/)==0){_4="file://"+_4;}else{var _d=document.location.toString();var i=_d.lastIndexOf("/");_4=_d.substr(0,i+1)+_4;}_4=_4.replace(/\\/mg,"/");}loadRemoteFile(_4,_7,_6);};abego.loadTiddlyWikiStore=function(_f,_10,_11,_12){var _13=function(_14,_15){if(_12){_12(_14,"abego.loadTiddlyWikiStore",_15,_f,_11);}};var _16=function(_17,_18){var _19=_18.indexOf(startSaveArea);var _1a=_18.indexOf("<!--POST-BODY-END--"+">");var _1b=_18.lastIndexOf(endSaveArea,_1a==-1?_18.length:_1a);if((_19==-1)||(_1b==-1)){return config.messages.invalidFileError.format([_f]);}var _1c="<html><body>"+_18.substring(_19,_1b+endSaveArea.length)+"</body></html>";var _1d=document.createElement("iframe");_1d.style.display="none";document.body.appendChild(_1d);var doc=_1d.document;if(_1d.contentDocument){doc=_1d.contentDocument;}else{if(_1d.contentWindow){doc=_1d.contentWindow.document;}}doc.open();doc.writeln(_1c);doc.close();var _1f=doc.getElementById("storeArea");_17.loadFromDiv(_1f,"store");_1d.parentNode.removeChild(_1d);return null;};var _20=function(_21){_13("Error when loading %0".format([_f]),"Failed");_10(undefined,_f,_11,_21);return _21;};var _22=function(_23){_13("Loaded %0".format([_f]),"Done");_10(_23,_f,_11);return null;};var _24=function(_25,_26,_27,_28){if(_25===undefined){_20(_28);return;}_13("Processing %0".format([_f]),"Processing");var _29=config.messages.invalidFileError;config.messages.invalidFileError="The file '%0' does not appear to be a valid TiddlyWiki file";try{var _2a=new TiddlyWiki();var _2b=_16(_2a,_25);if(_2b){_20(_2b);}else{_22(_2a);}}catch(ex){_20(exceptionText(ex));}finally{config.messages.invalidFileError=_29;}};_13("Start loading %0".format([_f]),"Started");abego.loadFile(_f,_24,_11);};(function(){if(abego.TiddlyWikiIncluder){return;}var _2c="waiting";var _2d="loading";var _2e=1000;var _2f=-200;var _30=-100;var _31=-300;var _32;var _33=[];var _34={};var _35=[];var _36;var _37=[];var _38;var _39=function(){if(_32===undefined){_32=config.options.chkUseInclude===undefined||config.options.chkUseInclude;}return _32;};var _3a=function(url){return "No include specified for %0".format([url]);};var _3c=function(){var _3d=_35;_35=[];if(_3d.length){for(var i=0;i<_37.length;i++){_37[i](_3d);}}};var _3f;var _40=function(){if(_36!==undefined){clearInterval(_36);}_3f=0;var _41=function(){abego.TiddlyWikiIncluder.sendProgress("","","Done");};_36=setInterval(function(){_3f++;if(_3f<=10){return;}clearInterval(_36);_36=undefined;abego.TiddlyWikiIncluder.sendProgress("Refreshing...","","");refreshDisplay();invokeLater(_41,0,_2f);},1);};var _42=function(_43){var _44;for(var i=0;i<_33.length;i++){var _46=abego.TiddlyWikiIncluder.getStore(_33[i]);if(_46&&(_44=_43(_46,_33[i]))){return _44;}}};var _47=function(){if(!window.store){return invokeLater(_47,100);}var _48=store.fetchTiddler;store.fetchTiddler=function(_49){var t=_48.apply(this,arguments);if(t){return t;}if(config.shadowTiddlers[_49]!==undefined){return undefined;}if(_49==config.macros.newTiddler.title){return undefined;}return _42(function(_4b,url){var t=_4b.fetchTiddler(_49);if(t){t.includeURL=url;}return t;});};if(_33.length){_40();}};var _4e=function(){if(!window.store){return invokeLater(_4e,100);}var _4f=store.getTiddlerText("IncludeList");if(_4f){wikify(_4f,document.createElement("div"));}};var _50=function(_51){var _52=function(){var _53=store.forEachTiddler;var _54=function(_55){var _56={};var _57;var _58=function(_59,_5a){if(_56[_59]){return;}_56[_59]=1;if(_57){_5a.includeURL=_57;}_55.apply(this,arguments);};_53.call(store,_58);for(var n in config.shadowTiddlers){_56[n]=1;}_56[config.macros.newTiddler.title]=1;_42(function(_5c,url){_57=url;_5c.forEachTiddler(_58);});};store.forEachTiddler=_54;try{return _51.apply(this,arguments);}finally{store.forEachTiddler=_53;}};return _52;};var _5e=function(_5f,_60){return _5f[_60]=_50(_5f[_60]);};abego.TiddlyWikiIncluder={};abego.TiddlyWikiIncluder.setProgressFunction=function(_61){_38=_61;};abego.TiddlyWikiIncluder.getProgressFunction=function(_62){return _38;};abego.TiddlyWikiIncluder.sendProgress=function(_63,_64,_65){if(_38){_38.apply(this,arguments);}};abego.TiddlyWikiIncluder.onError=function(url,_67){displayMessage("Error when including '%0':\n%1".format([url,_67]));};abego.TiddlyWikiIncluder.hasPendingIncludes=function(){for(var i=0;i<_33.length;i++){var _69=abego.TiddlyWikiIncluder.getState(_33[i]);if(_69==_2c||_69==_2d){return true;}}return false;};abego.TiddlyWikiIncluder.getIncludes=function(){return _33.slice();};abego.TiddlyWikiIncluder.getState=function(url){var s=_34[url];if(!s){return _3a(url);}return typeof s=="string"?s:null;};abego.TiddlyWikiIncluder.getStore=function(url){var s=_34[url];if(!s){return _3a(url);}return s instanceof TiddlyWiki?s:null;};abego.TiddlyWikiIncluder.include=function(url,_6f){if(!_39()||_34[url]){return;}var _70=this;_33.push(url);_34[url]=_2c;var _71=function(_72,_73,_74,_75){if(_72===undefined){_34[url]=_75;_70.onError(url,_75);return;}_34[url]=_72;_35.push(url);invokeLater(_3c);};var _76=function(){_34[url]=_2d;abego.loadTiddlyWikiStore(url,_71,null,_38);};if(_6f){invokeLater(_76,_6f);}else{_76();}};abego.TiddlyWikiIncluder.forReallyEachTiddler=function(_77){var _78=function(){store.forEachTiddler(_77);};_50(_78).call(store);};abego.TiddlyWikiIncluder.getFunctionUsingForReallyEachTiddler=_50;abego.TiddlyWikiIncluder.useForReallyEachTiddler=_5e;abego.TiddlyWikiIncluder.addListener=function(_79){_37.push(_79);};abego.TiddlyWikiIncluder.addListener(_40);if(config.options.chkUseInclude===undefined){config.options.chkUseInclude=true;}config.shadowTiddlers.AdvancedOptions+="\n<<option chkUseInclude>> Include ~TiddlyWikis (IncludeList | IncludeState | [[help|http://tiddlywiki.abego-software.de/#%5B%5BIncludePlugin%20Documentation%5D%5D]])\n^^(Reload this ~TiddlyWiki to make changes become effective)^^";config.shadowTiddlers.IncludeState="<<includeState>>";var _7a=function(e,_7c,_7d){if(!anim||!abego.ShowAnimation){e.style.display=_7c?"block":"none";return;}anim.startAnimating(new abego.ShowAnimation(e,_7c,_7d));};abego.TiddlyWikiIncluder.getDefaultProgressFunction=function(){setStylesheet(".includeProgressState{\n"+"background-color:#FFCC00;\n"+"position:absolute;\n"+"right:0.2em;\n"+"top:0.2em;\n"+"width:7em;\n"+"padding-left:0.2em;\n"+"padding-right:0.2em\n"+"}\n","abegoInclude");var _7e=function(){var e=document.createElement("div");e.className="includeProgressState";e.style.display="none";document.body.appendChild(e);return e;};var _80=_7e();var _81=function(_82){removeChildren(_80);createTiddlyText(_80,_82);_7a(_80,true,0);};var _83=function(){invokeLater(function(){_7a(_80,false,_2e);},100,_30);};var _84=function(_85,_86,_87,url,_89){if(_87=="Done"||_87=="Failed"){_83();return;}if(_86=="abego.loadTiddlyWikiStore"){_3f=0;if(_87=="Processing"){_81("Including...");}}else{_81(_85);}};return _84;};abego.TiddlyWikiIncluder.setProgressFunction(abego.TiddlyWikiIncluder.getDefaultProgressFunction());config.macros.include={};config.macros.include.handler=function(_8a,_8b,_8c,_8d,_8e,_8f){_8c=_8e.parseParams("url",null,true,false,true);var _90=parseInt(getParam(_8c,"delay","0"));var _91=_8c[0]["url"];var _92=getFlag(_8c,"hide",false);if(!_92){createTiddlyText(createTiddlyElement(_8a,"code"),_8d.source.substring(_8d.matchStart,_8d.nextMatch));}for(var i=0;_91&&i<_91.length;i++){abego.TiddlyWikiIncluder.include(_91[i],_90);}};config.macros.includeState={};config.macros.includeState.handler=function(_94,_95,_96,_97,_98,_99){var _9a=function(){var s="";var _9c=abego.TiddlyWikiIncluder.getIncludes();if(!_9c.length){return "{{noIncludes{\nNo includes or 'include' is disabled (see AdvancedOptions)\n}}}\n";}s+="|!Address|!State|\n";for(var i=0;i<_9c.length;i++){var inc=_9c[i];s+="|{{{"+inc+"}}}|";var t=abego.TiddlyWikiIncluder.getState(inc);s+=t?"{{{"+t+"}}}":"included";s+="|\n";}s+="|includeState|k\n";return s;};var _a0=function(){removeChildren(div);wikify(_9a(),div);if(abego.TiddlyWikiIncluder.hasPendingIncludes()){invokeLater(_a0,500,_31);}};var div=createTiddlyElement(_94,"div");invokeLater(_a0,0,_31);};var _a2=Tiddler.prototype.isReadOnly;Tiddler.prototype.isReadOnly=function(){return _a2.apply(this,arguments)||this.isIncluded();};Tiddler.prototype.isIncluded=function(){return this.includeURL!=undefined;};Tiddler.prototype.getIncludeURL=function(){return this.includeURL;};var _a3={getMissingLinks:1,getOrphans:1,getTags:1,reverseLookup:1,updateTiddlers:1};for(var n in _a3){_5e(TiddlyWiki.prototype,n);}var _a5=function(){if(abego.IntelliTagger){_5e(abego.IntelliTagger,"assistTagging");}};var _a6=function(){if(config.macros.forEachTiddler){_5e(config.macros.forEachTiddler,"findTiddlers");}};_47();invokeLater(_4e,100);invokeLater(_a5,100);invokeLater(_a6,100);})();
//%/
/***
|Name|InlineJavascriptPlugin|
|Source|http://www.TiddlyTools.com/#InlineJavascriptPlugin|
|Documentation|http://www.TiddlyTools.com/#InlineJavascriptPluginInfo|
|Version|1.9.2|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides||
|Description|Insert Javascript executable code directly into your tiddler content.|
''Call directly into TW core utility routines, define new functions, calculate values, add dynamically-generated TiddlyWiki-formatted output'' into tiddler content, or perform any other programmatic actions each time the tiddler is rendered.
!!!!!Documentation
>see [[InlineJavascriptPluginInfo]]
!!!!!Revisions
<<<
2008.03.03 [1.9.2] corrected declaration of wikifyPlainText() for 'TW 2.1.x compatibility fallback' (fixes Safari "parse error")
2008.02.23 [1.9.1] in onclick function, use string instead of array for 'bufferedHTML' attribute on link element (fixes IE errors)
2008.02.21 [1.9.0] 'onclick' scripts now allow returned text (or document.write() calls) to be wikified into a span that immediately follows the onclick link. Also, added default 'return false' handling if no return value provided (prevents HREF from being triggered -- return TRUE to allow HREF to be processed). Thanks to Xavier Verges for suggestion and preliminary code.
|please see [[InlineJavascriptPluginInfo]] for additional revision details|
2005.11.08 [1.0.0] initial release
<<<
!!!!!Code
***/
//{{{
version.extensions.inlineJavascript= {major: 1, minor: 9, revision: 2, date: new Date(2008,3,3)};
config.formatters.push( {
name: "inlineJavascript",
match: "\\<script",
lookahead: "\\<script(?: src=\\\"((?:.|\\n)*?)\\\")?(?: label=\\\"((?:.|\\n)*?)\\\")?(?: title=\\\"((?:.|\\n)*?)\\\")?(?: key=\\\"((?:.|\\n)*?)\\\")?( show)?\\>((?:.|\\n)*?)\\</script\\>",
handler: function(w) {
var lookaheadRegExp = new RegExp(this.lookahead,"mg");
lookaheadRegExp.lastIndex = w.matchStart;
var lookaheadMatch = lookaheadRegExp.exec(w.source)
if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {
var src=lookaheadMatch[1];
var label=lookaheadMatch[2];
var tip=lookaheadMatch[3];
var key=lookaheadMatch[4];
var show=lookaheadMatch[5];
var code=lookaheadMatch[6];
if (src) { // load a script library
// make script tag, set src, add to body to execute, then remove for cleanup
var script = document.createElement("script"); script.src = src;
document.body.appendChild(script); document.body.removeChild(script);
}
if (code) { // there is script code
if (show) // show inline script code in tiddler output
wikify("{{{\n"+lookaheadMatch[0]+"\n}}}\n",w.output);
if (label) { // create a link to an 'onclick' script
// add a link, define click handler, save code in link (pass 'place'), set link attributes
var link=createTiddlyElement(w.output,"a",null,"tiddlyLinkExisting",wikifyPlainText(label));
var fixup=code.replace(/document.write\s*\(/gi,'place.bufferedHTML+=(');
link.code="function _out(place){"+fixup+"\n};_out(this);"
link.tiddler=w.tiddler;
link.onclick=function(){
this.bufferedHTML="";
try{ var r=eval(this.code);
if(this.bufferedHTML.length || (typeof(r)==="string")&&r.length)
var s=this.parentNode.insertBefore(document.createElement("span"),this.nextSibling);
if(this.bufferedHTML.length)
s.innerHTML=this.bufferedHTML;
if((typeof(r)==="string")&&r.length) {
wikify(r,s,null,this.tiddler);
return false;
} else return r!==undefined?r:false;
} catch(e){alert(e.description||e.toString());return false;}
};
link.setAttribute("title",tip||"");
var URIcode='javascript:void(eval(decodeURIComponent(%22(function(){try{';
URIcode+=encodeURIComponent(encodeURIComponent(code.replace(/\n/g,' ')));
URIcode+='}catch(e){alert(e.description||e.toString())}})()%22)))';
link.setAttribute("href",URIcode);
link.style.cursor="pointer";
if (key) link.accessKey=key.substr(0,1); // single character only
}
else { // run inline script code
var fixup=code.replace(/document.write\s*\(/gi,'place.innerHTML+=(');
var code="function _out(place){"+fixup+"\n};_out(w.output);"
try { var out=eval(code); } catch(e) { out=e.description?e.description:e.toString(); }
if (out && out.length) wikify(out,w.output,w.highlightRegExp,w.tiddler);
}
}
w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;
}
}
} )
//}}}
// // Backward-compatibility for TW2.1.x and earlier
//{{{
if (typeof(wikifyPlainText)=="undefined") window.wikifyPlainText=function(text,limit,tiddler) {
if(limit > 0) text = text.substr(0,limit);
var wikifier = new Wikifier(text,formatter,null,tiddler);
return wikifier.wikifyPlain();
}
//}}}
//{{{
config.formatters.unshift( {
name: "inlinetabs",
match: "\\<tabs",
lookaheadRegExp: /(?:<tabs (.*)>\n)((?:.|\n)*?)(?:\n<\/tabs>)/mg,
handler: function(w)
{
this.lookaheadRegExp.lastIndex = w.matchStart;
var lookaheadMatch = this.lookaheadRegExp.exec(w.source)
if(lookaheadMatch && lookaheadMatch.index == w.matchStart)
{
var cookie = lookaheadMatch[1];
var wrapper = createTiddlyElement(null,"div",null,cookie);
var tabset = createTiddlyElement(wrapper,"div",null,"tabset");
tabset.setAttribute("cookie",cookie);
var validTab = false;
var firstTab = '';
var tabregexp = /(?:<tab (.*)>)(?:(?:\n)?)((?:.|\n)*?)(?:<\/tab>)/mg;
while((m = tabregexp.exec(lookaheadMatch[2])) != null)
{
if (firstTab == '') firstTab = m[1];
var tab = createTiddlyButton(tabset,m[1],m[1],story.onClickInlineTab,"tab tabUnselected");
tab.setAttribute("tab",m[1]);
tab.setAttribute("content",m[2]);
tab.title = m[1];
if(config.options[cookie] == m[1])
validTab = true;
}
if(!validTab)
config.options[cookie] = firstTab;
w.output.appendChild(wrapper);
story.switchInlineTab(tabset,config.options[cookie]);
w.nextMatch = this.lookaheadRegExp.lastIndex;
}
}
})
Story.prototype.switchInlineTab = function(tabset,tab)
{
var cookie = tabset.getAttribute("cookie");
var theTab = null
var nodes = tabset.childNodes;
for(var t=0; t<nodes.length; t++)
if(nodes[t].getAttribute && nodes[t].getAttribute("tab") == tab)
{
theTab = nodes[t];
theTab.className = "tab tabSelected";
}
else
nodes[t].className = "tab tabUnselected"
if(theTab)
{
if(tabset.nextSibling && tabset.nextSibling.className == "tabContents")
tabset.parentNode.removeChild(tabset.nextSibling);
var tabContent = createTiddlyElement(null,"div",null,"tabContents");
tabset.parentNode.insertBefore(tabContent,tabset.nextSibling);
wikify(theTab.getAttribute("content"),tabContent);
if(cookie)
{
config.options[cookie] = tab;
saveOptionCookie(cookie);
}
}
}
Story.prototype.onClickInlineTab = function(e)
{
story.switchInlineTab(this.parentNode,this.getAttribute("tab"));
return false;
}
//}}}
Simple Noter er en fuldstændig simpel måde at tage og organisere noter. Dave Gifford lavede den til sine seminarieelever, og har gjort den tilgængelig for alle. (MM har oversat og tilføjet nogle ekstra plugins.red) Originalen kan ses [[her.|http://www.giffmex.org/nobrainernotes.html]]
!Hvordan bruger man Simple Noter:
#''Notatteknik i SN'': i en nøddeskal, du laver noter som hører til emner og underemner, og finder dem hurtigt igen, enten med søgefunktionen, eller via Emne indekset, som opdateres automatisk.
##''Fra top til bund metoden:'' Klik på 'Nyt hovedemne' øverst //(kan ses i den udgave af SN du har gemt til din pc)// og følg de instruktioner som gives. 'Emne' indekset til venstre vil automatisk tilføje emner og noter til Emne indekset. Klik på 'genopfrisk' knappen for at se de nye tilføjelser til menuen. Klik på pilene (►) for at åbne forskellige niveauer i indekset.
##''Fra bunden og op metoden'': Klik på 'Ny note' foroven //(kan ses i den udgave af SN du har gemt til din pc)// og følg de instruktioner , der gives om at lave en note og arbejd dig op ad emne- og underemnekæden.
#''Navigation i SN'': Der er fire måder at navigere igennem Simple Noter:
##Søg efter en note gennem søgevinduet.
##Se dine noter igennem via Emne indekset til venstre.
##Brug history, frem- og tilbageknapperne for at finde noter du lige har brugt.
##Åben sidepanelet for at se lister over noter efter titel, dato ændret og efter tags.
#''Formatering i Simple Noter''
##Når en note eller et emne er i edit-mode, kan du bruge knapper til at formater valgt tekst eller tilføje links og billeder.
!Hvordan man downloader Simple Noter:
Du kan downloade lige så mange kopier af Simple Noter som du ønsker, gratis.
# [[Klik her|http://simplenoter.tiddlyspot.com/download]] og vælg //gem// eller hent den originale 'No-brainerNotes' [[højreklik her|http://www.giffmex.org/nobrainernotes.html]] og vælg 'Gem linkmål som', 'Gem link som', eller lignende. Giv din fil et nyt filnavn og læg den hvor du vil.
#Hvis du bruger en anden browser end Firefox, vil du få brug for [[klik her|http://www.tiddlywiki.com/TiddlySaver.jar]], gem ~TiddlySaver filen, og læg den //samme sted// som din Simple Noter-fil. ~TiddlySaver er en Java applet som giver dig mulighed for at gemme ændringer i forskellige browsere som ikke understøtter at man kan gemme ændringer til lokale filer.
!Andre instruktioner
*[[Grundlæggende tilpasning]]
*[[Avanceret tilpasning]]
For at se hvordan man formaterer tekst i ~TiddlyWiki, kan du læse "Special formatting" sektionen af [[denne tutorial|http://www.giffmex.org/twfortherestofus.html]].
(Red.(MM)) Udover [[HurtigEdit|QuickEditToolbar]] som er indbygget i denne udgave af ~TiddlyWiki, fra starten, har jeg tilføjet wikibar og wysiwyg. For at kunne bruge wysiwyg lokalt - dvs. efter du har downloadet filen til din pc, - skal du downloade [[denne zipfil|http://maans.newp.dk/fckeditor.zip]], pakke mappen ud og lægge mappen (ikke indholdet, men hele mappen) samme sted som du har din tiddlywiki-fil.
[[MusiKat]]@@position:relative;+++^25em^@[[MusiKat]]<<moveablePanel name:GæsteKort>>
----
| <<tiddler MusiKat>> |
===
@@
<script label="(reset)">
story.forEachTiddler(function(t,e)
{story.refreshTiddler(t,null,true)});
refreshDisplay();
return false;
</script>
|sortable|k
|Titel,Kilde,nr|h
|<<QOTD SangBogen2>>|
|<<QOTD SangBogen2>>|
|<<QOTD SangBogen2>>|
|<<QOTD SangBogen2>>|
|<<QOTD SangBogen2>>|
|<<QOTD SangBogen2>>|
|<<QOTD SangMappen2>>|
|<<QOTD SangMappen2>>|
|<<QOTD SangMappen2>>|
|<<QOTD SangMappen2>>|
|<<QOTD SangMappen2>>|
|<<QOTD SangMappen2>>|
|<<tiddler KlikSelv>>|
|<<tiddler SangTimeLærerChat>>|
|!Tålmodighed! Det tager ca 20 sek at "joine" chatten. NB!: Ved tryk på Reset - skal du logge på chatten igen!!|
[[KlogeOrd]]@@position:relative;+++^19em^@[[KlogeOrd]]<<moveablePanel name:KlogeOrd>>
----
| <<QOTD KlogeOrd-alle-i-en 18000>> |
===
@@
Du skal handle således, at dine handlinger kan danne mønster for et helt samfund.
----
Den dag, hvor du er i stand til, at fortælle om den sletteste sag i dit liv, er den allerede under for-vandling fra en hæslig episode til en værdifuld erfaring.
----
Mennesker skal flytte sig - vi er født med fysiske fødder og psykiske rødder og ikke omvendt.
----
At se uden at tolke, er at glo. At lytte uden at tolke er at føle uden at tænke.
----
Kun den der bliver ved med at søge trods alle fiaskoer bliver ved med at finde.
----
Om kærlighed: mislykkede forsøg er langt at foretrække for ingen forsøg for indimellem opstår den højeste lykke.
----
Selvværdet udvikles hos den der stoler på sin umiddelbarheds evne til at skelne mellem godt og ondt i de og det fremmede, som han møder.
----
Kun hvad der trænger ind til hjertet, kan gå ud fra hjertet.
----
Verden består som bekendt af to lande: indlandet og udlandet - hvoraf det første er langt det vigtigste, men for dets egen skyld, må det tage det sidste med i betragtning.
Piet Hein
----
Kun idioter kan undvære deres medmenneskers hjerne.
Piet Hein
----
Ukendskab er det bedste grundlag for had.
Piet Hein
----
Man må kunne tale om hver ting for sig og om tingene i sammenhæng.
Piet Hein
----
Man kan ikke blodigere udtrykke foragt for mennesker end ved ikke at vente noget af dem.
Piet Hein
----
Evnen til at udnytte egne evner, er så vigtig, at hvis bare man har den, behøver man ingen anden.
Piet Hein
----
Når 2 deler et ansvar, blir der højst 1% til hver.
Piet Hein
----
Det er lettere at kæmpe mod et dårligt ry end mod en dårlig samvittighed.
----
Pessimisterne er dog de reneste tåber - de tror på det modsatte af, hvad de håber. Nej, de optimi-ster, som livet beror på, er dem, som tør håbe på noget, de tror på.
Piet Hein
----
Nonchelance er evnen til at blive nede på jorden, når alt andet hænger oppe under loftet.
EARL WILSON
----
Uretfærdighed hist og her er den største trussel mod retfærdighed overalt.
MARTIN LUTHER KING.
----
Det er ikke nemt at tage problemerne eet ad gangen, når de samtidig nægter at stille op på en række.
ASHLEIGH BRILLIANT
----
En stor profet stræber aldrig efter at forklare dig sine visioner. Han inviterer dig i stedet til at stå ved siden af ham og opleve det selv.
ROBERT INMAN
----
Vær varsom med dine tanker. De kan blive til ord før du aner det.
IARA GASSEN
----
Kreativitet er evnen til at løse problemer, som ikke kan beskrives før de er løst.
PIET HEIN
----
Nøglen til et godt liv er, at gøre dét, som man vil, og derpå at elske dét, man gør.
----
Hvis du har for travlt med at værne om dig selv, så kan du ikke holde om andre.
----
Alt hvad der ikke dræber mig gør mig stærkere.
----
Bliv den du er
----
En mand som er ilde lidt, er altid at beklage.
Peter Freuchen
----
Den der ikke adlyder sig selv må adlyde andre.
----
Hvis man ikke er åben og vil lære det hele at kende, hvordan kan man så træffe et etisk valg om godt og ondt?
Michael Koium
----
Den der nyder, at se på kunst for at slippe for, at tænke på sit eget liv - forstår ikke, hvad kunst er.
----
Jo mindre selvtillid folk har, desto større behov har de for at få ret
----
Mest af alt holder jeg af hverdagen.
Dan Turell
----
Lykke og held er ikke en mangelvare - der er rigeligt til alle.
----
Misundelige mennesker, er mennesker, som har sat sig for lave mål
----
Det er kun 5% af det vi går og frygter, som bliver til virkelighed
----
Du får, hvad du FORVENTER - ikke hvad du fortjener
----
Det er beskæmmende, at vi lever i en tid, hvor det er lettere at sprænge et atom end en norm.
Einstein
----
Lad os være ved godt mod ved at huske på, at de problemer, der er sværest at bære, er dem, som aldrig kommer.
James R. Lowell
----
Det er altid for tidligt at bekymre sig og for sent at ærgre sig.
----
Livet er det dejligste eventyr.
H.C.Andersen
----
Vi ved, at godt nok er det bedstes fjende nr. 1
----
Information er svaret, men hvad er spørgsmålet?
James Halloran
----
Den information, vore ansatte er mest interesseret i, er den, de tror vi holder tilbage for dem.
----
Der er intet som smitter mere end et godt humør - bortset fra manglen på samme
----
Det eneste man bør gøre bag en andens ryg, er at klappe den.
----
Trivsel er et resultat af, hvordan vi behandler hinanden. Motivation er, hvordan vi bruger hinan-den.
----
Jeg kan godt lide invitationer. Men jeg hader ordrer!
----
Kære De, hvorfor prøver De ikke at høre og tænke over dét, som jeg prøver at fortælle Dem, i stedet for at bevise, hvor meget jeg ikke ved?
----
Jeg har tit undret mig over, hvorfor folk har så travlt med at besejre hinanden i stedet for at lære af hinanden.
----
Det er relationen mere end det sagte, som er forskellen mellem god og dårlig kommunikation.
----
Din samtalepartner har sjældent gavn af dine meninger og fortolkninger. Han gavnes mest af de sandheder, som han selv finder frem til.
----
Mennesker, som aldrig åbner for deres tanker, viser deres følelser eller siger deres uforbeholdne mening, er rent ud sagt dræbende kedsommelige.
----
Selv Vor Herre kan kun tale til et sultent menneske på brødets sprog
Mahatma Gandhi
----
Menneskets øjne afslører lige så meget som menneskets tale, men med den fordel, at øjets sprog er universelt, og ikke forudsætter brugen af en ordbog
Ralph Waldo Emerson
----
Hvis de omkring dig ikke vil lytte til dig, må du falde på knæ og bede om tilgivelse, for skylden er i sandhed din
Feodor Dostoyevski
----
Søg først at forstå. Derefter at blive forstået.
Anonym
----
Den eneste måde at gøre en person troværdig på er at tro på ham.
Henry L. Stimson
----
Alt som kan siges, kan siges klart.
Ludvig Wittgenstein
----
God kommunikation er lige så stimulerende som sort kaffe, og det er akkurat lige så svært at sove bagefter.
Anne Morrow Lindbergh
----
Management er at gøre tingene rigtigt; lederskab at finde de rigtige ting at gøre.
----
Den bedste chef er den, der har fornuft nok til at vælge gode medarbejdere til at gøre arbejdet, og selvbeherskelse nok til at lade være med at forstyrre dem, mens de gør det.
T. Roosevelt
----
Masserne vil følge en leder, som marcherer tyve skridt foran, men hvis han er tusind skridt foran dem, ser de ham ikke og følger ham ikke.
Georg Brandes
----
Man kan udmærket være eminent uden at være kompetent.
----
Menneskers tilfredshed påvirkes ikke så meget af det du siger og skriver, som af det du gør.
----
At tænke er vejen til succes, men at handle og gennemføre er ofte forskellen mellem succes og fiako.
----
Som leder skal du vide HVORFOR, men du skal også have en mening om HVORDAN
----
Kunsten er, at kunne se forskel på det, som skal ændres, det der bør ændres og det der ikke kan ændres.
----
Somme tider, når jeg tænker på, hvilke forunderlige konsekvenser små ting skaber..... bliver jeg fristet til at tænke, at der ikke findes små ting.
Bruce Barton
----
Forandring kræver tid, viljestyrke, disciplin, kræfter og vigtigst af alt en målsætning samt en overbevisning om, at alt er muligt.
John Evan-Jones
----
En leder, er en, der kan foretage en kritisk vurdering på basis af formodninger
Harry Maynard
----
Autoritet er evnen til at vinde de andres tilslutning.
Bertrand de Jouvenel
----
Fremskridtets kunst består i at sikre ro og orden i forandringen, og at sikre forandring i ro og orden
Alfred North Whitehead
----
At delegere på den rette måde, er et tegn på lederens tro på og tillid til sine medarbejdere
James F. Evered
----
Magt er evnen til at få folk til at gøre, som du vil, og styrken til at afslå at gøre noget, du ikke vil.
Harry Motor Jensen
----
Lederen er kun leder så længe, at han kan bevise, at han er den bedste og mestrer de bedste me-toder
Kenneth Walker
----
Når en tanke ikke kan udtrykkes på simpel vis, bør den afvises.
Marquis de Luc Vauvenargues
----
Visioner uden handling er blot en drøm.
Handling uden visioner får bare tiden til at gå.
Visioner sammen med handling kan ændre verden.
----
Livsklogskab har den, der accepterer, at livet er fuldt af modstridende følelser.
----
I grunden er enhver ulykke netop kun så tung, som man tager den.
Marie von Ebner-Eschenbach
----
Alder er som at bestige et bjerg. Man bliver nok lidt forpustet, men får en langt bedre udsigt.
Ingrid Bergman
----
Hvis sandheden står i vejen for dig, er du på forkert vej.
----
Livet - der findes intet mere sjældent i verden. De fleste mennesker eksisterer blot.
Oscar Wilde
----
Hvad jager vi dog efter? Er det lykken? Den har ingen endnu fanget ved kun at tænke på sig selv, den smutter fra os, hvis vi tror, vi kan gribe den uden at dele den med andre.
Magrethe II af Danmark
----
Det, at han er død, er ikke bevis på, at han har levet.
S.J.Lec
----
Menneskene har for stor respekt for døden målt på den ringe respekt, de har for livet.
Henry de Montherlant
----
Mange lever med en så forbløffende rutine, at det er vanskeligt at tro, at de lever for første gang.
S.J.Lec
----
Mange vil gerne lægge år til deres liv, men det er faktisk mere vigtigt at lægge liv til årerne.
----
Det, der ligger før os, og det, der ligger efter os, er for intet at regne mod det, der ligger inden i os
Oliver Wendell Holmes
----
De ting, som betyder mest, må aldrig være slaver af de ting, som betyder mindst.
Goethe
----
At standse op et øjeblik en gang imellem kan være den eneste mulighed for at overkomme at gå videre.
Olle Wedholm
----
Succes kommer til de mennesker, der ved, at den ikke kommer af sig selv og derfor går ud og henter den.
----
Lykkelig er det folk, hvis historie er kedsommelig at læse om.
Citat: Charles de Montesquieu
----
"Tidligt op og tidligt i seng - så er man sikker på aldrig at møde nogle interessante mennesker."
Oprindelse: Ukendt
----
"Sig aldrig nej af stolthed og aldrig ja af svaghed."
Oprindelse: Spansk ordsprog
----
Kreativitet er udmærket, men plagiat er hurtigere.
Citat: Ukendt
----
"Et nej er bedre end et falsk løfte."
Oprindelse: Tysk ordsprog
----
"Den danser godt for hvem lykken spiller."
Oprindelse: Engelsk ordsprog
----
"Det er et sølle gilde, hvor der ikke går noget i stykker," sagde konen. Hendes mand brækkede halsen."
Oprindelse: Jysk ordsprog
----
"En lille gave er bedre end et stort løfte."
Oprindelse: Fransk ordsprog
----
"Hvis en dame siger "nej" mener hun "måske"; siger hun "måske" mener hun "ja"; siger hun "ja" så er hun ingen dame."
Oprindelse: Ukendt
----
"Lidet siger den, der elsker meget."
Oprindelse: Italiensk ordsprog
----
"Gud havde ikke arme nok til at holde børn væk fra ulykker, så derfor opfandt han mødre."
Oprindelse: Alice, 11 år
----
"En ekspert er en person der har gjort alle de fejl der kan gøres, på et meget snævert område."
Oprindelse: Niels Bohr
----
"Gifte mænd lever ikke længere end ungkarle. Det føles bare sådan."
Oprindelse: Ukendt
----
"I et frugtbart land er der mange dagdrivere."
Oprindelse: Italiensk ordsprog
----
"Den der sår vind, han høster storm."
Oprindelse: Spansk ordsprog
----
"Du hersker over ordet indtil du har sagt det."
Oprindelse: Arabisk ordsprog
----
"Hjernen er et vidunderligt organ. Den begynder at fungere så snart man slår øjnene op om mor-genen, og den holder først op når man er kommet på arbejde."
Oprindelse: Robert Frost
----
"Jeg skriver en kvindes løfter i vand."
Oprindelse: Sofokles
----
"Et liv uden ven bliver en død uden et vidne."
Oprindelse: Spansk ordsprog
----
Alle mennesker dør, men ikke alle, der dør har levet.
Citat: Ukendt
----
"Drik dig fuld hvis du vil være lykkelig én dag. Gift dig hvis du vil være lykkelig to dage. Vil du være lykkelig en hel uge, så slagt et svin og spis det. Vil du være lykkelig resten af dit liv, så bliv gartner."
Oprindelse: Kinesisk ordsprog
----
"Det er lettest for en grim pige at føre et anstændigt liv."
Oprindelse: Marlene Dietrich
----
"At erhverve er held. At beholde er dyd."
Oprindelse: Indisk ordsprog
----
"Gift din søn bort som du vil; din datter som du kan."
Oprindelse: Kinesisk ordsprog
----
"Der findes to slags ulykker: Uheld som rammer os selv, og held som rammer andre."
Oprindelse: Ambrose Pierce
----
En gentleman hjælper en kvinde lige så korrekt i tøjet, som han ukorrekt har hjulpet hende af med det.
Citat: Peter Ustinov
----
"Evigt ejes kun det tabte."
Oprindelse: Marcel Proust
----
"Delt sorg er halv sorg, delt glæde er dobbelt glæde."
Oprindelse: Engelsk ordsprog
----
"Hvis dine bønner altid blev hørt, så havde du god grund til at tvivle på Guds visdom."
Oprindelse: Ukendt
----
En kvinde snorker ikke - hun spoler tilbage!
----
"Jeg er ikke ung nok til at vide alt."
Oprindelse: Oscar Wilde
----
"Mænd bygger huse, kvinder skaber hjem."
Oprindelse: Norsk ordsprog
----
"Intet er umuligt for den, som ikke behøver at gøre det selv."
Oprindelse: A. H. Weiler
----
"Har du gjort en velgerning, så skjul den; har du modtaget en velgerning, så udbred den."
Oprindelse: Arabisk ordsprog
----
"Pyjamassen er opfundet, fordi ord ingen vægt har i en natskjorte."
Oprindelse: Poul Henningsen
----
"Mens man før giftede sig, når man havde lært en kvinde at kende, så bliver man nu skilt fra hen-de, når det samme sker."
Oprindelse: John Barrymore
----
Først når man nøje ved, hvordan børnebørnene er faldet ud, kan man bedømme, om man har op-draget sine børn godt.
Citat: Erich Maria Remarque
----
"Stilen er tankernes klædedragt."
Oprindelse: Lord Chesterfield
----
"Spis dig halvmæt og drik dig halvfuld, og du lever et århundrede."
Oprindelse: Russisk ordsprog
----
Hvis kærlighed gør blind - Hvad skal man så med frækt undertøj?
----
"Om aftenen skal man rose den smukke dag. Den smukke kvinde skal roses om morgenen."
Oprindelse: Ukendt
----
"Samvittigheden har ingen tænder, men den gnaver alligevel."
Oprindelse: Russisk ordsprog
----
"Når klog kommer til klogere, må klog vige."
Oprindelse: Svensk ordsprog
----
"Når længslerne dør ud, begynder døden."
Oprindelse: Christian Houmark
----
"Når en kvinde ikke elsker, er hun lige så koldblodig som en gammel jurist."
Oprindelse: Honoré de Balzac
----
"Når en kvinde ler, ved hun noget. Når hun græder, vil hun noget."
Oprindelse: Svensk ordsprog
----
"Når forelskede par aldrig keder sig i hinandens selskab, skyldes det, at de altid taler om sig selv."
Oprindelse: La Rochefoucauld
----
Det er med kvinder som med biler: enten skal man skifte dem ud hvert andet år eller også skal man beslutte at køre dem helt ned.
Citat: Ukendt
----
"Mange kysser barnet for ammens skyld."
Oprindelse: Dansk ordsprog
----
"Mange mennesker forsømmer den lille lykke, fordi de forgæves venter på den store."
Oprindelse: Pearl S. Buck
----
"Med mandfolk og med kvindfolk jeg nåed lige vidt, kun et trøsted mig, det var akvavit."
Oprindelse: Holger Drachmann
----
"Midsommernatten er ikke lang, men den sætter mange vugger i gang."
Oprindelse: Svensk ordsprog
----
"Man skal hellere lade skrædderen tage mål af sig, end snedkeren."
Oprindelse: Gl. dansk ordsprog
----
"Man skal have en god karakter for at kunne glæde sig over en vens fremgang."
Oprindelse: Oscar Wilde
----
"Man kan ikke flygte fra sin skæbne, og man kan ikke dele den med andre."
Oprindelse: Oldnordisk ordsprog
----
En rigtig ven fortæller dig det, når du har spinat mellem tænderne.
Citat: Ukendt
----
"Man kan ikke give unge mennesker sandheder, men kun love at man aldrig vil lyve for dem."
Oprindelse: Albert Camus
----
"Man kan ikke nå til himlen uden stige."
Oprindelse: Belgisk ordsprog
----
"Man får ikke ondt i tungen af at tie."
Oprindelse: Russisk ordsprog
----
"Mænd er dog udtalt ulogiske; først beundrer de en kvindes ben, så anholder de om hendes hånd."
Oprindelse: Marlene Dietrich
----
"Mæt mand ypper ikke kiv."
Oprindelse: Jydsk ordsprog
----
"Lykke er det eneste man kan give, uden selv at eje det."
Oprindelse: Somerset Maugham
----
"Lykken består i at kende sine grænser - og elske dem."
Oprindelse: Romain Rolland
----
"Lykken synes at være skabt til at deles."
Oprindelse: Paul Bourget
----
Vælg hverken kone eller linned ved stearinlys.
Citat: Spansk ordsprog
----
"Ladhed opskræmmer intet vildt."
Oprindelse: Bibelcitat
----
"Længsel bærer et menneske den halve vej."
Oprindelse: Islandsk ordsprog
----
Vær smuk! Erobring ved første øjekast sparer tid og ulejlighed.
Citat: Mae West
----
Siden tobakken indførelse er den gennemsnitlige levealder fordoblet
Tage Voss
----
Kong Salomon var den klogeste mand i verden. Det var han uden tvivl, fordi han havde så man-ge koner til at rådgive sig."
Oprindelse: Jean Georges
----
"Knirken kommer altid fra det svageste og dårligste hjul."
Oprindelse: Peder Laale
----
"Intet er så vidunderligt som at møde den eneste kvinde i verden. Og det er lige vidunderligt hver gang!"
Oprindelse: John Barrymore
----
"Ideer skal have vinger - men de skal også have fødder, så de kan gå på jorden."
Oprindelse: Knud W. Jensen
----
Sagt om mål og rammestyring: Det er lettere at måle rammerne end at ramme målene.
Citat: Ukendt
----
Det bedste ved fremtiden er at den kommer en dag af gangen.
Citat: Abraham Lincoln
----
"Hvis man tager en kvinde på ordet og en ål ved halen, smutter de begge væk."
Oprindelse: Polsk ordsprog
----
"Hvor fornuften sparker troen ud, smutter overtroen ind ad bagdøren."
Oprindelse: Ingeborg Buhl
----
"Hvis en mand tit bliver skældt ud af sin kone, skal han ikke fortvivle. Det betyder jo kun, at hun endnu ikke har opgivet ham helt."
Oprindelse: Walther Winchell
----
"Hvad gavner det at have kister fulde, når fanden har nøglen."
Oprindelse: Peder Syv
----
"Himlen er høj, men den som vil derop, må bukke sig."
Oprindelse: Ukendt
"Hellere krøbling i himlen end hel og holden i helvede."
Oprindelse: Ukendt
----
"Hellere med dig i helvede end alene i himlen."
Oprindelse: Frisisk ordsprog
----
"Hellere være en levende mus, end en død løve."
Oprindelse: Uzbekisk ordsprog
----
"Hellere være storsnudet end slet ingen næse at have."
Oprindelse: Ukendt
----
"Himlen er den fattiges sparebøsse."
Oprindelse: Tysk ordsprog
----
Den der aldrig har gjort fejltrin, som er værd at skjule, har sjældent gjort fremskridt, som er værd at vise.
----
Kunne vi lære af andres fejltagelser, ville vi ikke behøve at gøre så mange selv.
----
Man siger tiden læger alle sår, men ikke dem man har tilføjet andre.
----
Vorherre har har sat grænser for for forstanden, men åbenbart ikke for dumheden.
(Voltàre)
----
Drømme er livets krydderi!
Citat: Troels Kløvedal
----
"Gift dig aldrig for pengenes skyld. Det er altid billigere at låne."
Oprindelse: Skotsk ordsprog
----
"Frierier og dårligt slædeføre skal man passe på, mens tid er."
Oprindelse: Kirgisisk ordsprog
----
"For at blive kureret for din længsel, skal du blot opnå, hvad du ønsker."
Oprindelse: Fransk ordsprog
----
Hvis arbejde er sundt, så giv det til de syge.
Citat: Jacob Haugaard
----
"Fattigdommen savner meget, gerrigheden alt."
Oprindelse: Italiensk ordsprog
----
"Faren er ikke, at computerne begynder at tænke som mennesker, men at menneskene begynder at tænke som computere."
Oprindelse: J. Harris
----
"En tåbelig ven er en større plage end en klog fjende."
Oprindelse: Tyrkisk ordsprog
----
"En ulykke kommer sjældent alene, sagde pigen. Hun fik tvillinger."
Oprindelse: Gl. dansk ordsprog
----
Opdragelse er de voksnes organiserede forsvar mod ungdommen.
Citat: Mark Twain
----
Det er svært at være socialist nu om stunder, nu da analfabeter kan læse, de fattige har penge og sultens slavehær kæmper mod overvægten.
Citat: Ukendt
----
Erfaring er evnen til at genkende en fejl anden gang man laver den.
Citat: Ukendt
----
Livet er som biler uden centrallås, man bliver nød til at låse op for sig selv før man kan låse op for andre!
Citat: kristian erland eskildsen
----
Han er mindre hæmmet af tankernes tyngde end af deres træge strøm.
Citat: Ukendt
----
Stor er den som véd, men større er den som véd hvor han skal spørge.
Citat: Piet Hein
----
Mange mennesker giver penge ud, de ikke har, til ting, som de ikke har brug for, for at imponere folk, som de ikke kan lide.
Citat: Ukendt
----
Mange mennesker forsømmer den lille lykke, fordi de venter forgæves på den store.
Citat: Dale Carniegie
----
I teorien skulle mænd og kvinder kunne forstå hinanden - og i teorien skulle man kunne fange ål med en lasso.
Citat: Ukendt
----
"En psykiater er en person, som tager sig rasende dyrt betalt for at spørge dig om noget, som din kone udfritter dig om helt gratis."
Oprindelse: Joey Adams
----
"En god dag begynder om morgenen."
Oprindelse: Ukendt
----
"Det gælder ikke om at finde en pige, som man har lyst til at gå i seng med. Det gælder i højere grad om at finde den, man har lyst til at stå op med."
Oprindelse: Jens Locher
----
"Det bedste sted at finde en hjælpende hånd, er yderst på din egen arm."
Oprindelse: Amerikansk ordsprog
----
"Den perfekte mand er blevet godt opdraget af sin mor. Men det er hans svigermor, der fuldender hans opdragelse."
Oprindelse: Life
----
"Den jomfru som rødmer, ved allerede for meget."
Oprindelse: Rousseau
----
"Den der ikke kan tåle gode dage, han skal blot gifte sig."
Oprindelse: Peder Syv
----
"Den der klæder sig på fransk, må finde sig i at fryse på dansk."
Oprindelse: Jydsk ordsprog
----
"Den der spiser kirsebær med de store, får stenene i øjnene."
Oprindelse: Ukendt
----
"Den der træder blidt, når vidt."
Oprindelse: Kinesisk ordsprog
----
"Den dovne forlader ugerne den varme seng."
Oprindelse: Islandsk ordsprog
----
"Den erfarne har mange ar."
Oprindelse: Canadisk ordsprog
----
"Den fattige kureres af arbejde, den rige af lægen."
Oprindelse: Polsk ordsprog
----
"Den gamle tror alt; den midaldrende tvivler på alt; den unge ved alt."
Oprindelse: Oscar Wilde
----
"Den gerrige, som stadig graver sin skat dybere ned, baner sig vej mod helvede."
Oprindelse: Indisk ordsprog
----
"Den hidsige får lov at leve, som han vil; den eftertænksomme holder man øje med."
Oprindelse: Arabisk ordsprog
----
"Dovenskaben bevæger sig så langsomt, at fattigdommen snart træder den i hælene."
Oprindelse: Engelsk ordsprog
----
"Drik dit øl før det dovner, tag din kærest i favn før hun sovner."
Oprindelse: Peder Syv
----
"Elsk, som om du skulle dø i dag!"
Oprindelse: Seneca
----
"Elskeren kan blive kølig, mænd kan komme til at hade deres hustruer - kun forældres kærlighed kan vare hele livet."
Oprindelse: Browning
----
"Det er let at gøre sig lystig over lægekunsten så længe man selv er rask."
Oprindelse: Molière
----
"Da Gud havde skabt Adam tog han sig en hviledag. Men efter han skabte Eva, er der ingen der har fået et roligt øjeblik."
Oprindelse: Ukendt
----
"Kærlighedens tunge er øjnene."
Oprindelse: Phineas Fletcher
----
"Le, og hele verden ler med dig. Græd, og du græder alene."
Oprindelse: Ella Wheeler Wilcox
----
"Hellere en nabo ved hånden end en broder i det fjerne."
Oprindelse: Ukendt
----
"Høflighed er den mest acceptable form for hykleri."
Oprindelse: Ambrose Bierce
----
"Lykke består af ulykker som undgåes."
Oprindelse: Alphonse Karr
----
"Lykke er at have et godt helbred og en dårlig hukommelse."
Oprindelse: Ingrid Bergman
----
"Lykke er at gøre det man vil, og ville det man gør."
Oprindelse: Francoise Giroud
----
"Politiet er en trussel mod den frie verden."
Oprindelse: W. C. Fields
----
"Jeg elsker menneskeheden. Det er enkeltpersonerne jeg ikke kan holde ud."
Oprindelse: Groucho Marx
----
"Lykkelige mennesker tæller ikke flygtige minutter."
Oprindelse: Kinesisk ordsprog
----
"Dovenskab er blot en vane med at hvile sig, før man risikerer at blive træt."
Oprindelse: Jules Renard
----
"Elsk din nabo, men riv ikke gærdet imellem jer ned."
Oprindelse: Ukendt
----
"Gift dig aldrig med en enke, medmindre hendes første mand blev hængt."
Oprindelse: Kinesisk ordsprog
----
Når du ejer en ting, ejer den også dig.
Citat: Ukendt
----
"Manden med arret har ikke glemt såret."
Oprindelse: Afrikansk ordsprog
----
"Mode er for kvinder uden smag, etikette for mennesker uden opdragelse."
Oprindelse: Maria
----
Takt er at få folk til at føle sig hjemme, når man ønskede at de var det.
Citat: Ukendt
----
"Danmark er verdens bedste land, hvor få har for meget og færre format."
Oprindelse: Paul Hammerich
----
Tal i vrede, og du kommer til at holde den bedste tale, du nogenside har fortrudt.
Citat: Winston Churchill
----
"Skønhed uden dyd er som en rose uden duft."
Oprindelse: Dansk ordsprog
----
"At være ægtemand er fast arbejde. Det er derfor så mange ægtemænd begår fejl. De giver ikke arbejdet deres fulde opmærksomhed."
Oprindelse: Arnold Bennett
----
"Den mand som hviler på sine laurbær, har anbragt dem det gale sted."
Oprindelse: Amerikansk ordsprog
----
"Tålmodighed er blot en slags let fortvivlelse forklædt som dyd."
Oprindelse: Ambrose Bierce
----
Tur - retur.
At bryde af og rejse bort kan være svært og falde hårdt, men det er livets krav til dem som holder af at komme hjem.
Citat: Piet Hein
----
"Drik ikke vandet! Fiskene boller i det!"
Oprindelse: W. C. Fields
----
"Jeg holder mig fra helsekost. Derimod har jeg, i min alder, brug for alle de konserveringsmidler som jeg kan få."
Oprindelse: George Burns
----
"Den som kun vil se sin egen fordel ser for lidt."
Oprindelse: Tao-Te-King
----
"Et sundt seksualliv er det bedste middel mod sportens fristelser."
Oprindelse: Ukendt
----
"Vær blot lykkelig. Hvis du er ulykkelig har du nemlig ingen venner."
Oprindelse: Euripides
----
"Ægteskabet har mange sorger, cølibat ingen glæder."
Oprindelse: Dr. Samuel Johnson
----
"I jalousi er der mere egoisme end der er kærlighed."
Oprindelse: La Rochefoucauld
----
"At leve er som at kunne kunsten at tegne uden at bruge viskelæder."
Oprindelse: Chicago Tribune
----
"Velopdragenhed består i at skjule hvor lidt vi tænker på andre."
Oprindelse: Mark Twain
----
"Bestræb dig på at leve sådan, at selv bedemanden vil sørge, når du dør."
Oprindelse: Mark Twain
----
"Takt er evnen til at kunne pege på det ubehagelige uden selv at blive ubehagelig."
Oprindelse: Tysk ordsprog
----
"Folk der går til psykiatere burde have deres hoved undersøgt."
Oprindelse: Samuel Goldwyn
----
"En improviseret tale kræver megen forberedelse."
Oprindelse: Churchill
----
"Kvinder vil aldrig blive så succesrige som mænd, af den simple årsag at de ikke har koner til at rådgive sig."
Oprindelse: Dick Van Dyke
----
"Danmark er uegnet til helårsbeboelse."
Oprindelse: Claus Hermansen
----
"Hvis solen altid skinnede ville alt blive en ørken."
Oprindelse: Arabisk ordsprog
----
"Ved siden af de ti bud har man glemt et elvte, der ikke burde være mindre vigtigt end de andre: Du må ikke kede din næste!"
Oprindelse: Isaac Bashevis Singer
----
"Kunst er at huske en kvindes fødselsdag, men aldrig hendes alder."
Oprindelse: Ukendt
----
"En ungkarl er en mand der skal en ny vej til arbejde hver morgen."
Oprindelse: Ukendt
----
"Hadet og kærligheden sover begge så let, at den svageste stemme kan vække dem."
Oprindelse: Lawater
----
"Jeg afskyr folk der holder hunde. De er kujoner der ikke har mod nok til selv at bide."
Oprindelse: August Strindberg
----
"Med den sande kærlighed er det som spøgelser; alle taler om den, men få har set den."
Oprindelse: La Rochefoucauld
----
"Jo mere du giver, jo større bliver du."
Oprindelse: Saint-Exupéry
----
"Arbejdet er den drikkende klasses forbandelse."
Oprindelse: Oscar Wilde
----
Den nemmeste måde at skaffe sig en lille formue på er at starte med en stor.
Citat: Ukendt
----
Det er kunstnerens forpligtelse at være en outsider. Man kan kun lede masserne udefra.
Citat: Edward Albee
----
En komiker er en, der gør morsomme ting. En stor komiker er en, der gør ting morsomme.
Citat: Buster Keaton
----
"At dissekere humor er som at dissekere en frø. Kun få er interesseret, og den stakkels frø dør af det."
Oprindelse: E. B. White
----
"Utilfredshed er det første skridt mod fremgang."
Oprindelse: Oscar Wilde
----
"Den som tager sorgerne på forskud, lider under dem to gange."
Oprindelse: B. Porteus
----
"Kunst er det man ikke kan. Hvis man kunne, var det jo ingen kunst."
Oprindelse: Robert Storm Petersen
----
"Kærlighedens dødeligste fjende er vanen."
Oprindelse: Edvard George Lytton
----
"Ingen kan tænke klart med knyttede næver."
Oprindelse: George Jean Nathan
----
Den er menneskeligt at fejle, totalt sammenbrud kræver en computer!
----
"Man behøver ikke at opfatte sig selv som idealist, blot fordi man ikke har succes i livet."
Oprindelse: Henry Miller
----
"Kærlighedens første suk er visdommens sidste."
Oprindelse: Antoine Bret
----
"Erfaring - det er navnet som mænd har givet deres fejltrin."
Oprindelse: Oscar Wilde
----
"Lediggang er roden til et sandt guddommeligt liv."
Oprindelse: Søren Kierkegaard
----
"Alle de gode leveregler er skrevet ned; nu mangler vi blot at leve efter dem."
Oprindelse: Blaise Pascal
----
"Det du ikke kan hoppe over, det må du krybe under."
Oprindelse: Tjekkisk ordsprog
----
"Alting i verden efterstræbes med større lyst end det nydes."
Oprindelse: Shakespeare
----
"Hvad der er samlet med omhu vil bevares med visdom."
Oprindelse: Ukendt
----
"Vær stille eller sig noget, som er bedre end stilhed."
Oprindelse: Pytagoras
----
"Man må begrænse sig, det er betingelsen for al nydelse."
Oprindelse: Søren Kierkegaard
----
Blandt mennesker er der langt flere kopier end originaler.
Citat: Pablo Picasso
----
"Den bedste metoder til at få succes i livet er at gå på tæer. Andres tæer selvfølgelig!"
Oprindelse: John Churton Collins
----
"Smiger drikker vi i store slurke, men sandheden kun dråbevis."
Oprindelse: Rousseau
----
"En kvindes skønhed skal bedømmes som en kirkerude - indefra!"
Oprindelse: Ukendt
----
"Den er fri som gør ikke hvad han vil, men hvad han bør."
Oprindelse: Dansk ordsprog
----
"Når en far berømmer sin søn, lovpriser han sig selv."
Oprindelse: Kinesisk ordsprog
----
"Der findes mennesker som kender til alt og intet ved."
Oprindelse: Kant
----
"Intet skærper appetitten som kun lidt på fadet."
Oprindelse: Svensk ordsprog
----
"Du kan mislykkes flere gange, men du er ikke selv mislykket før du skyder skylden på de andre."
Oprindelse: Olaus Petri
----
"Kærligheden regerer uden sværd, binder uden lænker."
Oprindelse: Ordsprog
----
"Und ikke noget menneske den glæde at han kan få dig til at hade."
Oprindelse: Monrad
----
"Det er ikke faderens vrede sønnen frygter, men hans tavshed."
Oprindelse: Kinesisk ordsprog
----
"Intet afslører et menneskes karakter som den spøg, han tager ilde op."
Oprindelse: Ukendt
----
"Den største hindring for at have det godt med andre er at have det skidt med sig selv."
Oprindelse: Balzac
----
"Med en god kone bliver du lykkelig, med en dårlig bliver du filosof."
Oprindelse: Sokrates
----
"I kærlighed kan man kun sejre ved overgivelse."
Oprindelse: Napoleon
----
"En rådgiver er en som ikke kan få sig et ordentligt job."
Oprindelse: Henry W. Platt
----
"Det er meget lettere at være kritisk end at være fejlfri.
"Oprindelse: Disraeli
----
"Det eneste man behøver her i livet er dumhed og troen på sig selv, så er succesen hjemme."
Oprindelse: Mark Twain
----
"Den sande kærlighed begynder der hvor der ikke ventes gengæld."
Oprindelse: Saint-Exupéry
----
"Tavshed er et af de vanskeligste argumenter at gendrive."
Oprindelse: Josh Billings
----
"At kunne lytte er en af de vigtigste egenskaber i en samtale."
Oprindelse: La Rochefoucauld
----
"Vor lykke her i livet er en mosaik af lutter smådele."
Oprindelse: Samuel Coleridge
----
"Taknemlighed er en sjælden blomst."
Oprindelse: Ukendt
----
"Man har ikke omvendt en mand, fordi man har bragt ham til tavshed."
Oprindelse: Dansk ordsprog
----
"Den som vil leve i skyggen af en stor mand, må vænne sig til et køligt klima."
Oprindelse: Japansk ordsprog
----
It's better to close your mouth, and look like a fool; than to open it, and remove all doubt.
Citat: Ukendt
----
Komedie: tragedie betragtet i fugleperspektiv.
Citat: Elbert Hubbard
----
"Under sød tale ligger ofte falskhed i dvale."
Oprindelse: Dansk ordsprog
----
"Brug altid blide ord men stærke argumenter."
Oprindelse: H. G. Bohn
----
"At forstå andre er at være klog. At forstå sig selv er at være viis."
Oprindelse: Kinesisk ordsprog
----
"Når man tager barnet ved hånden, tager man moderen ved hjertet."
Oprindelse: Dansk ordsprog
----
"Beskedenhed er en dyd, men man kommer længere uden."
Oprindelse: Tysk ordsprog
----
"Hvis man ikke vil tabe ansigt er det bedst at man altid holder nederste del af det lukket."
Oprindelse: Ukendt
"Den som taler meget, oplever kun lidt."
Oprindelse: Armensk ordsprog
----
"Hvis vi ikke stræber efter at blive bedre, hører vi op med at være gode."
Oprindelse: Oliver Cromwell
----
"En jomfru der ler, er halvt erobret."
Oprindelse: Italiensk ordsprog
----
"En succesrig mand skal beherske tre ting: Han skal kunne uddelegere alt ansvaret, frasige sig alle fiaskoerne og tage hele æren."
Oprindelse: Ukendt
----
"Som modvægt mod sorger har Himlen skænket os håbet, søvnen og latteren."
Oprindelse: Kant
----
"Hellere rig og rask end syg og fattig"
Oprindelse: Jørgen Lademann
----
"Manden har besejret alle naturens værste vanskeligheder - undtagen kvinden."
Oprindelse: Sinclair Lewis
----
"Det er bedre at tænde blot et lille lys end at forbande mørket."
Oprindelse: Kungfutse
----
Humorens dybeste funktion er at lade latteren komme gråden i forkøbet.
Citat: Frithiof Brandt
----
"Der er ingen stor begavelse uden en tilsætning af galskab."
Oprindelse: Latinsk ordsprog
----
"Mod består ikke i at vove uden frygt, men at gå beslutsomt frem i en retfærdig sag."
Oprindelse: Plutarch
----
"Hør én mand, før du svarer - hør flere før du dømmer."
Oprindelse: Dansk ordsprog
----
"Succes giver venner, modgang prøver dem."
Oprindelse: Publius Syrus
----
"Den som går i de stores fodspor, begynder snart at halte."
Oprindelse: Tyrkisk ordsprog
----
"Den ved kun lidt om kærlighed som altid taler om den."
Oprindelse: Italiensk ordsprog
----
"Den ged der bræger mest giver mindst mælk."
Oprindelse: Polsk ordsprog
----
"Penge gør ikke lykkelig - men de beroliger."
Oprindelse: Amerikansk ordsprog
----
"Der findes mange stier til bjergets top, men udsigten deroppefra vil altid være den samme."
Oprindelse: Kinesisk ordsprog
----
"Beundring er noget man udtrykker over for andre, når de ligner en selv."
Oprindelse: Ambrose Bierce
----
"Lægekunst er at holde patienten beskæftiget, mens naturen kurerer sygdommen."
Oprindelse: Voltaire
----
"I en elskers øjne er hvert ar et smilehul."
Oprindelse: Japansk ordsprog
----
"Kærlighed er en form for seksuel fantasi som man ikke helt kan se bort fra."
Oprindelse: Beatrice Schumann
----
"Hellere være sund bonde end syg kejser."
Oprindelse: Tysk ordsprog
----
"Man holder bedst sit ord ved aldrig at give det."
Oprindelse: Napoleon Bonaparte
----
"Den som flygter for ulven møder bjørnen."
Oprindelse: Tysk ordsprog
----
"Værdighed er det eneste som ikke kan bevares i alkohol."
Oprindelse: Amerikansk ordsprog
----
"En god lytter sidder gerne og tænker på noget helt andet."
Oprindelse: Amerikansk ordsprog
----
"Et gram sund fornuft er bedre end et kilo lærdom."
Oprindelse: Svensk ordsprog
----
"Fra succes til fiasko er der et lille skridt, fra fiasko til succes er der lang vej at gå."
Oprindelse: Jødisk ordspro
----
"Hvad folk kalder skæbne er som regel deres egne dumheder."
Oprindelse: Schopenhauer
----
"Hvad kærligheden er ved ingen; hvad den formår ved nogen - men hvilke ulykker den anretter det ved vi allesammen."
Oprindelse: Frejlif Olsen
----
"Invester aldrig i noget der kan spise eller skal repareres."
Oprindelse: Billy Rose
----
"Hvis du altid siger sandheden har du ikke behov for at gå og huske noget som helst."
Oprindelse: Mark Twain
----
"Man kan ikke nyde lediggang hvis der ikke ligger en masse arbejde der skal gøres."
Oprindelse: Jerome K. Jerome
----
"De eneste normale mennesker er dem man ikke kender særlig godt."
Oprindelse: Joe Ancis
----
"Den mand der dør ugift, har i virkeligheden aldrig levet. For hvad er livet uden lidelse?"
Oprindelse: Frejlif Olsen
----
"Sorgen over en ægtemand er ligesom smerten i en albue: Pinefuld og kort."
Oprindelse: Tysk ordsprog
----
"Hvor kærligheden kigger ind gennem vinduet, kryber elendigheden ud gennem døren."
Oprindelse: Polsk ordsprog
----
"Gift dig aldrig med en kvinde, før du har set hvordan hun ser ud når hun er rigtigt godt forkølet."
Oprindelse: Weygandt
----
Det er kun sportsmænd og idioter, der ikke springer over, hvor gærdet er lavest.
Citat: Jesper Klein
----
"Pengene findes altid, men lommerne veksler."
Oprindelse: Gertrude Stein
----
"Kærlighed uden gengældelse er som et spørgsmål uden svar."
Oprindelse: Tysk ordsprog
----
"Den bedste måde at fordoble sine penge på er ved at folde dem sammen og stikke dem i lommen."
Oprindelse: Kin Hubbard
----
"Kærlighed og mæslinger er farligere jo ældre patienten er."
Oprindelse: Byron
----
"Kvinder tilgiver de mænd der elsker dem, og mænd elsker de kvinder der tilgiver dem."
Oprindelse: Judge
----
Du kan ikke hjælpe de fattige ved at udrydde de rige.
Citat: Abraham Lincoln
----
"Jeg har sikkert mine fejl, men at tage fejl er ikke en af dem."
Oprindelse: Jimmy Hoffa
----
"Hvis mænd sagde det til deres egne koner, som de siger til andre kvinder, ville der være færre ulykkelige ægteskaber."
Oprindelse: George Kaufman
----
"Der er kun to slags kvinder i verden. Kvinder der altid taler, og kvinder der aldrig kan tie stille."
Oprindelse: Oscar Wilde
----
"Snak og tak gør ingen mand rig."
Oprindelse: Jysk ordsprog
----
"Mennesket er den eneste fejltagelse som naturen har begået."
Oprindelse: Voltaire
----
"Jeg respekterer andres tro, men det er tvivlen der driver mig videre i livet."
Oprindelse: Wilson Mizner
----
"Når man er så fantastisk som jeg er det vanskeligt at bevare ydmygheden."
Oprindelse: Muhammad Ali
----
"Du ville blive forbavset, hvis jeg fortalte dig hvor meget det koster at se så billig ud."
Oprindelse: Dolly Parton
----
"Man kan ikke både skide og slå på tromme på samme tid."
Oprindelse: Ukendt
----
"Skønt såret heles bliver arret tilbage."
Oprindelse: Engelsk ordsprog
----
"Når en ged trækker sig tilbage er det for at tage tilløb til at stange."
Oprindelse: Indisk ordsprog
----
"Den der ikke bliver snakket om er der ikke meget ved."
Oprindelse: Sjællandsk ordsprog
----
"En håndfuld rækker langt, hvis den gives som gave i kærlighed."
Oprindelse: Indisk ordsprog
----
"En mand vil aldrig kritisere din stemme hvis du synger hans pris."
Oprindelse: Judge
----
"Al for megen omsorg for helbredet er ødelæggende for evnen til at opleve tilværelsen."
Oprindelse: Platon
----
"Har man taget fanden med i båden må man også ro ham i land."
Oprindelse: Svensk ordsprog
----
"Dyden i midten," sagde Fanden. Han satte sig mellem to advokater."
Oprindelse: Ukendt
----
"Ofte kommer sur svie efter sød kløe."
Oprindelse: Peder Laale
----
"Svig må forklæde sig, men sandheden går altid nøgen."
Oprindelse: Skotsk ordsprog
----
"Den første forudsætning for trivsel på arbejdspladsen er chefens fravær."
Oprindelse: Svensk
----
"Den, som ikke ærer det små, er ikke det store værdigt."
Oprindelse: Indisk ordpsrog
----
"At komme i rette tid er godt. At gå i rette tid er bedre."
Oprindelse: Ukendt
----
"Kærlighed er den eneste sygdom, der får en til at føle sig bedre."
Oprindelse: Sam Shephard
----
"I efteråret fór en rasende orkan gennem landet og forårsagede forbedringer for millioner af kroner."
Oprindelse: Ukendt
----
"Min hjerne er mit favoritorgan nummer to."
Oprindelse: Woody Allen
----
"Af alle seksuelle varianter er kyskhed nok den mest ejendommelige."
Oprindelse: Remy de Gourmont
----
"Man skal ikke kaste med sko, når man selv er en sut."
Oprindelse: Ukendt
----
"Man lærer kun lidt af sejren, men meget af nederlaget."
Oprindelse: Japansk ordsprog
----
"Når solen står op, vender min moral tilbage."
Oprindelse: Elayne Boosler
----
"Fiasko er det krydderi, som giver succesen smag."
Oprindelse: Truman Capote
----
"Dovenskab er ikke andet end en vane med at hvile sig, før man bliver træt."
Oprindelse: Jules Renard
----
"Kvinder der vil være jævnbyrdige med mænd, mangler ambitioner i tilværelsen."
Oprindelse: Ukendt
----
God dømmekraft kommer fra erfaringer. Desværre kommer erfaringer som regel fra dårlig dømmekraft.
Citat: Ukendt
----
"Det jævner sig, sagde manden. Han havde skidt i bukserne og skulle ride hjem."
Oprindelse: Ukendt
----
"Efter min mening er sex det smukkeste, mest naturlige og sundeste man kan købe for penge."
Oprindelse: Steve Martin
----
"Giv en mand frie hænder, og de er straks overalt på dig."
Oprindelse: Mae West
----
"Kun den, der går sine egne veje, kan aldrig blive indhentet af nogen."
Oprindelse: Marlon Brando
----
"Ensomhed er mere fornøjelig, hvis man har nogen at dele den med."
Oprindelse: Ukendt
----
"Der er intet galt i at arbejde, bare det ikke optager for meget af ens fritid."
Oprindelse: Ukendt
----
Så længe man ved, hvor meget man har, er man endnu ikke rig.
Citat: Paul Getty
----
Ungkarle lever efter mottoet: heller to ringe under øjnene end en på fingeren.
Citat: Mario Adorf
----
"Et magert forlig er bedre end en fed proces."
Oprindelse: Ukendt
----
"Jeg ved, hvordan Nixon havde det med Vietnam. Jeg har selv engang prøvet at komme ud af en bogklub."
Oprindelse: Ukendt
----
"En mand med succes er en, der tjener flere penge, end hans hustru kan bruge."
Oprindelse: Ukendt
----
"En kvinde med succes er en, der kan finde sådan en mand."
Oprindelse: Ukendt
----
"Skriv fornærmelser i sand, men velgerninger i sten."
Oprindelse: Arabisk ordsprog
----
"En kvinde får altid det sidste ord i en diskussion. Alt, hvad en mand siger efter det, er begyndelsen til en ny diskussion."
Oprindelse: Ukendt
----
"En arkæolog er et menneske, hvis hele tilværelse ligger i ruiner."
Oprindelse: Ukendt
----
"Dem, der ved, hvad der skal til, gør det. Dem, der vidste det engang, men ikke ved det mere, bliver konsulenter."
Oprindelse: Ukendt
----
Det gælder ikke om at gøre tingene rigtigt, men at gøre de rigtige ting!
Citat: JBK-mix
----
"Sparekassebogen er et monument over den morskab, man ikke har haft."
Oprindelse: Svensk ordsprog
----
"En kvinde der søger en ægtemand, er det mest samvittighedsløse rovdyr."
Oprindelse: G. B. Shaw
----
"Et gram (kvint) sund fornuft er bedre end et kilo (centner) lærdom."
Oprindelse: Svensk ordsprog
----
"Mode er en form for smagløshed, der er så ulidelig at den må ændres hver sjette måned."
Oprindelse: Oscar Wilde
----
Er man et nul, hvis man kommer før nummer 1?
Citat: Ukendt
----
"Det er bedre at have elsket og tabt, end aldrig at have tabt."
Oprindelse: Samuel Butler
----
"Kærlighed er det der kan ske for mænd og kvinder som ikke kender hinanden."
Oprindelse: W. Somerset Maugham
----
"Man kan være helt sikker på, at man er gammel, når lysene koster mere end lagkagen."
Oprindelse: Ukendt
----
"To bønder påstår begge at de ejer den samme ko. Mens den ene trækker i dens hoved og den anden i dens hale, bliver koen malket af en advokat."
Oprindelse: Jødisk ordsprog
----
"Ingen glemmer nogensinde hvor han begravede stridsøksen."
Oprindelse: Kin Hubbard
----
"Tag dig i agt for en mand der aldrig drikker."
Oprindelse: Græsk ordsprog
----
"Kærligheden er en kat der river, selv om man kun havde tænkt sig at lege med den."
Oprindelse: Ninon de Lenclos
----
"Alle rovfugle er tavse."
Oprindelse: Amerikansk ordsprog
----
"Havebrug er racisme anvendt over for Guds natur i dagligdagen."
Oprindelse: Ukendt
----
"Jeg har aldrig drukket mig fuld, men ofte fået serveret for meget."
Oprindelse: George Gobel
----
"Underholdsbidrag er som at købe havre til en død hest."
Oprindelse: Arthur Baer
----
"Et hjem er et sted, hvor der alle vegne er udsigt til noget, der trænger til at blive gjort."
Oprindelse: Ukendt
----
"Mangt et ægteskab er en dødsdom, som eksekveres i årevis."
Oprindelse: August Strindberg
----
"Venner kan komme og gå, men fjender hober sig op."
Oprindelse: Thomas Jones
----
"Vær forsigtig med bøger om helsekost. Du kunne komme til at dø af en trykfejl."
Oprindelse: Mark Twain
----
"Hum dig lige. Du står i min aura!"
Oprindelse: Ukendt
----
"Fjernsynet har bevist at folk hellere vil se på alt andet end hinanden."
Oprindelse: Ann Landers
----
"Diplomati er kunsten at sige 'sød lille hund' indtil du kan finde en sten."
Oprindelse: Will Rogers
----
"Idealisme er det der går forud for erfaring; kynisme er det der følger efter."
Oprindelse: David T. Wolf
----
"Gamle mennesker bør ikke spise helsekost. De har brug for alle de konserveringsmidler de kan få."
Oprindelse: Robert Orben
----
"Alt hvad der er for dumt til at blive sagt, bliver sunget."
Oprindelse: Voltaire
----
"De der er for kloge til at engagere sig i politik, bliver straffet ved at blive regeret af dem der er mindre kloge."
Oprindelse: Platon
----
"Den bedste kur mod hypokondri er at holde op med at interessere sig for sin egen krop, og i stedet interessere sig for en andens."
Oprindelse: Goodman Ace
----
Jeg omfavner min rival, men det er for at kværke ham.
Citat: (Jean Racine, Britannicus)
----
"Da jeg havde læst om drikkeriets forbandelse, lagde jeg læsning på hylden."
Oprindelse: Henny Youngman
----
Man kan tæmme vildt dyr men ej ond kvinde
Citat: Peder Laale
----
"Hold op med at bekymre dig om dit helbred. Det forsvinder helt af sig selv."
Oprindelse: Robert Orben
----
"Stof til eftertanke: Titanic blev bygget på et skibsværft af uddannede håndværkere. Noahs ark på en bjergside af en flok amatører."
Oprindelse: Ukendt
----
"Tilgiv dine fjender, men glem aldrig deres navne."
Oprindelse: John F. Kennedy
----
"At bede er at spørge om universets love kan tilsidesættes til fordel for en enkelt troende i al hans lidenhed."
Oprindelse: Ambrose Bierce
----
Med kritik følger ansvar.
Citat: Ukendt
----
"Noget af det sværeste at acceptere er et godt eksempel."
Oprindelse: Mark Twain
----
Styr hest med bidsel og kone med kæp.
Citat: Peder Laale
----
"Indforstået jargon og uforståelige fremmedord er et varemærke for ethvert seriøst moderne erhverv."
Oprindelse: Ukendt
----
"Jeg tror på kærlighed ved første blik. Det er meget tidsbesparende."
Oprindelse: Ukendt
----
Visdom er ikke at vide en masse. Visdom er at vide hvad man skal gøre med det man ved.
Citat: Ukendt
----
"God dømmekraft bygger på erfaring, og erfaring kommer af ringe dømmekraft."
Oprindelse: Barry LePatner
----
"Hævn er sød og ikke fedende."
Oprindelse: Alfred Hitchcock
----
"Hvis du vil læse om kærlighed og ægteskab, må du købe to forskellige bøger."
Oprindelse: Alan King
----
Det er vigtigere at have ret, end at få ret.
Citat: Ukendt
----
"Har man ingen karakter, må man anlægge sig nogle leveregler."
Oprindelse: Albert Camus
----
"Mange mennesker tror, at de tænker, når de i virkeligheden bare flytter rundt på deres fordomme."
Oprindelse: Ukendt
----
"Kunsten er en løgn, som får os til at se sandheden."
Oprindelse: Pablo Picasso
----
"I de blindes rige er den enøjede konge."
Oprindelse: Machiavelli
----
"At spare er ganske strålende. Især hvis ens forældre har gjort det for én."
Oprindelse: Winston Churchill
----
"Alle lidenskaber dør ud med alderen. Kun egoismen lever evigt."
Oprindelse: Voltaire
----
"Alt her i livet har sin pris, også de ting man får foræret."
Oprindelse: Theodor Fontane
----
"Alle har lyst til himlen, men få bryder sig om vejen derhen."
Oprindelse: Peder Syv
----
"Ægtemænd og stueplanter skal behandles med omhu - ellers går de ud."
Oprindelse: Dansk ordsprog
----
"Gid jeg var godt gift, for nu har jeg fået nok af kærligheden, sagde pigen."
Oprindelse: Ukendt
----
"Ikke så ringe," sagde manden. Han kastede en sten efter hunden og ramte sin svigermor.
Oprindelse: Gl. dansk ordsprog
----
"Dagens lys udsletter nattens ord."
Oprindelse: Arabisk ordsprog
----
"Den fattige kureres af arbejde, den rige af lægen."
Oprindelse: Polsk ordsprog
----
"Den gamle tror alt; den midaldrende tvivler på alt; den unge ved alt."
Oprindelse: Oscar Wilde
----
"Der er ingen værre tyv end en dårlig bog."
Oprindelse: Italiensk ordsprog
----
"Den, der samtidig kigger til højre og venstre, kommer uvægerligt til at skele."
Oprindelse: Konrad Adenauer
----
"Den, der glemmer fortiden, er dømt til at gentage den."
Oprindelse: Elsa Gress
----
"Den, der lever dydigt, bliver æret, men han bliver ikke misundt."
Oprindelse: Persisk ordsprog
----
"Den uvidende har mod, den vidende har angst."
Oprindelse: Alberto Moravia
----
"Den, der aldrig er rådvild, bliver aldrig gift."
Oprindelse: Ukendt
----
"Den propmætte prædiker altid om faste."
Oprindelse: Spansk ordsprog
----
"Det er i de gamle klæder man skal tjene til de ny."
Oprindelse: Ukendt
----
"Det er ikke den koldeste pige der får minkpelsen."
Oprindelse: Russisk ordsprog
----
"En løgn kan gå fra Bagdad til Konstantinopel, mens sandheden leder efter sine sandaler."
Oprindelse: Arabisk ordsprog
----
"En god dag giver en glad aften."
Oprindelse: Ukendt
----
"En dårlig samvittighed er en samvittighed, der gør sin pligt."
Oprindelse: Aldous Huxley
----
"Elsk, som om du skulle dø i dag!"
Oprindelse: Seneca
----
"Dovenskaben bevæger sig så langsomt, at fattigdommen snart træder den i hælene."
Oprindelse: Engelsk ordsprog
----
"Drik dit øl før det dovner, tag din kærest i favn før hun sovner."
Oprindelse: Peder Syv
----
"Det nytter ikke at kunne se os selv, som andre ser os. Vi ville alligevel aldrig tro det."
Oprindelse: James Thurber
----
"Det vigtigste for et godt ægteskab er, at man lærer at strides harmonisk"
Oprindelse: Anita Ekberg
----
"Det gælder ikke om at finde en pige, som man har lyst til at gå i seng med. Det gælder i højere grad om at finde den, man har lyst til at stå op med."
Oprindelse: Jens Locher
----
"Det har man for sin imødekommenhed, sagde pigen. Hun fik tvillinger."
Oprindelse: Gl. dansk ordsprog
----
"Det er kærlighed, når hun stryger krummerne ud af sengen."
Oprindelse: Kurt Tucholsky
----
"Det er med ord som med solstråler; jo mere de koncentreres, jo dybere brænder de."
Oprindelse: James Joyce
----
"Et er at lære udenad, et andet er at samle viden."
Oprindelse: Seneca
----
"Et menneske er ikke gammelt, så længe alderen ikke træder i stedet for drømme."
Oprindelse: John Barrymore
----
"Et menneske lever kun et liv på denne jord. Gennem bøgerne lever mennesket mange liv."
Oprindelse: Tom Kristensen
----
"Gift dig aldrig for pengenes skyld. Det er altid billigere at låne."
Oprindelse: Skotsk ordsprog
----
Den som løftet blikket ser ingen grænser.
Citat: Ukendt
----
"Hvis en mand tit bliver skældt ud af sin kone, skal han ikke fortvivle. Det betyder jo kun, at hun endnu ikke har opgivet ham helt."
Oprindelse: Walther Winchell
----
"Hvis man tager en kvinde på ordet og en ål ved halen, smutter de begge væk."
Oprindelse: Polsk ordsprog
----
De mænd, der kommer bedst ud af det med kvinder, er de samme som dem der ved, hvordan man bedst undvære dem.
Citat: Charles Baudelaire
----
"Hvad man kalder en last er altid det samme. Hvad man kalder dyd er mere bestemt af moden."
Oprindelse: Bernhard Shaw
----
Målet med livet er ikke at blive verdensmestre, men at lære at mestre verden.
Citat: Arne Nielsson
----
Ofte trykker en laurbærkrans mere end en tornekrone.
Citat: Wolfgang Eschker
----
"Knirken kommer altid fra det svageste og dårligste hjul."
Oprindelse: Peder Laale
----
Smilet er et udtømmende udsagn uden ord.
Citat: Hans Arndt
----
"Kvinder har et velsignet karaktertræk: De kan tilgive mænds dårskaber."
Oprindelse: McCardie
----
"Kvinder vil gerne opleve romaner i kærligheden, mændene blot noveller."
Oprindelse: Daphne du Maurier
----
"Man kan drive enhver forelsket kvinde så langt, at hun gør hvad hun vil."
Oprindelse: Marcello Mastroianni
----
"Man kan ikke flygte fra sin skæbne, og man kan ikke dele den med andre."
Oprindelse: Oldnordisk ordsprog
----
"Lykke er det eneste man kan give, uden selv at eje det."
Oprindelse: Somerset Maugham
----
At prale bringer måske ikke lykke, men intet menneske, som har fanget en stor fisk, går hjem ad en sidegade.
Citat: Svend Horn
----
"Myggen flyver så længe omkring lyset, at den til sidst brænder vingerne."
Oprindelse: Peder Syv
----
"Mands ære er at undgå trætte, men alle tåber vil strid."
Oprindelse: Bibelcitat
----
"Man kan også blive mæt af honningkage."
Oprindelse: Norsk ordsprog
----
"Om aftenen skal man rose den smukke dag. Den smukke kvinde skal roses om morgenen."
Oprindelse: Ukendt
----
Det er godt at få det bedre, men det er bedre at få det godt.
Citat: Ukendt
----
"Når en kvinde ler, ved hun noget. Når hun græder, vil hun noget."
Oprindelse: Svensk ordsprog
----
Smilet er et udtømmende udsagn uden ord.
Citat: Hans Arndt
----
"Når en kvinde ikke elsker, er hun lige så koldblodig som en gammel jurist."
Oprindelse: Honoré de Balzac
----
"Hvis du skal have et arbejde godt og hurtigt lavet, så vælg en travl mand. De andre har aldrig tid."
Oprindelse: Elbert Hubbard
----
"Ungkarl: En påfugl. Forlovet: En løve. Gift: Et æsel."
Oprindelse: Spansk ordsprog
----
"Utilfredshed er det første skridt mod fremgang."
Oprindelse: Oscar Wilde
----
"Tid, ord og mødom kan man ikke tage tilbage."
Oprindelse: Ukendt
----
"Stormen fælder de store træer, de små bliver stående."
Oprindelse: Sjællandsk ordsprog
----
"Styrke uden klogskab segner på grund af sin egen tyngde."
Oprindelse: Horats
----
"Tænk to gange, og ti så stille."
Oprindelse: Ukendt
----
"Sommetider har tårer samme vægt som ord."
Oprindelse: Ovid
----
"Sorger druknes ikke i alkohol, de kan svømme."
Oprindelse: Heinz Rühmann
----
"Som mæslinger er kærligheden farligst, når den kommer sent i livet."
Oprindelse: Engelsk ordsprog
----
"Smilehuller burde forbydes ved lov. De anretter flere ulykker end alverdens sprængstoffer."
Oprindelse: Duncan Schwann
----
"Se imod himlen, for i jorden kan du jo altid komme."
Oprindelse: Ukendt
----
"Det eneste der afholder Gud fra at sende en ny syndflod, er at den første slog fejl."
Oprindelse: Nicolas Chamfort
----
"Verden bliver lys, og menneskene synes gode, for den sjæl der elsker."
Oprindelse: Monrad
----
Hvis man ikke er venstreorienteret som ung, har man intet hjerte - hvis man er venstreorienteret som gammel, har man ingen hjerne.
Citat: Jaques Chirac
----
Da jeg var ung vidste jeg alt, men nu er jeg blevet klogere.
Citat: Dansk ordsprog
----
Det er svært at være socialist nu om stunder, nu da analfabeter kan læse, de fattige har penge og sultens slavehær kæmper mod overvægten.
Citat: Ukendt
----
Det objektive danner livet, mens det subjektive er livet.
Citat: Dithmer
----
Gode venner kan lave alting sammen - men kun de bedste venner er i stand til at lave ingenting sammen.
Citat: Peter Plys
"Den korrekte elsker tager færre chancer, end der bydes ham."
Oprindelse: John Field
----
"Den største sorg er at indse, at vi selv er eneste årsag til al vor modgang."
Oprindelse: Sofokles
----
"Hellere et tomt hus end en dårlig lejer."
Oprindelse: Skotsk ordsprog
----
"Inden rosen ved af det, er den et gammelt hyben."
Oprindelse: Svensk ordsprog
----
"De søvnløse og de ulykkelige er oftest meget stolte over deres problemer."
Oprindelse: Bertrand Russell
----
"Eventyr er resultatet af en dårlig planlægning."
Oprindelse: Blatchford Snell
----
En god tretant er bedre end en ond cirkel
Oprindelse: Ukendt
----
"Amatører håber. Professionelle arbejder."
Oprindelse: Garson Kanin
----
"At forsømme nuet er at kaste sin ejendom bort."
Oprindelse: Schiller
----
"En smuk kvinde er hurtigt klædt på."
Oprindelse: Engelsk ordsprog
----
"En mand kan modstå alt - undtagen fristelser."
Oprindelse: Oscar Wilde
----
"En ægte leder behøver ikke føre an. Det er nok for ham at udpege retningen."
Oprindelse: Henry Miller
----
"Guld giver et stænk af skønhed, også til den grimmeste."
Oprindelse: Boileau
----
Mænd. Find dem. Fup dem. Forlad dem. (Mae West)
----
Mænd er som Camembert: Lettest at fordøje når de er halvmodne (Deneuve)
----
Ordforklaring: Urinstinkt. Især på herretoiletter. (Anon)
----
"Det er menneskeligt at fejle, men hvis man virkelig ønsker at lave kage i det, så skal man tage en computer til hjælp."
Oprindelse: Ukendt
----
"Har man ingen bekymringer, skaffer man sig nogle."
Oprindelse: Svensk ordsprog
----
"Den danser godt for hvem lykken spiller."
Oprindelse: Engelsk ordsprog
----
"Den som ikke kan danse, giver det ujævne gulv skylden."
Oprindelse: Malajisk ordsprog
----
"Ingen er så klog som manden, der tier stille på de rigtige tidspunkter."
Oprindelse: Ukendt
----
"Tag kærligheden til det skønne ud af vore hjerter, og du fjerner hele fortryllelsen ved livet."
Oprindelse: Rousseau
----
"Kun en klog mand ved hvordan man skal elske."
Oprindelse: Seneca
----
"Sig aldrig nej af stolthed og aldrig ja af svaghed."
Oprindelse: Spansk ordsprog
----
"Pligten er først behagelig når den er gjort."
Oprindelse: August Strindberg
----
"Hjertet får aldrig rynker."
Oprindelse: Madame de Sévigné
----
"At drive en virksomhed uden at annoncere er som at blinke til en pige i mørke. Du ved, hvad du gør, men ingen andre opdager det."
Oprindelse: Stuart H. Britt
----
"Sjælelige lidelser helbredes ofte af virksomhed."
Oprindelse: Goethe
----
"Drømmen om et forenet Europa har ingen udsigt til at blive virkeliggjort. Man kan ikke lave omelet af hårdkogte æg."
Oprindelse: Charles de Gaulle
----
"Lykke består af ulykker som undgåes."
Oprindelse: Alphonse Karr
----
"Den går trygt, som intet ejer."
Oprindelse: Fransk ordsprog
----
"Jeg har stadig alt det, jeg havde for tyve år siden - men nu sidder det hele lidt længere nede."
Oprindelse: Gypsy Rose Lee
----
"Er du i tvivl om, hvad du skal gøre, vælg da det venligste."
Oprindelse: Amerikansk ordsprog
----
"Hun havde et smil der kunne oplyse en mindre købstad."
Oprindelse: Ukendt
----
"Ægteskabet har mange sorger, cølibat ingen glæder."
Oprindelse: Dr. Samuel Johnson
----
"At leve er som at kunne kunsten at tegne uden at bruge viskelæder."
Oprindelse: Chicago Tribune
----
"Velopdragenhed består i at skjule hvor lidt vi tænker på andre."
Oprindelse: Mark Twain
----
"Tal med en mand om ham selv og han vil lytte i timevis."
Oprindelse: Benjamin Disraeli
----
"Universet er som et ur - så der må være en urmager!"
Oprindelse: Voltaire
----
"Gud skabte Adam. Så betragtede han sit arbejde og sagde så: "Det kan jeg godt gøre bedre næste gang."
Oprindelse: Dr. Joyce Brothers
----
"Beskedenhed hos en skuespiller er som lidenskab hos en luder."
Oprindelse: Jackie Gleason
----
"Den mand som hviler på sine laurbær, har anbragt dem det gale sted."
Oprindelse: Amerikansk ordsprog
----
"Jeg ved at alkohol er en langsom dræber, men jeg har heller ikke så travlt."
Oprindelse: Courteline
----
"Mode er for kvinder uden smag, etikette for mennesker uden opdragelse."
Oprindelse: Maria
----
"Ved siden af de ti bud har man glemt et elvte, der ikke burde være mindre vigtigt end de andre: Du må ikke kede din næste!"
Oprindelse: Isaac Bashevis Singer
----
"En ungkarl er en mand der skal en ny vej til arbejde hver morgen."
Oprindelse: Ukendt
----
"Et mirakel sker ikke i strid med naturen, men i strid med hvad vi ved."
Oprindelse: Augustin
----
"Moderne kunst opstår, når malerne holder op med at kigge på piger og bilder sig ind at de har en bedre idé."
Oprindelse: John Ciardi
----
"Enhver mand ved, at han ved at kysse sin kones øjenlåg kan gøre hende blind, og at han kan gøre hende stum ved at kysse hendes mund."
Oprindelse: Dale Carnegie
----
"Kvinder vil aldrig blive så succesrige som mænd, af den simple årsag at de ikke har koner til at rådgive sig."
Oprindelse: Dick Van Dyke
----
"At lide for sine egne fejltagelser er det bitreste her i livet."
Oprindelse: Oscar Wilde
----
"Der er stadig en del tvivl om hvem der er bedst til at tage sig af små børn, men der er ingen tvivl om at de dårligste til jobbet, er deres egen forældre."
Oprindelse: Bernard Shaw
Man bør ikke fordømme mennesker for hvad de gør mod deres fjender. Men måske bør man dømme dem efter sindelaget, de viser deres venner.
(Herman Bang 1908)
----
Man ved at man er ved at blive gammel, når lysene koster mere end kagen.
(Bob Hope)
----
Mand og kvinde er to parallelle linjer, og det ligger i parallelle linjers natur, at de aldrig mødes.
(August Strindberg)
----
Meget dunkelt ville blive klart, hvis man gik ud fra den kendsgerning, at mennesker er forskellige, i stedet for, som det nu er på mode, at gå ud fra, at de er ens.
(Jørgen Nielsen)
----
Menneske, der er ingen vej. Vejen bliver til, når du går.
(Machado, Antonio)
----
Menneskene fødes som Individer, opdrages som veltilpassede Puslebrikker og uniformeres til sidst som komplet intetsigende Kistelemmer.
(Ove Fahnøe 1975)
----
Mennesker er mærkelige. Tro mig på mit ord - jeg ved det. Jeg tilhører selv en fjern variant af stammen.
(Turèll, Dan]
----
Mennesker forstår ikke bøger, før de har prøvet en del af livet. Fordommen imod bøger er opstået ved at man så, hvor stupide de mennesker var, som KUN læste bøger.
(Ezra Pound)
----
Mennesker og vilddyr. Forskellen er, at de første kæmper med tungen, de andre med tænderne.
(Samuel Butler 1612)
----
Mennesker påstår ofte, at i et demokrati bliver beslutningerne taget af folkets flertal. Det er naturligvis ikke sandt. Beslutningerne bliver taget af flertallet blandt dem, der lader sig høre og som stemmer - og det er noget helt andet.
(Walter H. Judd)
----
Mildt sagt: Hans åndelige Tyngdekraft levner ham ikke så meget
Misfornøjelse er det første skridt mod en mands eller en nations fremgang.
(Oscar Wilde)
----
Mit hemmelige plot er et lave nogen skoler over hele landet for autodidakte. Så vil jeg score kassen på iværksætterydelse, og når folk møder op ved døren så hænger der et skilt, hvor der står: "Gå dog hjem!"
(Ole Bornedal 1995)
----
Mode begynder med Mod - udvist af en Nar.
(Ove Fahnøe 1970)
----
Må Gud bevare mig i smult vand, i stormfuldt klarer jeg mig selv.
(Spansk Ordsprog)
----
Måske har jeg modsagt mig selv i aften. Men hvad jeg har sagt, står jeg ved.
(Robert Storm Petersen)
----
Pas altid på dem, der tilføjer: "Med andre ord". De er ved at begynde forfra.
(Robert Morley)
----
Pas på den gode smag. Den står tit i vejen for noget, der er endnu bedre.
(Peter Bastian DR-TV 1997)
----
Pas på en mand, som taler lovprisende om kvindefrigørelse. Han har tænkt sig at holde op med at arbejde.
(Erica Jong)
----
På vore landeveje har vi et liv og leben som på hestevognens tid. I det samme hjulspor kører traktorer og knallerter med 30 km/t, EU-knallerter med 45, lastbiler med 70 og resten med 80. Og så dem midt i mellem. God dansk tradition. Det er som i skolen; de langsomme bestemmer farten.
(Søren Molte)
----
Rengøring er at flytte Snavset.
(Ove Fahnøe 1975)
----
Rettelse: I min artikel om mælkepriser skal der stå "ko" i stedet for "hest" hele vejen igennem
(J.B Morton)
----
Se der! De ser! Han løber BORT fra menneskene - : Men de følger efter ham, fordi han løber forrest.
(Friedrich Nietzsche)
----
Sex mellem en mand og en kvinde kan være vidunderligt, hvis ellers man kan klemme sig ind mellem den rette mand og den rette kvinde.
(Woody Allen)
----
Slagen mand tænker.
(Sven Clausen)
----
Sluk for tv. Livet bliver ikke genudsendt. Læs avis i stedet!
(J.B. Holmgaard)
----
Så vi pløjer bare videre, som fluen sagde til oksen.
(Henry Wadsworth Longfellow)
----
Tal i vrede, og du kommer til at holde den bedste tale, du nogensinde har fortrudt.
(Winston Churchill)
----
Jeg tror mest på den videnskabelige teori, der siger at Saturns ringe består af mistet flybagage.
(Mark Russell)
----
Jeg tror på Kødets Lyst og Sjælens ubodelige Ensomhed.
(Hjalmar Söderberg 1906)
----
Jeg ved godt, at vi alle på længere sigt skriver i vand.
(Thorkild Hansen)
----
Jeg ved ikke hvem min bedstefar var, men jeg er frygtelig interesseret i at vide, hvad der skal blive af hans barnebarn.
(Abraham Lincoln)
----
Jeg vil fatte mig i korthed - og forblive dunkel.
(Horsts)
----
Jeg vil ikke gøre en særlig indsats for at gøre mig mere populær, eftersom jeg ikke vil søge genvalg. Jeg har andet at lave.
(Yeltsin, Boris)
----
Jeg vover næsten at påstå, at refleksionstilstanden er en unaturlig tilstand, og at dét menneske, der mediterer, er et desperat dyr.
(Jean-Jaques Rousseau)
----
Jo højere et podium, en dværg klatrer op på, desto klarere ser man, hvor lille han er.
(Gabriel Laub)
----
Jo mere en mand ved, og jo mere han rejser, desto mere tilbøjelig er han til at gifte sig med en landsbypige.
(Bernard Shaw)
----
Jo større en løgn, des flere mennesker hopper på den.
(Adolf Hitler 1928)
----
Kig engang på barnets ordforråd. Det er en stor misforståelse, at der er flere ord end idéer i denne verden, og at barnet taler mere, end det ved. Jeg tror det er een af grundene til, at folk på landet generelt har en mere retsindig sjæl end byfolk - fordi deres ordforråd er mindre udvidet. De har få idéer, men de er bedre til at sammenligne dem.
(Jean-Jaques Rousseau)
----
Kunsten at forhøre er ikke så let som man skulle tro. Det er i høj grad mestrenes og ikke disciplenes kunst; man må vide meget om tingene for at kunne spørge til det, man ikke ved.
(Jean-Jaques Rousseau)
----
Kunstens geværløb er skævt. Sigter man lidt ved siden af, har man en chance for at ramme plet.
(Thorkild Hansen)
----
Kvinden - hun har meget af Barnet, men intet af dets uskyld.
(Hamsun, 1908, "En vandrer")
----
Kvinden er et ufuldkomment og ondt dyr.
(Pave Innocens 8.s "heksehammeren" 1484)
----
Kvinden er kun seksuel. Manden er også seksuel.
(Otto Weiniger)
----
Kvinden er ubetinget det bedste, man har af den slags.
(Gustav Wied)
----
Kvinden føder, manden avler. Der er en forskel.
(Vilh. Andersen)
----
Kvinden var Guds anden fejl.
(Nietsche)
----
Kvinder er billeder, mænd er problemer; hvis du ønsker at vide, hvad en kvinde virkelig mener, så se på hende, hør ikke på hende.
(Oscar Wilde)
----
Kvinderne er de mest samvittighedsfulde betalere. De har altid betalt mig tilbage med renter og rentes rente.
(Peter Frankenfeld)
----
Kærlighed og had er ikke blinde, men blændede af den ild, de bærer med sig.
(Friedrich Nietzsche)
----
Lad os sige, at menneskeheden er som en flok, der er stuvet sammen i en bil, som kører ned ad bakke i en frygtelig fart, uden lys og med en fireårs dreng bag rattet. På skiltene langs vejen står: Fremskridt.
(Lord Dunsanny)
----
Lev farligt. Byg eders byer ved Vesuvs fod. Send eders skibe ud på de ukendte have. Lev i stadig krig.
(Nietzsche, 'Således talte Zarathustra')
----
Ligegyldighed eller had er kærlighedens smertelige bundfald.
(Herman Bang 1897)
----
Ligesom en kædes styrke er afhængig af dens svageste led, er den offentlige mening bestemt af, hvad den dummeste tænker.
(Johannes Hohlenberg)
----
Liv er intet, væren er alt.
(Gottfried Benn)
----
Livet er Krig mellem Trolde i Hjernen og Hjertets Hvælv.
(Hamsun, Mysterier 1898)
----
Lyt ikke til de andre og bliv kvalt: Man bør puste, hvis man har mel i munden.
(Søren Molte)
----
Lyt til fornuften, ellers vil den smertefuldt bringe sig i erindring.
(Engelsk ordsprog)
----
I grunden var min kone meget barnlig. Når jeg lå i mit badekar, kom hun ind og sænkede alle mine skibe.
(Woody Allen)
----
Ingen dør nu til dags af dræbende sandheder: der gives for mange modgifte.
(Friedrich Nietzsche)
----
Ingen var skyld i, at jeg ikke fra skole eller fra kursus fik en eksamen af en slags. Ingen, hverken mor eller far eller andre. Det var i den sene sidste nat, på sin vis en trøst. Jeg var, og har altid været, begavet nok til at gøre mine dumheder selv."
(Palle Lauring)
----
Ingenting er så foragteligt, som når man diskuterer med et menneske og gør alt for at overbevise ham - da pludselig mærker man, at man ikke har med hans forstand at gøre, men med hans vilje; han VIL ikke forstå.
(Schopenhauer)
----
Intet umenneskeligt skal være mig fremmed.
(Thorkild Hansen)
----
Intet vil blive gjort, hvis alle mulige indvendinger først skal gennemgås.
(Samuel Johnson)
----
Jeg citerer ofte mig selv. Det giver kraft i min konversation.
(George Bernard Shaw)
----
Jeg elsker mænd, som har en fremtid og kvinder, som har en fortid
(Oscar Wilde)
----
Jeg er beredt til at møde min skaber. Om han er beredt til at møde mig, er en anden ting.
(Winston Churchill)
----
Jeg er en utrolig venlig mand. Jeg har aldrig gjort en ulykke på hverken folk, fæ eller babyer medmindre det var nødvendigt.
(W.C. Fields)
----
Jeg er faktisk blevet så gammel, at jeg godt kan gå forbi en sovende hund, uden at jeg behøver at sparke til den. Det har også taget mig et halvt hundrede år at lære.
(Uffe Ellemann-Jensen 1996)
----
Jeg er ikke bange for stærke mennesker. Jeg er bange for svage mennesker.
(Piet Hein 1991)
----
Jeg er sådan en slags passiv sadist. Sådan en blød mand, der ikke tager opvasken.
(Povl Erik Carstensen)
----
Jeg er uenig i hvad du siger, men jeg vil indtil døden forsvare din ret til at sige det.
(Voltaire)
----
Jeg foragter folk, der holder hund. Det er krystere, der ikke selv tør bide folk.
(August Strindberg)
----
Jeg forudser systematisk alle tænkelige ulykker, indbrud, brand, hærværk, dødsfald, torskegilder og konfirmationstaler i det håb, at det kun er det uforudsete der indtræffer.
(Thorkild Hansen)
----
Jeg har indtrykket af, at de bedste dør og rosset bliver tilbage, - for resten er jeg heller ikke selv så rask, som jeg har været.
(Knud Hjortø)
----
Jeg har ofte hørt tale om frihed, men jeg har aldrig set andet end dens billede. Den som har et hjerte er aldrig fri.
(Alfred de Vigny)
----
Jeg har set kapitalismens slaver, og de lever ikke dårligt.
(Nikita S. Krustjov)
----
Jeg håber intet. Jeg frygter intet. Jeg er fri.
(Inskription på grækers gravsten)
----
Jeg kender ensomhedens tyngde, og gennem lange år har jeg søgt nogen, hvis hjerte kan finde vej til mig.
(Alfred Nobel)
----
Jeg kender kun een rejseform mere behagelig end hesteryg - det er til fods.
(Jean-Jaques Rousseau)
----
Jeg lytter altid til min gode veninde Kettys råd, for hun har begået den ene fejl efter den anden. Hendes erfaringer er uvurderlige.
(Grace Pally)
----
Jeg skal sige Dem: Hvis jeg havde skabt manden og kvinden, ville jeg have dannet dem efter en helt anden type end den nuværende, de højerestående pattedyr. Jeg ville have skabt mand og kvinde ikke i de højere abers lighed, men i lighed med insekterne, som efter at have været larver bliver forvandlet som sommerfugle og som på sin livsaften ikke har anden tanke end at elske og være skønne. Jeg ville have anbragt ungdommen som afslutning på menneskelivet. Visse insekter har i sin sidste forvandling vinger, men ingen mave. De genfødes kun i denne renere form for at leve i en time og dø.
(Anatole France)
----
Jeg så engang i Asien en stime blå rejer, umiskendeligt BLÅ rejer. Det var opmuntring nok for en hel dag.
(Dan Turrèll)
----
Jeg søger ikke, jeg finder.
(Pablo Picasso)
----
Erfaringen er en god lære mester, man han sender nogen afsindigt dyre regninger.
(Minna Antrim)
----
Erobre Verden? Det er for meget, jeg vil ikke. Lad Verden erobre MIG. Hvis den insisterer.
(Dan Turèll 1993)
----
Et pseudobehov: Hvis vi nu får dette, hvad er vi så nødt til at bruge det til?
(Ove Fahnøe 1975)
----
Et åbent sind er godt nok på sin måde, men det bør ikke være så åbent, at det ikke kan lukke noget ude eller inde. Det bør indimellem kunne smække døren til, ellers kommer der for megen gennemtræk.
(Samuel Butler)
----
Ethvert menneske er idiot fem minutter hver dag. Klogskab består i ikke at overskride denne grænse.
(Elbert Hubbard)
----
For hver gang du siger til en kvinde, at hun er smuk, hvisker djævlen hende det i øret ti gange.
(italiensk ordsprog)
----
Formel for min lykke: Et ja, et nej, en lige linie, et mål...
(Friedrich Nietzsche)
----
Forskellen på mademoiselle og madame er stadigvæk monsieur.
(Guido Baumann)
----
Fremtiden bliver uden mig
(Poul Borum 1996)
----
Før fægtede dansken med åben pande. Nu fægter han med sin fulde madskål og skriger på mere.
(Asger Aamund)
----
Gæt, hvis du kan, og vælg, hvis du tør.
(Pierre Corneille, Héraclius)
----
Hadet er modsat kærligheden en følelse, der aldrig kan drages i tvivl.
(Thorkild Hansen)
----
Han burde have levet i Urtiden, saa ville Fremskridtet i ham have faaet en varm Forkæmper.
(Hamsun om Strindberg 1907)
----
Han har altid haft den skæbne at skubbe et dårligt rygte foran sig.
(Jens Genefke 1995)
----
Hans uvidenhed er encyklopædisk.
(Abba Eban)
----
Harmoni med naturen? Hvilken rørende illusion. Som om naturen var lutter fred og ingen fare. Som om jordskælv og insektangreb, AIDS og influenza ikke var en del af naturen. Som om vores tilværelse og overlevelse - hele lægevidenskaben f.eks. ikke byggede på BEKÆMPELSE af naturen.
(Luc Ferry, Politiken 5/9 '93)
----
Huleboerens kone klagede over, at han ikke havde slæbt hende nogen steder hen for nylig.
(Laurence J. Peter)
----
Hvad jeg har lært, kan jeg ikke mere huske. Den smule, jeg endnu ved, har jeg gættet mig til.
(Nicolas Chamfort)
----
Hvis Gud bare ville give mig et rigtigt tegn. For eksempel åbne en konto til mig i Schweiz.
(Woody Allen)
----
Hvis det ikke lykkes første gang, så prøv igen, og så igen. Og stop så. Det er jo ingen grund til at optræde som en komplet idiot.
(W. C. Fields)
----
Hvis du ikke går til yderpunkterne, så skal du ikke gå nogen steder.
(Asger Jorn)
----
Hvis jeg var prins eller lovgiver, ville jeg ikke spilde min tid på at sige hvad man BURDE gøre. Jeg ville gøre det selv eller holde min mund.
(Jean-Jaques Rousseau)
----
Hvorfra stammer menneskets svaghed? Fra forskellen mellem hans kunnen og hans drømme. Det er vores drømme, som gør os svage, fordi man skal tilføje lidenskaberne mere energi, end vi har overskud til fra naturens hånd. Gør man drømmene mindre, er det som om man får mere kraft: Den mand, som kan mere end han drømmer har et overskud; han er uden tvivl et stærkt væsen.
(Jean-Jaques Rousseau)
----
Aber kan ikke synge, men de forsøger det altså heller ikke.
(Robert Lembke)
----
Al kunst rummer ekshibitionisme - men ekshibitionisme er ikke kunst.
(Arthur Kostler)
----
Alle stærke følelser, gode og dårlige, har en tendens til at forplante sig uønsket. Det ikke blot betyder noget, hvad der bliver gjort, men også hvorfor det bliver gjort.
(Bertrand Russell)
----
At leve er det sjældneste af alt i verden. De fleste mennesker eksisterer, ikke andet.
(Oscar Wilde)
----
At vi franskmænd betragtes som verdens bedste elskere beror på vores gode PR-folk: Kvinderne.
(Chevalier, Maurice)
----
At ønske sin kvindes lykke, er det ikke at have opnået den?
(Jean-Jaques Rousseau)
----
Blandt 1000 vilkårligt valgte Mennesker er der altid kun en enkelt Ener - Resten er Nuller.
(Ove Fahnøe 1970)
----
Brug ikke det udenlandske ord ideal. Vi har jo det gode norske ord løgn.
(Henrik Ibsen)
----
Da jeg blev kidnappet reagerede mine forældre lynhurtigt. De lejede mit værelse ud.
(Woody Allen)
----
De jager efter følelser, der passer ind i deres gloseforråd.
(Henri Davray om dårlige kunstnere)
----
Den ideelle kvindebluse består af 10 pct. silke og 90. pct. indhold.
(Peter Sellers)
----
Den selvoptagne skal man ikke dømme, før man ved, hvad han er optaget af.
(Frithiof Brandt)
----
Den, som giver op, når han er bagud, er fej. Den som giver op, når han fører, er en nar.
(Wade, William Arthur)
----
Den, som tror på menneskets frie vilje, har aldrig elsket og aldrig hadet.
(Marie Von Ebner-Eschenbach)
----
Desværre fastsætter loven ingen straf for kvinder, der forfører mænd.
(August Strindberg)
----
Det eneste man kan gøre med gode råd, er at give dem videre. Selv har man aldrig nytte af dem.
(Oscar Wilde)
----
Det er bedre at slides op end at ruste væk.
(Whitefield, George)
----
Det er ikke tornen der stikker dig, det er dig der stikker dig på tornen.
(afrikansk ordsprog)
----
Det er lettere at rette egne Fejl end andres. Navnlig fordi der ikke er så mange af dem.
(Ove Fahnøe 1975)
----
Det er utroligt så skadeligt det er for et godt hoved at beskæftige sig med noget dumt.
(Goethe)
----
Det kinesiske skrifttegn for lykken: en kvinde under et tag
(Thorkild Hansen)
----
Det lykkedes Gud at fange hans blik til sidst.
(George S. Kaufmann om en død tjener)
----
Det mest tåbelige tidsspilde, jeg kender, er diskussioner med yndige kvinder.
(David Niven)
----
Det var en kvinde, der drev mig til druk. Jeg har aldrig fået sagt ordentligt tak.
(W.C. Fields)
----
Det værste ved at være bøsse er al den helvedes discomusik man tvinges til at udholde.
(Quentin Crisp)
----
Det, som ikke nedbryder mig, gør mig stærkere.
(Friedrich Nietzsche)
----
Du skal sige røv, så griner folk. Så skal du give dem budskabet. Og når de så er lige ved at kede sig skal du sige røv igen. Så vil de elske dig.
(Poul Henningsen)
----
Du skal være aktuel, ramme problemerne på dags dato og klokkeslæt. Så siger samtiden, at du er tidløs.
(Thorkild Hansen)
----
Ejendom støtter, beskytter, bekræfter. Men den tynger, tager din frihed, vækker din frygt for at miste. Du ejer den ikke mere, den ejer dig.
(Thorkild Hansen)
----
En halv Abe er nok til at udvikle det fulde Menneske.
(Ove Fahnøe 1975)
----
En mand begynder at blive gammel, når han kigger på menukortet inden han kigger på servitricen.
(Ukendt)
----
Enhver Medalje har en Bagside. I Pressen er det altid den, der erobrer Forsiden.
(Ove Fahnøe 1970)
----
Er du ikke enig med mig, har du ikke lyttet godt nok.
(Markewich, Sam)
----
Hvis nogen fortæller dig, at han lægger alle kortene på bordet ... så tæl dem.
Du skal handle således, at dine handlinger kan danne mønster for et helt samfund.
----
Den dag, hvor du er i stand til, at fortælle om den sletteste sag i dit liv, er den allerede under for-vandling fra en hæslig episode til en værdifuld erfaring.
----
Mennesker skal flytte sig - vi er født med fysiske fødder og psykiske rødder og ikke omvendt.
----
At se uden at tolke, er at glo. At lytte uden at tolke er at føle uden at tænke.
----
Kun den der bliver ved med at søge trods alle fiaskoer bliver ved med at finde.
----
Om kærlighed: mislykkede forsøg er langt at foretrække for ingen forsøg for indimellem opstår den højeste lykke.
----
Selvværdet udvikles hos den der stoler på sin umiddelbarheds evne til at skelne mellem godt og ondt i de og det fremmede, som han møder.
----
Kun hvad der trænger ind til hjertet, kan gå ud fra hjertet.
----
Verden består som bekendt af to lande: indlandet og udlandet - hvoraf det første er langt det vigtigste, men for dets egen skyld, må det tage det sidste med i betragtning.
Piet Hein
----
Kun idioter kan undvære deres medmenneskers hjerne.
Piet Hein
----
Ukendskab er det bedste grundlag for had.
Piet Hein
----
Man må kunne tale om hver ting for sig og om tingene i sammenhæng.
Piet Hein
----
Man kan ikke blodigere udtrykke foragt for mennesker end ved ikke at vente noget af dem.
Piet Hein
----
Evnen til at udnytte egne evner, er så vigtig, at hvis bare man har den, behøver man ingen anden.
Piet Hein
----
Når 2 deler et ansvar, blir der højst 1% til hver.
Piet Hein
----
Det er lettere at kæmpe mod et dårligt ry end mod en dårlig samvittighed.
----
Pessimisterne er dog de reneste tåber - de tror på det modsatte af, hvad de håber. Nej, de optimi-ster, som livet beror på, er dem, som tør håbe på noget, de tror på.
Piet Hein
----
Nonchelance er evnen til at blive nede på jorden, når alt andet hænger oppe under loftet.
EARL WILSON
----
Uretfærdighed hist og her er den største trussel mod retfærdighed overalt.
MARTIN LUTHER KING.
----
Det er ikke nemt at tage problemerne eet ad gangen, når de samtidig nægter at stille op på en række.
ASHLEIGH BRILLIANT
----
En stor profet stræber aldrig efter at forklare dig sine visioner. Han inviterer dig i stedet til at stå ved siden af ham og opleve det selv.
ROBERT INMAN
----
Vær varsom med dine tanker. De kan blive til ord før du aner det.
IARA GASSEN
----
Kreativitet er evnen til at løse problemer, som ikke kan beskrives før de er løst.
PIET HEIN
----
Nøglen til et godt liv er, at gøre dét, som man vil, og derpå at elske dét, man gør.
----
Hvis du har for travlt med at værne om dig selv, så kan du ikke holde om andre.
----
Alt hvad der ikke dræber mig gør mig stærkere.
----
Bliv den du er
----
En mand som er ilde lidt, er altid at beklage.
Peter Freuchen
----
Den der ikke adlyder sig selv må adlyde andre.
----
Hvis man ikke er åben og vil lære det hele at kende, hvordan kan man så træffe et etisk valg om godt og ondt?
Michael Koium
----
Den der nyder, at se på kunst for at slippe for, at tænke på sit eget liv - forstår ikke, hvad kunst er.
----
Jo mindre selvtillid folk har, desto større behov har de for at få ret
----
Mest af alt holder jeg af hverdagen.
Dan Turell
----
Lykke og held er ikke en mangelvare - der er rigeligt til alle.
----
Misundelige mennesker, er mennesker, som har sat sig for lave mål
----
Det er kun 5% af det vi går og frygter, som bliver til virkelighed
----
Du får, hvad du FORVENTER - ikke hvad du fortjener
----
Det er beskæmmende, at vi lever i en tid, hvor det er lettere at sprænge et atom end en norm.
Einstein
----
Lad os være ved godt mod ved at huske på, at de problemer, der er sværest at bære, er dem, som aldrig kommer.
James R. Lowell
----
Det er altid for tidligt at bekymre sig og for sent at ærgre sig.
----
Livet er det dejligste eventyr.
H.C.Andersen
----
Vi ved, at godt nok er det bedstes fjende nr. 1
----
Information er svaret, men hvad er spørgsmålet?
James Halloran
----
Den information, vore ansatte er mest interesseret i, er den, de tror vi holder tilbage for dem.
----
Der er intet som smitter mere end et godt humør - bortset fra manglen på samme
----
Det eneste man bør gøre bag en andens ryg, er at klappe den.
----
Trivsel er et resultat af, hvordan vi behandler hinanden. Motivation er, hvordan vi bruger hinan-den.
----
Jeg kan godt lide invitationer. Men jeg hader ordrer!
----
Kære De, hvorfor prøver De ikke at høre og tænke over dét, som jeg prøver at fortælle Dem, i stedet for at bevise, hvor meget jeg ikke ved?
----
Jeg har tit undret mig over, hvorfor folk har så travlt med at besejre hinanden i stedet for at lære af hinanden.
----
Det er relationen mere end det sagte, som er forskellen mellem god og dårlig kommunikation.
----
Din samtalepartner har sjældent gavn af dine meninger og fortolkninger. Han gavnes mest af de sandheder, som han selv finder frem til.
----
Mennesker, som aldrig åbner for deres tanker, viser deres følelser eller siger deres uforbeholdne mening, er rent ud sagt dræbende kedsommelige.
----
Selv Vor Herre kan kun tale til et sultent menneske på brødets sprog
Mahatma Gandhi
----
Menneskets øjne afslører lige så meget som menneskets tale, men med den fordel, at øjets sprog er universelt, og ikke forudsætter brugen af en ordbog
Ralph Waldo Emerson
----
Hvis de omkring dig ikke vil lytte til dig, må du falde på knæ og bede om tilgivelse, for skylden er i sandhed din
Feodor Dostoyevski
----
Søg først at forstå. Derefter at blive forstået.
Anonym
----
Den eneste måde at gøre en person troværdig på er at tro på ham.
Henry L. Stimson
----
Alt som kan siges, kan siges klart.
Ludvig Wittgenstein
----
God kommunikation er lige så stimulerende som sort kaffe, og det er akkurat lige så svært at sove bagefter.
Anne Morrow Lindbergh
----
Management er at gøre tingene rigtigt; lederskab at finde de rigtige ting at gøre.
----
Den bedste chef er den, der har fornuft nok til at vælge gode medarbejdere til at gøre arbejdet, og selvbeherskelse nok til at lade være med at forstyrre dem, mens de gør det.
T. Roosevelt
----
Masserne vil følge en leder, som marcherer tyve skridt foran, men hvis han er tusind skridt foran dem, ser de ham ikke og følger ham ikke.
Georg Brandes
----
Man kan udmærket være eminent uden at være kompetent.
----
Menneskers tilfredshed påvirkes ikke så meget af det du siger og skriver, som af det du gør.
----
At tænke er vejen til succes, men at handle og gennemføre er ofte forskellen mellem succes og fiako.
----
Som leder skal du vide HVORFOR, men du skal også have en mening om HVORDAN
----
Kunsten er, at kunne se forskel på det, som skal ændres, det der bør ændres og det der ikke kan ændres.
----
Somme tider, når jeg tænker på, hvilke forunderlige konsekvenser små ting skaber..... bliver jeg fristet til at tænke, at der ikke findes små ting.
Bruce Barton
----
Forandring kræver tid, viljestyrke, disciplin, kræfter og vigtigst af alt en målsætning samt en overbevisning om, at alt er muligt.
John Evan-Jones
----
En leder, er en, der kan foretage en kritisk vurdering på basis af formodninger
Harry Maynard
----
Autoritet er evnen til at vinde de andres tilslutning.
Bertrand de Jouvenel
----
Fremskridtets kunst består i at sikre ro og orden i forandringen, og at sikre forandring i ro og orden
Alfred North Whitehead
----
At delegere på den rette måde, er et tegn på lederens tro på og tillid til sine medarbejdere
James F. Evered
----
Magt er evnen til at få folk til at gøre, som du vil, og styrken til at afslå at gøre noget, du ikke vil.
Harry Motor Jensen
----
Lederen er kun leder så længe, at han kan bevise, at han er den bedste og mestrer de bedste me-toder
Kenneth Walker
----
Når en tanke ikke kan udtrykkes på simpel vis, bør den afvises.
Marquis de Luc Vauvenargues
----
Visioner uden handling er blot en drøm.
Handling uden visioner får bare tiden til at gå.
Visioner sammen med handling kan ændre verden.
----
Livsklogskab har den, der accepterer, at livet er fuldt af modstridende følelser.
----
I grunden er enhver ulykke netop kun så tung, som man tager den.
Marie von Ebner-Eschenbach
----
Alder er som at bestige et bjerg. Man bliver nok lidt forpustet, men får en langt bedre udsigt.
Ingrid Bergman
----
Hvis sandheden står i vejen for dig, er du på forkert vej.
----
Livet - der findes intet mere sjældent i verden. De fleste mennesker eksisterer blot.
Oscar Wilde
----
Hvad jager vi dog efter? Er det lykken? Den har ingen endnu fanget ved kun at tænke på sig selv, den smutter fra os, hvis vi tror, vi kan gribe den uden at dele den med andre.
Magrethe II af Danmark
----
Det, at han er død, er ikke bevis på, at han har levet.
S.J.Lec
----
Menneskene har for stor respekt for døden målt på den ringe respekt, de har for livet.
Henry de Montherlant
----
Mange lever med en så forbløffende rutine, at det er vanskeligt at tro, at de lever for første gang.
S.J.Lec
----
Mange vil gerne lægge år til deres liv, men det er faktisk mere vigtigt at lægge liv til årerne.
----
Det, der ligger før os, og det, der ligger efter os, er for intet at regne mod det, der ligger inden i os
Oliver Wendell Holmes
----
De ting, som betyder mest, må aldrig være slaver af de ting, som betyder mindst.
Goethe
----
At standse op et øjeblik en gang imellem kan være den eneste mulighed for at overkomme at gå videre.
Olle Wedholm
----
Succes kommer til de mennesker, der ved, at den ikke kommer af sig selv og derfor går ud og henter den.
----
Lykkelig er det folk, hvis historie er kedsommelig at læse om.
Citat: Charles de Montesquieu
----
"Tidligt op og tidligt i seng - så er man sikker på aldrig at møde nogle interessante mennesker."
Oprindelse: Ukendt
----
"Sig aldrig nej af stolthed og aldrig ja af svaghed."
Oprindelse: Spansk ordsprog
----
Kreativitet er udmærket, men plagiat er hurtigere.
Citat: Ukendt
----
"Et nej er bedre end et falsk løfte."
Oprindelse: Tysk ordsprog
----
"Den danser godt for hvem lykken spiller."
Oprindelse: Engelsk ordsprog
----
"Det er et sølle gilde, hvor der ikke går noget i stykker," sagde konen. Hendes mand brækkede halsen."
Oprindelse: Jysk ordsprog
----
"En lille gave er bedre end et stort løfte."
Oprindelse: Fransk ordsprog
----
"Hvis en dame siger "nej" mener hun "måske"; siger hun "måske" mener hun "ja"; siger hun "ja" så er hun ingen dame."
Oprindelse: Ukendt
----
"Lidet siger den, der elsker meget."
Oprindelse: Italiensk ordsprog
----
"Gud havde ikke arme nok til at holde børn væk fra ulykker, så derfor opfandt han mødre."
Oprindelse: Alice, 11 år
----
"En ekspert er en person der har gjort alle de fejl der kan gøres, på et meget snævert område."
Oprindelse: Niels Bohr
----
"Gifte mænd lever ikke længere end ungkarle. Det føles bare sådan."
Oprindelse: Ukendt
----
"I et frugtbart land er der mange dagdrivere."
Oprindelse: Italiensk ordsprog
----
"Den der sår vind, han høster storm."
Oprindelse: Spansk ordsprog
----
"Du hersker over ordet indtil du har sagt det."
Oprindelse: Arabisk ordsprog
----
"Hjernen er et vidunderligt organ. Den begynder at fungere så snart man slår øjnene op om mor-genen, og den holder først op når man er kommet på arbejde."
Oprindelse: Robert Frost
----
"Jeg skriver en kvindes løfter i vand."
Oprindelse: Sofokles
----
"Et liv uden ven bliver en død uden et vidne."
Oprindelse: Spansk ordsprog
----
Alle mennesker dør, men ikke alle, der dør har levet.
Citat: Ukendt
----
"Drik dig fuld hvis du vil være lykkelig én dag. Gift dig hvis du vil være lykkelig to dage. Vil du være lykkelig en hel uge, så slagt et svin og spis det. Vil du være lykkelig resten af dit liv, så bliv gartner."
Oprindelse: Kinesisk ordsprog
----
"Det er lettest for en grim pige at føre et anstændigt liv."
Oprindelse: Marlene Dietrich
----
"At erhverve er held. At beholde er dyd."
Oprindelse: Indisk ordsprog
----
"Gift din søn bort som du vil; din datter som du kan."
Oprindelse: Kinesisk ordsprog
----
"Der findes to slags ulykker: Uheld som rammer os selv, og held som rammer andre."
Oprindelse: Ambrose Pierce
----
En gentleman hjælper en kvinde lige så korrekt i tøjet, som han ukorrekt har hjulpet hende af med det.
Citat: Peter Ustinov
----
"Evigt ejes kun det tabte."
Oprindelse: Marcel Proust
----
"Delt sorg er halv sorg, delt glæde er dobbelt glæde."
Oprindelse: Engelsk ordsprog
----
"Hvis dine bønner altid blev hørt, så havde du god grund til at tvivle på Guds visdom."
Oprindelse: Ukendt
----
En kvinde snorker ikke - hun spoler tilbage!
----
"Jeg er ikke ung nok til at vide alt."
Oprindelse: Oscar Wilde
----
"Mænd bygger huse, kvinder skaber hjem."
Oprindelse: Norsk ordsprog
----
"Intet er umuligt for den, som ikke behøver at gøre det selv."
Oprindelse: A. H. Weiler
----
"Har du gjort en velgerning, så skjul den; har du modtaget en velgerning, så udbred den."
Oprindelse: Arabisk ordsprog
----
"Pyjamassen er opfundet, fordi ord ingen vægt har i en natskjorte."
Oprindelse: Poul Henningsen
----
"Mens man før giftede sig, når man havde lært en kvinde at kende, så bliver man nu skilt fra hen-de, når det samme sker."
Oprindelse: John Barrymore
----
Først når man nøje ved, hvordan børnebørnene er faldet ud, kan man bedømme, om man har op-draget sine børn godt.
Citat: Erich Maria Remarque
----
"Stilen er tankernes klædedragt."
Oprindelse: Lord Chesterfield
----
"Spis dig halvmæt og drik dig halvfuld, og du lever et århundrede."
Oprindelse: Russisk ordsprog
----
Hvis kærlighed gør blind - Hvad skal man så med frækt undertøj?
----
"Om aftenen skal man rose den smukke dag. Den smukke kvinde skal roses om morgenen."
Oprindelse: Ukendt
----
"Samvittigheden har ingen tænder, men den gnaver alligevel."
Oprindelse: Russisk ordsprog
----
"Når klog kommer til klogere, må klog vige."
Oprindelse: Svensk ordsprog
----
"Når længslerne dør ud, begynder døden."
Oprindelse: Christian Houmark
----
"Når en kvinde ikke elsker, er hun lige så koldblodig som en gammel jurist."
Oprindelse: Honoré de Balzac
----
"Når en kvinde ler, ved hun noget. Når hun græder, vil hun noget."
Oprindelse: Svensk ordsprog
----
"Når forelskede par aldrig keder sig i hinandens selskab, skyldes det, at de altid taler om sig selv."
Oprindelse: La Rochefoucauld
----
Det er med kvinder som med biler: enten skal man skifte dem ud hvert andet år eller også skal man beslutte at køre dem helt ned.
Citat: Ukendt
----
"Mange kysser barnet for ammens skyld."
Oprindelse: Dansk ordsprog
----
"Mange mennesker forsømmer den lille lykke, fordi de forgæves venter på den store."
Oprindelse: Pearl S. Buck
----
"Med mandfolk og med kvindfolk jeg nåed lige vidt, kun et trøsted mig, det var akvavit."
Oprindelse: Holger Drachmann
----
"Midsommernatten er ikke lang, men den sætter mange vugger i gang."
Oprindelse: Svensk ordsprog
----
"Man skal hellere lade skrædderen tage mål af sig, end snedkeren."
Oprindelse: Gl. dansk ordsprog
----
"Man skal have en god karakter for at kunne glæde sig over en vens fremgang."
Oprindelse: Oscar Wilde
----
"Man kan ikke flygte fra sin skæbne, og man kan ikke dele den med andre."
Oprindelse: Oldnordisk ordsprog
----
En rigtig ven fortæller dig det, når du har spinat mellem tænderne.
Citat: Ukendt
----
"Man kan ikke give unge mennesker sandheder, men kun love at man aldrig vil lyve for dem."
Oprindelse: Albert Camus
----
"Man kan ikke nå til himlen uden stige."
Oprindelse: Belgisk ordsprog
----
"Man får ikke ondt i tungen af at tie."
Oprindelse: Russisk ordsprog
----
"Mænd er dog udtalt ulogiske; først beundrer de en kvindes ben, så anholder de om hendes hånd."
Oprindelse: Marlene Dietrich
----
"Mæt mand ypper ikke kiv."
Oprindelse: Jydsk ordsprog
----
"Lykke er det eneste man kan give, uden selv at eje det."
Oprindelse: Somerset Maugham
----
"Lykken består i at kende sine grænser - og elske dem."
Oprindelse: Romain Rolland
----
"Lykken synes at være skabt til at deles."
Oprindelse: Paul Bourget
----
Vælg hverken kone eller linned ved stearinlys.
Citat: Spansk ordsprog
----
"Ladhed opskræmmer intet vildt."
Oprindelse: Bibelcitat
----
"Længsel bærer et menneske den halve vej."
Oprindelse: Islandsk ordsprog
----
Vær smuk! Erobring ved første øjekast sparer tid og ulejlighed.
Citat: Mae West
----
Siden tobakken indførelse er den gennemsnitlige levealder fordoblet
Tage Voss
----
Kong Salomon var den klogeste mand i verden. Det var han uden tvivl, fordi han havde så man-ge koner til at rådgive sig."
Oprindelse: Jean Georges
----
"Knirken kommer altid fra det svageste og dårligste hjul."
Oprindelse: Peder Laale
----
"Intet er så vidunderligt som at møde den eneste kvinde i verden. Og det er lige vidunderligt hver gang!"
Oprindelse: John Barrymore
----
"Ideer skal have vinger - men de skal også have fødder, så de kan gå på jorden."
Oprindelse: Knud W. Jensen
----
Sagt om mål og rammestyring: Det er lettere at måle rammerne end at ramme målene.
Citat: Ukendt
----
Det bedste ved fremtiden er at den kommer en dag af gangen.
Citat: Abraham Lincoln
----
"Hvis man tager en kvinde på ordet og en ål ved halen, smutter de begge væk."
Oprindelse: Polsk ordsprog
----
"Hvor fornuften sparker troen ud, smutter overtroen ind ad bagdøren."
Oprindelse: Ingeborg Buhl
----
"Hvis en mand tit bliver skældt ud af sin kone, skal han ikke fortvivle. Det betyder jo kun, at hun endnu ikke har opgivet ham helt."
Oprindelse: Walther Winchell
----
"Hvad gavner det at have kister fulde, når fanden har nøglen."
Oprindelse: Peder Syv
----
"Himlen er høj, men den som vil derop, må bukke sig."
Oprindelse: Ukendt
----
"Hellere krøbling i himlen end hel og holden i helvede."
Oprindelse: Ukendt
----
"Hellere med dig i helvede end alene i himlen."
Oprindelse: Frisisk ordsprog
----
"Hellere være en levende mus, end en død løve."
Oprindelse: Uzbekisk ordsprog
----
"Hellere være storsnudet end slet ingen næse at have."
Oprindelse: Ukendt
----
"Himlen er den fattiges sparebøsse."
Oprindelse: Tysk ordsprog
----
Den der aldrig har gjort fejltrin, som er værd at skjule, har sjældent gjort fremskridt, som er værd at vise.
----
Kunne vi lære af andres fejltagelser, ville vi ikke behøve at gøre så mange selv.
----
Man siger tiden læger alle sår, men ikke dem man har tilføjet andre.
----
Vorherre har har sat grænser for for forstanden, men åbenbart ikke for dumheden.
(Voltàre)
----
Drømme er livets krydderi!
Citat: Troels Kløvedal
----
"Gift dig aldrig for pengenes skyld. Det er altid billigere at låne."
Oprindelse: Skotsk ordsprog
----
"Frierier og dårligt slædeføre skal man passe på, mens tid er."
Oprindelse: Kirgisisk ordsprog
----
"For at blive kureret for din længsel, skal du blot opnå, hvad du ønsker."
Oprindelse: Fransk ordsprog
----
Hvis arbejde er sundt, så giv det til de syge.
Citat: Jacob Haugaard
----
"Fattigdommen savner meget, gerrigheden alt."
Oprindelse: Italiensk ordsprog
----
"Faren er ikke, at computerne begynder at tænke som mennesker, men at menneskene begynder at tænke som computere."
Oprindelse: J. Harris
----
"En tåbelig ven er en større plage end en klog fjende."
Oprindelse: Tyrkisk ordsprog
----
"En ulykke kommer sjældent alene, sagde pigen. Hun fik tvillinger."
Oprindelse: Gl. dansk ordsprog
----
Opdragelse er de voksnes organiserede forsvar mod ungdommen.
Citat: Mark Twain
----
Det er svært at være socialist nu om stunder, nu da analfabeter kan læse, de fattige har penge og sultens slavehær kæmper mod overvægten.
Citat: Ukendt
----
Erfaring er evnen til at genkende en fejl anden gang man laver den.
Citat: Ukendt
----
Livet er som biler uden centrallås, man bliver nød til at låse op for sig selv før man kan låse op for andre!
Citat: kristian erland eskildsen
----
Han er mindre hæmmet af tankernes tyngde end af deres træge strøm.
Citat: Ukendt
----
Stor er den som véd, men større er den som véd hvor han skal spørge.
Citat: Piet Hein
----
Mange mennesker giver penge ud, de ikke har, til ting, som de ikke har brug for, for at imponere folk, som de ikke kan lide.
Citat: Ukendt
----
Mange mennesker forsømmer den lille lykke, fordi de venter forgæves på den store.
Citat: Dale Carniegie
----
I teorien skulle mænd og kvinder kunne forstå hinanden - og i teorien skulle man kunne fange ål med en lasso.
Citat: Ukendt
----
"En psykiater er en person, som tager sig rasende dyrt betalt for at spørge dig om noget, som din kone udfritter dig om helt gratis."
Oprindelse: Joey Adams
----
"En god dag begynder om morgenen."
Oprindelse: Ukendt
----
"Det gælder ikke om at finde en pige, som man har lyst til at gå i seng med. Det gælder i højere grad om at finde den, man har lyst til at stå op med."
Oprindelse: Jens Locher
----
"Det bedste sted at finde en hjælpende hånd, er yderst på din egen arm."
Oprindelse: Amerikansk ordsprog
----
"Den perfekte mand er blevet godt opdraget af sin mor. Men det er hans svigermor, der fuldender hans opdragelse."
Oprindelse: Life
----
"Den jomfru som rødmer, ved allerede for meget."
Oprindelse: Rousseau
----
"Den der ikke kan tåle gode dage, han skal blot gifte sig."
Oprindelse: Peder Syv
----
"Den der klæder sig på fransk, må finde sig i at fryse på dansk."
Oprindelse: Jydsk ordsprog
----
"Den der spiser kirsebær med de store, får stenene i øjnene."
Oprindelse: Ukendt
----
"Den der træder blidt, når vidt."
Oprindelse: Kinesisk ordsprog
----
"Den dovne forlader ugerne den varme seng."
Oprindelse: Islandsk ordsprog
----
"Den erfarne har mange ar."
Oprindelse: Canadisk ordsprog
----
"Den fattige kureres af arbejde, den rige af lægen."
Oprindelse: Polsk ordsprog
----
"Den gamle tror alt; den midaldrende tvivler på alt; den unge ved alt."
Oprindelse: Oscar Wilde
----
"Den gerrige, som stadig graver sin skat dybere ned, baner sig vej mod helvede."
Oprindelse: Indisk ordsprog
----
"Den hidsige får lov at leve, som han vil; den eftertænksomme holder man øje med."
Oprindelse: Arabisk ordsprog
----
"Dovenskaben bevæger sig så langsomt, at fattigdommen snart træder den i hælene."
Oprindelse: Engelsk ordsprog
----
"Drik dit øl før det dovner, tag din kærest i favn før hun sovner."
Oprindelse: Peder Syv
----
"Elsk, som om du skulle dø i dag!"
Oprindelse: Seneca
----
"Elskeren kan blive kølig, mænd kan komme til at hade deres hustruer - kun forældres kærlighed kan vare hele livet."
Oprindelse: Browning
----
"Det er let at gøre sig lystig over lægekunsten så længe man selv er rask."
Oprindelse: Molière
----
"Da Gud havde skabt Adam tog han sig en hviledag. Men efter han skabte Eva, er der ingen der har fået et roligt øjeblik."
Oprindelse: Ukendt
----
"Kærlighedens tunge er øjnene."
Oprindelse: Phineas Fletcher
----
"Le, og hele verden ler med dig. Græd, og du græder alene."
Oprindelse: Ella Wheeler Wilcox
----
"Hellere en nabo ved hånden end en broder i det fjerne."
Oprindelse: Ukendt
----
"Høflighed er den mest acceptable form for hykleri."
Oprindelse: Ambrose Bierce
----
"Lykke består af ulykker som undgåes."
Oprindelse: Alphonse Karr
----
"Lykke er at have et godt helbred og en dårlig hukommelse."
Oprindelse: Ingrid Bergman
----
"Lykke er at gøre det man vil, og ville det man gør."
Oprindelse: Francoise Giroud
----
"Politiet er en trussel mod den frie verden."
Oprindelse: W. C. Fields
----
"Jeg elsker menneskeheden. Det er enkeltpersonerne jeg ikke kan holde ud."
Oprindelse: Groucho Marx
----
"Lykkelige mennesker tæller ikke flygtige minutter."
Oprindelse: Kinesisk ordsprog
----
"Dovenskab er blot en vane med at hvile sig, før man risikerer at blive træt."
Oprindelse: Jules Renard
----
"Elsk din nabo, men riv ikke gærdet imellem jer ned."
Oprindelse: Ukendt
----
"Gift dig aldrig med en enke, medmindre hendes første mand blev hængt."
Oprindelse: Kinesisk ordsprog
----
Når du ejer en ting, ejer den også dig.
Citat: Ukendt
----
"Manden med arret har ikke glemt såret."
Oprindelse: Afrikansk ordsprog
----
"Mode er for kvinder uden smag, etikette for mennesker uden opdragelse."
Oprindelse: Maria
----
Takt er at få folk til at føle sig hjemme, når man ønskede at de var det.
Citat: Ukendt
----
"Danmark er verdens bedste land, hvor få har for meget og færre format."
Oprindelse: Paul Hammerich
----
Tal i vrede, og du kommer til at holde den bedste tale, du nogenside har fortrudt.
Citat: Winston Churchill
----
"Skønhed uden dyd er som en rose uden duft."
Oprindelse: Dansk ordsprog
----
"At være ægtemand er fast arbejde. Det er derfor så mange ægtemænd begår fejl. De giver ikke arbejdet deres fulde opmærksomhed."
Oprindelse: Arnold Bennett
----
"Den mand som hviler på sine laurbær, har anbragt dem det gale sted."
Oprindelse: Amerikansk ordsprog
----
"Tålmodighed er blot en slags let fortvivlelse forklædt som dyd."
Oprindelse: Ambrose Bierce
----
Tur - retur.
At bryde af og rejse bort kan være svært og falde hårdt, men det er livets krav til dem som holder af at komme hjem.
Citat: Piet Hein
----
"Drik ikke vandet! Fiskene boller i det!"
Oprindelse: W. C. Fields
----
"Jeg holder mig fra helsekost. Derimod har jeg, i min alder, brug for alle de konserveringsmidler som jeg kan få."
Oprindelse: George Burns
----
"Den som kun vil se sin egen fordel ser for lidt."
Oprindelse: Tao-Te-King
----
"Et sundt seksualliv er det bedste middel mod sportens fristelser."
Oprindelse: Ukendt
----
"Vær blot lykkelig. Hvis du er ulykkelig har du nemlig ingen venner."
Oprindelse: Euripides
----
"Ægteskabet har mange sorger, cølibat ingen glæder."
Oprindelse: Dr. Samuel Johnson
----
"I jalousi er der mere egoisme end der er kærlighed."
Oprindelse: La Rochefoucauld
----
"At leve er som at kunne kunsten at tegne uden at bruge viskelæder."
Oprindelse: Chicago Tribune
----
"Velopdragenhed består i at skjule hvor lidt vi tænker på andre."
Oprindelse: Mark Twain
----
"Bestræb dig på at leve sådan, at selv bedemanden vil sørge, når du dør."
Oprindelse: Mark Twain
----
"Takt er evnen til at kunne pege på det ubehagelige uden selv at blive ubehagelig."
Oprindelse: Tysk ordsprog
----
"Folk der går til psykiatere burde have deres hoved undersøgt."
Oprindelse: Samuel Goldwyn
----
"En improviseret tale kræver megen forberedelse."
Oprindelse: Churchill
----
"Kvinder vil aldrig blive så succesrige som mænd, af den simple årsag at de ikke har koner til at rådgive sig."
Oprindelse: Dick Van Dyke
----
"Danmark er uegnet til helårsbeboelse."
Oprindelse: Claus Hermansen
----
"Hvis solen altid skinnede ville alt blive en ørken."
Oprindelse: Arabisk ordsprog
----
"Ved siden af de ti bud har man glemt et elvte, der ikke burde være mindre vigtigt end de andre: Du må ikke kede din næste!"
Oprindelse: Isaac Bashevis Singer
----
"Kunst er at huske en kvindes fødselsdag, men aldrig hendes alder."
Oprindelse: Ukendt
----
"En ungkarl er en mand der skal en ny vej til arbejde hver morgen."
Oprindelse: Ukendt
----
"Hadet og kærligheden sover begge så let, at den svageste stemme kan vække dem."
Oprindelse: Lawater
----
"Jeg afskyr folk der holder hunde. De er kujoner der ikke har mod nok til selv at bide."
Oprindelse: August Strindberg
----
"Med den sande kærlighed er det som spøgelser; alle taler om den, men få har set den."
Oprindelse: La Rochefoucauld
----
"Jo mere du giver, jo større bliver du."
Oprindelse: Saint-Exupéry
----
"Arbejdet er den drikkende klasses forbandelse."
Oprindelse: Oscar Wilde
----
Den nemmeste måde at skaffe sig en lille formue på er at starte med en stor.
Citat: Ukendt
----
Det er kunstnerens forpligtelse at være en outsider. Man kan kun lede masserne udefra.
Citat: Edward Albee
----
En komiker er en, der gør morsomme ting. En stor komiker er en, der gør ting morsomme.
Citat: Buster Keaton
----
"At dissekere humor er som at dissekere en frø. Kun få er interesseret, og den stakkels frø dør af det."
Oprindelse: E. B. White
----
"Utilfredshed er det første skridt mod fremgang."
Oprindelse: Oscar Wilde
----
"Den som tager sorgerne på forskud, lider under dem to gange."
Oprindelse: B. Porteus
----
"Kunst er det man ikke kan. Hvis man kunne, var det jo ingen kunst."
Oprindelse: Robert Storm Petersen
----
"Kærlighedens dødeligste fjende er vanen."
Oprindelse: Edvard George Lytton
----
"Ingen kan tænke klart med knyttede næver."
Oprindelse: George Jean Nathan
----
Den er menneskeligt at fejle, totalt sammenbrud kræver en computer!
----
"Man behøver ikke at opfatte sig selv som idealist, blot fordi man ikke har succes i livet."
Oprindelse: Henry Miller
----
"Kærlighedens første suk er visdommens sidste."
Oprindelse: Antoine Bret
----
"Erfaring - det er navnet som mænd har givet deres fejltrin."
Oprindelse: Oscar Wilde
----
"Lediggang er roden til et sandt guddommeligt liv."
Oprindelse: Søren Kierkegaard
----
"Alle de gode leveregler er skrevet ned; nu mangler vi blot at leve efter dem."
Oprindelse: Blaise Pascal
----
"Det du ikke kan hoppe over, det må du krybe under."
Oprindelse: Tjekkisk ordsprog
----
"Alting i verden efterstræbes med større lyst end det nydes."
Oprindelse: Shakespeare
----
"Hvad der er samlet med omhu vil bevares med visdom."
Oprindelse: Ukendt
----
"Vær stille eller sig noget, som er bedre end stilhed."
Oprindelse: Pytagoras
----
"Man må begrænse sig, det er betingelsen for al nydelse."
Oprindelse: Søren Kierkegaard
----
Blandt mennesker er der langt flere kopier end originaler.
Citat: Pablo Picasso
----
"Den bedste metoder til at få succes i livet er at gå på tæer. Andres tæer selvfølgelig!"
Oprindelse: John Churton Collins
----
"Smiger drikker vi i store slurke, men sandheden kun dråbevis."
Oprindelse: Rousseau
----
"En kvindes skønhed skal bedømmes som en kirkerude - indefra!"
Oprindelse: Ukendt
----
"Den er fri som gør ikke hvad han vil, men hvad han bør."
Oprindelse: Dansk ordsprog
----
"Når en far berømmer sin søn, lovpriser han sig selv."
Oprindelse: Kinesisk ordsprog
----
"Der findes mennesker som kender til alt og intet ved."
Oprindelse: Kant
----
"Intet skærper appetitten som kun lidt på fadet."
Oprindelse: Svensk ordsprog
----
"Du kan mislykkes flere gange, men du er ikke selv mislykket før du skyder skylden på de andre."
Oprindelse: Olaus Petri
----
"Kærligheden regerer uden sværd, binder uden lænker."
Oprindelse: Ordsprog
----
"Und ikke noget menneske den glæde at han kan få dig til at hade."
Oprindelse: Monrad
----
"Det er ikke faderens vrede sønnen frygter, men hans tavshed."
Oprindelse: Kinesisk ordsprog
----
"Intet afslører et menneskes karakter som den spøg, han tager ilde op."
Oprindelse: Ukendt
----
"Den største hindring for at have det godt med andre er at have det skidt med sig selv."
Oprindelse: Balzac
----
"Med en god kone bliver du lykkelig, med en dårlig bliver du filosof."
Oprindelse: Sokrates
----
"I kærlighed kan man kun sejre ved overgivelse."
Oprindelse: Napoleon
----
"En rådgiver er en som ikke kan få sig et ordentligt job."
Oprindelse: Henry W. Platt
----
"Det er meget lettere at være kritisk end at være fejlfri.
"Oprindelse: Disraeli
----
"Det eneste man behøver her i livet er dumhed og troen på sig selv, så er succesen hjemme."
Oprindelse: Mark Twain
----
"Den sande kærlighed begynder der hvor der ikke ventes gengæld."
Oprindelse: Saint-Exupéry
----
"Tavshed er et af de vanskeligste argumenter at gendrive."
Oprindelse: Josh Billings
----
"At kunne lytte er en af de vigtigste egenskaber i en samtale."
Oprindelse: La Rochefoucauld
----
"Vor lykke her i livet er en mosaik af lutter smådele."
Oprindelse: Samuel Coleridge
----
"Taknemlighed er en sjælden blomst."
Oprindelse: Ukendt
----
"Man har ikke omvendt en mand, fordi man har bragt ham til tavshed."
Oprindelse: Dansk ordsprog
----
"Den som vil leve i skyggen af en stor mand, må vænne sig til et køligt klima."
Oprindelse: Japansk ordsprog
----
It's better to close your mouth, and look like a fool; than to open it, and remove all doubt.
Citat: Ukendt
----
Komedie: tragedie betragtet i fugleperspektiv.
Citat: Elbert Hubbard
----
"Under sød tale ligger ofte falskhed i dvale."
Oprindelse: Dansk ordsprog
----
"Brug altid blide ord men stærke argumenter."
Oprindelse: H. G. Bohn
----
"At forstå andre er at være klog. At forstå sig selv er at være viis."
Oprindelse: Kinesisk ordsprog
----
"Når man tager barnet ved hånden, tager man moderen ved hjertet."
Oprindelse: Dansk ordsprog
----
"Beskedenhed er en dyd, men man kommer længere uden."
Oprindelse: Tysk ordsprog
----
"Hvis man ikke vil tabe ansigt er det bedst at man altid holder nederste del af det lukket."
Oprindelse: Ukendt
----
"Den som taler meget, oplever kun lidt."
Oprindelse: Armensk ordsprog
----
"Hvis vi ikke stræber efter at blive bedre, hører vi op med at være gode."
Oprindelse: Oliver Cromwell
----
"En jomfru der ler, er halvt erobret."
Oprindelse: Italiensk ordsprog
----
"En succesrig mand skal beherske tre ting: Han skal kunne uddelegere alt ansvaret, frasige sig alle fiaskoerne og tage hele æren."
Oprindelse: Ukendt
----
"Som modvægt mod sorger har Himlen skænket os håbet, søvnen og latteren."
Oprindelse: Kant
----
"Hellere rig og rask end syg og fattig"
Oprindelse: Jørgen Lademann
----
"Manden har besejret alle naturens værste vanskeligheder - undtagen kvinden."
Oprindelse: Sinclair Lewis
----
"Det er bedre at tænde blot et lille lys end at forbande mørket."
Oprindelse: Kungfutse
----
Humorens dybeste funktion er at lade latteren komme gråden i forkøbet.
Citat: Frithiof Brandt
----
"Der er ingen stor begavelse uden en tilsætning af galskab."
Oprindelse: Latinsk ordsprog
----
"Mod består ikke i at vove uden frygt, men at gå beslutsomt frem i en retfærdig sag."
Oprindelse: Plutarch
----
"Hør én mand, før du svarer - hør flere før du dømmer."
Oprindelse: Dansk ordsprog
----
"Succes giver venner, modgang prøver dem."
Oprindelse: Publius Syrus
----
"Den som går i de stores fodspor, begynder snart at halte."
Oprindelse: Tyrkisk ordsprog
----
"Den ved kun lidt om kærlighed som altid taler om den."
Oprindelse: Italiensk ordsprog
----
"Den ged der bræger mest giver mindst mælk."
Oprindelse: Polsk ordsprog
----
"Penge gør ikke lykkelig - men de beroliger."
Oprindelse: Amerikansk ordsprog
----
"Der findes mange stier til bjergets top, men udsigten deroppefra vil altid være den samme."
Oprindelse: Kinesisk ordsprog
----
"Beundring er noget man udtrykker over for andre, når de ligner en selv."
Oprindelse: Ambrose Bierce
----
"Lægekunst er at holde patienten beskæftiget, mens naturen kurerer sygdommen."
Oprindelse: Voltaire
----
"I en elskers øjne er hvert ar et smilehul."
Oprindelse: Japansk ordsprog
----
"Kærlighed er en form for seksuel fantasi som man ikke helt kan se bort fra."
Oprindelse: Beatrice Schumann
----
"Hellere være sund bonde end syg kejser."
Oprindelse: Tysk ordsprog
----
"Man holder bedst sit ord ved aldrig at give det."
Oprindelse: Napoleon Bonaparte
----
"Den som flygter for ulven møder bjørnen."
Oprindelse: Tysk ordsprog
----
"Værdighed er det eneste som ikke kan bevares i alkohol."
Oprindelse: Amerikansk ordsprog
----
"En god lytter sidder gerne og tænker på noget helt andet."
Oprindelse: Amerikansk ordsprog
----
"Et gram sund fornuft er bedre end et kilo lærdom."
Oprindelse: Svensk ordsprog
----
"Fra succes til fiasko er der et lille skridt, fra fiasko til succes er der lang vej at gå."
Oprindelse: Jødisk ordspro
----
"Hvad folk kalder skæbne er som regel deres egne dumheder."
Oprindelse: Schopenhauer
----
"Hvad kærligheden er ved ingen; hvad den formår ved nogen - men hvilke ulykker den anretter det ved vi allesammen."
Oprindelse: Frejlif Olsen
----
"Invester aldrig i noget der kan spise eller skal repareres."
Oprindelse: Billy Rose
----
"Hvis du altid siger sandheden har du ikke behov for at gå og huske noget som helst."
Oprindelse: Mark Twain
----
"Man kan ikke nyde lediggang hvis der ikke ligger en masse arbejde der skal gøres."
Oprindelse: Jerome K. Jerome
----
"De eneste normale mennesker er dem man ikke kender særlig godt."
Oprindelse: Joe Ancis
----
"Den mand der dør ugift, har i virkeligheden aldrig levet. For hvad er livet uden lidelse?"
Oprindelse: Frejlif Olsen
----
"Sorgen over en ægtemand er ligesom smerten i en albue: Pinefuld og kort."
Oprindelse: Tysk ordsprog
----
"Hvor kærligheden kigger ind gennem vinduet, kryber elendigheden ud gennem døren."
Oprindelse: Polsk ordsprog
----
"Gift dig aldrig med en kvinde, før du har set hvordan hun ser ud når hun er rigtigt godt forkølet."
Oprindelse: Weygandt
----
Det er kun sportsmænd og idioter, der ikke springer over, hvor gærdet er lavest.
Citat: Jesper Klein
----
"Pengene findes altid, men lommerne veksler."
Oprindelse: Gertrude Stein
----
"Kærlighed uden gengældelse er som et spørgsmål uden svar."
Oprindelse: Tysk ordsprog
----
"Den bedste måde at fordoble sine penge på er ved at folde dem sammen og stikke dem i lommen."
Oprindelse: Kin Hubbard
----
"Kærlighed og mæslinger er farligere jo ældre patienten er."
Oprindelse: Byron
----
"Kvinder tilgiver de mænd der elsker dem, og mænd elsker de kvinder der tilgiver dem."
Oprindelse: Judge
----
Du kan ikke hjælpe de fattige ved at udrydde de rige.
Citat: Abraham Lincoln
----
"Jeg har sikkert mine fejl, men at tage fejl er ikke en af dem."
Oprindelse: Jimmy Hoffa
----
"Hvis mænd sagde det til deres egne koner, som de siger til andre kvinder, ville der være færre ulykkelige ægteskaber."
Oprindelse: George Kaufman
----
"Der er kun to slags kvinder i verden. Kvinder der altid taler, og kvinder der aldrig kan tie stille."
Oprindelse: Oscar Wilde
----
"Snak og tak gør ingen mand rig."
Oprindelse: Jysk ordsprog
----
"Mennesket er den eneste fejltagelse som naturen har begået."
Oprindelse: Voltaire
----
"Jeg respekterer andres tro, men det er tvivlen der driver mig videre i livet."
Oprindelse: Wilson Mizner
----
"Når man er så fantastisk som jeg er det vanskeligt at bevare ydmygheden."
Oprindelse: Muhammad Ali
----
"Du ville blive forbavset, hvis jeg fortalte dig hvor meget det koster at se så billig ud."
Oprindelse: Dolly Parton
----
"Man kan ikke både skide og slå på tromme på samme tid."
Oprindelse: Ukendt
----
"Skønt såret heles bliver arret tilbage."
Oprindelse: Engelsk ordsprog
----
"Når en ged trækker sig tilbage er det for at tage tilløb til at stange."
Oprindelse: Indisk ordsprog
----
"Den der ikke bliver snakket om er der ikke meget ved."
Oprindelse: Sjællandsk ordsprog
----
"En håndfuld rækker langt, hvis den gives som gave i kærlighed."
Oprindelse: Indisk ordsprog
----
"En mand vil aldrig kritisere din stemme hvis du synger hans pris."
Oprindelse: Judge
----
"Al for megen omsorg for helbredet er ødelæggende for evnen til at opleve tilværelsen."
Oprindelse: Platon
----
"Har man taget fanden med i båden må man også ro ham i land."
Oprindelse: Svensk ordsprog
----
"Dyden i midten," sagde Fanden. Han satte sig mellem to advokater."
Oprindelse: Ukendt
----
"Ofte kommer sur svie efter sød kløe."
Oprindelse: Peder Laale
----
"Svig må forklæde sig, men sandheden går altid nøgen."
Oprindelse: Skotsk ordsprog
----
"Den første forudsætning for trivsel på arbejdspladsen er chefens fravær."
Oprindelse: Svensk
----
"Den, som ikke ærer det små, er ikke det store værdigt."
Oprindelse: Indisk ordpsrog
----
"At komme i rette tid er godt. At gå i rette tid er bedre."
Oprindelse: Ukendt
----
"Kærlighed er den eneste sygdom, der får en til at føle sig bedre."
Oprindelse: Sam Shephard
----
"I efteråret fór en rasende orkan gennem landet og forårsagede forbedringer for millioner af kroner."
Oprindelse: Ukendt
----
"Min hjerne er mit favoritorgan nummer to."
Oprindelse: Woody Allen
----
"Af alle seksuelle varianter er kyskhed nok den mest ejendommelige."
Oprindelse: Remy de Gourmont
----
"Man skal ikke kaste med sko, når man selv er en sut."
Oprindelse: Ukendt
----
"Man lærer kun lidt af sejren, men meget af nederlaget."
Oprindelse: Japansk ordsprog
----
"Når solen står op, vender min moral tilbage."
Oprindelse: Elayne Boosler
----
"Fiasko er det krydderi, som giver succesen smag."
Oprindelse: Truman Capote
----
"Dovenskab er ikke andet end en vane med at hvile sig, før man bliver træt."
Oprindelse: Jules Renard
----
"Kvinder der vil være jævnbyrdige med mænd, mangler ambitioner i tilværelsen."
Oprindelse: Ukendt
----
God dømmekraft kommer fra erfaringer. Desværre kommer erfaringer som regel fra dårlig dømmekraft.
Citat: Ukendt
----
"Det jævner sig, sagde manden. Han havde skidt i bukserne og skulle ride hjem."
Oprindelse: Ukendt
----
"Efter min mening er sex det smukkeste, mest naturlige og sundeste man kan købe for penge."
Oprindelse: Steve Martin
----
"Giv en mand frie hænder, og de er straks overalt på dig."
Oprindelse: Mae West
----
"Kun den, der går sine egne veje, kan aldrig blive indhentet af nogen."
Oprindelse: Marlon Brando
----
"Ensomhed er mere fornøjelig, hvis man har nogen at dele den med."
Oprindelse: Ukendt
----
"Der er intet galt i at arbejde, bare det ikke optager for meget af ens fritid."
Oprindelse: Ukendt
----
Så længe man ved, hvor meget man har, er man endnu ikke rig.
Citat: Paul Getty
----
Ungkarle lever efter mottoet: heller to ringe under øjnene end en på fingeren.
Citat: Mario Adorf
----
"Et magert forlig er bedre end en fed proces."
Oprindelse: Ukendt
----
"Jeg ved, hvordan Nixon havde det med Vietnam. Jeg har selv engang prøvet at komme ud af en bogklub."
Oprindelse: Ukendt
----
"En mand med succes er en, der tjener flere penge, end hans hustru kan bruge."
Oprindelse: Ukendt
----
"En kvinde med succes er en, der kan finde sådan en mand."
Oprindelse: Ukendt
----
"Skriv fornærmelser i sand, men velgerninger i sten."
Oprindelse: Arabisk ordsprog
----
"En kvinde får altid det sidste ord i en diskussion. Alt, hvad en mand siger efter det, er begyndelsen til en ny diskussion."
Oprindelse: Ukendt
----
"En arkæolog er et menneske, hvis hele tilværelse ligger i ruiner."
Oprindelse: Ukendt
----
"Dem, der ved, hvad der skal til, gør det. Dem, der vidste det engang, men ikke ved det mere, bliver konsulenter."
Oprindelse: Ukendt
----
Det gælder ikke om at gøre tingene rigtigt, men at gøre de rigtige ting!
Citat: JBK-mix
----
"Sparekassebogen er et monument over den morskab, man ikke har haft."
Oprindelse: Svensk ordsprog
----
"En kvinde der søger en ægtemand, er det mest samvittighedsløse rovdyr."
Oprindelse: G. B. Shaw
----
"Et gram (kvint) sund fornuft er bedre end et kilo (centner) lærdom."
Oprindelse: Svensk ordsprog
----
"Mode er en form for smagløshed, der er så ulidelig at den må ændres hver sjette måned."
Oprindelse: Oscar Wilde
----
Er man et nul, hvis man kommer før nummer 1?
Citat: Ukendt
----
"Det er bedre at have elsket og tabt, end aldrig at have tabt."
Oprindelse: Samuel Butler
----
"Kærlighed er det der kan ske for mænd og kvinder som ikke kender hinanden."
Oprindelse: W. Somerset Maugham
----
"Man kan være helt sikker på, at man er gammel, når lysene koster mere end lagkagen."
Oprindelse: Ukendt
----
"To bønder påstår begge at de ejer den samme ko. Mens den ene trækker i dens hoved og den anden i dens hale, bliver koen malket af en advokat."
Oprindelse: Jødisk ordsprog
----
"Ingen glemmer nogensinde hvor han begravede stridsøksen."
Oprindelse: Kin Hubbard
----
"Tag dig i agt for en mand der aldrig drikker."
Oprindelse: Græsk ordsprog
----
"Kærligheden er en kat der river, selv om man kun havde tænkt sig at lege med den."
Oprindelse: Ninon de Lenclos
----
"Alle rovfugle er tavse."
Oprindelse: Amerikansk ordsprog
----
"Havebrug er racisme anvendt over for Guds natur i dagligdagen."
Oprindelse: Ukendt
----
"Jeg har aldrig drukket mig fuld, men ofte fået serveret for meget."
Oprindelse: George Gobel
----
"Underholdsbidrag er som at købe havre til en død hest."
Oprindelse: Arthur Baer
----
"Et hjem er et sted, hvor der alle vegne er udsigt til noget, der trænger til at blive gjort."
Oprindelse: Ukendt
----
"Mangt et ægteskab er en dødsdom, som eksekveres i årevis."
Oprindelse: August Strindberg
----
"Venner kan komme og gå, men fjender hober sig op."
Oprindelse: Thomas Jones
----
"Vær forsigtig med bøger om helsekost. Du kunne komme til at dø af en trykfejl."
Oprindelse: Mark Twain
----
"Hum dig lige. Du står i min aura!"
Oprindelse: Ukendt
----
"Fjernsynet har bevist at folk hellere vil se på alt andet end hinanden."
Oprindelse: Ann Landers
----
"Diplomati er kunsten at sige 'sød lille hund' indtil du kan finde en sten."
Oprindelse: Will Rogers
----
"Idealisme er det der går forud for erfaring; kynisme er det der følger efter."
Oprindelse: David T. Wolf
----
"Gamle mennesker bør ikke spise helsekost. De har brug for alle de konserveringsmidler de kan få."
Oprindelse: Robert Orben
----
"Alt hvad der er for dumt til at blive sagt, bliver sunget."
Oprindelse: Voltaire
----
"De der er for kloge til at engagere sig i politik, bliver straffet ved at blive regeret af dem der er mindre kloge."
Oprindelse: Platon
----
"Den bedste kur mod hypokondri er at holde op med at interessere sig for sin egen krop, og i stedet interessere sig for en andens."
Oprindelse: Goodman Ace
----
Jeg omfavner min rival, men det er for at kværke ham.
Citat: (Jean Racine, Britannicus)
----
"Da jeg havde læst om drikkeriets forbandelse, lagde jeg læsning på hylden."
Oprindelse: Henny Youngman
----
Man kan tæmme vildt dyr men ej ond kvinde
Citat: Peder Laale
----
"Hold op med at bekymre dig om dit helbred. Det forsvinder helt af sig selv."
Oprindelse: Robert Orben
----
"Stof til eftertanke: Titanic blev bygget på et skibsværft af uddannede håndværkere. Noahs ark på en bjergside af en flok amatører."
Oprindelse: Ukendt
----
"Tilgiv dine fjender, men glem aldrig deres navne."
Oprindelse: John F. Kennedy
----
"At bede er at spørge om universets love kan tilsidesættes til fordel for en enkelt troende i al hans lidenhed."
Oprindelse: Ambrose Bierce
----
Med kritik følger ansvar.
Citat: Ukendt
----
"Noget af det sværeste at acceptere er et godt eksempel."
Oprindelse: Mark Twain
----
Styr hest med bidsel og kone med kæp.
Citat: Peder Laale
----
"Indforstået jargon og uforståelige fremmedord er et varemærke for ethvert seriøst moderne erhverv."
Oprindelse: Ukendt
----
"Jeg tror på kærlighed ved første blik. Det er meget tidsbesparende."
Oprindelse: Ukendt
----
Visdom er ikke at vide en masse. Visdom er at vide hvad man skal gøre med det man ved.
Citat: Ukendt
----
"God dømmekraft bygger på erfaring, og erfaring kommer af ringe dømmekraft."
Oprindelse: Barry LePatner
----
"Hævn er sød og ikke fedende."
Oprindelse: Alfred Hitchcock
----
"Hvis du vil læse om kærlighed og ægteskab, må du købe to forskellige bøger."
Oprindelse: Alan King
----
Det er vigtigere at have ret, end at få ret.
Citat: Ukendt
----
"Har man ingen karakter, må man anlægge sig nogle leveregler."
Oprindelse: Albert Camus
----
"Mange mennesker tror, at de tænker, når de i virkeligheden bare flytter rundt på deres fordomme."
Oprindelse: Ukendt
----
"Kunsten er en løgn, som får os til at se sandheden."
Oprindelse: Pablo Picasso
----
"I de blindes rige er den enøjede konge."
Oprindelse: Machiavelli
----
"At spare er ganske strålende. Især hvis ens forældre har gjort det for én."
Oprindelse: Winston Churchill
----
"Alle lidenskaber dør ud med alderen. Kun egoismen lever evigt."
Oprindelse: Voltaire
----
"Alt her i livet har sin pris, også de ting man får foræret."
Oprindelse: Theodor Fontane
----
"Alle har lyst til himlen, men få bryder sig om vejen derhen."
Oprindelse: Peder Syv
----
"Ægtemænd og stueplanter skal behandles med omhu - ellers går de ud."
Oprindelse: Dansk ordsprog
----
"Gid jeg var godt gift, for nu har jeg fået nok af kærligheden, sagde pigen."
Oprindelse: Ukendt
----
"Ikke så ringe," sagde manden. Han kastede en sten efter hunden og ramte sin svigermor.
Oprindelse: Gl. dansk ordsprog
----
"Dagens lys udsletter nattens ord."
Oprindelse: Arabisk ordsprog
----
"Den fattige kureres af arbejde, den rige af lægen."
Oprindelse: Polsk ordsprog
----
"Den gamle tror alt; den midaldrende tvivler på alt; den unge ved alt."
Oprindelse: Oscar Wilde
----
"Der er ingen værre tyv end en dårlig bog."
Oprindelse: Italiensk ordsprog
----
"Den, der samtidig kigger til højre og venstre, kommer uvægerligt til at skele."
Oprindelse: Konrad Adenauer
----
"Den, der glemmer fortiden, er dømt til at gentage den."
Oprindelse: Elsa Gress
----
"Den, der lever dydigt, bliver æret, men han bliver ikke misundt."
Oprindelse: Persisk ordsprog
----
"Den uvidende har mod, den vidende har angst."
Oprindelse: Alberto Moravia
----
"Den, der aldrig er rådvild, bliver aldrig gift."
Oprindelse: Ukendt
----
"Den propmætte prædiker altid om faste."
Oprindelse: Spansk ordsprog
----
"Det er i de gamle klæder man skal tjene til de ny."
Oprindelse: Ukendt
----
"Det er ikke den koldeste pige der får minkpelsen."
Oprindelse: Russisk ordsprog
----
"En løgn kan gå fra Bagdad til Konstantinopel, mens sandheden leder efter sine sandaler."
Oprindelse: Arabisk ordsprog
----
"En god dag giver en glad aften."
Oprindelse: Ukendt
----
"En dårlig samvittighed er en samvittighed, der gør sin pligt."
Oprindelse: Aldous Huxley
----
"Elsk, som om du skulle dø i dag!"
Oprindelse: Seneca
----
"Dovenskaben bevæger sig så langsomt, at fattigdommen snart træder den i hælene."
Oprindelse: Engelsk ordsprog
----
"Drik dit øl før det dovner, tag din kærest i favn før hun sovner."
Oprindelse: Peder Syv
----
"Det nytter ikke at kunne se os selv, som andre ser os. Vi ville alligevel aldrig tro det."
Oprindelse: James Thurber
----
"Det vigtigste for et godt ægteskab er, at man lærer at strides harmonisk"
Oprindelse: Anita Ekberg
----
"Det gælder ikke om at finde en pige, som man har lyst til at gå i seng med. Det gælder i højere grad om at finde den, man har lyst til at stå op med."
Oprindelse: Jens Locher
----
"Det har man for sin imødekommenhed, sagde pigen. Hun fik tvillinger."
Oprindelse: Gl. dansk ordsprog
----
"Det er kærlighed, når hun stryger krummerne ud af sengen."
Oprindelse: Kurt Tucholsky
----
"Det er med ord som med solstråler; jo mere de koncentreres, jo dybere brænder de."
Oprindelse: James Joyce
----
"Et er at lære udenad, et andet er at samle viden."
Oprindelse: Seneca
----
"Et menneske er ikke gammelt, så længe alderen ikke træder i stedet for drømme."
Oprindelse: John Barrymore
----
"Et menneske lever kun et liv på denne jord. Gennem bøgerne lever mennesket mange liv."
Oprindelse: Tom Kristensen
----
"Gift dig aldrig for pengenes skyld. Det er altid billigere at låne."
Oprindelse: Skotsk ordsprog
----
Den som løftet blikket ser ingen grænser.
Citat: Ukendt
----
"Hvis en mand tit bliver skældt ud af sin kone, skal han ikke fortvivle. Det betyder jo kun, at hun endnu ikke har opgivet ham helt."
Oprindelse: Walther Winchell
----
"Hvis man tager en kvinde på ordet og en ål ved halen, smutter de begge væk."
Oprindelse: Polsk ordsprog
----
De mænd, der kommer bedst ud af det med kvinder, er de samme som dem der ved, hvordan man bedst undvære dem.
Citat: Charles Baudelaire
----
"Hvad man kalder en last er altid det samme. Hvad man kalder dyd er mere bestemt af moden."
Oprindelse: Bernhard Shaw
----
Målet med livet er ikke at blive verdensmestre, men at lære at mestre verden.
Citat: Arne Nielsson
----
Ofte trykker en laurbærkrans mere end en tornekrone.
Citat: Wolfgang Eschker
----
"Knirken kommer altid fra det svageste og dårligste hjul."
Oprindelse: Peder Laale
----
Smilet er et udtømmende udsagn uden ord.
Citat: Hans Arndt
----
"Kvinder har et velsignet karaktertræk: De kan tilgive mænds dårskaber."
Oprindelse: McCardie
----
"Kvinder vil gerne opleve romaner i kærligheden, mændene blot noveller."
Oprindelse: Daphne du Maurier
----
"Man kan drive enhver forelsket kvinde så langt, at hun gør hvad hun vil."
Oprindelse: Marcello Mastroianni
----
"Man kan ikke flygte fra sin skæbne, og man kan ikke dele den med andre."
Oprindelse: Oldnordisk ordsprog
----
"Lykke er det eneste man kan give, uden selv at eje det."
Oprindelse: Somerset Maugham
----
At prale bringer måske ikke lykke, men intet menneske, som har fanget en stor fisk, går hjem ad en sidegade.
Citat: Svend Horn
----
"Myggen flyver så længe omkring lyset, at den til sidst brænder vingerne."
Oprindelse: Peder Syv
----
"Mands ære er at undgå trætte, men alle tåber vil strid."
Oprindelse: Bibelcitat
----
"Man kan også blive mæt af honningkage."
Oprindelse: Norsk ordsprog
----
"Om aftenen skal man rose den smukke dag. Den smukke kvinde skal roses om morgenen."
Oprindelse: Ukendt
----
Det er godt at få det bedre, men det er bedre at få det godt.
Citat: Ukendt
----
"Når en kvinde ler, ved hun noget. Når hun græder, vil hun noget."
Oprindelse: Svensk ordsprog
----
Smilet er et udtømmende udsagn uden ord.
Citat: Hans Arndt
----
"Når en kvinde ikke elsker, er hun lige så koldblodig som en gammel jurist."
Oprindelse: Honoré de Balzac
----
"Hvis du skal have et arbejde godt og hurtigt lavet, så vælg en travl mand. De andre har aldrig tid."
Oprindelse: Elbert Hubbard
----
"Ungkarl: En påfugl. Forlovet: En løve. Gift: Et æsel."
Oprindelse: Spansk ordsprog
----
"Utilfredshed er det første skridt mod fremgang."
Oprindelse: Oscar Wilde
----
"Tid, ord og mødom kan man ikke tage tilbage."
Oprindelse: Ukendt
----
"Stormen fælder de store træer, de små bliver stående."
Oprindelse: Sjællandsk ordsprog
----
"Styrke uden klogskab segner på grund af sin egen tyngde."
Oprindelse: Horats
----
"Tænk to gange, og ti så stille."
Oprindelse: Ukendt
----
"Sommetider har tårer samme vægt som ord."
Oprindelse: Ovid
----
"Sorger druknes ikke i alkohol, de kan svømme."
Oprindelse: Heinz Rühmann
----
"Som mæslinger er kærligheden farligst, når den kommer sent i livet."
Oprindelse: Engelsk ordsprog
----
"Smilehuller burde forbydes ved lov. De anretter flere ulykker end alverdens sprængstoffer."
Oprindelse: Duncan Schwann
----
"Se imod himlen, for i jorden kan du jo altid komme."
Oprindelse: Ukendt
----
"Det eneste der afholder Gud fra at sende en ny syndflod, er at den første slog fejl."
Oprindelse: Nicolas Chamfort
----
"Verden bliver lys, og menneskene synes gode, for den sjæl der elsker."
Oprindelse: Monrad
----
Hvis man ikke er venstreorienteret som ung, har man intet hjerte - hvis man er venstreorienteret som gammel, har man ingen hjerne.
Citat: Jaques Chirac
----
Da jeg var ung vidste jeg alt, men nu er jeg blevet klogere.
Citat: Dansk ordsprog
----
Det er svært at være socialist nu om stunder, nu da analfabeter kan læse, de fattige har penge og sultens slavehær kæmper mod overvægten.
Citat: Ukendt
----
Det objektive danner livet, mens det subjektive er livet.
Citat: Dithmer
----
Gode venner kan lave alting sammen - men kun de bedste venner er i stand til at lave ingenting sammen.
Citat: Peter Plys
----
"Den korrekte elsker tager færre chancer, end der bydes ham."
Oprindelse: John Field
----
"Den største sorg er at indse, at vi selv er eneste årsag til al vor modgang."
Oprindelse: Sofokles
----
"Hellere et tomt hus end en dårlig lejer."
Oprindelse: Skotsk ordsprog
----
"Inden rosen ved af det, er den et gammelt hyben."
Oprindelse: Svensk ordsprog
----
"De søvnløse og de ulykkelige er oftest meget stolte over deres problemer."
Oprindelse: Bertrand Russell
----
"Eventyr er resultatet af en dårlig planlægning."
Oprindelse: Blatchford Snell
----
En god tretant er bedre end en ond cirkel
Oprindelse: Ukendt
----
"Amatører håber. Professionelle arbejder."
Oprindelse: Garson Kanin
----
"At forsømme nuet er at kaste sin ejendom bort."
Oprindelse: Schiller
----
"En smuk kvinde er hurtigt klædt på."
Oprindelse: Engelsk ordsprog
----
"En mand kan modstå alt - undtagen fristelser."
Oprindelse: Oscar Wilde
----
"En ægte leder behøver ikke føre an. Det er nok for ham at udpege retningen."
Oprindelse: Henry Miller
----
"Guld giver et stænk af skønhed, også til den grimmeste."
Oprindelse: Boileau
----
Mænd. Find dem. Fup dem. Forlad dem. (Mae West)
----
Mænd er som Camembert: Lettest at fordøje når de er halvmodne (Deneuve)
----
Ordforklaring: Urinstinkt. Især på herretoiletter. (Anon)
----
"Det er menneskeligt at fejle, men hvis man virkelig ønsker at lave kage i det, så skal man tage en computer til hjælp."
Oprindelse: Ukendt
----
"Har man ingen bekymringer, skaffer man sig nogle."
Oprindelse: Svensk ordsprog
----
"Den danser godt for hvem lykken spiller."
Oprindelse: Engelsk ordsprog
----
"Den som ikke kan danse, giver det ujævne gulv skylden."
Oprindelse: Malajisk ordsprog
----
"Ingen er så klog som manden, der tier stille på de rigtige tidspunkter."
Oprindelse: Ukendt
----
"Tag kærligheden til det skønne ud af vore hjerter, og du fjerner hele fortryllelsen ved livet."
Oprindelse: Rousseau
----
"Kun en klog mand ved hvordan man skal elske."
Oprindelse: Seneca
----
"Sig aldrig nej af stolthed og aldrig ja af svaghed."
Oprindelse: Spansk ordsprog
----
"Pligten er først behagelig når den er gjort."
Oprindelse: August Strindberg
----
"Hjertet får aldrig rynker."
Oprindelse: Madame de Sévigné
----
"At drive en virksomhed uden at annoncere er som at blinke til en pige i mørke. Du ved, hvad du gør, men ingen andre opdager det."
Oprindelse: Stuart H. Britt
----
"Sjælelige lidelser helbredes ofte af virksomhed."
Oprindelse: Goethe
----
"Drømmen om et forenet Europa har ingen udsigt til at blive virkeliggjort. Man kan ikke lave omelet af hårdkogte æg."
Oprindelse: Charles de Gaulle
----
"Lykke består af ulykker som undgåes."
Oprindelse: Alphonse Karr
----
"Den går trygt, som intet ejer."
Oprindelse: Fransk ordsprog
----
"Jeg har stadig alt det, jeg havde for tyve år siden - men nu sidder det hele lidt længere nede."
Oprindelse: Gypsy Rose Lee
----
"Er du i tvivl om, hvad du skal gøre, vælg da det venligste."
Oprindelse: Amerikansk ordsprog
----
"Hun havde et smil der kunne oplyse en mindre købstad."
Oprindelse: Ukendt
----
"Ægteskabet har mange sorger, cølibat ingen glæder."
Oprindelse: Dr. Samuel Johnson
----
"At leve er som at kunne kunsten at tegne uden at bruge viskelæder."
Oprindelse: Chicago Tribune
----
"Velopdragenhed består i at skjule hvor lidt vi tænker på andre."
Oprindelse: Mark Twain
----
"Tal med en mand om ham selv og han vil lytte i timevis."
Oprindelse: Benjamin Disraeli
----
"Universet er som et ur - så der må være en urmager!"
Oprindelse: Voltaire
----
"Gud skabte Adam. Så betragtede han sit arbejde og sagde så: "Det kan jeg godt gøre bedre næste gang."
Oprindelse: Dr. Joyce Brothers
----
"Beskedenhed hos en skuespiller er som lidenskab hos en luder."
Oprindelse: Jackie Gleason
----
"Den mand som hviler på sine laurbær, har anbragt dem det gale sted."
Oprindelse: Amerikansk ordsprog
----
"Jeg ved at alkohol er en langsom dræber, men jeg har heller ikke så travlt."
Oprindelse: Courteline
----
"Mode er for kvinder uden smag, etikette for mennesker uden opdragelse."
Oprindelse: Maria
----
"Ved siden af de ti bud har man glemt et elvte, der ikke burde være mindre vigtigt end de andre: Du må ikke kede din næste!"
Oprindelse: Isaac Bashevis Singer
----
"En ungkarl er en mand der skal en ny vej til arbejde hver morgen."
Oprindelse: Ukendt
----
"Et mirakel sker ikke i strid med naturen, men i strid med hvad vi ved."
Oprindelse: Augustin
----
"Moderne kunst opstår, når malerne holder op med at kigge på piger og bilder sig ind at de har en bedre idé."
Oprindelse: John Ciardi
----
"Enhver mand ved, at han ved at kysse sin kones øjenlåg kan gøre hende blind, og at han kan gøre hende stum ved at kysse hendes mund."
Oprindelse: Dale Carnegie
----
"Kvinder vil aldrig blive så succesrige som mænd, af den simple årsag at de ikke har koner til at rådgive sig."
Oprindelse: Dick Van Dyke
----
"At lide for sine egne fejltagelser er det bitreste her i livet."
Oprindelse: Oscar Wilde
----
"Der er stadig en del tvivl om hvem der er bedst til at tage sig af små børn, men der er ingen tvivl om at de dårligste til jobbet, er deres egen forældre."
Oprindelse: Bernard Shaw
----
Man bør ikke fordømme mennesker for hvad de gør mod deres fjender. Men måske bør man dømme dem efter sindelaget, de viser deres venner.
(Herman Bang 1908)
----
Man ved at man er ved at blive gammel, når lysene koster mere end kagen.
(Bob Hope)
----
Mand og kvinde er to parallelle linjer, og det ligger i parallelle linjers natur, at de aldrig mødes.
(August Strindberg)
----
Meget dunkelt ville blive klart, hvis man gik ud fra den kendsgerning, at mennesker er forskellige, i stedet for, som det nu er på mode, at gå ud fra, at de er ens.
(Jørgen Nielsen)
----
Menneske, der er ingen vej. Vejen bliver til, når du går.
(Machado, Antonio)
----
Menneskene fødes som Individer, opdrages som veltilpassede Puslebrikker og uniformeres til sidst som komplet intetsigende Kistelemmer.
(Ove Fahnøe 1975)
----
Mennesker er mærkelige. Tro mig på mit ord - jeg ved det. Jeg tilhører selv en fjern variant af stammen.
(Turèll, Dan]
----
Mennesker forstår ikke bøger, før de har prøvet en del af livet. Fordommen imod bøger er opstået ved at man så, hvor stupide de mennesker var, som KUN læste bøger.
(Ezra Pound)
----
Mennesker og vilddyr. Forskellen er, at de første kæmper med tungen, de andre med tænderne.
(Samuel Butler 1612)
----
Mennesker påstår ofte, at i et demokrati bliver beslutningerne taget af folkets flertal. Det er naturligvis ikke sandt. Beslutningerne bliver taget af flertallet blandt dem, der lader sig høre og som stemmer - og det er noget helt andet.
(Walter H. Judd)
----
Mildt sagt: Hans åndelige Tyngdekraft levner ham ikke så meget
Misfornøjelse er det første skridt mod en mands eller en nations fremgang.
(Oscar Wilde)
----
Mit hemmelige plot er et lave nogen skoler over hele landet for autodidakte. Så vil jeg score kassen på iværksætterydelse, og når folk møder op ved døren så hænger der et skilt, hvor der står: "Gå dog hjem!"
(Ole Bornedal 1995)
----
Mode begynder med Mod - udvist af en Nar.
(Ove Fahnøe 1970)
----
Må Gud bevare mig i smult vand, i stormfuldt klarer jeg mig selv.
(Spansk Ordsprog)
----
Måske har jeg modsagt mig selv i aften. Men hvad jeg har sagt, står jeg ved.
(Robert Storm Petersen)
----
Pas altid på dem, der tilføjer: "Med andre ord". De er ved at begynde forfra.
(Robert Morley)
----
Pas på den gode smag. Den står tit i vejen for noget, der er endnu bedre.
(Peter Bastian DR-TV 1997)
----
Pas på en mand, som taler lovprisende om kvindefrigørelse. Han har tænkt sig at holde op med at arbejde.
(Erica Jong)
----
På vore landeveje har vi et liv og leben som på hestevognens tid. I det samme hjulspor kører traktorer og knallerter med 30 km/t, EU-knallerter med 45, lastbiler med 70 og resten med 80. Og så dem midt i mellem. God dansk tradition. Det er som i skolen; de langsomme bestemmer farten.
(Søren Molte)
----
Rengøring er at flytte Snavset.
(Ove Fahnøe 1975)
----
Rettelse: I min artikel om mælkepriser skal der stå "ko" i stedet for "hest" hele vejen igennem
(J.B Morton)
----
Se der! De ser! Han løber BORT fra menneskene - : Men de følger efter ham, fordi han løber forrest.
(Friedrich Nietzsche)
----
Sex mellem en mand og en kvinde kan være vidunderligt, hvis ellers man kan klemme sig ind mellem den rette mand og den rette kvinde.
(Woody Allen)
----
Slagen mand tænker.
(Sven Clausen)
----
Sluk for tv. Livet bliver ikke genudsendt. Læs avis i stedet!
(J.B. Holmgaard)
----
Så vi pløjer bare videre, som fluen sagde til oksen.
(Henry Wadsworth Longfellow)
----
Tal i vrede, og du kommer til at holde den bedste tale, du nogensinde har fortrudt.
(Winston Churchill)
----
Jeg tror mest på den videnskabelige teori, der siger at Saturns ringe består af mistet flybagage.
(Mark Russell)
----
Jeg tror på Kødets Lyst og Sjælens ubodelige Ensomhed.
(Hjalmar Söderberg 1906)
----
Jeg ved godt, at vi alle på længere sigt skriver i vand.
(Thorkild Hansen)
----
Jeg ved ikke hvem min bedstefar var, men jeg er frygtelig interesseret i at vide, hvad der skal blive af hans barnebarn.
(Abraham Lincoln)
----
Jeg vil fatte mig i korthed - og forblive dunkel.
(Horsts)
----
Jeg vil ikke gøre en særlig indsats for at gøre mig mere populær, eftersom jeg ikke vil søge genvalg. Jeg har andet at lave.
(Yeltsin, Boris)
----
Jeg vover næsten at påstå, at refleksionstilstanden er en unaturlig tilstand, og at dét menneske, der mediterer, er et desperat dyr.
(Jean-Jaques Rousseau)
----
Jo højere et podium, en dværg klatrer op på, desto klarere ser man, hvor lille han er.
(Gabriel Laub)
----
Jo mere en mand ved, og jo mere han rejser, desto mere tilbøjelig er han til at gifte sig med en landsbypige.
(Bernard Shaw)
----
Jo større en løgn, des flere mennesker hopper på den.
(Adolf Hitler 1928)
----
Kig engang på barnets ordforråd. Det er en stor misforståelse, at der er flere ord end idéer i denne verden, og at barnet taler mere, end det ved. Jeg tror det er een af grundene til, at folk på landet generelt har en mere retsindig sjæl end byfolk - fordi deres ordforråd er mindre udvidet. De har få idéer, men de er bedre til at sammenligne dem.
(Jean-Jaques Rousseau)
----
Kunsten at forhøre er ikke så let som man skulle tro. Det er i høj grad mestrenes og ikke disciplenes kunst; man må vide meget om tingene for at kunne spørge til det, man ikke ved.
(Jean-Jaques Rousseau)
----
Kunstens geværløb er skævt. Sigter man lidt ved siden af, har man en chance for at ramme plet.
(Thorkild Hansen)
----
Kvinden - hun har meget af Barnet, men intet af dets uskyld.
(Hamsun, 1908, "En vandrer")
----
Kvinden er et ufuldkomment og ondt dyr.
(Pave Innocens 8.s "heksehammeren" 1484)
----
Kvinden er kun seksuel. Manden er også seksuel.
(Otto Weiniger)
----
Kvinden er ubetinget det bedste, man har af den slags.
(Gustav Wied)
----
Kvinden føder, manden avler. Der er en forskel.
(Vilh. Andersen)
----
Kvinden var Guds anden fejl.
(Nietsche)
----
Kvinder er billeder, mænd er problemer; hvis du ønsker at vide, hvad en kvinde virkelig mener, så se på hende, hør ikke på hende.
(Oscar Wilde)
----
Kvinderne er de mest samvittighedsfulde betalere. De har altid betalt mig tilbage med renter og rentes rente.
(Peter Frankenfeld)
----
Kærlighed og had er ikke blinde, men blændede af den ild, de bærer med sig.
(Friedrich Nietzsche)
----
Lad os sige, at menneskeheden er som en flok, der er stuvet sammen i en bil, som kører ned ad bakke i en frygtelig fart, uden lys og med en fireårs dreng bag rattet. På skiltene langs vejen står: Fremskridt.
(Lord Dunsanny)
----
Lev farligt. Byg eders byer ved Vesuvs fod. Send eders skibe ud på de ukendte have. Lev i stadig krig.
(Nietzsche, 'Således talte Zarathustra')
----
Ligegyldighed eller had er kærlighedens smertelige bundfald.
(Herman Bang 1897)
----
Ligesom en kædes styrke er afhængig af dens svageste led, er den offentlige mening bestemt af, hvad den dummeste tænker.
(Johannes Hohlenberg)
----
Liv er intet, væren er alt.
(Gottfried Benn)
----
Livet er Krig mellem Trolde i Hjernen og Hjertets Hvælv.
(Hamsun, Mysterier 1898)
----
Lyt ikke til de andre og bliv kvalt: Man bør puste, hvis man har mel i munden.
(Søren Molte)
----
Lyt til fornuften, ellers vil den smertefuldt bringe sig i erindring.
(Engelsk ordsprog)
----
I grunden var min kone meget barnlig. Når jeg lå i mit badekar, kom hun ind og sænkede alle mine skibe.
(Woody Allen)
----
Ingen dør nu til dags af dræbende sandheder: der gives for mange modgifte.
(Friedrich Nietzsche)
----
Ingen var skyld i, at jeg ikke fra skole eller fra kursus fik en eksamen af en slags. Ingen, hverken mor eller far eller andre. Det var i den sene sidste nat, på sin vis en trøst. Jeg var, og har altid været, begavet nok til at gøre mine dumheder selv."
(Palle Lauring)
----
Ingenting er så foragteligt, som når man diskuterer med et menneske og gør alt for at overbevise ham - da pludselig mærker man, at man ikke har med hans forstand at gøre, men med hans vilje; han VIL ikke forstå.
(Schopenhauer)
----
Intet umenneskeligt skal være mig fremmed.
(Thorkild Hansen)
----
Intet vil blive gjort, hvis alle mulige indvendinger først skal gennemgås.
(Samuel Johnson)
----
Jeg citerer ofte mig selv. Det giver kraft i min konversation.
(George Bernard Shaw)
----
Jeg elsker mænd, som har en fremtid og kvinder, som har en fortid
(Oscar Wilde)
----
Jeg er beredt til at møde min skaber. Om han er beredt til at møde mig, er en anden ting.
(Winston Churchill)
----
Jeg er en utrolig venlig mand. Jeg har aldrig gjort en ulykke på hverken folk, fæ eller babyer medmindre det var nødvendigt.
(W.C. Fields)
----
Jeg er faktisk blevet så gammel, at jeg godt kan gå forbi en sovende hund, uden at jeg behøver at sparke til den. Det har også taget mig et halvt hundrede år at lære.
(Uffe Ellemann-Jensen 1996)
----
Jeg er ikke bange for stærke mennesker. Jeg er bange for svage mennesker.
(Piet Hein 1991)
----
Jeg er sådan en slags passiv sadist. Sådan en blød mand, der ikke tager opvasken.
(Povl Erik Carstensen)
----
Jeg er uenig i hvad du siger, men jeg vil indtil døden forsvare din ret til at sige det.
(Voltaire)
----
Jeg foragter folk, der holder hund. Det er krystere, der ikke selv tør bide folk.
(August Strindberg)
----
Jeg forudser systematisk alle tænkelige ulykker, indbrud, brand, hærværk, dødsfald, torskegilder og konfirmationstaler i det håb, at det kun er det uforudsete der indtræffer.
(Thorkild Hansen)
----
Jeg har indtrykket af, at de bedste dør og rosset bliver tilbage, - for resten er jeg heller ikke selv så rask, som jeg har været.
(Knud Hjortø)
----
Jeg har ofte hørt tale om frihed, men jeg har aldrig set andet end dens billede. Den som har et hjerte er aldrig fri.
(Alfred de Vigny)
----
Jeg har set kapitalismens slaver, og de lever ikke dårligt.
(Nikita S. Krustjov)
----
Jeg håber intet. Jeg frygter intet. Jeg er fri.
(Inskription på grækers gravsten)
----
Jeg kender ensomhedens tyngde, og gennem lange år har jeg søgt nogen, hvis hjerte kan finde vej til mig.
(Alfred Nobel)
----
Jeg kender kun een rejseform mere behagelig end hesteryg - det er til fods.
(Jean-Jaques Rousseau)
----
Jeg lytter altid til min gode veninde Kettys råd, for hun har begået den ene fejl efter den anden. Hendes erfaringer er uvurderlige.
(Grace Pally)
----
Jeg skal sige Dem: Hvis jeg havde skabt manden og kvinden, ville jeg have dannet dem efter en helt anden type end den nuværende, de højerestående pattedyr. Jeg ville have skabt mand og kvinde ikke i de højere abers lighed, men i lighed med insekterne, som efter at have været larver bliver forvandlet som sommerfugle og som på sin livsaften ikke har anden tanke end at elske og være skønne. Jeg ville have anbragt ungdommen som afslutning på menneskelivet. Visse insekter har i sin sidste forvandling vinger, men ingen mave. De genfødes kun i denne renere form for at leve i en time og dø.
(Anatole France)
----
Jeg så engang i Asien en stime blå rejer, umiskendeligt BLÅ rejer. Det var opmuntring nok for en hel dag.
(Dan Turrèll)
----
Jeg søger ikke, jeg finder.
(Pablo Picasso)
----
Erfaringen er en god lære mester, man han sender nogen afsindigt dyre regninger.
(Minna Antrim)
----
Erobre Verden? Det er for meget, jeg vil ikke. Lad Verden erobre MIG. Hvis den insisterer.
(Dan Turèll 1993)
----
Et pseudobehov: Hvis vi nu får dette, hvad er vi så nødt til at bruge det til?
(Ove Fahnøe 1975)
----
Et åbent sind er godt nok på sin måde, men det bør ikke være så åbent, at det ikke kan lukke noget ude eller inde. Det bør indimellem kunne smække døren til, ellers kommer der for megen gennemtræk.
(Samuel Butler)
----
Ethvert menneske er idiot fem minutter hver dag. Klogskab består i ikke at overskride denne grænse.
(Elbert Hubbard)
----
For hver gang du siger til en kvinde, at hun er smuk, hvisker djævlen hende det i øret ti gange.
(italiensk ordsprog)
----
Formel for min lykke: Et ja, et nej, en lige linie, et mål...
(Friedrich Nietzsche)
----
Forskellen på mademoiselle og madame er stadigvæk monsieur.
(Guido Baumann)
----
Fremtiden bliver uden mig
(Poul Borum 1996)
----
Før fægtede dansken med åben pande. Nu fægter han med sin fulde madskål og skriger på mere.
(Asger Aamund)
----
Gæt, hvis du kan, og vælg, hvis du tør.
(Pierre Corneille, Héraclius)
----
Hadet er modsat kærligheden en følelse, der aldrig kan drages i tvivl.
(Thorkild Hansen)
----
Han burde have levet i Urtiden, saa ville Fremskridtet i ham have faaet en varm Forkæmper.
(Hamsun om Strindberg 1907)
----
Han har altid haft den skæbne at skubbe et dårligt rygte foran sig.
(Jens Genefke 1995)
----
Hans uvidenhed er encyklopædisk.
(Abba Eban)
----
Harmoni med naturen? Hvilken rørende illusion. Som om naturen var lutter fred og ingen fare. Som om jordskælv og insektangreb, AIDS og influenza ikke var en del af naturen. Som om vores tilværelse og overlevelse - hele lægevidenskaben f.eks. ikke byggede på BEKÆMPELSE af naturen.
(Luc Ferry, Politiken 5/9 '93)
----
Huleboerens kone klagede over, at han ikke havde slæbt hende nogen steder hen for nylig.
(Laurence J. Peter)
----
Hvad jeg har lært, kan jeg ikke mere huske. Den smule, jeg endnu ved, har jeg gættet mig til.
(Nicolas Chamfort)
----
Hvis Gud bare ville give mig et rigtigt tegn. For eksempel åbne en konto til mig i Schweiz.
(Woody Allen)
----
Hvis det ikke lykkes første gang, så prøv igen, og så igen. Og stop så. Det er jo ingen grund til at optræde som en komplet idiot.
(W. C. Fields)
----
Hvis du ikke går til yderpunkterne, så skal du ikke gå nogen steder.
(Asger Jorn)
----
Hvis jeg var prins eller lovgiver, ville jeg ikke spilde min tid på at sige hvad man BURDE gøre. Jeg ville gøre det selv eller holde min mund.
(Jean-Jaques Rousseau)
----
Hvorfra stammer menneskets svaghed? Fra forskellen mellem hans kunnen og hans drømme. Det er vores drømme, som gør os svage, fordi man skal tilføje lidenskaberne mere energi, end vi har overskud til fra naturens hånd. Gør man drømmene mindre, er det som om man får mere kraft: Den mand, som kan mere end han drømmer har et overskud; han er uden tvivl et stærkt væsen.
(Jean-Jaques Rousseau)
----
Aber kan ikke synge, men de forsøger det altså heller ikke.
(Robert Lembke)
----
Al kunst rummer ekshibitionisme - men ekshibitionisme er ikke kunst.
(Arthur Kostler)
----
Alle stærke følelser, gode og dårlige, har en tendens til at forplante sig uønsket. Det ikke blot betyder noget, hvad der bliver gjort, men også hvorfor det bliver gjort.
(Bertrand Russell)
----
At leve er det sjældneste af alt i verden. De fleste mennesker eksisterer, ikke andet.
(Oscar Wilde)
----
At vi franskmænd betragtes som verdens bedste elskere beror på vores gode PR-folk: Kvinderne.
(Chevalier, Maurice)
----
At ønske sin kvindes lykke, er det ikke at have opnået den?
(Jean-Jaques Rousseau)
----
Blandt 1000 vilkårligt valgte Mennesker er der altid kun en enkelt Ener - Resten er Nuller.
(Ove Fahnøe 1970)
----
Brug ikke det udenlandske ord ideal. Vi har jo det gode norske ord løgn.
(Henrik Ibsen)
----
Da jeg blev kidnappet reagerede mine forældre lynhurtigt. De lejede mit værelse ud.
(Woody Allen)
----
De jager efter følelser, der passer ind i deres gloseforråd.
(Henri Davray om dårlige kunstnere)
----
Den ideelle kvindebluse består af 10 pct. silke og 90. pct. indhold.
(Peter Sellers)
----
Den selvoptagne skal man ikke dømme, før man ved, hvad han er optaget af.
(Frithiof Brandt)
----
Den, som giver op, når han er bagud, er fej. Den som giver op, når han fører, er en nar.
(Wade, William Arthur)
----
Den, som tror på menneskets frie vilje, har aldrig elsket og aldrig hadet.
(Marie Von Ebner-Eschenbach)
----
Desværre fastsætter loven ingen straf for kvinder, der forfører mænd.
(August Strindberg)
----
Det eneste man kan gøre med gode råd, er at give dem videre. Selv har man aldrig nytte af dem.
(Oscar Wilde)
----
Det er bedre at slides op end at ruste væk.
(Whitefield, George)
----
Det er ikke tornen der stikker dig, det er dig der stikker dig på tornen.
(afrikansk ordsprog)
----
Det er lettere at rette egne Fejl end andres. Navnlig fordi der ikke er så mange af dem.
(Ove Fahnøe 1975)
----
Det er utroligt så skadeligt det er for et godt hoved at beskæftige sig med noget dumt.
(Goethe)
----
Det kinesiske skrifttegn for lykken: en kvinde under et tag
(Thorkild Hansen)
----
Det lykkedes Gud at fange hans blik til sidst.
(George S. Kaufmann om en død tjener)
----
Det mest tåbelige tidsspilde, jeg kender, er diskussioner med yndige kvinder.
(David Niven)
----
Det var en kvinde, der drev mig til druk. Jeg har aldrig fået sagt ordentligt tak.
(W.C. Fields)
----
Det værste ved at være bøsse er al den helvedes discomusik man tvinges til at udholde.
(Quentin Crisp)
----
Det, som ikke nedbryder mig, gør mig stærkere.
(Friedrich Nietzsche)
----
Du skal sige røv, så griner folk. Så skal du give dem budskabet. Og når de så er lige ved at kede sig skal du sige røv igen. Så vil de elske dig.
(Poul Henningsen)
----
Du skal være aktuel, ramme problemerne på dags dato og klokkeslæt. Så siger samtiden, at du er tidløs.
(Thorkild Hansen)
----
Ejendom støtter, beskytter, bekræfter. Men den tynger, tager din frihed, vækker din frygt for at miste. Du ejer den ikke mere, den ejer dig.
(Thorkild Hansen)
----
En halv Abe er nok til at udvikle det fulde Menneske.
(Ove Fahnøe 1975)
----
En mand begynder at blive gammel, når han kigger på menukortet inden han kigger på servitricen.
(Ukendt)
----
Enhver Medalje har en Bagside. I Pressen er det altid den, der erobrer Forsiden.
(Ove Fahnøe 1970)
----
Er du ikke enig med mig, har du ikke lyttet godt nok.
(Markewich, Sam)
----
Hvis nogen fortæller dig, at han lægger alle kortene på bordet ... så tæl dem.
----
Sidste ord:
Den er så tam, at man kan putte hovedet ind i munden på den...
----
Sidste ord:
Det her er en spiselig svamp...
----
Sidste ord:
Klip den røde ledning over først...
----
Sidste ord:
Chefen er da ligeglad...
----
Sidste ord:
Det koster kun det halve ved det her flyselskab...
----
Sidste ord:
Jeg tror, den er død..
----
Sidste ord:
Jeg går over broen først...
----
Sidste ord:
Hvad min bedre halvdel ikke ved, har min bedre halvdel heller ikke ondt af...
----
Sidste ord:
Hells hva` for noget?
----
Sidste ord:
Kom nu! Der sker ikke noget..
<html><p>For at komme i gang med denne tomme tiddlywiki, skal du ændre på de følgende tiddlere:</p><p>* SiteTitle & SiteSubtitle: Sidens titel og undertitel, som vist øverst (efter de er gemt, vil de også vise sig i browserens titelmenu)</p><p>* MainMenu: er hovedmenuen (er oftest placeret til venstre)</p><p>* DefaultTiddlers: Indeholder navnene på de tiddlere du vilhave skal starte op når du åbner TiddlyWiki</p><p>Du skal også skrive dit brugernavn for at signere dine redigeringer: <<option txtUserName>></p></html>
<html>
<div class="js-kit-comments" permalink=""></div>
</html>
<script src="http://js-kit.com/comments.js"></script>
<<miniBrowser hidecontrols http://www.sautinsoft.net/html-to-rtf-convert.aspx>>
<<miniBrowser hidecontrols http://66.89.113.16/doc2pdf/>>
<<miniBrowser hidecontrols http://www.pdfonline.com/pdf2word/index.asp>>
<html><p>Interessante opdagelser: # Hvis man kopierer tabellerne ind som wysiwyg fra KlikSelv - kan de stadig sorteres (Kolonneoverskriften forsvinder godt nok - men det gør ikke noget ved sorteringen..) # Man kan kopiere "[[Tilfældige sange]]" tiddler indholdet og få et "frosset" forslag - men KlikSelv er nok at foretrække - fordi man har mere "styr på det".</p><p>(Ctrl+C fra KlikSelv):</p><table class="twtable"><tbody><tr class="evenRow hoverRow"><td><span tiddler="SangBogenKlik" refresh="content"><table class="sortable"><thead><tr class="evenRow"><td index="0">Bogen:<span class="hidden">↑</span></td><td index="1">Titel nr<span class="hidden">↑</span></td></tr></thead><tbody><tr class="oddRow"><td>1</td><td><div style="overflow: hidden; display: block; height: auto; opacity: 1;" class="sliderPanel"><a nextitem="252" href="javascript:;" style="display: block;" title="click to view another item" cookie="" random="true" list="Aftensang 19
----
Altid frejdig, når du går 23
----
Anemonesangen 153
----
April, april (A) 158
----
At kende sig selv 205
----
At lære er at ville (A) 108
----
At samles, skilles ad 264
----
Barndommens land 114
----
Bedstefar tag dine tænder på (A) 158
----
Bladet i bogen sig vender 126
----
Bliv! Råbte Herren i de tomme sale 148
----
Blomstre som en rosengård 35
----
Blæsten går frisk over Limfjordens vande 83
----
Bornholm, Bornholm, Bornholm 88
----
Cafe Måneskin 257
----
Crying in the rain 289
----
Dagen før 233
----
Dagen går med raske fjed 22
----
Danmark frit (A) 130
----
Danmark, nu blunder den lyse nat 160
----
Danmarks-kanon 235
----
De dybeste lag 44
----
De evige tre (A) 195
----
De levendes land (A) 90
----
De nære ting 209
----
De ord, jeg synger 115
----
De små børns smil 109
----
Decembernat 47
----
Decembersang 48
----
Dejlig er den himmel blå 50
----
Dejlig er jorden 52
----
Dejligst af alle glæder (A) 198
----
Den blå anemone 146
----
Den danske sang 84
----
Den grønne søde vår 134
----
Den himmelblå 66
----
Den kedsom vinter gik sin gang 135
----
Den lille lysegrønne sang 157
----
Den mørke nat forgangen er 5
----
Den røde tråd 258
----
Den signede dag med fryd vi ser 1
----
Den spillemand snapped fiolen fra væg 211
----
Der bor en kraft i sindet 274
----
Der dukker af disen (A) 85
----
Der er et yndigt land 67
----
Der er noget galt i Danmark 234
----
Der er noget i luften 31
----
Der går i nat et glædesbud 42
----
Der stode tre skalke 187
----
Der truer os i tiden (A) 106
----
Derfor kan vort øje glædes 104
----
Desertøren 229
----
Det bedste jeg ved 246
----
Det drømmende vand 232
----
Det er angstens sved, han sveder 45
----
Det er forår, alting klippes ned 156
----
Det er hvidt herude 180
----
Det er i dag et vejr 136
----
Det er lærkernes tid 137
----
Det er os, det er os 131
----
Det er så køhnt, det er så dejle 139
----
Det er så sandt 46
----
Det haver så nyligen regnet 127
----
Det kimer nu til julefest 53
----
Det lysner over agres felt 172
----
Det løvfald, som vi kom så alt for nær 174
----
Det' sørme det' sandt december 48
----
Det var en lørdag aften 191
----
Det øjeblik vi lever i 116
----
DGI blues 268
----
Du danske sommer 161
----
Du gamla, du fria, du fjållhoga Nord 69
----
Du ka' gør', hva' du vil 263
----
Du kom med alt det der var dig 194
----
Du skal plante et træ 119
----
Du, som har tændt millioner af stjerner 26
----
Duerne flyver 276
----
Dybt hælder året i sin gang 41
----
Efterårskanon 244
----
En enkel sang om frihed 227
----
En kæde af evige bånd 267
----
En lærke letted (A) 130
----
En rose så jeg skyde 54
----
En stjerne fødes (L'94) 265
----
En sømand har sin enegang 216
----
En yndig og frydefuld sommertid 193
----
Engang var frihed ordet (A) 110
----
Er lyset for de lærde blot (A) 91
----
Et barn er født i Betlehem 55
----
Et jævnt og muntert virksomt liv 93
----
Fire påskeliljer 145
----
Folkeligt skal alt nu være (A) 94
----
For en fremmed barskt og fattigt 81
----
For længe sid'n, i Betlehem 65
----
Forunderligt at sige 56
----
Forår 155
----
Forår ved Mariager fjord (A) 197
----
Forårsdag 147
----
Forårsskibet 148
----
Fred hviler over land og by (A) 21
----
Frihed er det bedste guld 107
----
Gi' dem himlen tilbage 111
----
Gi' mig en dag 199
----
Giv mig, Gud, en salmetunge 33
----
Glade jul, dejlige jul 58
----
Glæden, sorgen og lykken (A) 198
----
Go jawten, go jawten 212
----
Go' nu nat 27
----
Godmorgen, lille land 82
----
Grundlovssangen 86
----
Græshoppen og valmuen 207
----
Gå stille og tyst gennem verden 105
----
Han kommer med sommer 162
----
Happy Christmas (War is over) 287
----
Har du visor, min vän 200
----
Hele verden er vores 226
----
Hey Jude 293
----
Hil dig, frelser og forsoner 36
----
Hilsen til forårssolen 156
----
Himmel og hav 245
----
Hist, hvor vejen slår en bugt 217
----
Holger Danskes mærke 123
----
Hvad er det, min Marie! (A) 203
----
Hvad solskin er for det sorte muld (A) 92
----
Hvem sidder der bag skærmen 220
----
Hvergang en sommer 167
----
Hvide skyer falder ned 245
----
Hvor smiler fager den danske kyst 76
----
Hvorfor går min elskede 208
----
Hymnen til Afrika 112
----
Højt fra træets grønne top 60
----
I al sin glans nu stråler solen 39
----
I alle de riger og lande 123
----
I dag er landet vort 87
----
I Danmark er jeg født (A) 78
----
I det spæde morgengry 9
----
I hjerterne begynder 272
----
I skovens dybe, stille ro (A) 20
----
I sne står urt og busk i skjul 182
----
I østen stiger solen op 3
----
Imagine 292
----
Imellem Esbjerg og Fanø 262
----
Ind til dig igen 206
----
Ind under jul, hvor er det trist 49
----
Ja, vi elsker dette landet 70
----
Jeg bærer med smil min byrde 97
----
Jeg ejer både mark og eng 225
----
Jeg elsker de grønne lunde 75
----
Jeg elsker den brogede verden 98
----
Jeg fandt en sang på vejen 247
----
Jeg går i solen og traller 236
----
Jeg har fanget mig en myg 237
----
Jeg kender et land (A) 90
----
Jeg plukker fløjlsgræs 149
----
Jeg rutter med glædens 99
----
Jeg ser de bøgelyse øer 74
----
Jeg ved en lærkerede 151
----
Jeg ved, hvor der findes en have så skøn 73
----
Jeg vil male dagen blå 228
----
Jens vejmand 220
----
Jo, jo gøgleri er en nobel kunst 100
----
Jordens åndedrag 117
----
Julen har bragt velsignet bud 57
----
Juletræet med sin pynt 61
----
Juni 168
----
Jyden han æ stærk å sej 210
----
Jylland mellem tvende have 72
----
Kald det kærlighed 201
----
Kalendervender Tage 248
----
Kirsten og vejen fra Gurre 174
----
Kom, fred, og fyld den hele dag 231
----
Kom, glade overgivenhed 218
----
Kom, maj, du søde milde 133
----
Kom og dans 251
----
Kom, tro, og kom, glæde 64
----
Kommer hid, l piger små 124
----
Kong Kristjan stod ved højen mast 283
----
Kringsatt av fjender 101
----
Kumbaya 285
----
Kærlighedsrosen 193
----
Lad det leve 263
----
Leaving on a Jet-plane 295
----
Lermennesket 113
----
Let it be 291
----
Let it grow 296
----
Lille Messias 63
----
Livet er en morgengave (A) 118
----
Livstræet 120
----
Love is all around 297
----
Lovsynger Herren 34
----
Luk døren op og se 150
----
Lysfyldt morgen 125
----
Lær mig, nattens stjerne 17
----
Løft dit hoved, du raske gut 89
----
Mads Doss 221
----
Marken er mejet 169
----
Mary boy child 288
----
Med kåde smil den lyse sol 80
----
Med mor til fodbold 250
----
Menneskelivet er underligt 96
----
Mi nååbo, Pe Sme 219
----
Midsommervisen (A) 164
----
Morgengry 10
----
Morgenstund har guld i mund (A) 6
----
Musens sang 213
----
Mørk er november 178
----
Mørkets sang 273
----
Nanna 261
----
Natten er blid 18
----
Natten er så stille 16
----
Nattergalen, kender du den 154
----
Nattergalen på sin gren 259
----
Nocturne 24
----
Noget om helte (A) 118
----
Noget om skærsommernætter 163
----
Nu er dagen fuld af sang 140
----
Nu er det længe siden 173
----
Nu er jord og himmel stille (A) 25
----
Nu falmer skoven trindt om land (A) 175
----
Nu har vi altså jul igen 62
----
Nu hviler mark og enge 15
----
Nu lyser løv i lunde 141
----
Nu nejer blomsterne 163
----
Nu rinder solen op af østerlide (A) 2
----
Nu skal det åbenbares (A) 95
----
Nu skal vi ha' gilde 241
----
Nu tændes tusind julelys 51
----
Når egene knoppes 166
----
Når vinteren rinder i grøft og i grav 142
----
O come, all ye faithful 284
----
O, Færø, så fager 71
----
Og det blev vår 152
----
Ole sad på en knold og sang 222
----
Om lidt 271
----
One hand, One heart 299
----
Op, al den ting, som Gud har gjort 32
----
Opvåvni 144
----
Papirsklip 256
----
Per spelmann 186
----
Påske 150
----
Påskeblomst! Hvad vil du her 38
----
Ramund 188
----
Regnvejrsdag i november 228
----
Romeo 260
----
Roselil og hendes moder 189
----
Ræven er ude med halen så lang 202
----
Røverne fra Kardemommeby 249
----
Sang i det grønne 129
----
Sangen har lysning 102
----
Santa Claus is comin' to town 286
----
Sat her i forvirringstiden 121
----
Se, det summer af sol over engen (A) 159
----
Se, hvilken morgenstund 11
----
Se Norges blomsterdal 223
----
Se, nu stiger solen af havets skød (A) 4
----
Sensommerkanon 242
----
Sensommervise 171
----
Septembers himmel 170
----
Sig månen langsomt hæver 12
----
Sig nærmer tiden 103
----
Skal vi ikke være venner 270
----
Skipper Klements morgensang 132
----
Skoven er så underfuld 177
----
Skuld gammel venskab 224
----
Skyerne gråne 30
----
Skærm jeres huse med grav og planke 132
----
Skønjomfruen går i dansen 190
----
Sneflokke kommer vrimlende 181
----
Snemand Frost og frøken Tø (A) 183
----
Solhvervssang 179
----
Solkanon 243
----
Solsikke 176
----
Som dybest brønd 128
----
Som en rejselysten flåde 77
----
Som forårssolen morgenrød 37
----
Sommerens ø 167
----
Sommersalme 40
----
Soon and very soon 298
----
Sov på min arm 24
----
Spurven sidder stum bag kvist 185
----
Stenen slår smut på det danske vand 275
----
Stilfærdigt farvel 266
----
Stille, hjerte, sol går ned 13
----
Stjernefart 253
----
Stjerner dukker frem 18
----
Storken 162
----
Summer nights (Grease) 306
----
Svantes lykkelige dag 11
----
Svinehyrden 252
----
Swing low 301
----
Sæt grammofonen i stå 214
----
Søren Bramfris lærkesang 215
----
Så længe skuden kan gå 279
----
Så tænder vi et lys i kvæld 28
----
Tag del i det, der er din tid 269
----
Take it easy, boy, boy 304
----
Tears in heaven 302
----
That's what friends are for 309
----
The Rose 305
----
Those were the days 308
----
Til Dem, hr. præsident 229
----
Til himlene rækker din miskundhed, Gi 1 8
----
Til min Marie (A) 203
----
Til ungdommen 101
----
Till havs med solfyllda segel 240
----
To be or not to be 303
----
To gyldne sommerfugle (A) 197
----
Tusind stykker 282
----
Underlige aftenlufte 14
----
Valmuevejen 254
----
Velkommen i den grønne lund 129
----
Velkommen igen, Guds engle små (A; 59
----
Velkommen, lærkelil (A) 143
----
Vem kan segla forutan vind 192
----
Veninde, tag frakken og støvlerne på 47
----
Vennekredsen 238
----
Vennesang 277
----
Veronica 196
----
Vi, der valgte regnen 122
----
Vi elsker vort land (A) 164
----
Vi vil plante et træ 230
----
Vipper springe over klinge 165
----
Visen om de atten svaner 204
----
VLTJ 280
----
Vor sol er blevet kold (A) 179
----
Vort modersmål er dejligt 79
----
Vær lidt varsom 184
----
Vær velkommen, Herrens år (advent 29
----
Vær velkommen, Herrens år (nytår) 43
----
Være vind 278
----
Vågn nu op af dine drømme 239
----
Vågn op og slå på dine strenge 7
----
Våren er i luften 138
----
Vårt land, vårt land, vårt fosterland 68
----
Vårvise 255
----
War is over 287
----
What a wonderful world 300
----
Whiskey in the Jar 307
----
Wonderful tonight 294
----
Yesterday 290
----
Æbler lyser rødt på træernes grene 171
----
Åbent landskab 281" id="20090207.10553101000.41619615659178666" class="QOTD">Se, det summer af sol over engen (A) 159</a></div></td></tr><tr class="evenRow"><td>2</td><td><div style="overflow: hidden; display: block; height: auto; opacity: 1;" class="sliderPanel"><a nextitem="97" href="javascript:;" style="display: block;" title="click to view another item" cookie="" random="true" list="Aftensang 19
----
Altid frejdig, når du går 23
----
Anemonesangen 153
----
April, april (A) 158
----
At kende sig selv 205
----
At lære er at ville (A) 108
----
At samles, skilles ad 264
----
Barndommens land 114
----
Bedstefar tag dine tænder på (A) 158
----
Bladet i bogen sig vender 126
----
Bliv! Råbte Herren i de tomme sale 148
----
Blomstre som en rosengård 35
----
Blæsten går frisk over Limfjordens vande 83
----
Bornholm, Bornholm, Bornholm 88
----
Cafe Måneskin 257
----
Crying in the rain 289
----
Dagen før 233
----
Dagen går med raske fjed 22
----
Danmark frit (A) 130
----
Danmark, nu blunder den lyse nat 160
----
Danmarks-kanon 235
----
De dybeste lag 44
----
De evige tre (A) 195
----
De levendes land (A) 90
----
De nære ting 209
----
De ord, jeg synger 115
----
De små børns smil 109
----
Decembernat 47
----
Decembersang 48
----
Dejlig er den himmel blå 50
----
Dejlig er jorden 52
----
Dejligst af alle glæder (A) 198
----
Den blå anemone 146
----
Den danske sang 84
----
Den grønne søde vår 134
----
Den himmelblå 66
----
Den kedsom vinter gik sin gang 135
----
Den lille lysegrønne sang 157
----
Den mørke nat forgangen er 5
----
Den røde tråd 258
----
Den signede dag med fryd vi ser 1
----
Den spillemand snapped fiolen fra væg 211
----
Der bor en kraft i sindet 274
----
Der dukker af disen (A) 85
----
Der er et yndigt land 67
----
Der er noget galt i Danmark 234
----
Der er noget i luften 31
----
Der går i nat et glædesbud 42
----
Der stode tre skalke 187
----
Der truer os i tiden (A) 106
----
Derfor kan vort øje glædes 104
----
Desertøren 229
----
Det bedste jeg ved 246
----
Det drømmende vand 232
----
Det er angstens sved, han sveder 45
----
Det er forår, alting klippes ned 156
----
Det er hvidt herude 180
----
Det er i dag et vejr 136
----
Det er lærkernes tid 137
----
Det er os, det er os 131
----
Det er så køhnt, det er så dejle 139
----
Det er så sandt 46
----
Det haver så nyligen regnet 127
----
Det kimer nu til julefest 53
----
Det lysner over agres felt 172
----
Det løvfald, som vi kom så alt for nær 174
----
Det' sørme det' sandt december 48
----
Det var en lørdag aften 191
----
Det øjeblik vi lever i 116
----
DGI blues 268
----
Du danske sommer 161
----
Du gamla, du fria, du fjållhoga Nord 69
----
Du ka' gør', hva' du vil 263
----
Du kom med alt det der var dig 194
----
Du skal plante et træ 119
----
Du, som har tændt millioner af stjerner 26
----
Duerne flyver 276
----
Dybt hælder året i sin gang 41
----
Efterårskanon 244
----
En enkel sang om frihed 227
----
En kæde af evige bånd 267
----
En lærke letted (A) 130
----
En rose så jeg skyde 54
----
En stjerne fødes (L'94) 265
----
En sømand har sin enegang 216
----
En yndig og frydefuld sommertid 193
----
Engang var frihed ordet (A) 110
----
Er lyset for de lærde blot (A) 91
----
Et barn er født i Betlehem 55
----
Et jævnt og muntert virksomt liv 93
----
Fire påskeliljer 145
----
Folkeligt skal alt nu være (A) 94
----
For en fremmed barskt og fattigt 81
----
For længe sid'n, i Betlehem 65
----
Forunderligt at sige 56
----
Forår 155
----
Forår ved Mariager fjord (A) 197
----
Forårsdag 147
----
Forårsskibet 148
----
Fred hviler over land og by (A) 21
----
Frihed er det bedste guld 107
----
Gi' dem himlen tilbage 111
----
Gi' mig en dag 199
----
Giv mig, Gud, en salmetunge 33
----
Glade jul, dejlige jul 58
----
Glæden, sorgen og lykken (A) 198
----
Go jawten, go jawten 212
----
Go' nu nat 27
----
Godmorgen, lille land 82
----
Grundlovssangen 86
----
Græshoppen og valmuen 207
----
Gå stille og tyst gennem verden 105
----
Han kommer med sommer 162
----
Happy Christmas (War is over) 287
----
Har du visor, min vän 200
----
Hele verden er vores 226
----
Hey Jude 293
----
Hil dig, frelser og forsoner 36
----
Hilsen til forårssolen 156
----
Himmel og hav 245
----
Hist, hvor vejen slår en bugt 217
----
Holger Danskes mærke 123
----
Hvad er det, min Marie! (A) 203
----
Hvad solskin er for det sorte muld (A) 92
----
Hvem sidder der bag skærmen 220
----
Hvergang en sommer 167
----
Hvide skyer falder ned 245
----
Hvor smiler fager den danske kyst 76
----
Hvorfor går min elskede 208
----
Hymnen til Afrika 112
----
Højt fra træets grønne top 60
----
I al sin glans nu stråler solen 39
----
I alle de riger og lande 123
----
I dag er landet vort 87
----
I Danmark er jeg født (A) 78
----
I det spæde morgengry 9
----
I hjerterne begynder 272
----
I skovens dybe, stille ro (A) 20
----
I sne står urt og busk i skjul 182
----
I østen stiger solen op 3
----
Imagine 292
----
Imellem Esbjerg og Fanø 262
----
Ind til dig igen 206
----
Ind under jul, hvor er det trist 49
----
Ja, vi elsker dette landet 70
----
Jeg bærer med smil min byrde 97
----
Jeg ejer både mark og eng 225
----
Jeg elsker de grønne lunde 75
----
Jeg elsker den brogede verden 98
----
Jeg fandt en sang på vejen 247
----
Jeg går i solen og traller 236
----
Jeg har fanget mig en myg 237
----
Jeg kender et land (A) 90
----
Jeg plukker fløjlsgræs 149
----
Jeg rutter med glædens 99
----
Jeg ser de bøgelyse øer 74
----
Jeg ved en lærkerede 151
----
Jeg ved, hvor der findes en have så skøn 73
----
Jeg vil male dagen blå 228
----
Jens vejmand 220
----
Jo, jo gøgleri er en nobel kunst 100
----
Jordens åndedrag 117
----
Julen har bragt velsignet bud 57
----
Juletræet med sin pynt 61
----
Juni 168
----
Jyden han æ stærk å sej 210
----
Jylland mellem tvende have 72
----
Kald det kærlighed 201
----
Kalendervender Tage 248
----
Kirsten og vejen fra Gurre 174
----
Kom, fred, og fyld den hele dag 231
----
Kom, glade overgivenhed 218
----
Kom, maj, du søde milde 133
----
Kom og dans 251
----
Kom, tro, og kom, glæde 64
----
Kommer hid, l piger små 124
----
Kong Kristjan stod ved højen mast 283
----
Kringsatt av fjender 101
----
Kumbaya 285
----
Kærlighedsrosen 193
----
Lad det leve 263
----
Leaving on a Jet-plane 295
----
Lermennesket 113
----
Let it be 291
----
Let it grow 296
----
Lille Messias 63
----
Livet er en morgengave (A) 118
----
Livstræet 120
----
Love is all around 297
----
Lovsynger Herren 34
----
Luk døren op og se 150
----
Lysfyldt morgen 125
----
Lær mig, nattens stjerne 17
----
Løft dit hoved, du raske gut 89
----
Mads Doss 221
----
Marken er mejet 169
----
Mary boy child 288
----
Med kåde smil den lyse sol 80
----
Med mor til fodbold 250
----
Menneskelivet er underligt 96
----
Mi nååbo, Pe Sme 219
----
Midsommervisen (A) 164
----
Morgengry 10
----
Morgenstund har guld i mund (A) 6
----
Musens sang 213
----
Mørk er november 178
----
Mørkets sang 273
----
Nanna 261
----
Natten er blid 18
----
Natten er så stille 16
----
Nattergalen, kender du den 154
----
Nattergalen på sin gren 259
----
Nocturne 24
----
Noget om helte (A) 118
----
Noget om skærsommernætter 163
----
Nu er dagen fuld af sang 140
----
Nu er det længe siden 173
----
Nu er jord og himmel stille (A) 25
----
Nu falmer skoven trindt om land (A) 175
----
Nu har vi altså jul igen 62
----
Nu hviler mark og enge 15
----
Nu lyser løv i lunde 141
----
Nu nejer blomsterne 163
----
Nu rinder solen op af østerlide (A) 2
----
Nu skal det åbenbares (A) 95
----
Nu skal vi ha' gilde 241
----
Nu tændes tusind julelys 51
----
Når egene knoppes 166
----
Når vinteren rinder i grøft og i grav 142
----
O come, all ye faithful 284
----
O, Færø, så fager 71
----
Og det blev vår 152
----
Ole sad på en knold og sang 222
----
Om lidt 271
----
One hand, One heart 299
----
Op, al den ting, som Gud har gjort 32
----
Opvåvni 144
----
Papirsklip 256
----
Per spelmann 186
----
Påske 150
----
Påskeblomst! Hvad vil du her 38
----
Ramund 188
----
Regnvejrsdag i november 228
----
Romeo 260
----
Roselil og hendes moder 189
----
Ræven er ude med halen så lang 202
----
Røverne fra Kardemommeby 249
----
Sang i det grønne 129
----
Sangen har lysning 102
----
Santa Claus is comin' to town 286
----
Sat her i forvirringstiden 121
----
Se, det summer af sol over engen (A) 159
----
Se, hvilken morgenstund 11
----
Se Norges blomsterdal 223
----
Se, nu stiger solen af havets skød (A) 4
----
Sensommerkanon 242
----
Sensommervise 171
----
Septembers himmel 170
----
Sig månen langsomt hæver 12
----
Sig nærmer tiden 103
----
Skal vi ikke være venner 270
----
Skipper Klements morgensang 132
----
Skoven er så underfuld 177
----
Skuld gammel venskab 224
----
Skyerne gråne 30
----
Skærm jeres huse med grav og planke 132
----
Skønjomfruen går i dansen 190
----
Sneflokke kommer vrimlende 181
----
Snemand Frost og frøken Tø (A) 183
----
Solhvervssang 179
----
Solkanon 243
----
Solsikke 176
----
Som dybest brønd 128
----
Som en rejselysten flåde 77
----
Som forårssolen morgenrød 37
----
Sommerens ø 167
----
Sommersalme 40
----
Soon and very soon 298
----
Sov på min arm 24
----
Spurven sidder stum bag kvist 185
----
Stenen slår smut på det danske vand 275
----
Stilfærdigt farvel 266
----
Stille, hjerte, sol går ned 13
----
Stjernefart 253
----
Stjerner dukker frem 18
----
Storken 162
----
Summer nights (Grease) 306
----
Svantes lykkelige dag 11
----
Svinehyrden 252
----
Swing low 301
----
Sæt grammofonen i stå 214
----
Søren Bramfris lærkesang 215
----
Så længe skuden kan gå 279
----
Så tænder vi et lys i kvæld 28
----
Tag del i det, der er din tid 269
----
Take it easy, boy, boy 304
----
Tears in heaven 302
----
That's what friends are for 309
----
The Rose 305
----
Those were the days 308
----
Til Dem, hr. præsident 229
----
Til himlene rækker din miskundhed, Gi 1 8
----
Til min Marie (A) 203
----
Til ungdommen 101
----
Till havs med solfyllda segel 240
----
To be or not to be 303
----
To gyldne sommerfugle (A) 197
----
Tusind stykker 282
----
Underlige aftenlufte 14
----
Valmuevejen 254
----
Velkommen i den grønne lund 129
----
Velkommen igen, Guds engle små (A; 59
----
Velkommen, lærkelil (A) 143
----
Vem kan segla forutan vind 192
----
Veninde, tag frakken og støvlerne på 47
----
Vennekredsen 238
----
Vennesang 277
----
Veronica 196
----
Vi, der valgte regnen 122
----
Vi elsker vort land (A) 164
----
Vi vil plante et træ 230
----
Vipper springe over klinge 165
----
Visen om de atten svaner 204
----
VLTJ 280
----
Vor sol er blevet kold (A) 179
----
Vort modersmål er dejligt 79
----
Vær lidt varsom 184
----
Vær velkommen, Herrens år (advent 29
----
Vær velkommen, Herrens år (nytår) 43
----
Være vind 278
----
Vågn nu op af dine drømme 239
----
Vågn op og slå på dine strenge 7
----
Våren er i luften 138
----
Vårt land, vårt land, vårt fosterland 68
----
Vårvise 255
----
War is over 287
----
What a wonderful world 300
----
Whiskey in the Jar 307
----
Wonderful tonight 294
----
Yesterday 290
----
Æbler lyser rødt på træernes grene 171
----
Åbent landskab 281" id="20090207.10553101700.7117557776705948" class="QOTD">Forår ved Mariager fjord (A) 197</a></div></td></tr><tr class="oddRow"><td>3</td><td><div style="overflow: hidden; display: block; height: auto; opacity: 1;" class="sliderPanel"><a nextitem="250" href="javascript:;" style="display: block;" title="click to view another item" cookie="" random="true" list="Aftensang 19
----
Altid frejdig, når du går 23
----
Anemonesangen 153
----
April, april (A) 158
----
At kende sig selv 205
----
At lære er at ville (A) 108
----
At samles, skilles ad 264
----
Barndommens land 114
----
Bedstefar tag dine tænder på (A) 158
----
Bladet i bogen sig vender 126
----
Bliv! Råbte Herren i de tomme sale 148
----
Blomstre som en rosengård 35
----
Blæsten går frisk over Limfjordens vande 83
----
Bornholm, Bornholm, Bornholm 88
----
Cafe Måneskin 257
----
Crying in the rain 289
----
Dagen før 233
----
Dagen går med raske fjed 22
----
Danmark frit (A) 130
----
Danmark, nu blunder den lyse nat 160
----
Danmarks-kanon 235
----
De dybeste lag 44
----
De evige tre (A) 195
----
De levendes land (A) 90
----
De nære ting 209
----
De ord, jeg synger 115
----
De små børns smil 109
----
Decembernat 47
----
Decembersang 48
----
Dejlig er den himmel blå 50
----
Dejlig er jorden 52
----
Dejligst af alle glæder (A) 198
----
Den blå anemone 146
----
Den danske sang 84
----
Den grønne søde vår 134
----
Den himmelblå 66
----
Den kedsom vinter gik sin gang 135
----
Den lille lysegrønne sang 157
----
Den mørke nat forgangen er 5
----
Den røde tråd 258
----
Den signede dag med fryd vi ser 1
----
Den spillemand snapped fiolen fra væg 211
----
Der bor en kraft i sindet 274
----
Der dukker af disen (A) 85
----
Der er et yndigt land 67
----
Der er noget galt i Danmark 234
----
Der er noget i luften 31
----
Der går i nat et glædesbud 42
----
Der stode tre skalke 187
----
Der truer os i tiden (A) 106
----
Derfor kan vort øje glædes 104
----
Desertøren 229
----
Det bedste jeg ved 246
----
Det drømmende vand 232
----
Det er angstens sved, han sveder 45
----
Det er forår, alting klippes ned 156
----
Det er hvidt herude 180
----
Det er i dag et vejr 136
----
Det er lærkernes tid 137
----
Det er os, det er os 131
----
Det er så køhnt, det er så dejle 139
----
Det er så sandt 46
----
Det haver så nyligen regnet 127
----
Det kimer nu til julefest 53
----
Det lysner over agres felt 172
----
Det løvfald, som vi kom så alt for nær 174
----
Det' sørme det' sandt december 48
----
Det var en lørdag aften 191
----
Det øjeblik vi lever i 116
----
DGI blues 268
----
Du danske sommer 161
----
Du gamla, du fria, du fjållhoga Nord 69
----
Du ka' gør', hva' du vil 263
----
Du kom med alt det der var dig 194
----
Du skal plante et træ 119
----
Du, som har tændt millioner af stjerner 26
----
Duerne flyver 276
----
Dybt hælder året i sin gang 41
----
Efterårskanon 244
----
En enkel sang om frihed 227
----
En kæde af evige bånd 267
----
En lærke letted (A) 130
----
En rose så jeg skyde 54
----
En stjerne fødes (L'94) 265
----
En sømand har sin enegang 216
----
En yndig og frydefuld sommertid 193
----
Engang var frihed ordet (A) 110
----
Er lyset for de lærde blot (A) 91
----
Et barn er født i Betlehem 55
----
Et jævnt og muntert virksomt liv 93
----
Fire påskeliljer 145
----
Folkeligt skal alt nu være (A) 94
----
For en fremmed barskt og fattigt 81
----
For længe sid'n, i Betlehem 65
----
Forunderligt at sige 56
----
Forår 155
----
Forår ved Mariager fjord (A) 197
----
Forårsdag 147
----
Forårsskibet 148
----
Fred hviler over land og by (A) 21
----
Frihed er det bedste guld 107
----
Gi' dem himlen tilbage 111
----
Gi' mig en dag 199
----
Giv mig, Gud, en salmetunge 33
----
Glade jul, dejlige jul 58
----
Glæden, sorgen og lykken (A) 198
----
Go jawten, go jawten 212
----
Go' nu nat 27
----
Godmorgen, lille land 82
----
Grundlovssangen 86
----
Græshoppen og valmuen 207
----
Gå stille og tyst gennem verden 105
----
Han kommer med sommer 162
----
Happy Christmas (War is over) 287
----
Har du visor, min vän 200
----
Hele verden er vores 226
----
Hey Jude 293
----
Hil dig, frelser og forsoner 36
----
Hilsen til forårssolen 156
----
Himmel og hav 245
----
Hist, hvor vejen slår en bugt 217
----
Holger Danskes mærke 123
----
Hvad er det, min Marie! (A) 203
----
Hvad solskin er for det sorte muld (A) 92
----
Hvem sidder der bag skærmen 220
----
Hvergang en sommer 167
----
Hvide skyer falder ned 245
----
Hvor smiler fager den danske kyst 76
----
Hvorfor går min elskede 208
----
Hymnen til Afrika 112
----
Højt fra træets grønne top 60
----
I al sin glans nu stråler solen 39
----
I alle de riger og lande 123
----
I dag er landet vort 87
----
I Danmark er jeg født (A) 78
----
I det spæde morgengry 9
----
I hjerterne begynder 272
----
I skovens dybe, stille ro (A) 20
----
I sne står urt og busk i skjul 182
----
I østen stiger solen op 3
----
Imagine 292
----
Imellem Esbjerg og Fanø 262
----
Ind til dig igen 206
----
Ind under jul, hvor er det trist 49
----
Ja, vi elsker dette landet 70
----
Jeg bærer med smil min byrde 97
----
Jeg ejer både mark og eng 225
----
Jeg elsker de grønne lunde 75
----
Jeg elsker den brogede verden 98
----
Jeg fandt en sang på vejen 247
----
Jeg går i solen og traller 236
----
Jeg har fanget mig en myg 237
----
Jeg kender et land (A) 90
----
Jeg plukker fløjlsgræs 149
----
Jeg rutter med glædens 99
----
Jeg ser de bøgelyse øer 74
----
Jeg ved en lærkerede 151
----
Jeg ved, hvor der findes en have så skøn 73
----
Jeg vil male dagen blå 228
----
Jens vejmand 220
----
Jo, jo gøgleri er en nobel kunst 100
----
Jordens åndedrag 117
----
Julen har bragt velsignet bud 57
----
Juletræet med sin pynt 61
----
Juni 168
----
Jyden han æ stærk å sej 210
----
Jylland mellem tvende have 72
----
Kald det kærlighed 201
----
Kalendervender Tage 248
----
Kirsten og vejen fra Gurre 174
----
Kom, fred, og fyld den hele dag 231
----
Kom, glade overgivenhed 218
----
Kom, maj, du søde milde 133
----
Kom og dans 251
----
Kom, tro, og kom, glæde 64
----
Kommer hid, l piger små 124
----
Kong Kristjan stod ved højen mast 283
----
Kringsatt av fjender 101
----
Kumbaya 285
----
Kærlighedsrosen 193
----
Lad det leve 263
----
Leaving on a Jet-plane 295
----
Lermennesket 113
----
Let it be 291
----
Let it grow 296
----
Lille Messias 63
----
Livet er en morgengave (A) 118
----
Livstræet 120
----
Love is all around 297
----
Lovsynger Herren 34
----
Luk døren op og se 150
----
Lysfyldt morgen 125
----
Lær mig, nattens stjerne 17
----
Løft dit hoved, du raske gut 89
----
Mads Doss 221
----
Marken er mejet 169
----
Mary boy child 288
----
Med kåde smil den lyse sol 80
----
Med mor til fodbold 250
----
Menneskelivet er underligt 96
----
Mi nååbo, Pe Sme 219
----
Midsommervisen (A) 164
----
Morgengry 10
----
Morgenstund har guld i mund (A) 6
----
Musens sang 213
----
Mørk er november 178
----
Mørkets sang 273
----
Nanna 261
----
Natten er blid 18
----
Natten er så stille 16
----
Nattergalen, kender du den 154
----
Nattergalen på sin gren 259
----
Nocturne 24
----
Noget om helte (A) 118
----
Noget om skærsommernætter 163
----
Nu er dagen fuld af sang 140
----
Nu er det længe siden 173
----
Nu er jord og himmel stille (A) 25
----
Nu falmer skoven trindt om land (A) 175
----
Nu har vi altså jul igen 62
----
Nu hviler mark og enge 15
----
Nu lyser løv i lunde 141
----
Nu nejer blomsterne 163
----
Nu rinder solen op af østerlide (A) 2
----
Nu skal det åbenbares (A) 95
----
Nu skal vi ha' gilde 241
----
Nu tændes tusind julelys 51
----
Når egene knoppes 166
----
Når vinteren rinder i grøft og i grav 142
----
O come, all ye faithful 284
----
O, Færø, så fager 71
----
Og det blev vår 152
----
Ole sad på en knold og sang 222
----
Om lidt 271
----
One hand, One heart 299
----
Op, al den ting, som Gud har gjort 32
----
Opvåvni 144
----
Papirsklip 256
----
Per spelmann 186
----
Påske 150
----
Påskeblomst! Hvad vil du her 38
----
Ramund 188
----
Regnvejrsdag i november 228
----
Romeo 260
----
Roselil og hendes moder 189
----
Ræven er ude med halen så lang 202
----
Røverne fra Kardemommeby 249
----
Sang i det grønne 129
----
Sangen har lysning 102
----
Santa Claus is comin' to town 286
----
Sat her i forvirringstiden 121
----
Se, det summer af sol over engen (A) 159
----
Se, hvilken morgenstund 11
----
Se Norges blomsterdal 223
----
Se, nu stiger solen af havets skød (A) 4
----
Sensommerkanon 242
----
Sensommervise 171
----
Septembers himmel 170
----
Sig månen langsomt hæver 12
----
Sig nærmer tiden 103
----
Skal vi ikke være venner 270
----
Skipper Klements morgensang 132
----
Skoven er så underfuld 177
----
Skuld gammel venskab 224
----
Skyerne gråne 30
----
Skærm jeres huse med grav og planke 132
----
Skønjomfruen går i dansen 190
----
Sneflokke kommer vrimlende 181
----
Snemand Frost og frøken Tø (A) 183
----
Solhvervssang 179
----
Solkanon 243
----
Solsikke 176
----
Som dybest brønd 128
----
Som en rejselysten flåde 77
----
Som forårssolen morgenrød 37
----
Sommerens ø 167
----
Sommersalme 40
----
Soon and very soon 298
----
Sov på min arm 24
----
Spurven sidder stum bag kvist 185
----
Stenen slår smut på det danske vand 275
----
Stilfærdigt farvel 266
----
Stille, hjerte, sol går ned 13
----
Stjernefart 253
----
Stjerner dukker frem 18
----
Storken 162
----
Summer nights (Grease) 306
----
Svantes lykkelige dag 11
----
Svinehyrden 252
----
Swing low 301
----
Sæt grammofonen i stå 214
----
Søren Bramfris lærkesang 215
----
Så længe skuden kan gå 279
----
Så tænder vi et lys i kvæld 28
----
Tag del i det, der er din tid 269
----
Take it easy, boy, boy 304
----
Tears in heaven 302
----
That's what friends are for 309
----
The Rose 305
----
Those were the days 308
----
Til Dem, hr. præsident 229
----
Til himlene rækker din miskundhed, Gi 1 8
----
Til min Marie (A) 203
----
Til ungdommen 101
----
Till havs med solfyllda segel 240
----
To be or not to be 303
----
To gyldne sommerfugle (A) 197
----
Tusind stykker 282
----
Underlige aftenlufte 14
----
Valmuevejen 254
----
Velkommen i den grønne lund 129
----
Velkommen igen, Guds engle små (A; 59
----
Velkommen, lærkelil (A) 143
----
Vem kan segla forutan vind 192
----
Veninde, tag frakken og støvlerne på 47
----
Vennekredsen 238
----
Vennesang 277
----
Veronica 196
----
Vi, der valgte regnen 122
----
Vi elsker vort land (A) 164
----
Vi vil plante et træ 230
----
Vipper springe over klinge 165
----
Visen om de atten svaner 204
----
VLTJ 280
----
Vor sol er blevet kold (A) 179
----
Vort modersmål er dejligt 79
----
Vær lidt varsom 184
----
Vær velkommen, Herrens år (advent 29
----
Vær velkommen, Herrens år (nytår) 43
----
Være vind 278
----
Vågn nu op af dine drømme 239
----
Vågn op og slå på dine strenge 7
----
Våren er i luften 138
----
Vårt land, vårt land, vårt fosterland 68
----
Vårvise 255
----
War is over 287
----
What a wonderful world 300
----
Whiskey in the Jar 307
----
Wonderful tonight 294
----
Yesterday 290
----
Æbler lyser rødt på træernes grene 171
----
Åbent landskab 281" id="20090207.10553101880.2568796200249466" class="QOTD">Santa Claus is comin' to town 286</a></div></td></tr><tr class="evenRow"><td>4</td><td><div style="overflow: hidden; display: block; height: auto; opacity: 1;" class="sliderPanel"><a nextitem="277" href="javascript:;" style="display: block;" title="click to view another item" cookie="" random="true" list="Aftensang 19
----
Altid frejdig, når du går 23
----
Anemonesangen 153
----
April, april (A) 158
----
At kende sig selv 205
----
At lære er at ville (A) 108
----
At samles, skilles ad 264
----
Barndommens land 114
----
Bedstefar tag dine tænder på (A) 158
----
Bladet i bogen sig vender 126
----
Bliv! Råbte Herren i de tomme sale 148
----
Blomstre som en rosengård 35
----
Blæsten går frisk over Limfjordens vande 83
----
Bornholm, Bornholm, Bornholm 88
----
Cafe Måneskin 257
----
Crying in the rain 289
----
Dagen før 233
----
Dagen går med raske fjed 22
----
Danmark frit (A) 130
----
Danmark, nu blunder den lyse nat 160
----
Danmarks-kanon 235
----
De dybeste lag 44
----
De evige tre (A) 195
----
De levendes land (A) 90
----
De nære ting 209
----
De ord, jeg synger 115
----
De små børns smil 109
----
Decembernat 47
----
Decembersang 48
----
Dejlig er den himmel blå 50
----
Dejlig er jorden 52
----
Dejligst af alle glæder (A) 198
----
Den blå anemone 146
----
Den danske sang 84
----
Den grønne søde vår 134
----
Den himmelblå 66
----
Den kedsom vinter gik sin gang 135
----
Den lille lysegrønne sang 157
----
Den mørke nat forgangen er 5
----
Den røde tråd 258
----
Den signede dag med fryd vi ser 1
----
Den spillemand snapped fiolen fra væg 211
----
Der bor en kraft i sindet 274
----
Der dukker af disen (A) 85
----
Der er et yndigt land 67
----
Der er noget galt i Danmark 234
----
Der er noget i luften 31
----
Der går i nat et glædesbud 42
----
Der stode tre skalke 187
----
Der truer os i tiden (A) 106
----
Derfor kan vort øje glædes 104
----
Desertøren 229
----
Det bedste jeg ved 246
----
Det drømmende vand 232
----
Det er angstens sved, han sveder 45
----
Det er forår, alting klippes ned 156
----
Det er hvidt herude 180
----
Det er i dag et vejr 136
----
Det er lærkernes tid 137
----
Det er os, det er os 131
----
Det er så køhnt, det er så dejle 139
----
Det er så sandt 46
----
Det haver så nyligen regnet 127
----
Det kimer nu til julefest 53
----
Det lysner over agres felt 172
----
Det løvfald, som vi kom så alt for nær 174
----
Det' sørme det' sandt december 48
----
Det var en lørdag aften 191
----
Det øjeblik vi lever i 116
----
DGI blues 268
----
Du danske sommer 161
----
Du gamla, du fria, du fjållhoga Nord 69
----
Du ka' gør', hva' du vil 263
----
Du kom med alt det der var dig 194
----
Du skal plante et træ 119
----
Du, som har tændt millioner af stjerner 26
----
Duerne flyver 276
----
Dybt hælder året i sin gang 41
----
Efterårskanon 244
----
En enkel sang om frihed 227
----
En kæde af evige bånd 267
----
En lærke letted (A) 130
----
En rose så jeg skyde 54
----
En stjerne fødes (L'94) 265
----
En sømand har sin enegang 216
----
En yndig og frydefuld sommertid 193
----
Engang var frihed ordet (A) 110
----
Er lyset for de lærde blot (A) 91
----
Et barn er født i Betlehem 55
----
Et jævnt og muntert virksomt liv 93
----
Fire påskeliljer 145
----
Folkeligt skal alt nu være (A) 94
----
For en fremmed barskt og fattigt 81
----
For længe sid'n, i Betlehem 65
----
Forunderligt at sige 56
----
Forår 155
----
Forår ved Mariager fjord (A) 197
----
Forårsdag 147
----
Forårsskibet 148
----
Fred hviler over land og by (A) 21
----
Frihed er det bedste guld 107
----
Gi' dem himlen tilbage 111
----
Gi' mig en dag 199
----
Giv mig, Gud, en salmetunge 33
----
Glade jul, dejlige jul 58
----
Glæden, sorgen og lykken (A) 198
----
Go jawten, go jawten 212
----
Go' nu nat 27
----
Godmorgen, lille land 82
----
Grundlovssangen 86
----
Græshoppen og valmuen 207
----
Gå stille og tyst gennem verden 105
----
Han kommer med sommer 162
----
Happy Christmas (War is over) 287
----
Har du visor, min vän 200
----
Hele verden er vores 226
----
Hey Jude 293
----
Hil dig, frelser og forsoner 36
----
Hilsen til forårssolen 156
----
Himmel og hav 245
----
Hist, hvor vejen slår en bugt 217
----
Holger Danskes mærke 123
----
Hvad er det, min Marie! (A) 203
----
Hvad solskin er for det sorte muld (A) 92
----
Hvem sidder der bag skærmen 220
----
Hvergang en sommer 167
----
Hvide skyer falder ned 245
----
Hvor smiler fager den danske kyst 76
----
Hvorfor går min elskede 208
----
Hymnen til Afrika 112
----
Højt fra træets grønne top 60
----
I al sin glans nu stråler solen 39
----
I alle de riger og lande 123
----
I dag er landet vort 87
----
I Danmark er jeg født (A) 78
----
I det spæde morgengry 9
----
I hjerterne begynder 272
----
I skovens dybe, stille ro (A) 20
----
I sne står urt og busk i skjul 182
----
I østen stiger solen op 3
----
Imagine 292
----
Imellem Esbjerg og Fanø 262
----
Ind til dig igen 206
----
Ind under jul, hvor er det trist 49
----
Ja, vi elsker dette landet 70
----
Jeg bærer med smil min byrde 97
----
Jeg ejer både mark og eng 225
----
Jeg elsker de grønne lunde 75
----
Jeg elsker den brogede verden 98
----
Jeg fandt en sang på vejen 247
----
Jeg går i solen og traller 236
----
Jeg har fanget mig en myg 237
----
Jeg kender et land (A) 90
----
Jeg plukker fløjlsgræs 149
----
Jeg rutter med glædens 99
----
Jeg ser de bøgelyse øer 74
----
Jeg ved en lærkerede 151
----
Jeg ved, hvor der findes en have så skøn 73
----
Jeg vil male dagen blå 228
----
Jens vejmand 220
----
Jo, jo gøgleri er en nobel kunst 100
----
Jordens åndedrag 117
----
Julen har bragt velsignet bud 57
----
Juletræet med sin pynt 61
----
Juni 168
----
Jyden han æ stærk å sej 210
----
Jylland mellem tvende have 72
----
Kald det kærlighed 201
----
Kalendervender Tage 248
----
Kirsten og vejen fra Gurre 174
----
Kom, fred, og fyld den hele dag 231
----
Kom, glade overgivenhed 218
----
Kom, maj, du søde milde 133
----
Kom og dans 251
----
Kom, tro, og kom, glæde 64
----
Kommer hid, l piger små 124
----
Kong Kristjan stod ved højen mast 283
----
Kringsatt av fjender 101
----
Kumbaya 285
----
Kærlighedsrosen 193
----
Lad det leve 263
----
Leaving on a Jet-plane 295
----
Lermennesket 113
----
Let it be 291
----
Let it grow 296
----
Lille Messias 63
----
Livet er en morgengave (A) 118
----
Livstræet 120
----
Love is all around 297
----
Lovsynger Herren 34
----
Luk døren op og se 150
----
Lysfyldt morgen 125
----
Lær mig, nattens stjerne 17
----
Løft dit hoved, du raske gut 89
----
Mads Doss 221
----
Marken er mejet 169
----
Mary boy child 288
----
Med kåde smil den lyse sol 80
----
Med mor til fodbold 250
----
Menneskelivet er underligt 96
----
Mi nååbo, Pe Sme 219
----
Midsommervisen (A) 164
----
Morgengry 10
----
Morgenstund har guld i mund (A) 6
----
Musens sang 213
----
Mørk er november 178
----
Mørkets sang 273
----
Nanna 261
----
Natten er blid 18
----
Natten er så stille 16
----
Nattergalen, kender du den 154
----
Nattergalen på sin gren 259
----
Nocturne 24
----
Noget om helte (A) 118
----
Noget om skærsommernætter 163
----
Nu er dagen fuld af sang 140
----
Nu er det længe siden 173
----
Nu er jord og himmel stille (A) 25
----
Nu falmer skoven trindt om land (A) 175
----
Nu har vi altså jul igen 62
----
Nu hviler mark og enge 15
----
Nu lyser løv i lunde 141
----
Nu nejer blomsterne 163
----
Nu rinder solen op af østerlide (A) 2
----
Nu skal det åbenbares (A) 95
----
Nu skal vi ha' gilde 241
----
Nu tændes tusind julelys 51
----
Når egene knoppes 166
----
Når vinteren rinder i grøft og i grav 142
----
O come, all ye faithful 284
----
O, Færø, så fager 71
----
Og det blev vår 152
----
Ole sad på en knold og sang 222
----
Om lidt 271
----
One hand, One heart 299
----
Op, al den ting, som Gud har gjort 32
----
Opvåvni 144
----
Papirsklip 256
----
Per spelmann 186
----
Påske 150
----
Påskeblomst! Hvad vil du her 38
----
Ramund 188
----
Regnvejrsdag i november 228
----
Romeo 260
----
Roselil og hendes moder 189
----
Ræven er ude med halen så lang 202
----
Røverne fra Kardemommeby 249
----
Sang i det grønne 129
----
Sangen har lysning 102
----
Santa Claus is comin' to town 286
----
Sat her i forvirringstiden 121
----
Se, det summer af sol over engen (A) 159
----
Se, hvilken morgenstund 11
----
Se Norges blomsterdal 223
----
Se, nu stiger solen af havets skød (A) 4
----
Sensommerkanon 242
----
Sensommervise 171
----
Septembers himmel 170
----
Sig månen langsomt hæver 12
----
Sig nærmer tiden 103
----
Skal vi ikke være venner 270
----
Skipper Klements morgensang 132
----
Skoven er så underfuld 177
----
Skuld gammel venskab 224
----
Skyerne gråne 30
----
Skærm jeres huse med grav og planke 132
----
Skønjomfruen går i dansen 190
----
Sneflokke kommer vrimlende 181
----
Snemand Frost og frøken Tø (A) 183
----
Solhvervssang 179
----
Solkanon 243
----
Solsikke 176
----
Som dybest brønd 128
----
Som en rejselysten flåde 77
----
Som forårssolen morgenrød 37
----
Sommerens ø 167
----
Sommersalme 40
----
Soon and very soon 298
----
Sov på min arm 24
----
Spurven sidder stum bag kvist 185
----
Stenen slår smut på det danske vand 275
----
Stilfærdigt farvel 266
----
Stille, hjerte, sol går ned 13
----
Stjernefart 253
----
Stjerner dukker frem 18
----
Storken 162
----
Summer nights (Grease) 306
----
Svantes lykkelige dag 11
----
Svinehyrden 252
----
Swing low 301
----
Sæt grammofonen i stå 214
----
Søren Bramfris lærkesang 215
----
Så længe skuden kan gå 279
----
Så tænder vi et lys i kvæld 28
----
Tag del i det, der er din tid 269
----
Take it easy, boy, boy 304
----
Tears in heaven 302
----
That's what friends are for 309
----
The Rose 305
----
Those were the days 308
----
Til Dem, hr. præsident 229
----
Til himlene rækker din miskundhed, Gi 1 8
----
Til min Marie (A) 203
----
Til ungdommen 101
----
Till havs med solfyllda segel 240
----
To be or not to be 303
----
To gyldne sommerfugle (A) 197
----
Tusind stykker 282
----
Underlige aftenlufte 14
----
Valmuevejen 254
----
Velkommen i den grønne lund 129
----
Velkommen igen, Guds engle små (A; 59
----
Velkommen, lærkelil (A) 143
----
Vem kan segla forutan vind 192
----
Veninde, tag frakken og støvlerne på 47
----
Vennekredsen 238
----
Vennesang 277
----
Veronica 196
----
Vi, der valgte regnen 122
----
Vi elsker vort land (A) 164
----
Vi vil plante et træ 230
----
Vipper springe over klinge 165
----
Visen om de atten svaner 204
----
VLTJ 280
----
Vor sol er blevet kold (A) 179
----
Vort modersmål er dejligt 79
----
Vær lidt varsom 184
----
Vær velkommen, Herrens år (advent 29
----
Vær velkommen, Herrens år (nytår) 43
----
Være vind 278
----
Vågn nu op af dine drømme 239
----
Vågn op og slå på dine strenge 7
----
Våren er i luften 138
----
Vårt land, vårt land, vårt fosterland 68
----
Vårvise 255
----
War is over 287
----
What a wonderful world 300
----
Whiskey in the Jar 307
----
Wonderful tonight 294
----
Yesterday 290
----
Æbler lyser rødt på træernes grene 171
----
Åbent landskab 281" id="20090207.10553102070.8839542625127993" class="QOTD">Sommersalme 40</a></div></td></tr><tr class="oddRow"><td>5</td><td><div style="overflow: hidden; display: block; height: auto; opacity: 1;" class="sliderPanel"><a nextitem="92" href="javascript:;" style="display: block;" title="click to view another item" cookie="" random="true" list="Aftensang 19
----
Altid frejdig, når du går 23
----
Anemonesangen 153
----
April, april (A) 158
----
At kende sig selv 205
----
At lære er at ville (A) 108
----
At samles, skilles ad 264
----
Barndommens land 114
----
Bedstefar tag dine tænder på (A) 158
----
Bladet i bogen sig vender 126
----
Bliv! Råbte Herren i de tomme sale 148
----
Blomstre som en rosengård 35
----
Blæsten går frisk over Limfjordens vande 83
----
Bornholm, Bornholm, Bornholm 88
----
Cafe Måneskin 257
----
Crying in the rain 289
----
Dagen før 233
----
Dagen går med raske fjed 22
----
Danmark frit (A) 130
----
Danmark, nu blunder den lyse nat 160
----
Danmarks-kanon 235
----
De dybeste lag 44
----
De evige tre (A) 195
----
De levendes land (A) 90
----
De nære ting 209
----
De ord, jeg synger 115
----
De små børns smil 109
----
Decembernat 47
----
Decembersang 48
----
Dejlig er den himmel blå 50
----
Dejlig er jorden 52
----
Dejligst af alle glæder (A) 198
----
Den blå anemone 146
----
Den danske sang 84
----
Den grønne søde vår 134
----
Den himmelblå 66
----
Den kedsom vinter gik sin gang 135
----
Den lille lysegrønne sang 157
----
Den mørke nat forgangen er 5
----
Den røde tråd 258
----
Den signede dag med fryd vi ser 1
----
Den spillemand snapped fiolen fra væg 211
----
Der bor en kraft i sindet 274
----
Der dukker af disen (A) 85
----
Der er et yndigt land 67
----
Der er noget galt i Danmark 234
----
Der er noget i luften 31
----
Der går i nat et glædesbud 42
----
Der stode tre skalke 187
----
Der truer os i tiden (A) 106
----
Derfor kan vort øje glædes 104
----
Desertøren 229
----
Det bedste jeg ved 246
----
Det drømmende vand 232
----
Det er angstens sved, han sveder 45
----
Det er forår, alting klippes ned 156
----
Det er hvidt herude 180
----
Det er i dag et vejr 136
----
Det er lærkernes tid 137
----
Det er os, det er os 131
----
Det er så køhnt, det er så dejle 139
----
Det er så sandt 46
----
Det haver så nyligen regnet 127
----
Det kimer nu til julefest 53
----
Det lysner over agres felt 172
----
Det løvfald, som vi kom så alt for nær 174
----
Det' sørme det' sandt december 48
----
Det var en lørdag aften 191
----
Det øjeblik vi lever i 116
----
DGI blues 268
----
Du danske sommer 161
----
Du gamla, du fria, du fjållhoga Nord 69
----
Du ka' gør', hva' du vil 263
----
Du kom med alt det der var dig 194
----
Du skal plante et træ 119
----
Du, som har tændt millioner af stjerner 26
----
Duerne flyver 276
----
Dybt hælder året i sin gang 41
----
Efterårskanon 244
----
En enkel sang om frihed 227
----
En kæde af evige bånd 267
----
En lærke letted (A) 130
----
En rose så jeg skyde 54
----
En stjerne fødes (L'94) 265
----
En sømand har sin enegang 216
----
En yndig og frydefuld sommertid 193
----
Engang var frihed ordet (A) 110
----
Er lyset for de lærde blot (A) 91
----
Et barn er født i Betlehem 55
----
Et jævnt og muntert virksomt liv 93
----
Fire påskeliljer 145
----
Folkeligt skal alt nu være (A) 94
----
For en fremmed barskt og fattigt 81
----
For længe sid'n, i Betlehem 65
----
Forunderligt at sige 56
----
Forår 155
----
Forår ved Mariager fjord (A) 197
----
Forårsdag 147
----
Forårsskibet 148
----
Fred hviler over land og by (A) 21
----
Frihed er det bedste guld 107
----
Gi' dem himlen tilbage 111
----
Gi' mig en dag 199
----
Giv mig, Gud, en salmetunge 33
----
Glade jul, dejlige jul 58
----
Glæden, sorgen og lykken (A) 198
----
Go jawten, go jawten 212
----
Go' nu nat 27
----
Godmorgen, lille land 82
----
Grundlovssangen 86
----
Græshoppen og valmuen 207
----
Gå stille og tyst gennem verden 105
----
Han kommer med sommer 162
----
Happy Christmas (War is over) 287
----
Har du visor, min vän 200
----
Hele verden er vores 226
----
Hey Jude 293
----
Hil dig, frelser og forsoner 36
----
Hilsen til forårssolen 156
----
Himmel og hav 245
----
Hist, hvor vejen slår en bugt 217
----
Holger Danskes mærke 123
----
Hvad er det, min Marie! (A) 203
----
Hvad solskin er for det sorte muld (A) 92
----
Hvem sidder der bag skærmen 220
----
Hvergang en sommer 167
----
Hvide skyer falder ned 245
----
Hvor smiler fager den danske kyst 76
----
Hvorfor går min elskede 208
----
Hymnen til Afrika 112
----
Højt fra træets grønne top 60
----
I al sin glans nu stråler solen 39
----
I alle de riger og lande 123
----
I dag er landet vort 87
----
I Danmark er jeg født (A) 78
----
I det spæde morgengry 9
----
I hjerterne begynder 272
----
I skovens dybe, stille ro (A) 20
----
I sne står urt og busk i skjul 182
----
I østen stiger solen op 3
----
Imagine 292
----
Imellem Esbjerg og Fanø 262
----
Ind til dig igen 206
----
Ind under jul, hvor er det trist 49
----
Ja, vi elsker dette landet 70
----
Jeg bærer med smil min byrde 97
----
Jeg ejer både mark og eng 225
----
Jeg elsker de grønne lunde 75
----
Jeg elsker den brogede verden 98
----
Jeg fandt en sang på vejen 247
----
Jeg går i solen og traller 236
----
Jeg har fanget mig en myg 237
----
Jeg kender et land (A) 90
----
Jeg plukker fløjlsgræs 149
----
Jeg rutter med glædens 99
----
Jeg ser de bøgelyse øer 74
----
Jeg ved en lærkerede 151
----
Jeg ved, hvor der findes en have så skøn 73
----
Jeg vil male dagen blå 228
----
Jens vejmand 220
----
Jo, jo gøgleri er en nobel kunst 100
----
Jordens åndedrag 117
----
Julen har bragt velsignet bud 57
----
Juletræet med sin pynt 61
----
Juni 168
----
Jyden han æ stærk å sej 210
----
Jylland mellem tvende have 72
----
Kald det kærlighed 201
----
Kalendervender Tage 248
----
Kirsten og vejen fra Gurre 174
----
Kom, fred, og fyld den hele dag 231
----
Kom, glade overgivenhed 218
----
Kom, maj, du søde milde 133
----
Kom og dans 251
----
Kom, tro, og kom, glæde 64
----
Kommer hid, l piger små 124
----
Kong Kristjan stod ved højen mast 283
----
Kringsatt av fjender 101
----
Kumbaya 285
----
Kærlighedsrosen 193
----
Lad det leve 263
----
Leaving on a Jet-plane 295
----
Lermennesket 113
----
Let it be 291
----
Let it grow 296
----
Lille Messias 63
----
Livet er en morgengave (A) 118
----
Livstræet 120
----
Love is all around 297
----
Lovsynger Herren 34
----
Luk døren op og se 150
----
Lysfyldt morgen 125
----
Lær mig, nattens stjerne 17
----
Løft dit hoved, du raske gut 89
----
Mads Doss 221
----
Marken er mejet 169
----
Mary boy child 288
----
Med kåde smil den lyse sol 80
----
Med mor til fodbold 250
----
Menneskelivet er underligt 96
----
Mi nååbo, Pe Sme 219
----
Midsommervisen (A) 164
----
Morgengry 10
----
Morgenstund har guld i mund (A) 6
----
Musens sang 213
----
Mørk er november 178
----
Mørkets sang 273
----
Nanna 261
----
Natten er blid 18
----
Natten er så stille 16
----
Nattergalen, kender du den 154
----
Nattergalen på sin gren 259
----
Nocturne 24
----
Noget om helte (A) 118
----
Noget om skærsommernætter 163
----
Nu er dagen fuld af sang 140
----
Nu er det længe siden 173
----
Nu er jord og himmel stille (A) 25
----
Nu falmer skoven trindt om land (A) 175
----
Nu har vi altså jul igen 62
----
Nu hviler mark og enge 15
----
Nu lyser løv i lunde 141
----
Nu nejer blomsterne 163
----
Nu rinder solen op af østerlide (A) 2
----
Nu skal det åbenbares (A) 95
----
Nu skal vi ha' gilde 241
----
Nu tændes tusind julelys 51
----
Når egene knoppes 166
----
Når vinteren rinder i grøft og i grav 142
----
O come, all ye faithful 284
----
O, Færø, så fager 71
----
Og det blev vår 152
----
Ole sad på en knold og sang 222
----
Om lidt 271
----
One hand, One heart 299
----
Op, al den ting, som Gud har gjort 32
----
Opvåvni 144
----
Papirsklip 256
----
Per spelmann 186
----
Påske 150
----
Påskeblomst! Hvad vil du her 38
----
Ramund 188
----
Regnvejrsdag i november 228
----
Romeo 260
----
Roselil og hendes moder 189
----
Ræven er ude med halen så lang 202
----
Røverne fra Kardemommeby 249
----
Sang i det grønne 129
----
Sangen har lysning 102
----
Santa Claus is comin' to town 286
----
Sat her i forvirringstiden 121
----
Se, det summer af sol over engen (A) 159
----
Se, hvilken morgenstund 11
----
Se Norges blomsterdal 223
----
Se, nu stiger solen af havets skød (A) 4
----
Sensommerkanon 242
----
Sensommervise 171
----
Septembers himmel 170
----
Sig månen langsomt hæver 12
----
Sig nærmer tiden 103
----
Skal vi ikke være venner 270
----
Skipper Klements morgensang 132
----
Skoven er så underfuld 177
----
Skuld gammel venskab 224
----
Skyerne gråne 30
----
Skærm jeres huse med grav og planke 132
----
Skønjomfruen går i dansen 190
----
Sneflokke kommer vrimlende 181
----
Snemand Frost og frøken Tø (A) 183
----
Solhvervssang 179
----
Solkanon 243
----
Solsikke 176
----
Som dybest brønd 128
----
Som en rejselysten flåde 77
----
Som forårssolen morgenrød 37
----
Sommerens ø 167
----
Sommersalme 40
----
Soon and very soon 298
----
Sov på min arm 24
----
Spurven sidder stum bag kvist 185
----
Stenen slår smut på det danske vand 275
----
Stilfærdigt farvel 266
----
Stille, hjerte, sol går ned 13
----
Stjernefart 253
----
Stjerner dukker frem 18
----
Storken 162
----
Summer nights (Grease) 306
----
Svantes lykkelige dag 11
----
Svinehyrden 252
----
Swing low 301
----
Sæt grammofonen i stå 214
----
Søren Bramfris lærkesang 215
----
Så længe skuden kan gå 279
----
Så tænder vi et lys i kvæld 28
----
Tag del i det, der er din tid 269
----
Take it easy, boy, boy 304
----
Tears in heaven 302
----
That's what friends are for 309
----
The Rose 305
----
Those were the days 308
----
Til Dem, hr. præsident 229
----
Til himlene rækker din miskundhed, Gi 1 8
----
Til min Marie (A) 203
----
Til ungdommen 101
----
Till havs med solfyllda segel 240
----
To be or not to be 303
----
To gyldne sommerfugle (A) 197
----
Tusind stykker 282
----
Underlige aftenlufte 14
----
Valmuevejen 254
----
Velkommen i den grønne lund 129
----
Velkommen igen, Guds engle små (A; 59
----
Velkommen, lærkelil (A) 143
----
Vem kan segla forutan vind 192
----
Veninde, tag frakken og støvlerne på 47
----
Vennekredsen 238
----
Vennesang 277
----
Veronica 196
----
Vi, der valgte regnen 122
----
Vi elsker vort land (A) 164
----
Vi vil plante et træ 230
----
Vipper springe over klinge 165
----
Visen om de atten svaner 204
----
VLTJ 280
----
Vor sol er blevet kold (A) 179
----
Vort modersmål er dejligt 79
----
Vær lidt varsom 184
----
Vær velkommen, Herrens år (advent 29
----
Vær velkommen, Herrens år (nytår) 43
----
Være vind 278
----
Vågn nu op af dine drømme 239
----
Vågn op og slå på dine strenge 7
----
Våren er i luften 138
----
Vårt land, vårt land, vårt fosterland 68
----
Vårvise 255
----
War is over 287
----
What a wonderful world 300
----
Whiskey in the Jar 307
----
Wonderful tonight 294
----
Yesterday 290
----
Æbler lyser rødt på træernes grene 171
----
Åbent landskab 281" id="20090207.10553102280.27435283535519717" class="QOTD">Folkeligt skal alt nu være (A) 94</a></div></td></tr></tbody></table></span></td><td><span tiddler="SangMappenKlik" refresh="content"><table class="sortable"><thead><tr class="evenRow"><td index="0">Mappen:<span class="hidden">↑</span></td><td index="1">Titel side<span class="hidden">↑</span></td></tr></thead><tbody><tr class="oddRow"><td>1</td><td><div style="overflow: hidden; display: block; height: auto; opacity: 1;" class="sliderPanel"><a nextitem="2" href="javascript:;" style="display: block;" title="click to view another item" cookie="" random="true" list="Andreas sang 21
----
Barndommens gade 22
----
Buster 4
----
Byens hotel 50
----
California Dreamin' 42
----
Can’t Help Falling In Love 24
----
Dagen er din 6
----
Dansevise 27
----
Danskerne findes i mange modeller 30
----
De smukke unge mennesker 45
----
Den gamle spillemand 15
----
Det som lysner over vangen 27
----
Dream A Little Dream of Me 34
----
Du satte dig selv 12
----
Eight Days A Week 13
----
Elefantens vuggevise 47
----
En sang af sommer 40
----
Fly Me To The Moon 44
----
Gem et lille smil 46
----
Gi’ os lyset tilbage 10
----
Go Down Moses 9
----
Hvor du sætter din fod 39
----
Hvor længe vil du ydmyge dig? 28
----
Hymne til sangen 14
----
Hører du nogen kalde 31
----
Inderst inde 19
----
Indianer 11
----
Jeg mødte en sang 41
----
Joanna 34
----
Jutlandia 16
----
Kajs sang 21
----
Killing Me Softly 17
----
Kvinde min 18
----
Kære linedanser 55
----
Love Is A Matter Of Difference 52
----
Magi i luften 51
----
Masser af succes 59
----
Masser af succes 54
----
Menneske din egen magt 20
----
Midt om natten 43
----
Noget i dig selv 26
----
Puff 23
----
Solen begynder at gløde 29
----
Som jorden sang sin første sang 37
----
Stand by me 7
----
Sådan nogen som os 38
----
Sång till friheten 25
----
This Is My Life 21
----
Ud under åben himmel 36
----
Udsigt i kikkert 3
----
Vi har kun én sol 8
----
Vågner i natten 48
----
With A Little Help 35
----
You’ve Got A Friend 32" id="20090207.10553102590.5987609344477386" class="QOTD">Barndommens gade 22</a></div></td></tr><tr class="evenRow"><td>2</td><td><div style="overflow: hidden; display: block; height: auto; opacity: 1;" class="sliderPanel"><a nextitem="48" href="javascript:;" style="display: block;" title="click to view another item" cookie="" random="true" list="Andreas sang 21
----
Barndommens gade 22
----
Buster 4
----
Byens hotel 50
----
California Dreamin' 42
----
Can’t Help Falling In Love 24
----
Dagen er din 6
----
Dansevise 27
----
Danskerne findes i mange modeller 30
----
De smukke unge mennesker 45
----
Den gamle spillemand 15
----
Det som lysner over vangen 27
----
Dream A Little Dream of Me 34
----
Du satte dig selv 12
----
Eight Days A Week 13
----
Elefantens vuggevise 47
----
En sang af sommer 40
----
Fly Me To The Moon 44
----
Gem et lille smil 46
----
Gi’ os lyset tilbage 10
----
Go Down Moses 9
----
Hvor du sætter din fod 39
----
Hvor længe vil du ydmyge dig? 28
----
Hymne til sangen 14
----
Hører du nogen kalde 31
----
Inderst inde 19
----
Indianer 11
----
Jeg mødte en sang 41
----
Joanna 34
----
Jutlandia 16
----
Kajs sang 21
----
Killing Me Softly 17
----
Kvinde min 18
----
Kære linedanser 55
----
Love Is A Matter Of Difference 52
----
Magi i luften 51
----
Masser af succes 59
----
Masser af succes 54
----
Menneske din egen magt 20
----
Midt om natten 43
----
Noget i dig selv 26
----
Puff 23
----
Solen begynder at gløde 29
----
Som jorden sang sin første sang 37
----
Stand by me 7
----
Sådan nogen som os 38
----
Sång till friheten 25
----
This Is My Life 21
----
Ud under åben himmel 36
----
Udsigt i kikkert 3
----
Vi har kun én sol 8
----
Vågner i natten 48
----
With A Little Help 35
----
You’ve Got A Friend 32" id="20090207.10553102770.5220329026766984" class="QOTD">This Is My Life 21</a></div></td></tr><tr class="oddRow"><td>3</td><td><div style="overflow: hidden; display: block; height: auto; opacity: 1;" class="sliderPanel"><a nextitem="44" href="javascript:;" style="display: block;" title="click to view another item" cookie="" random="true" list="Andreas sang 21
----
Barndommens gade 22
----
Buster 4
----
Byens hotel 50
----
California Dreamin' 42
----
Can’t Help Falling In Love 24
----
Dagen er din 6
----
Dansevise 27
----
Danskerne findes i mange modeller 30
----
De smukke unge mennesker 45
----
Den gamle spillemand 15
----
Det som lysner over vangen 27
----
Dream A Little Dream of Me 34
----
Du satte dig selv 12
----
Eight Days A Week 13
----
Elefantens vuggevise 47
----
En sang af sommer 40
----
Fly Me To The Moon 44
----
Gem et lille smil 46
----
Gi’ os lyset tilbage 10
----
Go Down Moses 9
----
Hvor du sætter din fod 39
----
Hvor længe vil du ydmyge dig? 28
----
Hymne til sangen 14
----
Hører du nogen kalde 31
----
Inderst inde 19
----
Indianer 11
----
Jeg mødte en sang 41
----
Joanna 34
----
Jutlandia 16
----
Kajs sang 21
----
Killing Me Softly 17
----
Kvinde min 18
----
Kære linedanser 55
----
Love Is A Matter Of Difference 52
----
Magi i luften 51
----
Masser af succes 59
----
Masser af succes 54
----
Menneske din egen magt 20
----
Midt om natten 43
----
Noget i dig selv 26
----
Puff 23
----
Solen begynder at gløde 29
----
Som jorden sang sin første sang 37
----
Stand by me 7
----
Sådan nogen som os 38
----
Sång till friheten 25
----
This Is My Life 21
----
Ud under åben himmel 36
----
Udsigt i kikkert 3
----
Vi har kun én sol 8
----
Vågner i natten 48
----
With A Little Help 35
----
You’ve Got A Friend 32" id="20090207.10553102900.3883973995073138" class="QOTD">Som jorden sang sin første sang 37</a></div></td></tr><tr class="evenRow"><td>4</td><td><div style="overflow: hidden; display: block; height: auto; opacity: 1;" class="sliderPanel"><a nextitem="36" href="javascript:;" style="display: block;" title="click to view another item" cookie="" random="true" list="Andreas sang 21
----
Barndommens gade 22
----
Buster 4
----
Byens hotel 50
----
California Dreamin' 42
----
Can’t Help Falling In Love 24
----
Dagen er din 6
----
Dansevise 27
----
Danskerne findes i mange modeller 30
----
De smukke unge mennesker 45
----
Den gamle spillemand 15
----
Det som lysner over vangen 27
----
Dream A Little Dream of Me 34
----
Du satte dig selv 12
----
Eight Days A Week 13
----
Elefantens vuggevise 47
----
En sang af sommer 40
----
Fly Me To The Moon 44
----
Gem et lille smil 46
----
Gi’ os lyset tilbage 10
----
Go Down Moses 9
----
Hvor du sætter din fod 39
----
Hvor længe vil du ydmyge dig? 28
----
Hymne til sangen 14
----
Hører du nogen kalde 31
----
Inderst inde 19
----
Indianer 11
----
Jeg mødte en sang 41
----
Joanna 34
----
Jutlandia 16
----
Kajs sang 21
----
Killing Me Softly 17
----
Kvinde min 18
----
Kære linedanser 55
----
Love Is A Matter Of Difference 52
----
Magi i luften 51
----
Masser af succes 59
----
Masser af succes 54
----
Menneske din egen magt 20
----
Midt om natten 43
----
Noget i dig selv 26
----
Puff 23
----
Solen begynder at gløde 29
----
Som jorden sang sin første sang 37
----
Stand by me 7
----
Sådan nogen som os 38
----
Sång till friheten 25
----
This Is My Life 21
----
Ud under åben himmel 36
----
Udsigt i kikkert 3
----
Vi har kun én sol 8
----
Vågner i natten 48
----
With A Little Help 35
----
You’ve Got A Friend 32" id="20090207.10553102990.8621247878285461" class="QOTD">Magi i luften 51</a></div></td></tr><tr class="oddRow hoverRow"><td>5</td><td><div style="overflow: hidden; display: block; height: auto; opacity: 1;" class="sliderPanel"><a nextitem="19" href="javascript:;" style="display: block;" title="click to view another item" cookie="" random="true" list="Andreas sang 21
----
Barndommens gade 22
----
Buster 4
----
Byens hotel 50
----
California Dreamin' 42
----
Can’t Help Falling In Love 24
----
Dagen er din 6
----
Dansevise 27
----
Danskerne findes i mange modeller 30
----
De smukke unge mennesker 45
----
Den gamle spillemand 15
----
Det som lysner over vangen 27
----
Dream A Little Dream of Me 34
----
Du satte dig selv 12
----
Eight Days A Week 13
----
Elefantens vuggevise 47
----
En sang af sommer 40
----
Fly Me To The Moon 44
----
Gem et lille smil 46
----
Gi’ os lyset tilbage 10
----
Go Down Moses 9
----
Hvor du sætter din fod 39
----
Hvor længe vil du ydmyge dig? 28
----
Hymne til sangen 14
----
Hører du nogen kalde 31
----
Inderst inde 19
----
Indianer 11
----
Jeg mødte en sang 41
----
Joanna 34
----
Jutlandia 16
----
Kajs sang 21
----
Killing Me Softly 17
----
Kvinde min 18
----
Kære linedanser 55
----
Love Is A Matter Of Difference 52
----
Magi i luften 51
----
Masser af succes 59
----
Masser af succes 54
----
Menneske din egen magt 20
----
Midt om natten 43
----
Noget i dig selv 26
----
Puff 23
----
Solen begynder at gløde 29
----
Som jorden sang sin første sang 37
----
Stand by me 7
----
Sådan nogen som os 38
----
Sång till friheten 25
----
This Is My Life 21
----
Ud under åben himmel 36
----
Udsigt i kikkert 3
----
Vi har kun én sol 8
----
Vågner i natten 48
----
With A Little Help 35
----
You’ve Got A Friend 32" id="20090207.10553103070.12140430092699828" class="QOTD">Gem et lille smil 46</a></div></td></tr></tbody></table></span></td></tr></tbody></table><p>(Ctrl+C fra [[Tilfældige sange]]):</p><table class="twtable"><tbody><tr class="evenRow"><td><span refresh="content" tiddler="SangBogenTilfældig"><table class="sortable"><thead><tr class="evenRow"><td index="0">Bogen:<span class="hidden">↑</span></td><td index="1">Titel nr<span class="hidden">↑</span></td></tr></thead><tbody><tr class="oddRow"><td>1</td><td><div class="sliderPanel" style="overflow: hidden; display: block; height: auto; opacity: 1;"><a class="QOTD" id="20090207.18393601630.8094364660492199" list="Aftensang 19
----
Altid frejdig, når du går 23
----
Anemonesangen 153
----
April, april (A) 158
----
At kende sig selv 205
----
At lære er at ville (A) 108
----
At samles, skilles ad 264
----
Barndommens land 114
----
Bedstefar tag dine tænder på (A) 158
----
Bladet i bogen sig vender 126
----
Bliv! Råbte Herren i de tomme sale 148
----
Blomstre som en rosengård 35
----
Blæsten går frisk over Limfjordens vande 83
----
Bornholm, Bornholm, Bornholm 88
----
Cafe Måneskin 257
----
Crying in the rain 289
----
Dagen før 233
----
Dagen går med raske fjed 22
----
Danmark frit (A) 130
----
Danmark, nu blunder den lyse nat 160
----
Danmarks-kanon 235
----
De dybeste lag 44
----
De evige tre (A) 195
----
De levendes land (A) 90
----
De nære ting 209
----
De ord, jeg synger 115
----
De små børns smil 109
----
Decembernat 47
----
Decembersang 48
----
Dejlig er den himmel blå 50
----
Dejlig er jorden 52
----
Dejligst af alle glæder (A) 198
----
Den blå anemone 146
----
Den danske sang 84
----
Den grønne søde vår 134
----
Den himmelblå 66
----
Den kedsom vinter gik sin gang 135
----
Den lille lysegrønne sang 157
----
Den mørke nat forgangen er 5
----
Den røde tråd 258
----
Den signede dag med fryd vi ser 1
----
Den spillemand snapped fiolen fra væg 211
----
Der bor en kraft i sindet 274
----
Der dukker af disen (A) 85
----
Der er et yndigt land 67
----
Der er noget galt i Danmark 234
----
Der er noget i luften 31
----
Der går i nat et glædesbud 42
----
Der stode tre skalke 187
----
Der truer os i tiden (A) 106
----
Derfor kan vort øje glædes 104
----
Desertøren 229
----
Det bedste jeg ved 246
----
Det drømmende vand 232
----
Det er angstens sved, han sveder 45
----
Det er forår, alting klippes ned 156
----
Det er hvidt herude 180
----
Det er i dag et vejr 136
----
Det er lærkernes tid 137
----
Det er os, det er os 131
----
Det er så køhnt, det er så dejle 139
----
Det er så sandt 46
----
Det haver så nyligen regnet 127
----
Det kimer nu til julefest 53
----
Det lysner over agres felt 172
----
Det løvfald, som vi kom så alt for nær 174
----
Det' sørme det' sandt december 48
----
Det var en lørdag aften 191
----
Det øjeblik vi lever i 116
----
DGI blues 268
----
Du danske sommer 161
----
Du gamla, du fria, du fjållhoga Nord 69
----
Du ka' gør', hva' du vil 263
----
Du kom med alt det der var dig 194
----
Du skal plante et træ 119
----
Du, som har tændt millioner af stjerner 26
----
Duerne flyver 276
----
Dybt hælder året i sin gang 41
----
Efterårskanon 244
----
En enkel sang om frihed 227
----
En kæde af evige bånd 267
----
En lærke letted (A) 130
----
En rose så jeg skyde 54
----
En stjerne fødes (L'94) 265
----
En sømand har sin enegang 216
----
En yndig og frydefuld sommertid 193
----
Engang var frihed ordet (A) 110
----
Er lyset for de lærde blot (A) 91
----
Et barn er født i Betlehem 55
----
Et jævnt og muntert virksomt liv 93
----
Fire påskeliljer 145
----
Folkeligt skal alt nu være (A) 94
----
For en fremmed barskt og fattigt 81
----
For længe sid'n, i Betlehem 65
----
Forunderligt at sige 56
----
Forår 155
----
Forår ved Mariager fjord (A) 197
----
Forårsdag 147
----
Forårsskibet 148
----
Fred hviler over land og by (A) 21
----
Frihed er det bedste guld 107
----
Gi' dem himlen tilbage 111
----
Gi' mig en dag 199
----
Giv mig, Gud, en salmetunge 33
----
Glade jul, dejlige jul 58
----
Glæden, sorgen og lykken (A) 198
----
Go jawten, go jawten 212
----
Go' nu nat 27
----
Godmorgen, lille land 82
----
Grundlovssangen 86
----
Græshoppen og valmuen 207
----
Gå stille og tyst gennem verden 105
----
Han kommer med sommer 162
----
Happy Christmas (War is over) 287
----
Har du visor, min vän 200
----
Hele verden er vores 226
----
Hey Jude 293
----
Hil dig, frelser og forsoner 36
----
Hilsen til forårssolen 156
----
Himmel og hav 245
----
Hist, hvor vejen slår en bugt 217
----
Holger Danskes mærke 123
----
Hvad er det, min Marie! (A) 203
----
Hvad solskin er for det sorte muld (A) 92
----
Hvem sidder der bag skærmen 220
----
Hvergang en sommer 167
----
Hvide skyer falder ned 245
----
Hvor smiler fager den danske kyst 76
----
Hvorfor går min elskede 208
----
Hymnen til Afrika 112
----
Højt fra træets grønne top 60
----
I al sin glans nu stråler solen 39
----
I alle de riger og lande 123
----
I dag er landet vort 87
----
I Danmark er jeg født (A) 78
----
I det spæde morgengry 9
----
I hjerterne begynder 272
----
I skovens dybe, stille ro (A) 20
----
I sne står urt og busk i skjul 182
----
I østen stiger solen op 3
----
Imagine 292
----
Imellem Esbjerg og Fanø 262
----
Ind til dig igen 206
----
Ind under jul, hvor er det trist 49
----
Ja, vi elsker dette landet 70
----
Jeg bærer med smil min byrde 97
----
Jeg ejer både mark og eng 225
----
Jeg elsker de grønne lunde 75
----
Jeg elsker den brogede verden 98
----
Jeg fandt en sang på vejen 247
----
Jeg går i solen og traller 236
----
Jeg har fanget mig en myg 237
----
Jeg kender et land (A) 90
----
Jeg plukker fløjlsgræs 149
----
Jeg rutter med glædens 99
----
Jeg ser de bøgelyse øer 74
----
Jeg ved en lærkerede 151
----
Jeg ved, hvor der findes en have så skøn 73
----
Jeg vil male dagen blå 228
----
Jens vejmand 220
----
Jo, jo gøgleri er en nobel kunst 100
----
Jordens åndedrag 117
----
Julen har bragt velsignet bud 57
----
Juletræet med sin pynt 61
----
Juni 168
----
Jyden han æ stærk å sej 210
----
Jylland mellem tvende have 72
----
Kald det kærlighed 201
----
Kalendervender Tage 248
----
Kirsten og vejen fra Gurre 174
----
Kom, fred, og fyld den hele dag 231
----
Kom, glade overgivenhed 218
----
Kom, maj, du søde milde 133
----
Kom og dans 251
----
Kom, tro, og kom, glæde 64
----
Kommer hid, l piger små 124
----
Kong Kristjan stod ved højen mast 283
----
Kringsatt av fjender 101
----
Kumbaya 285
----
Kærlighedsrosen 193
----
Lad det leve 263
----
Leaving on a Jet-plane 295
----
Lermennesket 113
----
Let it be 291
----
Let it grow 296
----
Lille Messias 63
----
Livet er en morgengave (A) 118
----
Livstræet 120
----
Love is all around 297
----
Lovsynger Herren 34
----
Luk døren op og se 150
----
Lysfyldt morgen 125
----
Lær mig, nattens stjerne 17
----
Løft dit hoved, du raske gut 89
----
Mads Doss 221
----
Marken er mejet 169
----
Mary boy child 288
----
Med kåde smil den lyse sol 80
----
Med mor til fodbold 250
----
Menneskelivet er underligt 96
----
Mi nååbo, Pe Sme 219
----
Midsommervisen (A) 164
----
Morgengry 10
----
Morgenstund har guld i mund (A) 6
----
Musens sang 213
----
Mørk er november 178
----
Mørkets sang 273
----
Nanna 261
----
Natten er blid 18
----
Natten er så stille 16
----
Nattergalen, kender du den 154
----
Nattergalen på sin gren 259
----
Nocturne 24
----
Noget om helte (A) 118
----
Noget om skærsommernætter 163
----
Nu er dagen fuld af sang 140
----
Nu er det længe siden 173
----
Nu er jord og himmel stille (A) 25
----
Nu falmer skoven trindt om land (A) 175
----
Nu har vi altså jul igen 62
----
Nu hviler mark og enge 15
----
Nu lyser løv i lunde 141
----
Nu nejer blomsterne 163
----
Nu rinder solen op af østerlide (A) 2
----
Nu skal det åbenbares (A) 95
----
Nu skal vi ha' gilde 241
----
Nu tændes tusind julelys 51
----
Når egene knoppes 166
----
Når vinteren rinder i grøft og i grav 142
----
O come, all ye faithful 284
----
O, Færø, så fager 71
----
Og det blev vår 152
----
Ole sad på en knold og sang 222
----
Om lidt 271
----
One hand, One heart 299
----
Op, al den ting, som Gud har gjort 32
----
Opvåvni 144
----
Papirsklip 256
----
Per spelmann 186
----
Påske 150
----
Påskeblomst! Hvad vil du her 38
----
Ramund 188
----
Regnvejrsdag i november 228
----
Romeo 260
----
Roselil og hendes moder 189
----
Ræven er ude med halen så lang 202
----
Røverne fra Kardemommeby 249
----
Sang i det grønne 129
----
Sangen har lysning 102
----
Santa Claus is comin' to town 286
----
Sat her i forvirringstiden 121
----
Se, det summer af sol over engen (A) 159
----
Se, hvilken morgenstund 11
----
Se Norges blomsterdal 223
----
Se, nu stiger solen af havets skød (A) 4
----
Sensommerkanon 242
----
Sensommervise 171
----
Septembers himmel 170
----
Sig månen langsomt hæver 12
----
Sig nærmer tiden 103
----
Skal vi ikke være venner 270
----
Skipper Klements morgensang 132
----
Skoven er så underfuld 177
----
Skuld gammel venskab 224
----
Skyerne gråne 30
----
Skærm jeres huse med grav og planke 132
----
Skønjomfruen går i dansen 190
----
Sneflokke kommer vrimlende 181
----
Snemand Frost og frøken Tø (A) 183
----
Solhvervssang 179
----
Solkanon 243
----
Solsikke 176
----
Som dybest brønd 128
----
Som en rejselysten flåde 77
----
Som forårssolen morgenrød 37
----
Sommerens ø 167
----
Sommersalme 40
----
Soon and very soon 298
----
Sov på min arm 24
----
Spurven sidder stum bag kvist 185
----
Stenen slår smut på det danske vand 275
----
Stilfærdigt farvel 266
----
Stille, hjerte, sol går ned 13
----
Stjernefart 253
----
Stjerner dukker frem 18
----
Storken 162
----
Summer nights (Grease) 306
----
Svantes lykkelige dag 11
----
Svinehyrden 252
----
Swing low 301
----
Sæt grammofonen i stå 214
----
Søren Bramfris lærkesang 215
----
Så længe skuden kan gå 279
----
Så tænder vi et lys i kvæld 28
----
Tag del i det, der er din tid 269
----
Take it easy, boy, boy 304
----
Tears in heaven 302
----
That's what friends are for 309
----
The Rose 305
----
Those were the days 308
----
Til Dem, hr. præsident 229
----
Til himlene rækker din miskundhed, Gi 1 8
----
Til min Marie (A) 203
----
Til ungdommen 101
----
Till havs med solfyllda segel 240
----
To be or not to be 303
----
To gyldne sommerfugle (A) 197
----
Tusind stykker 282
----
Underlige aftenlufte 14
----
Valmuevejen 254
----
Velkommen i den grønne lund 129
----
Velkommen igen, Guds engle små (A; 59
----
Velkommen, lærkelil (A) 143
----
Vem kan segla forutan vind 192
----
Veninde, tag frakken og støvlerne på 47
----
Vennekredsen 238
----
Vennesang 277
----
Veronica 196
----
Vi, der valgte regnen 122
----
Vi elsker vort land (A) 164
----
Vi vil plante et træ 230
----
Vipper springe over klinge 165
----
Visen om de atten svaner 204
----
VLTJ 280
----
Vor sol er blevet kold (A) 179
----
Vort modersmål er dejligt 79
----
Vær lidt varsom 184
----
Vær velkommen, Herrens år (advent 29
----
Vær velkommen, Herrens år (nytår) 43
----
Være vind 278
----
Vågn nu op af dine drømme 239
----
Vågn op og slå på dine strenge 7
----
Våren er i luften 138
----
Vårt land, vårt land, vårt fosterland 68
----
Vårvise 255
----
War is over 287
----
What a wonderful world 300
----
Whiskey in the Jar 307
----
Wonderful tonight 294
----
Yesterday 290
----
Æbler lyser rødt på træernes grene 171
----
Åbent landskab 281" delay="3700" random="true" cookie="" title="auto-timer stopped... click to view another item, or 'mouseout' to restart timer" style="display: block;" href="javascript:;" nextitem="90">Et jævnt og muntert virksomt liv 93</a></div></td></tr><tr class="evenRow"><td>2</td><td><div class="sliderPanel" style="overflow: hidden; display: block; height: auto; opacity: 1;"><a class="QOTD" id="20090207.18393602050.04773713693363579" list="Aftensang 19
----
Altid frejdig, når du går 23
----
Anemonesangen 153
----
April, april (A) 158
----
At kende sig selv 205
----
At lære er at ville (A) 108
----
At samles, skilles ad 264
----
Barndommens land 114
----
Bedstefar tag dine tænder på (A) 158
----
Bladet i bogen sig vender 126
----
Bliv! Råbte Herren i de tomme sale 148
----
Blomstre som en rosengård 35
----
Blæsten går frisk over Limfjordens vande 83
----
Bornholm, Bornholm, Bornholm 88
----
Cafe Måneskin 257
----
Crying in the rain 289
----
Dagen før 233
----
Dagen går med raske fjed 22
----
Danmark frit (A) 130
----
Danmark, nu blunder den lyse nat 160
----
Danmarks-kanon 235
----
De dybeste lag 44
----
De evige tre (A) 195
----
De levendes land (A) 90
----
De nære ting 209
----
De ord, jeg synger 115
----
De små børns smil 109
----
Decembernat 47
----
Decembersang 48
----
Dejlig er den himmel blå 50
----
Dejlig er jorden 52
----
Dejligst af alle glæder (A) 198
----
Den blå anemone 146
----
Den danske sang 84
----
Den grønne søde vår 134
----
Den himmelblå 66
----
Den kedsom vinter gik sin gang 135
----
Den lille lysegrønne sang 157
----
Den mørke nat forgangen er 5
----
Den røde tråd 258
----
Den signede dag med fryd vi ser 1
----
Den spillemand snapped fiolen fra væg 211
----
Der bor en kraft i sindet 274
----
Der dukker af disen (A) 85
----
Der er et yndigt land 67
----
Der er noget galt i Danmark 234
----
Der er noget i luften 31
----
Der går i nat et glædesbud 42
----
Der stode tre skalke 187
----
Der truer os i tiden (A) 106
----
Derfor kan vort øje glædes 104
----
Desertøren 229
----
Det bedste jeg ved 246
----
Det drømmende vand 232
----
Det er angstens sved, han sveder 45
----
Det er forår, alting klippes ned 156
----
Det er hvidt herude 180
----
Det er i dag et vejr 136
----
Det er lærkernes tid 137
----
Det er os, det er os 131
----
Det er så køhnt, det er så dejle 139
----
Det er så sandt 46
----
Det haver så nyligen regnet 127
----
Det kimer nu til julefest 53
----
Det lysner over agres felt 172
----
Det løvfald, som vi kom så alt for nær 174
----
Det' sørme det' sandt december 48
----
Det var en lørdag aften 191
----
Det øjeblik vi lever i 116
----
DGI blues 268
----
Du danske sommer 161
----
Du gamla, du fria, du fjållhoga Nord 69
----
Du ka' gør', hva' du vil 263
----
Du kom med alt det der var dig 194
----
Du skal plante et træ 119
----
Du, som har tændt millioner af stjerner 26
----
Duerne flyver 276
----
Dybt hælder året i sin gang 41
----
Efterårskanon 244
----
En enkel sang om frihed 227
----
En kæde af evige bånd 267
----
En lærke letted (A) 130
----
En rose så jeg skyde 54
----
En stjerne fødes (L'94) 265
----
En sømand har sin enegang 216
----
En yndig og frydefuld sommertid 193
----
Engang var frihed ordet (A) 110
----
Er lyset for de lærde blot (A) 91
----
Et barn er født i Betlehem 55
----
Et jævnt og muntert virksomt liv 93
----
Fire påskeliljer 145
----
Folkeligt skal alt nu være (A) 94
----
For en fremmed barskt og fattigt 81
----
For længe sid'n, i Betlehem 65
----
Forunderligt at sige 56
----
Forår 155
----
Forår ved Mariager fjord (A) 197
----
Forårsdag 147
----
Forårsskibet 148
----
Fred hviler over land og by (A) 21
----
Frihed er det bedste guld 107
----
Gi' dem himlen tilbage 111
----
Gi' mig en dag 199
----
Giv mig, Gud, en salmetunge 33
----
Glade jul, dejlige jul 58
----
Glæden, sorgen og lykken (A) 198
----
Go jawten, go jawten 212
----
Go' nu nat 27
----
Godmorgen, lille land 82
----
Grundlovssangen 86
----
Græshoppen og valmuen 207
----
Gå stille og tyst gennem verden 105
----
Han kommer med sommer 162
----
Happy Christmas (War is over) 287
----
Har du visor, min vän 200
----
Hele verden er vores 226
----
Hey Jude 293
----
Hil dig, frelser og forsoner 36
----
Hilsen til forårssolen 156
----
Himmel og hav 245
----
Hist, hvor vejen slår en bugt 217
----
Holger Danskes mærke 123
----
Hvad er det, min Marie! (A) 203
----
Hvad solskin er for det sorte muld (A) 92
----
Hvem sidder der bag skærmen 220
----
Hvergang en sommer 167
----
Hvide skyer falder ned 245
----
Hvor smiler fager den danske kyst 76
----
Hvorfor går min elskede 208
----
Hymnen til Afrika 112
----
Højt fra træets grønne top 60
----
I al sin glans nu stråler solen 39
----
I alle de riger og lande 123
----
I dag er landet vort 87
----
I Danmark er jeg født (A) 78
----
I det spæde morgengry 9
----
I hjerterne begynder 272
----
I skovens dybe, stille ro (A) 20
----
I sne står urt og busk i skjul 182
----
I østen stiger solen op 3
----
Imagine 292
----
Imellem Esbjerg og Fanø 262
----
Ind til dig igen 206
----
Ind under jul, hvor er det trist 49
----
Ja, vi elsker dette landet 70
----
Jeg bærer med smil min byrde 97
----
Jeg ejer både mark og eng 225
----
Jeg elsker de grønne lunde 75
----
Jeg elsker den brogede verden 98
----
Jeg fandt en sang på vejen 247
----
Jeg går i solen og traller 236
----
Jeg har fanget mig en myg 237
----
Jeg kender et land (A) 90
----
Jeg plukker fløjlsgræs 149
----
Jeg rutter med glædens 99
----
Jeg ser de bøgelyse øer 74
----
Jeg ved en lærkerede 151
----
Jeg ved, hvor der findes en have så skøn 73
----
Jeg vil male dagen blå 228
----
Jens vejmand 220
----
Jo, jo gøgleri er en nobel kunst 100
----
Jordens åndedrag 117
----
Julen har bragt velsignet bud 57
----
Juletræet med sin pynt 61
----
Juni 168
----
Jyden han æ stærk å sej 210
----
Jylland mellem tvende have 72
----
Kald det kærlighed 201
----
Kalendervender Tage 248
----
Kirsten og vejen fra Gurre 174
----
Kom, fred, og fyld den hele dag 231
----
Kom, glade overgivenhed 218
----
Kom, maj, du søde milde 133
----
Kom og dans 251
----
Kom, tro, og kom, glæde 64
----
Kommer hid, l piger små 124
----
Kong Kristjan stod ved højen mast 283
----
Kringsatt av fjender 101
----
Kumbaya 285
----
Kærlighedsrosen 193
----
Lad det leve 263
----
Leaving on a Jet-plane 295
----
Lermennesket 113
----
Let it be 291
----
Let it grow 296
----
Lille Messias 63
----
Livet er en morgengave (A) 118
----
Livstræet 120
----
Love is all around 297
----
Lovsynger Herren 34
----
Luk døren op og se 150
----
Lysfyldt morgen 125
----
Lær mig, nattens stjerne 17
----
Løft dit hoved, du raske gut 89
----
Mads Doss 221
----
Marken er mejet 169
----
Mary boy child 288
----
Med kåde smil den lyse sol 80
----
Med mor til fodbold 250
----
Menneskelivet er underligt 96
----
Mi nååbo, Pe Sme 219
----
Midsommervisen (A) 164
----
Morgengry 10
----
Morgenstund har guld i mund (A) 6
----
Musens sang 213
----
Mørk er november 178
----
Mørkets sang 273
----
Nanna 261
----
Natten er blid 18
----
Natten er så stille 16
----
Nattergalen, kender du den 154
----
Nattergalen på sin gren 259
----
Nocturne 24
----
Noget om helte (A) 118
----
Noget om skærsommernætter 163
----
Nu er dagen fuld af sang 140
----
Nu er det længe siden 173
----
Nu er jord og himmel stille (A) 25
----
Nu falmer skoven trindt om land (A) 175
----
Nu har vi altså jul igen 62
----
Nu hviler mark og enge 15
----
Nu lyser løv i lunde 141
----
Nu nejer blomsterne 163
----
Nu rinder solen op af østerlide (A) 2
----
Nu skal det åbenbares (A) 95
----
Nu skal vi ha' gilde 241
----
Nu tændes tusind julelys 51
----
Når egene knoppes 166
----
Når vinteren rinder i grøft og i grav 142
----
O come, all ye faithful 284
----
O, Færø, så fager 71
----
Og det blev vår 152
----
Ole sad på en knold og sang 222
----
Om lidt 271
----
One hand, One heart 299
----
Op, al den ting, som Gud har gjort 32
----
Opvåvni 144
----
Papirsklip 256
----
Per spelmann 186
----
Påske 150
----
Påskeblomst! Hvad vil du her 38
----
Ramund 188
----
Regnvejrsdag i november 228
----
Romeo 260
----
Roselil og hendes moder 189
----
Ræven er ude med halen så lang 202
----
Røverne fra Kardemommeby 249
----
Sang i det grønne 129
----
Sangen har lysning 102
----
Santa Claus is comin' to town 286
----
Sat her i forvirringstiden 121
----
Se, det summer af sol over engen (A) 159
----
Se, hvilken morgenstund 11
----
Se Norges blomsterdal 223
----
Se, nu stiger solen af havets skød (A) 4
----
Sensommerkanon 242
----
Sensommervise 171
----
Septembers himmel 170
----
Sig månen langsomt hæver 12
----
Sig nærmer tiden 103
----
Skal vi ikke være venner 270
----
Skipper Klements morgensang 132
----
Skoven er så underfuld 177
----
Skuld gammel venskab 224
----
Skyerne gråne 30
----
Skærm jeres huse med grav og planke 132
----
Skønjomfruen går i dansen 190
----
Sneflokke kommer vrimlende 181
----
Snemand Frost og frøken Tø (A) 183
----
Solhvervssang 179
----
Solkanon 243
----
Solsikke 176
----
Som dybest brønd 128
----
Som en rejselysten flåde 77
----
Som forårssolen morgenrød 37
----
Sommerens ø 167
----
Sommersalme 40
----
Soon and very soon 298
----
Sov på min arm 24
----
Spurven sidder stum bag kvist 185
----
Stenen slår smut på det danske vand 275
----
Stilfærdigt farvel 266
----
Stille, hjerte, sol går ned 13
----
Stjernefart 253
----
Stjerner dukker frem 18
----
Storken 162
----
Summer nights (Grease) 306
----
Svantes lykkelige dag 11
----
Svinehyrden 252
----
Swing low 301
----
Sæt grammofonen i stå 214
----
Søren Bramfris lærkesang 215
----
Så længe skuden kan gå 279
----
Så tænder vi et lys i kvæld 28
----
Tag del i det, der er din tid 269
----
Take it easy, boy, boy 304
----
Tears in heaven 302
----
That's what friends are for 309
----
The Rose 305
----
Those were the days 308
----
Til Dem, hr. præsident 229
----
Til himlene rækker din miskundhed, Gi 1 8
----
Til min Marie (A) 203
----
Til ungdommen 101
----
Till havs med solfyllda segel 240
----
To be or not to be 303
----
To gyldne sommerfugle (A) 197
----
Tusind stykker 282
----
Underlige aftenlufte 14
----
Valmuevejen 254
----
Velkommen i den grønne lund 129
----
Velkommen igen, Guds engle små (A; 59
----
Velkommen, lærkelil (A) 143
----
Vem kan segla forutan vind 192
----
Veninde, tag frakken og støvlerne på 47
----
Vennekredsen 238
----
Vennesang 277
----
Veronica 196
----
Vi, der valgte regnen 122
----
Vi elsker vort land (A) 164
----
Vi vil plante et træ 230
----
Vipper springe over klinge 165
----
Visen om de atten svaner 204
----
VLTJ 280
----
Vor sol er blevet kold (A) 179
----
Vort modersmål er dejligt 79
----
Vær lidt varsom 184
----
Vær velkommen, Herrens år (advent 29
----
Vær velkommen, Herrens år (nytår) 43
----
Være vind 278
----
Vågn nu op af dine drømme 239
----
Vågn op og slå på dine strenge 7
----
Våren er i luften 138
----
Vårt land, vårt land, vårt fosterland 68
----
Vårvise 255
----
War is over 287
----
What a wonderful world 300
----
Whiskey in the Jar 307
----
Wonderful tonight 294
----
Yesterday 290
----
Æbler lyser rødt på træernes grene 171
----
Åbent landskab 281" delay="4000" random="true" cookie="" title="auto-timer stopped... click to view another item, or 'mouseout' to restart timer" style="display: block;" href="javascript:;" nextitem="140">I østen stiger solen op 3</a></div></td></tr><tr class="oddRow"><td>3</td><td><div class="sliderPanel" style="overflow: hidden; display: block; height: auto; opacity: 1;"><a class="QOTD" id="20090207.18393602240.7255189017407051" list="Aftensang 19
----
Altid frejdig, når du går 23
----
Anemonesangen 153
----
April, april (A) 158
----
At kende sig selv 205
----
At lære er at ville (A) 108
----
At samles, skilles ad 264
----
Barndommens land 114
----
Bedstefar tag dine tænder på (A) 158
----
Bladet i bogen sig vender 126
----
Bliv! Råbte Herren i de tomme sale 148
----
Blomstre som en rosengård 35
----
Blæsten går frisk over Limfjordens vande 83
----
Bornholm, Bornholm, Bornholm 88
----
Cafe Måneskin 257
----
Crying in the rain 289
----
Dagen før 233
----
Dagen går med raske fjed 22
----
Danmark frit (A) 130
----
Danmark, nu blunder den lyse nat 160
----
Danmarks-kanon 235
----
De dybeste lag 44
----
De evige tre (A) 195
----
De levendes land (A) 90
----
De nære ting 209
----
De ord, jeg synger 115
----
De små børns smil 109
----
Decembernat 47
----
Decembersang 48
----
Dejlig er den himmel blå 50
----
Dejlig er jorden 52
----
Dejligst af alle glæder (A) 198
----
Den blå anemone 146
----
Den danske sang 84
----
Den grønne søde vår 134
----
Den himmelblå 66
----
Den kedsom vinter gik sin gang 135
----
Den lille lysegrønne sang 157
----
Den mørke nat forgangen er 5
----
Den røde tråd 258
----
Den signede dag med fryd vi ser 1
----
Den spillemand snapped fiolen fra væg 211
----
Der bor en kraft i sindet 274
----
Der dukker af disen (A) 85
----
Der er et yndigt land 67
----
Der er noget galt i Danmark 234
----
Der er noget i luften 31
----
Der går i nat et glædesbud 42
----
Der stode tre skalke 187
----
Der truer os i tiden (A) 106
----
Derfor kan vort øje glædes 104
----
Desertøren 229
----
Det bedste jeg ved 246
----
Det drømmende vand 232
----
Det er angstens sved, han sveder 45
----
Det er forår, alting klippes ned 156
----
Det er hvidt herude 180
----
Det er i dag et vejr 136
----
Det er lærkernes tid 137
----
Det er os, det er os 131
----
Det er så køhnt, det er så dejle 139
----
Det er så sandt 46
----
Det haver så nyligen regnet 127
----
Det kimer nu til julefest 53
----
Det lysner over agres felt 172
----
Det løvfald, som vi kom så alt for nær 174
----
Det' sørme det' sandt december 48
----
Det var en lørdag aften 191
----
Det øjeblik vi lever i 116
----
DGI blues 268
----
Du danske sommer 161
----
Du gamla, du fria, du fjållhoga Nord 69
----
Du ka' gør', hva' du vil 263
----
Du kom med alt det der var dig 194
----
Du skal plante et træ 119
----
Du, som har tændt millioner af stjerner 26
----
Duerne flyver 276
----
Dybt hælder året i sin gang 41
----
Efterårskanon 244
----
En enkel sang om frihed 227
----
En kæde af evige bånd 267
----
En lærke letted (A) 130
----
En rose så jeg skyde 54
----
En stjerne fødes (L'94) 265
----
En sømand har sin enegang 216
----
En yndig og frydefuld sommertid 193
----
Engang var frihed ordet (A) 110
----
Er lyset for de lærde blot (A) 91
----
Et barn er født i Betlehem 55
----
Et jævnt og muntert virksomt liv 93
----
Fire påskeliljer 145
----
Folkeligt skal alt nu være (A) 94
----
For en fremmed barskt og fattigt 81
----
For længe sid'n, i Betlehem 65
----
Forunderligt at sige 56
----
Forår 155
----
Forår ved Mariager fjord (A) 197
----
Forårsdag 147
----
Forårsskibet 148
----
Fred hviler over land og by (A) 21
----
Frihed er det bedste guld 107
----
Gi' dem himlen tilbage 111
----
Gi' mig en dag 199
----
Giv mig, Gud, en salmetunge 33
----
Glade jul, dejlige jul 58
----
Glæden, sorgen og lykken (A) 198
----
Go jawten, go jawten 212
----
Go' nu nat 27
----
Godmorgen, lille land 82
----
Grundlovssangen 86
----
Græshoppen og valmuen 207
----
Gå stille og tyst gennem verden 105
----
Han kommer med sommer 162
----
Happy Christmas (War is over) 287
----
Har du visor, min vän 200
----
Hele verden er vores 226
----
Hey Jude 293
----
Hil dig, frelser og forsoner 36
----
Hilsen til forårssolen 156
----
Himmel og hav 245
----
Hist, hvor vejen slår en bugt 217
----
Holger Danskes mærke 123
----
Hvad er det, min Marie! (A) 203
----
Hvad solskin er for det sorte muld (A) 92
----
Hvem sidder der bag skærmen 220
----
Hvergang en sommer 167
----
Hvide skyer falder ned 245
----
Hvor smiler fager den danske kyst 76
----
Hvorfor går min elskede 208
----
Hymnen til Afrika 112
----
Højt fra træets grønne top 60
----
I al sin glans nu stråler solen 39
----
I alle de riger og lande 123
----
I dag er landet vort 87
----
I Danmark er jeg født (A) 78
----
I det spæde morgengry 9
----
I hjerterne begynder 272
----
I skovens dybe, stille ro (A) 20
----
I sne står urt og busk i skjul 182
----
I østen stiger solen op 3
----
Imagine 292
----
Imellem Esbjerg og Fanø 262
----
Ind til dig igen 206
----
Ind under jul, hvor er det trist 49
----
Ja, vi elsker dette landet 70
----
Jeg bærer med smil min byrde 97
----
Jeg ejer både mark og eng 225
----
Jeg elsker de grønne lunde 75
----
Jeg elsker den brogede verden 98
----
Jeg fandt en sang på vejen 247
----
Jeg går i solen og traller 236
----
Jeg har fanget mig en myg 237
----
Jeg kender et land (A) 90
----
Jeg plukker fløjlsgræs 149
----
Jeg rutter med glædens 99
----
Jeg ser de bøgelyse øer 74
----
Jeg ved en lærkerede 151
----
Jeg ved, hvor der findes en have så skøn 73
----
Jeg vil male dagen blå 228
----
Jens vejmand 220
----
Jo, jo gøgleri er en nobel kunst 100
----
Jordens åndedrag 117
----
Julen har bragt velsignet bud 57
----
Juletræet med sin pynt 61
----
Juni 168
----
Jyden han æ stærk å sej 210
----
Jylland mellem tvende have 72
----
Kald det kærlighed 201
----
Kalendervender Tage 248
----
Kirsten og vejen fra Gurre 174
----
Kom, fred, og fyld den hele dag 231
----
Kom, glade overgivenhed 218
----
Kom, maj, du søde milde 133
----
Kom og dans 251
----
Kom, tro, og kom, glæde 64
----
Kommer hid, l piger små 124
----
Kong Kristjan stod ved højen mast 283
----
Kringsatt av fjender 101
----
Kumbaya 285
----
Kærlighedsrosen 193
----
Lad det leve 263
----
Leaving on a Jet-plane 295
----
Lermennesket 113
----
Let it be 291
----
Let it grow 296
----
Lille Messias 63
----
Livet er en morgengave (A) 118
----
Livstræet 120
----
Love is all around 297
----
Lovsynger Herren 34
----
Luk døren op og se 150
----
Lysfyldt morgen 125
----
Lær mig, nattens stjerne 17
----
Løft dit hoved, du raske gut 89
----
Mads Doss 221
----
Marken er mejet 169
----
Mary boy child 288
----
Med kåde smil den lyse sol 80
----
Med mor til fodbold 250
----
Menneskelivet er underligt 96
----
Mi nååbo, Pe Sme 219
----
Midsommervisen (A) 164
----
Morgengry 10
----
Morgenstund har guld i mund (A) 6
----
Musens sang 213
----
Mørk er november 178
----
Mørkets sang 273
----
Nanna 261
----
Natten er blid 18
----
Natten er så stille 16
----
Nattergalen, kender du den 154
----
Nattergalen på sin gren 259
----
Nocturne 24
----
Noget om helte (A) 118
----
Noget om skærsommernætter 163
----
Nu er dagen fuld af sang 140
----
Nu er det længe siden 173
----
Nu er jord og himmel stille (A) 25
----
Nu falmer skoven trindt om land (A) 175
----
Nu har vi altså jul igen 62
----
Nu hviler mark og enge 15
----
Nu lyser løv i lunde 141
----
Nu nejer blomsterne 163
----
Nu rinder solen op af østerlide (A) 2
----
Nu skal det åbenbares (A) 95
----
Nu skal vi ha' gilde 241
----
Nu tændes tusind julelys 51
----
Når egene knoppes 166
----
Når vinteren rinder i grøft og i grav 142
----
O come, all ye faithful 284
----
O, Færø, så fager 71
----
Og det blev vår 152
----
Ole sad på en knold og sang 222
----
Om lidt 271
----
One hand, One heart 299
----
Op, al den ting, som Gud har gjort 32
----
Opvåvni 144
----
Papirsklip 256
----
Per spelmann 186
----
Påske 150
----
Påskeblomst! Hvad vil du her 38
----
Ramund 188
----
Regnvejrsdag i november 228
----
Romeo 260
----
Roselil og hendes moder 189
----
Ræven er ude med halen så lang 202
----
Røverne fra Kardemommeby 249
----
Sang i det grønne 129
----
Sangen har lysning 102
----
Santa Claus is comin' to town 286
----
Sat her i forvirringstiden 121
----
Se, det summer af sol over engen (A) 159
----
Se, hvilken morgenstund 11
----
Se Norges blomsterdal 223
----
Se, nu stiger solen af havets skød (A) 4
----
Sensommerkanon 242
----
Sensommervise 171
----
Septembers himmel 170
----
Sig månen langsomt hæver 12
----
Sig nærmer tiden 103
----
Skal vi ikke være venner 270
----
Skipper Klements morgensang 132
----
Skoven er så underfuld 177
----
Skuld gammel venskab 224
----
Skyerne gråne 30
----
Skærm jeres huse med grav og planke 132
----
Skønjomfruen går i dansen 190
----
Sneflokke kommer vrimlende 181
----
Snemand Frost og frøken Tø (A) 183
----
Solhvervssang 179
----
Solkanon 243
----
Solsikke 176
----
Som dybest brønd 128
----
Som en rejselysten flåde 77
----
Som forårssolen morgenrød 37
----
Sommerens ø 167
----
Sommersalme 40
----
Soon and very soon 298
----
Sov på min arm 24
----
Spurven sidder stum bag kvist 185
----
Stenen slår smut på det danske vand 275
----
Stilfærdigt farvel 266
----
Stille, hjerte, sol går ned 13
----
Stjernefart 253
----
Stjerner dukker frem 18
----
Storken 162
----
Summer nights (Grease) 306
----
Svantes lykkelige dag 11
----
Svinehyrden 252
----
Swing low 301
----
Sæt grammofonen i stå 214
----
Søren Bramfris lærkesang 215
----
Så længe skuden kan gå 279
----
Så tænder vi et lys i kvæld 28
----
Tag del i det, der er din tid 269
----
Take it easy, boy, boy 304
----
Tears in heaven 302
----
That's what friends are for 309
----
The Rose 305
----
Those were the days 308
----
Til Dem, hr. præsident 229
----
Til himlene rækker din miskundhed, Gi 1 8
----
Til min Marie (A) 203
----
Til ungdommen 101
----
Till havs med solfyllda segel 240
----
To be or not to be 303
----
To gyldne sommerfugle (A) 197
----
Tusind stykker 282
----
Underlige aftenlufte 14
----
Valmuevejen 254
----
Velkommen i den grønne lund 129
----
Velkommen igen, Guds engle små (A; 59
----
Velkommen, lærkelil (A) 143
----
Vem kan segla forutan vind 192
----
Veninde, tag frakken og støvlerne på 47
----
Vennekredsen 238
----
Vennesang 277
----
Veronica 196
----
Vi, der valgte regnen 122
----
Vi elsker vort land (A) 164
----
Vi vil plante et træ 230
----
Vipper springe over klinge 165
----
Visen om de atten svaner 204
----
VLTJ 280
----
Vor sol er blevet kold (A) 179
----
Vort modersmål er dejligt 79
----
Vær lidt varsom 184
----
Vær velkommen, Herrens år (advent 29
----
Vær velkommen, Herrens år (nytår) 43
----
Være vind 278
----
Vågn nu op af dine drømme 239
----
Vågn op og slå på dine strenge 7
----
Våren er i luften 138
----
Vårt land, vårt land, vårt fosterland 68
----
Vårvise 255
----
War is over 287
----
What a wonderful world 300
----
Whiskey in the Jar 307
----
Wonderful tonight 294
----
Yesterday 290
----
Æbler lyser rødt på træernes grene 171
----
Åbent landskab 281" delay="4300" random="true" cookie="" title="auto-timer stopped... click to view another item, or 'mouseout' to restart timer" style="display: block;" href="javascript:;" nextitem="154">Jeg plukker fløjlsgræs 149</a></div></td></tr><tr class="evenRow"><td>4</td><td><div class="sliderPanel" style="overflow: hidden; display: block; height: auto; opacity: 1;"><a class="QOTD" id="20090207.18393602430.6050329883188892" list="Aftensang 19
----
Altid frejdig, når du går 23
----
Anemonesangen 153
----
April, april (A) 158
----
At kende sig selv 205
----
At lære er at ville (A) 108
----
At samles, skilles ad 264
----
Barndommens land 114
----
Bedstefar tag dine tænder på (A) 158
----
Bladet i bogen sig vender 126
----
Bliv! Råbte Herren i de tomme sale 148
----
Blomstre som en rosengård 35
----
Blæsten går frisk over Limfjordens vande 83
----
Bornholm, Bornholm, Bornholm 88
----
Cafe Måneskin 257
----
Crying in the rain 289
----
Dagen før 233
----
Dagen går med raske fjed 22
----
Danmark frit (A) 130
----
Danmark, nu blunder den lyse nat 160
----
Danmarks-kanon 235
----
De dybeste lag 44
----
De evige tre (A) 195
----
De levendes land (A) 90
----
De nære ting 209
----
De ord, jeg synger 115
----
De små børns smil 109
----
Decembernat 47
----
Decembersang 48
----
Dejlig er den himmel blå 50
----
Dejlig er jorden 52
----
Dejligst af alle glæder (A) 198
----
Den blå anemone 146
----
Den danske sang 84
----
Den grønne søde vår 134
----
Den himmelblå 66
----
Den kedsom vinter gik sin gang 135
----
Den lille lysegrønne sang 157
----
Den mørke nat forgangen er 5
----
Den røde tråd 258
----
Den signede dag med fryd vi ser 1
----
Den spillemand snapped fiolen fra væg 211
----
Der bor en kraft i sindet 274
----
Der dukker af disen (A) 85
----
Der er et yndigt land 67
----
Der er noget galt i Danmark 234
----
Der er noget i luften 31
----
Der går i nat et glædesbud 42
----
Der stode tre skalke 187
----
Der truer os i tiden (A) 106
----
Derfor kan vort øje glædes 104
----
Desertøren 229
----
Det bedste jeg ved 246
----
Det drømmende vand 232
----
Det er angstens sved, han sveder 45
----
Det er forår, alting klippes ned 156
----
Det er hvidt herude 180
----
Det er i dag et vejr 136
----
Det er lærkernes tid 137
----
Det er os, det er os 131
----
Det er så køhnt, det er så dejle 139
----
Det er så sandt 46
----
Det haver så nyligen regnet 127
----
Det kimer nu til julefest 53
----
Det lysner over agres felt 172
----
Det løvfald, som vi kom så alt for nær 174
----
Det' sørme det' sandt december 48
----
Det var en lørdag aften 191
----
Det øjeblik vi lever i 116
----
DGI blues 268
----
Du danske sommer 161
----
Du gamla, du fria, du fjållhoga Nord 69
----
Du ka' gør', hva' du vil 263
----
Du kom med alt det der var dig 194
----
Du skal plante et træ 119
----
Du, som har tændt millioner af stjerner 26
----
Duerne flyver 276
----
Dybt hælder året i sin gang 41
----
Efterårskanon 244
----
En enkel sang om frihed 227
----
En kæde af evige bånd 267
----
En lærke letted (A) 130
----
En rose så jeg skyde 54
----
En stjerne fødes (L'94) 265
----
En sømand har sin enegang 216
----
En yndig og frydefuld sommertid 193
----
Engang var frihed ordet (A) 110
----
Er lyset for de lærde blot (A) 91
----
Et barn er født i Betlehem 55
----
Et jævnt og muntert virksomt liv 93
----
Fire påskeliljer 145
----
Folkeligt skal alt nu være (A) 94
----
For en fremmed barskt og fattigt 81
----
For længe sid'n, i Betlehem 65
----
Forunderligt at sige 56
----
Forår 155
----
Forår ved Mariager fjord (A) 197
----
Forårsdag 147
----
Forårsskibet 148
----
Fred hviler over land og by (A) 21
----
Frihed er det bedste guld 107
----
Gi' dem himlen tilbage 111
----
Gi' mig en dag 199
----
Giv mig, Gud, en salmetunge 33
----
Glade jul, dejlige jul 58
----
Glæden, sorgen og lykken (A) 198
----
Go jawten, go jawten 212
----
Go' nu nat 27
----
Godmorgen, lille land 82
----
Grundlovssangen 86
----
Græshoppen og valmuen 207
----
Gå stille og tyst gennem verden 105
----
Han kommer med sommer 162
----
Happy Christmas (War is over) 287
----
Har du visor, min vän 200
----
Hele verden er vores 226
----
Hey Jude 293
----
Hil dig, frelser og forsoner 36
----
Hilsen til forårssolen 156
----
Himmel og hav 245
----
Hist, hvor vejen slår en bugt 217
----
Holger Danskes mærke 123
----
Hvad er det, min Marie! (A) 203
----
Hvad solskin er for det sorte muld (A) 92
----
Hvem sidder der bag skærmen 220
----
Hvergang en sommer 167
----
Hvide skyer falder ned 245
----
Hvor smiler fager den danske kyst 76
----
Hvorfor går min elskede 208
----
Hymnen til Afrika 112
----
Højt fra træets grønne top 60
----
I al sin glans nu stråler solen 39
----
I alle de riger og lande 123
----
I dag er landet vort 87
----
I Danmark er jeg født (A) 78
----
I det spæde morgengry 9
----
I hjerterne begynder 272
----
I skovens dybe, stille ro (A) 20
----
I sne står urt og busk i skjul 182
----
I østen stiger solen op 3
----
Imagine 292
----
Imellem Esbjerg og Fanø 262
----
Ind til dig igen 206
----
Ind under jul, hvor er det trist 49
----
Ja, vi elsker dette landet 70
----
Jeg bærer med smil min byrde 97
----
Jeg ejer både mark og eng 225
----
Jeg elsker de grønne lunde 75
----
Jeg elsker den brogede verden 98
----
Jeg fandt en sang på vejen 247
----
Jeg går i solen og traller 236
----
Jeg har fanget mig en myg 237
----
Jeg kender et land (A) 90
----
Jeg plukker fløjlsgræs 149
----
Jeg rutter med glædens 99
----
Jeg ser de bøgelyse øer 74
----
Jeg ved en lærkerede 151
----
Jeg ved, hvor der findes en have så skøn 73
----
Jeg vil male dagen blå 228
----
Jens vejmand 220
----
Jo, jo gøgleri er en nobel kunst 100
----
Jordens åndedrag 117
----
Julen har bragt velsignet bud 57
----
Juletræet med sin pynt 61
----
Juni 168
----
Jyden han æ stærk å sej 210
----
Jylland mellem tvende have 72
----
Kald det kærlighed 201
----
Kalendervender Tage 248
----
Kirsten og vejen fra Gurre 174
----
Kom, fred, og fyld den hele dag 231
----
Kom, glade overgivenhed 218
----
Kom, maj, du søde milde 133
----
Kom og dans 251
----
Kom, tro, og kom, glæde 64
----
Kommer hid, l piger små 124
----
Kong Kristjan stod ved højen mast 283
----
Kringsatt av fjender 101
----
Kumbaya 285
----
Kærlighedsrosen 193
----
Lad det leve 263
----
Leaving on a Jet-plane 295
----
Lermennesket 113
----
Let it be 291
----
Let it grow 296
----
Lille Messias 63
----
Livet er en morgengave (A) 118
----
Livstræet 120
----
Love is all around 297
----
Lovsynger Herren 34
----
Luk døren op og se 150
----
Lysfyldt morgen 125
----
Lær mig, nattens stjerne 17
----
Løft dit hoved, du raske gut 89
----
Mads Doss 221
----
Marken er mejet 169
----
Mary boy child 288
----
Med kåde smil den lyse sol 80
----
Med mor til fodbold 250
----
Menneskelivet er underligt 96
----
Mi nååbo, Pe Sme 219
----
Midsommervisen (A) 164
----
Morgengry 10
----
Morgenstund har guld i mund (A) 6
----
Musens sang 213
----
Mørk er november 178
----
Mørkets sang 273
----
Nanna 261
----
Natten er blid 18
----
Natten er så stille 16
----
Nattergalen, kender du den 154
----
Nattergalen på sin gren 259
----
Nocturne 24
----
Noget om helte (A) 118
----
Noget om skærsommernætter 163
----
Nu er dagen fuld af sang 140
----
Nu er det længe siden 173
----
Nu er jord og himmel stille (A) 25
----
Nu falmer skoven trindt om land (A) 175
----
Nu har vi altså jul igen 62
----
Nu hviler mark og enge 15
----
Nu lyser løv i lunde 141
----
Nu nejer blomsterne 163
----
Nu rinder solen op af østerlide (A) 2
----
Nu skal det åbenbares (A) 95
----
Nu skal vi ha' gilde 241
----
Nu tændes tusind julelys 51
----
Når egene knoppes 166
----
Når vinteren rinder i grøft og i grav 142
----
O come, all ye faithful 284
----
O, Færø, så fager 71
----
Og det blev vår 152
----
Ole sad på en knold og sang 222
----
Om lidt 271
----
One hand, One heart 299
----
Op, al den ting, som Gud har gjort 32
----
Opvåvni 144
----
Papirsklip 256
----
Per spelmann 186
----
Påske 150
----
Påskeblomst! Hvad vil du her 38
----
Ramund 188
----
Regnvejrsdag i november 228
----
Romeo 260
----
Roselil og hendes moder 189
----
Ræven er ude med halen så lang 202
----
Røverne fra Kardemommeby 249
----
Sang i det grønne 129
----
Sangen har lysning 102
----
Santa Claus is comin' to town 286
----
Sat her i forvirringstiden 121
----
Se, det summer af sol over engen (A) 159
----
Se, hvilken morgenstund 11
----
Se Norges blomsterdal 223
----
Se, nu stiger solen af havets skød (A) 4
----
Sensommerkanon 242
----
Sensommervise 171
----
Septembers himmel 170
----
Sig månen langsomt hæver 12
----
Sig nærmer tiden 103
----
Skal vi ikke være venner 270
----
Skipper Klements morgensang 132
----
Skoven er så underfuld 177
----
Skuld gammel venskab 224
----
Skyerne gråne 30
----
Skærm jeres huse med grav og planke 132
----
Skønjomfruen går i dansen 190
----
Sneflokke kommer vrimlende 181
----
Snemand Frost og frøken Tø (A) 183
----
Solhvervssang 179
----
Solkanon 243
----
Solsikke 176
----
Som dybest brønd 128
----
Som en rejselysten flåde 77
----
Som forårssolen morgenrød 37
----
Sommerens ø 167
----
Sommersalme 40
----
Soon and very soon 298
----
Sov på min arm 24
----
Spurven sidder stum bag kvist 185
----
Stenen slår smut på det danske vand 275
----
Stilfærdigt farvel 266
----
Stille, hjerte, sol går ned 13
----
Stjernefart 253
----
Stjerner dukker frem 18
----
Storken 162
----
Summer nights (Grease) 306
----
Svantes lykkelige dag 11
----
Svinehyrden 252
----
Swing low 301
----
Sæt grammofonen i stå 214
----
Søren Bramfris lærkesang 215
----
Så længe skuden kan gå 279
----
Så tænder vi et lys i kvæld 28
----
Tag del i det, der er din tid 269
----
Take it easy, boy, boy 304
----
Tears in heaven 302
----
That's what friends are for 309
----
The Rose 305
----
Those were the days 308
----
Til Dem, hr. præsident 229
----
Til himlene rækker din miskundhed, Gi 1 8
----
Til min Marie (A) 203
----
Til ungdommen 101
----
Till havs med solfyllda segel 240
----
To be or not to be 303
----
To gyldne sommerfugle (A) 197
----
Tusind stykker 282
----
Underlige aftenlufte 14
----
Valmuevejen 254
----
Velkommen i den grønne lund 129
----
Velkommen igen, Guds engle små (A; 59
----
Velkommen, lærkelil (A) 143
----
Vem kan segla forutan vind 192
----
Veninde, tag frakken og støvlerne på 47
----
Vennekredsen 238
----
Vennesang 277
----
Veronica 196
----
Vi, der valgte regnen 122
----
Vi elsker vort land (A) 164
----
Vi vil plante et træ 230
----
Vipper springe over klinge 165
----
Visen om de atten svaner 204
----
VLTJ 280
----
Vor sol er blevet kold (A) 179
----
Vort modersmål er dejligt 79
----
Vær lidt varsom 184
----
Vær velkommen, Herrens år (advent 29
----
Vær velkommen, Herrens år (nytår) 43
----
Være vind 278
----
Vågn nu op af dine drømme 239
----
Vågn op og slå på dine strenge 7
----
Våren er i luften 138
----
Vårt land, vårt land, vårt fosterland 68
----
Vårvise 255
----
War is over 287
----
What a wonderful world 300
----
Whiskey in the Jar 307
----
Wonderful tonight 294
----
Yesterday 290
----
Æbler lyser rødt på træernes grene 171
----
Åbent landskab 281" delay="4600" random="true" cookie="" title="auto-timer stopped... click to view another item, or 'mouseout' to restart timer" style="display: block;" href="javascript:;" nextitem="207">Mørkets sang 273</a></div></td></tr><tr class="oddRow"><td>5</td><td><div class="sliderPanel" style="overflow: hidden; display: block; height: auto; opacity: 1;"><a class="QOTD" id="20090207.18393602640.7179594713338653" list="Aftensang 19
----
Altid frejdig, når du går 23
----
Anemonesangen 153
----
April, april (A) 158
----
At kende sig selv 205
----
At lære er at ville (A) 108
----
At samles, skilles ad 264
----
Barndommens land 114
----
Bedstefar tag dine tænder på (A) 158
----
Bladet i bogen sig vender 126
----
Bliv! Råbte Herren i de tomme sale 148
----
Blomstre som en rosengård 35
----
Blæsten går frisk over Limfjordens vande 83
----
Bornholm, Bornholm, Bornholm 88
----
Cafe Måneskin 257
----
Crying in the rain 289
----
Dagen før 233
----
Dagen går med raske fjed 22
----
Danmark frit (A) 130
----
Danmark, nu blunder den lyse nat 160
----
Danmarks-kanon 235
----
De dybeste lag 44
----
De evige tre (A) 195
----
De levendes land (A) 90
----
De nære ting 209
----
De ord, jeg synger 115
----
De små børns smil 109
----
Decembernat 47
----
Decembersang 48
----
Dejlig er den himmel blå 50
----
Dejlig er jorden 52
----
Dejligst af alle glæder (A) 198
----
Den blå anemone 146
----
Den danske sang 84
----
Den grønne søde vår 134
----
Den himmelblå 66
----
Den kedsom vinter gik sin gang 135
----
Den lille lysegrønne sang 157
----
Den mørke nat forgangen er 5
----
Den røde tråd 258
----
Den signede dag med fryd vi ser 1
----
Den spillemand snapped fiolen fra væg 211
----
Der bor en kraft i sindet 274
----
Der dukker af disen (A) 85
----
Der er et yndigt land 67
----
Der er noget galt i Danmark 234
----
Der er noget i luften 31
----
Der går i nat et glædesbud 42
----
Der stode tre skalke 187
----
Der truer os i tiden (A) 106
----
Derfor kan vort øje glædes 104
----
Desertøren 229
----
Det bedste jeg ved 246
----
Det drømmende vand 232
----
Det er angstens sved, han sveder 45
----
Det er forår, alting klippes ned 156
----
Det er hvidt herude 180
----
Det er i dag et vejr 136
----
Det er lærkernes tid 137
----
Det er os, det er os 131
----
Det er så køhnt, det er så dejle 139
----
Det er så sandt 46
----
Det haver så nyligen regnet 127
----
Det kimer nu til julefest 53
----
Det lysner over agres felt 172
----
Det løvfald, som vi kom så alt for nær 174
----
Det' sørme det' sandt december 48
----
Det var en lørdag aften 191
----
Det øjeblik vi lever i 116
----
DGI blues 268
----
Du danske sommer 161
----
Du gamla, du fria, du fjållhoga Nord 69
----
Du ka' gør', hva' du vil 263
----
Du kom med alt det der var dig 194
----
Du skal plante et træ 119
----
Du, som har tændt millioner af stjerner 26
----
Duerne flyver 276
----
Dybt hælder året i sin gang 41
----
Efterårskanon 244
----
En enkel sang om frihed 227
----
En kæde af evige bånd 267
----
En lærke letted (A) 130
----
En rose så jeg skyde 54
----
En stjerne fødes (L'94) 265
----
En sømand har sin enegang 216
----
En yndig og frydefuld sommertid 193
----
Engang var frihed ordet (A) 110
----
Er lyset for de lærde blot (A) 91
----
Et barn er født i Betlehem 55
----
Et jævnt og muntert virksomt liv 93
----
Fire påskeliljer 145
----
Folkeligt skal alt nu være (A) 94
----
For en fremmed barskt og fattigt 81
----
For længe sid'n, i Betlehem 65
----
Forunderligt at sige 56
----
Forår 155
----
Forår ved Mariager fjord (A) 197
----
Forårsdag 147
----
Forårsskibet 148
----
Fred hviler over land og by (A) 21
----
Frihed er det bedste guld 107
----
Gi' dem himlen tilbage 111
----
Gi' mig en dag 199
----
Giv mig, Gud, en salmetunge 33
----
Glade jul, dejlige jul 58
----
Glæden, sorgen og lykken (A) 198
----
Go jawten, go jawten 212
----
Go' nu nat 27
----
Godmorgen, lille land 82
----
Grundlovssangen 86
----
Græshoppen og valmuen 207
----
Gå stille og tyst gennem verden 105
----
Han kommer med sommer 162
----
Happy Christmas (War is over) 287
----
Har du visor, min vän 200
----
Hele verden er vores 226
----
Hey Jude 293
----
Hil dig, frelser og forsoner 36
----
Hilsen til forårssolen 156
----
Himmel og hav 245
----
Hist, hvor vejen slår en bugt 217
----
Holger Danskes mærke 123
----
Hvad er det, min Marie! (A) 203
----
Hvad solskin er for det sorte muld (A) 92
----
Hvem sidder der bag skærmen 220
----
Hvergang en sommer 167
----
Hvide skyer falder ned 245
----
Hvor smiler fager den danske kyst 76
----
Hvorfor går min elskede 208
----
Hymnen til Afrika 112
----
Højt fra træets grønne top 60
----
I al sin glans nu stråler solen 39
----
I alle de riger og lande 123
----
I dag er landet vort 87
----
I Danmark er jeg født (A) 78
----
I det spæde morgengry 9
----
I hjerterne begynder 272
----
I skovens dybe, stille ro (A) 20
----
I sne står urt og busk i skjul 182
----
I østen stiger solen op 3
----
Imagine 292
----
Imellem Esbjerg og Fanø 262
----
Ind til dig igen 206
----
Ind under jul, hvor er det trist 49
----
Ja, vi elsker dette landet 70
----
Jeg bærer med smil min byrde 97
----
Jeg ejer både mark og eng 225
----
Jeg elsker de grønne lunde 75
----
Jeg elsker den brogede verden 98
----
Jeg fandt en sang på vejen 247
----
Jeg går i solen og traller 236
----
Jeg har fanget mig en myg 237
----
Jeg kender et land (A) 90
----
Jeg plukker fløjlsgræs 149
----
Jeg rutter med glædens 99
----
Jeg ser de bøgelyse øer 74
----
Jeg ved en lærkerede 151
----
Jeg ved, hvor der findes en have så skøn 73
----
Jeg vil male dagen blå 228
----
Jens vejmand 220
----
Jo, jo gøgleri er en nobel kunst 100
----
Jordens åndedrag 117
----
Julen har bragt velsignet bud 57
----
Juletræet med sin pynt 61
----
Juni 168
----
Jyden han æ stærk å sej 210
----
Jylland mellem tvende have 72
----
Kald det kærlighed 201
----
Kalendervender Tage 248
----
Kirsten og vejen fra Gurre 174
----
Kom, fred, og fyld den hele dag 231
----
Kom, glade overgivenhed 218
----
Kom, maj, du søde milde 133
----
Kom og dans 251
----
Kom, tro, og kom, glæde 64
----
Kommer hid, l piger små 124
----
Kong Kristjan stod ved højen mast 283
----
Kringsatt av fjender 101
----
Kumbaya 285
----
Kærlighedsrosen 193
----
Lad det leve 263
----
Leaving on a Jet-plane 295
----
Lermennesket 113
----
Let it be 291
----
Let it grow 296
----
Lille Messias 63
----
Livet er en morgengave (A) 118
----
Livstræet 120
----
Love is all around 297
----
Lovsynger Herren 34
----
Luk døren op og se 150
----
Lysfyldt morgen 125
----
Lær mig, nattens stjerne 17
----
Løft dit hoved, du raske gut 89
----
Mads Doss 221
----
Marken er mejet 169
----
Mary boy child 288
----
Med kåde smil den lyse sol 80
----
Med mor til fodbold 250
----
Menneskelivet er underligt 96
----
Mi nååbo, Pe Sme 219
----
Midsommervisen (A) 164
----
Morgengry 10
----
Morgenstund har guld i mund (A) 6
----
Musens sang 213
----
Mørk er november 178
----
Mørkets sang 273
----
Nanna 261
----
Natten er blid 18
----
Natten er så stille 16
----
Nattergalen, kender du den 154
----
Nattergalen på sin gren 259
----
Nocturne 24
----
Noget om helte (A) 118
----
Noget om skærsommernætter 163
----
Nu er dagen fuld af sang 140
----
Nu er det længe siden 173
----
Nu er jord og himmel stille (A) 25
----
Nu falmer skoven trindt om land (A) 175
----
Nu har vi altså jul igen 62
----
Nu hviler mark og enge 15
----
Nu lyser løv i lunde 141
----
Nu nejer blomsterne 163
----
Nu rinder solen op af østerlide (A) 2
----
Nu skal det åbenbares (A) 95
----
Nu skal vi ha' gilde 241
----
Nu tændes tusind julelys 51
----
Når egene knoppes 166
----
Når vinteren rinder i grøft og i grav 142
----
O come, all ye faithful 284
----
O, Færø, så fager 71
----
Og det blev vår 152
----
Ole sad på en knold og sang 222
----
Om lidt 271
----
One hand, One heart 299
----
Op, al den ting, som Gud har gjort 32
----
Opvåvni 144
----
Papirsklip 256
----
Per spelmann 186
----
Påske 150
----
Påskeblomst! Hvad vil du her 38
----
Ramund 188
----
Regnvejrsdag i november 228
----
Romeo 260
----
Roselil og hendes moder 189
----
Ræven er ude med halen så lang 202
----
Røverne fra Kardemommeby 249
----
Sang i det grønne 129
----
Sangen har lysning 102
----
Santa Claus is comin' to town 286
----
Sat her i forvirringstiden 121
----
Se, det summer af sol over engen (A) 159
----
Se, hvilken morgenstund 11
----
Se Norges blomsterdal 223
----
Se, nu stiger solen af havets skød (A) 4
----
Sensommerkanon 242
----
Sensommervise 171
----
Septembers himmel 170
----
Sig månen langsomt hæver 12
----
Sig nærmer tiden 103
----
Skal vi ikke være venner 270
----
Skipper Klements morgensang 132
----
Skoven er så underfuld 177
----
Skuld gammel venskab 224
----
Skyerne gråne 30
----
Skærm jeres huse med grav og planke 132
----
Skønjomfruen går i dansen 190
----
Sneflokke kommer vrimlende 181
----
Snemand Frost og frøken Tø (A) 183
----
Solhvervssang 179
----
Solkanon 243
----
Solsikke 176
----
Som dybest brønd 128
----
Som en rejselysten flåde 77
----
Som forårssolen morgenrød 37
----
Sommerens ø 167
----
Sommersalme 40
----
Soon and very soon 298
----
Sov på min arm 24
----
Spurven sidder stum bag kvist 185
----
Stenen slår smut på det danske vand 275
----
Stilfærdigt farvel 266
----
Stille, hjerte, sol går ned 13
----
Stjernefart 253
----
Stjerner dukker frem 18
----
Storken 162
----
Summer nights (Grease) 306
----
Svantes lykkelige dag 11
----
Svinehyrden 252
----
Swing low 301
----
Sæt grammofonen i stå 214
----
Søren Bramfris lærkesang 215
----
Så længe skuden kan gå 279
----
Så tænder vi et lys i kvæld 28
----
Tag del i det, der er din tid 269
----
Take it easy, boy, boy 304
----
Tears in heaven 302
----
That's what friends are for 309
----
The Rose 305
----
Those were the days 308
----
Til Dem, hr. præsident 229
----
Til himlene rækker din miskundhed, Gi 1 8
----
Til min Marie (A) 203
----
Til ungdommen 101
----
Till havs med solfyllda segel 240
----
To be or not to be 303
----
To gyldne sommerfugle (A) 197
----
Tusind stykker 282
----
Underlige aftenlufte 14
----
Valmuevejen 254
----
Velkommen i den grønne lund 129
----
Velkommen igen, Guds engle små (A; 59
----
Velkommen, lærkelil (A) 143
----
Vem kan segla forutan vind 192
----
Veninde, tag frakken og støvlerne på 47
----
Vennekredsen 238
----
Vennesang 277
----
Veronica 196
----
Vi, der valgte regnen 122
----
Vi elsker vort land (A) 164
----
Vi vil plante et træ 230
----
Vipper springe over klinge 165
----
Visen om de atten svaner 204
----
VLTJ 280
----
Vor sol er blevet kold (A) 179
----
Vort modersmål er dejligt 79
----
Vær lidt varsom 184
----
Vær velkommen, Herrens år (advent 29
----
Vær velkommen, Herrens år (nytår) 43
----
Være vind 278
----
Vågn nu op af dine drømme 239
----
Vågn op og slå på dine strenge 7
----
Våren er i luften 138
----
Vårt land, vårt land, vårt fosterland 68
----
Vårvise 255
----
War is over 287
----
What a wonderful world 300
----
Whiskey in the Jar 307
----
Wonderful tonight 294
----
Yesterday 290
----
Æbler lyser rødt på træernes grene 171
----
Åbent landskab 281" delay="4900" random="true" cookie="" title="auto-timer stopped... click to view another item, or 'mouseout' to restart timer" style="display: block;" href="javascript:;" nextitem="25">De nære ting 209</a></div></td></tr></tbody></table></span></td><td><span refresh="content" tiddler="SangMappenTilfældig"><table class="sortable"><thead><tr class="evenRow"><td index="0">Mappen:<span class="hidden">↑</span></td><td index="1">Titel side<span class="hidden">↑</span></td></tr></thead><tbody><tr class="oddRow"><td>1</td><td><div class="sliderPanel" style="overflow: hidden; display: block; height: auto; opacity: 1;"><a class="QOTD" id="20090207.18393602960.8225759455225827" list="Andreas sang 21
----
Barndommens gade 22
----
Buster 4
----
Byens hotel 50
----
California Dreamin' 42
----
Can’t Help Falling In Love 24
----
Dagen er din 6
----
Dansevise 27
----
Danskerne findes i mange modeller 30
----
De smukke unge mennesker 45
----
Den gamle spillemand 15
----
Det som lysner over vangen 27
----
Dream A Little Dream of Me 34
----
Du satte dig selv 12
----
Eight Days A Week 13
----
Elefantens vuggevise 47
----
En sang af sommer 40
----
Fly Me To The Moon 44
----
Gem et lille smil 46
----
Gi’ os lyset tilbage 10
----
Go Down Moses 9
----
Hvor du sætter din fod 39
----
Hvor længe vil du ydmyge dig? 28
----
Hymne til sangen 14
----
Hører du nogen kalde 31
----
Inderst inde 19
----
Indianer 11
----
Jeg mødte en sang 41
----
Joanna 34
----
Jutlandia 16
----
Kajs sang 21
----
Killing Me Softly 17
----
Kvinde min 18
----
Kære linedanser 55
----
Love Is A Matter Of Difference 52
----
Magi i luften 51
----
Masser af succes 59
----
Masser af succes 54
----
Menneske din egen magt 20
----
Midt om natten 43
----
Noget i dig selv 26
----
Puff 23
----
Solen begynder at gløde 29
----
Som jorden sang sin første sang 37
----
Stand by me 7
----
Sådan nogen som os 38
----
Sång till friheten 25
----
This Is My Life 21
----
Ud under åben himmel 36
----
Udsigt i kikkert 3
----
Vi har kun én sol 8
----
Vågner i natten 48
----
With A Little Help 35
----
You’ve Got A Friend 32" delay="8800" random="true" cookie="" title="auto-timer stopped... click to view another item, or 'mouseout' to restart timer" style="display: block;" href="javascript:;" nextitem="36">Magi i luften 51</a></div></td></tr><tr class="evenRow"><td>2</td><td><div class="sliderPanel" style="overflow: hidden; display: block; height: auto; opacity: 1;"><a class="QOTD" id="20090207.18393603140.27586872295971876" list="Andreas sang 21
----
Barndommens gade 22
----
Buster 4
----
Byens hotel 50
----
California Dreamin' 42
----
Can’t Help Falling In Love 24
----
Dagen er din 6
----
Dansevise 27
----
Danskerne findes i mange modeller 30
----
De smukke unge mennesker 45
----
Den gamle spillemand 15
----
Det som lysner over vangen 27
----
Dream A Little Dream of Me 34
----
Du satte dig selv 12
----
Eight Days A Week 13
----
Elefantens vuggevise 47
----
En sang af sommer 40
----
Fly Me To The Moon 44
----
Gem et lille smil 46
----
Gi’ os lyset tilbage 10
----
Go Down Moses 9
----
Hvor du sætter din fod 39
----
Hvor længe vil du ydmyge dig? 28
----
Hymne til sangen 14
----
Hører du nogen kalde 31
----
Inderst inde 19
----
Indianer 11
----
Jeg mødte en sang 41
----
Joanna 34
----
Jutlandia 16
----
Kajs sang 21
----
Killing Me Softly 17
----
Kvinde min 18
----
Kære linedanser 55
----
Love Is A Matter Of Difference 52
----
Magi i luften 51
----
Masser af succes 59
----
Masser af succes 54
----
Menneske din egen magt 20
----
Midt om natten 43
----
Noget i dig selv 26
----
Puff 23
----
Solen begynder at gløde 29
----
Som jorden sang sin første sang 37
----
Stand by me 7
----
Sådan nogen som os 38
----
Sång till friheten 25
----
This Is My Life 21
----
Ud under åben himmel 36
----
Udsigt i kikkert 3
----
Vi har kun én sol 8
----
Vågner i natten 48
----
With A Little Help 35
----
You’ve Got A Friend 32" delay="9100" random="true" cookie="" title="auto-timer stopped... click to view another item, or 'mouseout' to restart timer" style="display: block;" href="javascript:;" nextitem="47">Sång till friheten 25</a></div></td></tr><tr class="oddRow"><td>3</td><td><div class="sliderPanel" style="overflow: hidden; display: block; height: auto; opacity: 1;"><a class="QOTD" id="20090207.18393603360.5438446580471976" list="Andreas sang 21
----
Barndommens gade 22
----
Buster 4
----
Byens hotel 50
----
California Dreamin' 42
----
Can’t Help Falling In Love 24
----
Dagen er din 6
----
Dansevise 27
----
Danskerne findes i mange modeller 30
----
De smukke unge mennesker 45
----
Den gamle spillemand 15
----
Det som lysner over vangen 27
----
Dream A Little Dream of Me 34
----
Du satte dig selv 12
----
Eight Days A Week 13
----
Elefantens vuggevise 47
----
En sang af sommer 40
----
Fly Me To The Moon 44
----
Gem et lille smil 46
----
Gi’ os lyset tilbage 10
----
Go Down Moses 9
----
Hvor du sætter din fod 39
----
Hvor længe vil du ydmyge dig? 28
----
Hymne til sangen 14
----
Hører du nogen kalde 31
----
Inderst inde 19
----
Indianer 11
----
Jeg mødte en sang 41
----
Joanna 34
----
Jutlandia 16
----
Kajs sang 21
----
Killing Me Softly 17
----
Kvinde min 18
----
Kære linedanser 55
----
Love Is A Matter Of Difference 52
----
Magi i luften 51
----
Masser af succes 59
----
Masser af succes 54
----
Menneske din egen magt 20
----
Midt om natten 43
----
Noget i dig selv 26
----
Puff 23
----
Solen begynder at gløde 29
----
Som jorden sang sin første sang 37
----
Stand by me 7
----
Sådan nogen som os 38
----
Sång till friheten 25
----
This Is My Life 21
----
Ud under åben himmel 36
----
Udsigt i kikkert 3
----
Vi har kun én sol 8
----
Vågner i natten 48
----
With A Little Help 35
----
You’ve Got A Friend 32" delay="9400" random="true" cookie="" title="auto-timer stopped... click to view another item, or 'mouseout' to restart timer" style="display: block;" href="javascript:;" nextitem="3">Buster 4</a></div></td></tr><tr class="evenRow"><td>4</td><td><div class="sliderPanel" style="overflow: hidden; display: block; height: auto; opacity: 1;"><a class="QOTD" id="20090207.18393603530.7237422376634388" list="Andreas sang 21
----
Barndommens gade 22
----
Buster 4
----
Byens hotel 50
----
California Dreamin' 42
----
Can’t Help Falling In Love 24
----
Dagen er din 6
----
Dansevise 27
----
Danskerne findes i mange modeller 30
----
De smukke unge mennesker 45
----
Den gamle spillemand 15
----
Det som lysner over vangen 27
----
Dream A Little Dream of Me 34
----
Du satte dig selv 12
----
Eight Days A Week 13
----
Elefantens vuggevise 47
----
En sang af sommer 40
----
Fly Me To The Moon 44
----
Gem et lille smil 46
----
Gi’ os lyset tilbage 10
----
Go Down Moses 9
----
Hvor du sætter din fod 39
----
Hvor længe vil du ydmyge dig? 28
----
Hymne til sangen 14
----
Hører du nogen kalde 31
----
Inderst inde 19
----
Indianer 11
----
Jeg mødte en sang 41
----
Joanna 34
----
Jutlandia 16
----
Kajs sang 21
----
Killing Me Softly 17
----
Kvinde min 18
----
Kære linedanser 55
----
Love Is A Matter Of Difference 52
----
Magi i luften 51
----
Masser af succes 59
----
Masser af succes 54
----
Menneske din egen magt 20
----
Midt om natten 43
----
Noget i dig selv 26
----
Puff 23
----
Solen begynder at gløde 29
----
Som jorden sang sin første sang 37
----
Stand by me 7
----
Sådan nogen som os 38
----
Sång till friheten 25
----
This Is My Life 21
----
Ud under åben himmel 36
----
Udsigt i kikkert 3
----
Vi har kun én sol 8
----
Vågner i natten 48
----
With A Little Help 35
----
You’ve Got A Friend 32" delay="9700" random="true" cookie="" title="auto-timer stopped... click to view another item, or 'mouseout' to restart timer" style="display: block;" href="javascript:;" nextitem="51">Vi har kun én sol 8</a></div></td></tr><tr class="oddRow"><td>5</td><td><div class="sliderPanel" style="overflow: hidden; display: block; height: auto; opacity: 1;"><a class="QOTD" id="20090207.18393603710.7153786195590214" list="Andreas sang 21
----
Barndommens gade 22
----
Buster 4
----
Byens hotel 50
----
California Dreamin' 42
----
Can’t Help Falling In Love 24
----
Dagen er din 6
----
Dansevise 27
----
Danskerne findes i mange modeller 30
----
De smukke unge mennesker 45
----
Den gamle spillemand 15
----
Det som lysner over vangen 27
----
Dream A Little Dream of Me 34
----
Du satte dig selv 12
----
Eight Days A Week 13
----
Elefantens vuggevise 47
----
En sang af sommer 40
----
Fly Me To The Moon 44
----
Gem et lille smil 46
----
Gi’ os lyset tilbage 10
----
Go Down Moses 9
----
Hvor du sætter din fod 39
----
Hvor længe vil du ydmyge dig? 28
----
Hymne til sangen 14
----
Hører du nogen kalde 31
----
Inderst inde 19
----
Indianer 11
----
Jeg mødte en sang 41
----
Joanna 34
----
Jutlandia 16
----
Kajs sang 21
----
Killing Me Softly 17
----
Kvinde min 18
----
Kære linedanser 55
----
Love Is A Matter Of Difference 52
----
Magi i luften 51
----
Masser af succes 59
----
Masser af succes 54
----
Menneske din egen magt 20
----
Midt om natten 43
----
Noget i dig selv 26
----
Puff 23
----
Solen begynder at gløde 29
----
Som jorden sang sin første sang 37
----
Stand by me 7
----
Sådan nogen som os 38
----
Sång till friheten 25
----
This Is My Life 21
----
Ud under åben himmel 36
----
Udsigt i kikkert 3
----
Vi har kun én sol 8
----
Vågner i natten 48
----
With A Little Help 35
----
You’ve Got A Friend 32" delay="10000" random="true" cookie="" title="auto-timer stopped... click to view another item, or 'mouseout' to restart timer" style="display: block;" href="javascript:;" nextitem="5">California Dreamin' 42</a></div></td></tr></tbody></table></span></td></tr></tbody></table></html>
<<miniBrowser hidecontrols http://xn--mns-ula.dk/Billeder/images/Kringsatt.png>>
<html><style type="text/css">table.lfmWidgetradio_ed72864fd6a349e3e086f397b2c4728f td {margin:0 !important;padding:0 !important;border:0 !important;}table.lfmWidgetradio_ed72864fd6a349e3e086f397b2c4728f tr.lfmHead a:hover {background:url(http://cdn.last.fm/widgets/images/en/header/radio/regular_red.png) no-repeat 0 0 !important;}table.lfmWidgetradio_ed72864fd6a349e3e086f397b2c4728f tr.lfmEmbed object {float:left;}table.lfmWidgetradio_ed72864fd6a349e3e086f397b2c4728f tr.lfmFoot td.lfmConfig a:hover {background:url(http://cdn.last.fm/widgets/images/en/footer/red.png) no-repeat 0px 0 !important;;}table.lfmWidgetradio_ed72864fd6a349e3e086f397b2c4728f tr.lfmFoot td.lfmView a:hover {background:url(http://cdn.last.fm/widgets/images/en/footer/red.png) no-repeat -85px 0 !important;}table.lfmWidgetradio_ed72864fd6a349e3e086f397b2c4728f tr.lfmFoot td.lfmPopup a:hover {background:url(http://cdn.last.fm/widgets/images/en/footer/red.png) no-repeat -159px 0 !important;}</style>
<table class="lfmWidgetradio_ed72864fd6a349e3e086f397b2c4728f" cellpadding="0" cellspacing="0" border="0" style="width:184px;"><tr class="lfmHead"><td><a title="Måns' foretrukne" href="http://www.last.fm/listen/user/maans66/personal" target="_blank" style="display:block;overflow:hidden;height:20px;width:184px;background:url(http://cdn.last.fm/widgets/images/en/header/radio/regular_red.png) no-repeat 0 -20px;text-decoration:none;border:0;"></a></td></tr><tr class="lfmEmbed"><td><object type="application/x-shockwave-flash" data="http://cdn.last.fm/widgets/radio/22.swf" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,0,0" id="lfmEmbed_1963840343" width="184" height="140"> <param name="movie" value="http://cdn.last.fm/widgets/radio/22.swf" /> <param name="flashvars" value="lfmMode=radio&radioURL=user%2Fmaans66%2Fpersonal&title=maans66%E2%80%99s+Library&theme=red&lang=en&widget_id=radio_ed72864fd6a349e3e086f397b2c4728f" /> <param name="allowScriptAccess" value="always" /> <param name="allowNetworking" value="all" /> <param name="allowFullScreen" value="true" /> <param name="quality" value="high" /> <param name="bgcolor" value="d01f3c" /> <param name="wmode" value="transparent" /> <param name="menu" value="true" /> </object></td></tr><tr class="lfmFoot"><td style="background:url(http://cdn.last.fm/widgets/images/footer_bg/red.png) repeat-x 0 0;text-align:right;"><table cellspacing="0" cellpadding="0" border="0" style="width:184px;"><tr><td class="lfmConfig"><a href="http://www.last.fm/widgets/?url=user%2Fmaans66%2Fpersonal&colour=red&size=regular&autostart=0&from=code&widget=radio" title="Get your own widget" target="_blank" style="display:block;overflow:hidden;width:85px;height:20px;float:right;background:url(http://cdn.last.fm/widgets/images/en/footer/red.png) no-repeat 0px -20px;text-decoration:none;border:0;"></a></td><td class="lfmView" style="width:74px;"><a href="http://www.last.fm/user/maans66" title="Se Måns' profil" target="_blank" style="display:block;overflow:hidden;width:74px;height:20px;background:url(http://cdn.last.fm/widgets/images/en/footer/red.png) no-repeat -85px -20px;text-decoration:none;border:0;"></a></td><td class="lfmPopup"style="width:25px;"><a href="http://www.last.fm/widgets/popup/?url=user%2Fmaans66%2Fpersonal&colour=red&size=regular&autostart=0&from=code&widget=radio&resize=1" title="Load this radio in a pop up" target="_blank" style="display:block;overflow:hidden;width:25px;height:20px;background:url(http://cdn.last.fm/widgets/images/en/footer/red.png) no-repeat -159px -20px;text-decoration:none;border:0;" onclick="window.open(this.href + '&resize=0','lfm_popup','height=240,width=234,resizable=yes,scrollbars=yes'); return false;"></a></td></tr></table></td></tr></table></html>
!!!Lav en sangtime
RegneArk@@position:relative;+++^63em^@[[RegneArk]]<<moveablePanel name:RegneArk>>
----
<html><div align="left"><iframe src="http://spreadsheets.google.com/ccc?key=pqdy--SaXp5wwjIoujXgGbQ" frameborder="0" width="100%" height="600"></iframe></div></html>
===
@@
Onsdag@@position:relative;+++^13em^@[[Onsdag]]<<moveablePanel name:Onsdag>>
----
<<newJournal label:"Ny Sang/fortælling" tag:"Sang Sangtime" text:"!HUSK at ændre titelen til den aktuelle dato!!!
!!Sang/fortælling
|sortable|k
|nr|Titel|Kilde,nr/s|Pianist|ny|h
" >>
<<newJournal label:"OnsdagWysiwyg" text:{{"<<formTiddler #OnsdagWysiwygTemplate\>\>"}} tag:"Sang">>
<<newJournal label:"OnsdagsHjælp" text:{{"<<formTiddler OnsdagsTemplate\>\>"}} tag:"Sang">>
===
@@
Fredag@@position:relative;+++^13em^@[[Fredag]]<<moveablePanel name:Fredag>>
----
<<newJournal label:"Ny FredagsSangtime" tag:"Sang Sangtime" text:"!HUSK at ændre titelen til den aktuelle dato!!!
!!Fredagssangtimen
|sortable|k
|nr|Titel|Kilde,nr/s|Pianist|ny|h
" >>
<<newJournal label:"FredagWysiwyg" text:{{"<<formTiddler #FredagWysiwygTemplate\>\>"}} tag:"Sang Sangtime">>
<<newJournal label:"FredagsHjælp" text:{{"<<formTiddler FredagsTemplate\>\>"}} tag:"Sang Sangtime">>
===
@@
//{{{
/*
* ListByTag
*/
Array.prototype.tiddlerList = function(listFormat,max) {
var output = "";
if (!listFormat)
listFormat = "'\\n{{tiddlerListItem{{{tiddlerListItemTitle{[[' + tiddler.title + ']]}}} - ' + tiddler.created.formatString('0DD/0MM/YY') + ' - ' + tiddler.modifier + '\\n{{tiddlerExcerpt{' + text + ' ... \\n}}}}}}'";
if (!max)
max = this.length;
if (this.length > 0 && this[0] instanceof Tiddler) {
for (var i=0;i<max;i++) {
var tiddler = this[i];
var text = "{{{"+wikifyPlain(tiddler.title, store, 100)+"}}}";
output += eval(listFormat);
}
}
output += "\n----\n";
return output;
};
// tag, sorted, listformat, max(0), noReverse(true)
config.macros.listByTag = {};
config.macros.listByTag.handler = function(place,macroName,params,wikifier,paramString,tiddler)
{
params[0] = (params[0] ? params[0] : tiddler.title);
var tiddlers = store.getTaggedTiddlers(params[0],params[1]);
if (params[3] == 0) params[3] = null;
if (! params[4])
tiddlers = tiddlers.reverse();
wikify(tiddlers.tiddlerList(params[2],params[3]),place,null,tiddler.tiddler);
var tiddlerElem = document.getElementById(story.idPrefix + tiddler.title);
var e = null;
if(tiddlerElem != null) {
var children = tiddlerElem.getElementsByTagName("span");
for(var t=0; t<children.length; t++) {
var c = children[t];
if(c.className == 'tiddlerListItem') {
c.addEventListener('mousedown', function(event) {
var tiddlyLink = event.currentTarget.firstChild.firstChild;
var tiddlerTitle = tiddlyLink.getAttribute("tiddlyLink");
story.displayTiddler(null, tiddlerTitle);
event.preventDefault();
}, true);
}
}
}
};
//}}}
<script>
var tags = store.getTags();
if(tags.length == 0) return "no tags in document";
var out="";
for(var t=0; t<tags.length; t++) {
out+="*[["+tags[t][0]+"]] ("+tags[t][1]+")"+"\n";
var tids=store.getTaggedTiddlers(tags[t][0]);
for (i=0; i<tids.length; i++) out+="##[["+tids[i].title+"]]\n";
}
return out;
</script>
/***
|''Name:''|LoadRemoteFileThroughProxy (previous LoadRemoteFileHijack)|
|''Description:''|When the TiddlyWiki file is located on the web (view over http) the content of [[SiteProxy]] tiddler is added in front of the file url. If [[SiteProxy]] does not exist "/proxy/" is added. |
|''Version:''|1.1.0|
|''Date:''|mar 17, 2007|
|''Source:''|http://tiddlywiki.bidix.info/#LoadRemoteFileHijack|
|''Author:''|BidiX (BidiX (at) bidix (dot) info)|
|''License:''|[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D ]]|
|''~CoreVersion:''|2.2.0|
***/
//{{{
version.extensions.LoadRemoteFileThroughProxy = {
major: 1, minor: 1, revision: 0,
date: new Date("mar 17, 2007"),
source: "http://tiddlywiki.bidix.info/#LoadRemoteFileThroughProxy"};
if (!window.bidix) window.bidix = {}; // bidix namespace
if (!bidix.core) bidix.core = {};
bidix.core.loadRemoteFile = loadRemoteFile;
loadRemoteFile = function(url,callback,params)
{
if ((document.location.toString().substr(0,4) == "http") && (url.substr(0,4) == "http")){
url = store.getTiddlerText("SiteProxy", "/proxy/") + url;
}
return bidix.core.loadRemoteFile(url,callback,params);
}
//}}}
<<slider chkSliderLastFm LastFm "Radio»">>
{{bluey{Emne indeks}}}@@padding-left:0.5em;font-size:7pt;<script label="(genopfrisk)">
story.forEachTiddler(function(t,e)
{story.refreshTiddler(t,null,true)});
refreshDisplay();
return false;
</script>@@
<<forEachTiddler
where
'tiddler.tags.contains("Emner")'
script
'
function getFirstLine(s) {
var m = s.match(/\s*(.*)/);
return m != null && m.length >= 1 ? m[1] : "";
}
'
write
'getFirstLine(tiddler.text)' >><<tiddler LavSangTime>>
----
[img[alt_text|http://maans.newp.dk/Billeder/images/notebook.gif]]Kalender@@position:relative;+++^19em^@[[Kalender]]<<moveablePanel name:Kalender>>
----
|<<calendar thismonth>> |
===
@@
Hurtigt overblik@@position:relative;+++^25em^@[[tagSky]] Klik på initialer: <<tag SB>> <<tag JD>> <<tag NT>> <<tag MM>><<moveablePanel name:tagSky>>
----
|<<tiddler tagSky>>|
===
@@
----
Kontakt<<tiddler Meddelelser>>Læs kommentarer@@position:relative;+++^53em^@[[Kommentarer]]<<moveablePanel name:Kommentarer>>
----
<<tiddler Kommentarer >>
===
@@
[[Chat|SangTimeLærerChat]]<<tiddler Chat>>
| !<<tiddler KlogeOrd>> |
| <<tiddler GæsteKort>> |
| !<<tiddler Kat>> |
| ZenMaker@@position:relative;+++^75em^@[[ZenMaker]] Klik musik <<moveablePanel name: ZenMaker>>----<<tiddler ZenMaker>>===|
<!-- START: PDF Online Script -->
<script type="text/javascript">
var authorId = "AB9CAD14-7AED-4591-8C53-5C553A994451";
var pageOrientation = "0";
var topMargin = "0.5";
var bottomMargin = "0.5";
var leftMargin = "0.5";
var rightMargin = "0.5";
</script>
<script type="text/javascript" src="http://web2.pdfonline.com/pdfonline/pdfonline.js">
</script>
<!-- END: PDF Online Script -->
<!--{{{-->
<link rel='alternate' type='application/rss+xml' title='RSS' href='index.xml' />
<script type="text/javascript" src="http://mama.bplaced.net/fckeditor/fckeditor.js"></script>
<style type="text/css">#contentWrapper {display:none;}</style><div id="SplashScreen" style="border: 3px solid #ccc; display: block; text-align: center; width: 320px; margin: 100px auto; padding: 50px; color:#000; font-size: 28px; font-family:Tahoma; background-color:#eee;"><b>SangtimeNoter</b> hentes<blink> ...</blink><br><br><span style="font-size: 14px; color:red;">Bruger Javascript - bedst i Firefox.</span>
<link rel="shortcut icon" href="http://maans.newp.dk/Billeder/images/notebook.gif" type="image/vnd.microsoft.icon" />
<link rel="icon" href="http://maans.newp.dk/Billeder/images/notebook.gif" type="image/vnd.microsoft.icon" /> </div>
<!--}}}-->
/***
|Name|MatchTagsPlugin|
|Source|http://www.TiddlyTools.com/#MatchTagsPlugin|
|Documentation|http://www.TiddlyTools.com/#MatchTagsPluginInfo|
|Version|2.0.0|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides||
|Description|'tag matching' with full boolean expressions (AND, OR, NOT, and nested parentheses)|
!!!!!Documentation
> see [[MatchTagsPluginInfo]]
!!!!!Revisions
<<<
2008.09.04 [2.0.0] added "report" and "panel" options to generate formatted results and store in a tiddler. Also, added config.macros.matchTags.formatList(place,fmt,sep) API to return formatted output for use with other plugins/scripts
| please see [[MatchTagsPluginInfo]] for additional revision details |
2008.02.28 [1.0.0] initial release
<<<
!!!!!Code
***/
//{{{
version.extensions.MatchTagsPlugin= {major: 2, minor: 0, revision: 0, date: new Date(2008,9,4)};
// store.getMatchingTiddlers() processes boolean expressions for tag matching
// sortfield (optional) sets sort order for tiddlers - default=title
// tiddlers (optional) use alternative set of tiddlers (instead of current store)
TiddlyWiki.prototype.getMatchingTiddlers = function(tagexpr,sortfield,tiddlers) {
var debug=config.options.chkDebug; // abbreviation
var cmm=config.macros.matchTags; // abbreviation
var r=[]; // results are an array of tiddlers
var tids=tiddlers||store.getTiddlers(sortfield||"title");
if (tiddlers && sortfield) store.sortTiddlers(tids,sortfield);
if (debug) displayMessage(cmm.msg1.format([tids.length]));
// try simple lookup to quickly find single tags or tags that
// contain boolean operators as literals, e.g. "foo and bar"
for (var t=0; t<tids.length; t++)
if (tids[t].isTagged(tagexpr)) r.pushUnique(tids[t]);
if (r.length) {
if (debug) displayMessage(cmm.msg4.format([r.length,tagexpr]));
return r;
}
// convert expression into javascript code with regexp tests,
// so that "tag1 AND ( tag2 OR NOT tag3 )" becomes
// "/\~tag1\~/.test(...) && ( /\~tag2\~/.test(...) || ! /\~tag3\~/.test(...) )"
// normalize whitespace, tokenize operators, delimit with "~"
var c=tagexpr.trim(); // remove leading/trailing spaces
c = c.replace(/\s+/ig," "); // reduce multiple spaces to single spaces
c = c.replace(/\(\s?/ig,"~(~"); // open parens
c = c.replace(/\s?\)/ig,"~)~"); // close parens
c = c.replace(/(\s|~)?&&(\s|~)?/ig,"~&&~"); // &&
c = c.replace(/(\s|~)AND(\s|~)/ig,"~&&~"); // AND
c = c.replace(/(\s|~)?\|\|(\s|~)?/ig,"~||~"); // ||
c = c.replace(/(\s|~)OR(\s|~)/ig,"~||~"); // OR
c = c.replace(/(\s|~)?!(\s|~)?/ig,"~!~"); // !
c = c.replace(/(^|~|\s)NOT(\s|~)/ig,"~!~"); // NOT
c = c.replace(/(^|~|\s)NOT~\(/ig,"~!~("); // NOT(
// change tag terms to regexp tests
var terms=c.split("~"); for (var i=0; i<terms.length; i++) { var t=terms[i];
if (/(&&)|(\|\|)|[!\(\)]/.test(t) || t=="") continue; // skip operators/parens/spaces
if (t==config.macros.matchTags.untaggedKeyword)
terms[i]="tiddlertags=='~~'"; // 'untagged' tiddlers
else
terms[i]="/\\~"+t+"\\~/.test(tiddlertags)";
}
c=terms.join(" ");
if (debug) { displayMessage(cmm.msg2.format([tagexpr])); displayMessage(cmm.msg3.format([c])); }
// scan tiddlers for matches
for (var t=0; t<tids.length; t++) {
// assemble tags from tiddler into string "~tag1~tag2~tag3~"
var tiddlertags = "~"+tids[t].tags.join("~")+"~";
try { if(eval(c)) r.push(tids[t]); } // test tags
catch(e) { // error in test
displayMessage(cmm.msg2.format([tagexpr]));
displayMessage(cmm.msg3.format([c]));
displayMessage(e.toString());
break; // skip remaining tiddlers
}
}
if (debug) displayMessage(cmm.msg4.format([r.length,tagexpr]));
return r;
}
//}}}
//{{{
config.macros.matchTags = {
msg1: "scanning %0 input tiddlers",
msg2: "looking for '%0'",
msg3: "using expression: '%0'",
msg4: "found %0 tiddlers matching '%1'",
noMatch: "no matching tiddlers",
untaggedKeyword: "-",
untaggedLabel: "no tags",
untaggedPrompt: "show tiddlers with no tags",
defTiddler: "MatchingTiddlers",
defFormat: "%0",
defSeparator: "\n",
reportHeading: "Found %0 tiddlers tagged with: '{{{%1}}}'\n----\n",
handler: function(place,macroName,params,wikifier,paramString,tiddler) {
var mode=params[0]?params[0].toLowerCase():'';
if (mode=="inline")
params.shift();
if (mode=="report" || mode=="panel") {
params.shift();
var target=params.shift()||this.defTiddler;
}
if (mode=="popup") {
params.shift();
if (params[0]&¶ms[0].substr(0,6)=="label:") var label=params.shift().substr(6);
if (params[0]&¶ms[0].substr(0,7)=="prompt:") var prompt=params.shift().substr(7);
} else {
var fmt=(params.shift()||this.defFormat).unescapeLineBreaks();
var sep=(params.shift()||this.defSeparator).unescapeLineBreaks();
}
var sortBy="+title";
if (params[0]&¶ms[0].substr(0,5)=="sort:") sortBy=params.shift().substr(5);
var expr = params.join(" ");
if (mode!="panel" && (!expr||!expr.trim().length)) return;
if (expr==this.untaggedKeyword)
{ var label=this.untaggedLabel; var prompt=this.untaggedPrompt };
switch (mode) {
case "popup": this.createPopup(place,label,expr,prompt,sortBy); break;
case "panel": this.createPanel(place,expr,fmt,sep,sortBy,target); break;
case "report": this.createReport(target,expr,fmt,sep,sortBy); break;
case "inline": default: this.createInline(place,expr,fmt,sep,sortBy); break;
}
},
formatList: function(tids,fmt,sep) {
var out=[];
for (var t=0; t<tids.length; t++) {
var title="[["+tids[t].title+"]]";
var who=tids[t].modifier;
var when=tids[t].modified.toLocaleString();
var text=tids[t].text;
var first=tids[t].text.split("\n")[0];
var desc=store.getTiddlerSlice(tids[t].title,"description");
desc=desc||store.getTiddlerSlice(tids[t].title,"Description");
desc=desc||store.getTiddlerText(tids[t].title+"##description");
desc=desc||store.getTiddlerText(tids[t].title+"##Description");
out.push(fmt.format([title,who,when,text,first,desc]));
}
return out.join(sep);
},
createInline: function(place,expr,fmt,sep,sortBy) {
wikify(this.formatList(store.sortTiddlers(store.getMatchingTiddlers(expr),sortBy),fmt,sep),place);
},
createPopup: function(place,label,expr,prompt,sortBy) {
var btn=createTiddlyButton(place,
(label||expr).format([expr]),
(prompt||config.views.wikified.tag.tooltip).format([expr]),
function(ev){ return config.macros.matchTags.showPopup(this,ev||window.event); });
btn.setAttribute("sortBy",sortBy);
btn.setAttribute("expr",expr);
},
showPopup: function(here,ev) {
var p=Popup.create(here); if (!p) return false;
var tids=store.getMatchingTiddlers(here.getAttribute("expr"));
store.sortTiddlers(tids,here.getAttribute("sortBy"));
var list=[]; for (var t=0; t<tids.length; t++) list.push(tids[t].title);
if (!list.length) createTiddlyText(p,this.noMatch);
else {
var b=createTiddlyButton(createTiddlyElement(p,"li"),
config.views.wikified.tag.openAllText,
config.views.wikified.tag.openAllTooltip,
function() {
var list=this.getAttribute("list").readBracketedList();
story.displayTiddlers(null,tids);
});
b.setAttribute("list","[["+list.join("]] [[")+"]]");
createTiddlyElement(p,"hr");
}
var out=this.formatList(tids," %0 ","\n"); wikify(out,p);
Popup.show(p,false);
ev.cancelBubble=true;
if(ev.stopPropagation) ev.stopPropagation();
return false;
},
createReport: function(target,expr,fmt,sep,sortBy) {
var tids=store.sortTiddlers(store.getMatchingTiddlers(expr),sortBy);
if (!tids.length) { displayMessage('no matches for: '+expr); return false; }
var msg=config.messages.overwriteWarning.format([target]);
if (store.tiddlerExists(target) && !confirm(msg)) return false;
var out=this.reportHeading.format([tids.length,expr])
out+=this.formatList(tids,fmt,sep);
store.saveTiddler(target,target,out,config.options.txtUserName,new Date(),[],{});
story.closeTiddler(target); story.displayTiddler(null,target);
},
createPanel: function(place,expr,fmt,sep,sortBy,tid) {
var html="<form style='display:inline'><!-- \
--><input type='text' name='expr' style='width:55%' title='tag expression'><!-- \
--><input type='text' name='fmt' style='width:10%' title='list item format'><!-- \
--><input type='text' name='sep' style='width:5%' title='list item separator'><!-- \
--><input type='text' name='tid' style='width:20%' title='target tiddler title'><!-- \
--><input type='button' name='go' style='width:8%' value='go' onclick=\" \
var expr=this.form.expr.value; \
if (!expr.length) { alert('Enter a boolean tag expression'); return false; } \
var fmt=this.form.fmt.value; \
if (!fmt.length) { alert('Enter the list item output format'); return false; } \
var sep=this.form.sep.value.unescapeLineBreaks(); \
var tid=this.form.tid.value; \
if (!tid.length) { alert('Enter a target tiddler title'); return false; } \
config.macros.matchTags.createReport(tid,expr,fmt,sep,'title'); \
return false;\"> \
</form>";
var s=createTiddlyElement(place,"span"); s.innerHTML=html;
var f=s.getElementsByTagName("form")[0];
f.expr.value=expr; f.fmt.value=fmt; f.sep.value=sep.escapeLineBreaks(); f.tid.value=tid;
}
};
//}}}
//{{{
// SHADOW TIDDLER for displaying default panel input form
config.shadowTiddlers.MatchTags="{{smallform{<<matchTags panel>>}}}";
//}}}
//{{{
// TWEAK core filterTiddlers() for enhanced boolean matching in [tag[...]] syntax:
// use getMatchingTiddlers instead getTaggedTiddlers
var fn=TiddlyWiki.prototype.filterTiddlers;
fn=fn.toString().replace(/getTaggedTiddlers/g,"getMatchingTiddlers");
eval("TiddlyWiki.prototype.filterTiddlers="+fn);
//}}}
//{{{
// REDEFINE core handler for enhanced boolean matching in tag:"..." paramifier
// use filterTiddlers() instead of getTaggedTiddlers() to get list of tiddlers.
config.paramifiers.tag = {
onstart: function(v) {
var tagged = store.filterTiddlers("[tag["+v+"]]");
story.displayTiddlers(null,tagged,null,false,null);
}
};
//}}}
@@position:relative;+++^17em^@[[Meddelelser]]<<moveablePanel name:Kommentarpanel>>
----
<<tiddler ShoutBox >>
===
@@
/***
|Name|MiniBrowserPlugin|
|Source|http://www.TiddlyTools.com/#MiniBrowserPlugin|
|Version|1.4.0|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires|PlayerPlugin (optional, recommended)|
|Overrides||
|Options|##Configuration|
|Description|embedded browser-in-browser with favorites lists and media support|
!!!!!Usage
<<<
{{{<<miniBrowser noplayer expand hidecontrols URL TiddlerName TiddlerName TiddlerName...>>}}}
* ''noplayer'' (optional)<br>disables support for embedded media player (using [[PlayerPlugin]], if installed)
* ''expand'' (optional)<br>displays minibrowser controls on two lines instead of one for increased readability, especially when long titles or URLs are displayed.
* ''hidecontrols'' (optional)<br>hide initial display of minibrowser controls (except for 'show controls' checkbox)<br>//note: if no initial URL is specified, controls will be shown anyway//
* ''URL'' (optional)<br>specifies an initial URL to open when the mini browser is rendered
* ''TiddlerName'', ''TiddlerName''... (optional)<br>indicates one or more tiddlers containing "HR-separated" lists of favorites.<br>//notes: if no tiddler is specified, [[MiniBrowserList]] is used by default. In addition, when adding/deleting favorites, the plugin automatically updates [[MiniBrowserList]], regardless of any alternative lists of favorites stored in separate tiddlers. After changes to [[MiniBrowserList]] are made, you can then use cut/paste to manually move entries from that tiddler into other tiddlers.//
<<<
!!!!!Configuration
<<<
Default mini browser size:
width: <<option txtMiniBrowserWidth>> height: <<option txtMiniBrowserHeight>>
<<<
!!!!!Example
>{{{<<miniBrowser>>}}}<br>{{smallform small{<<miniBrowser>>}}}
>{{{<<miniBrowser expand>>}}}<br>{{smallform small{<<miniBrowser expand>>}}}
>{{{<<miniBrowser hidecontrols http://www.TiddlyWiki.com>>}}}<br>{{smallform small{<<miniBrowser hidecontrols http://www.TiddlyWiki.com>>}}}
!!!!!Revisions
<<<
2008.09.30 [1.4.0] removed hard-coded 8pt fontsize. Added optional "expand" display mode to show controls on two lines instead of one for increased readability.
2008.09.16 [1.3.1] fixed getWikifiedData() when using IE (remove \r and multiple \n)
2008.08.12 [1.3.0] added support for wikifying content from favorites lists to enable use of forEachTiddler or inline script output to generate lists on the fly.
2008.08.06 [1.2.2] corrected size control buttons to use fixed width
2008.04.07 [1.2.1] added txtMiniBrowserWidth and txtMiniBrowserHeight. cleanup init handling (somewhat)
2008.04.06 [1.2.0] added support for specifying initial URL to view (suggested by Richard Berg). When opening a URL, select matching entry (if any) in bookmarks droplist. Added support for hiding minibrowser controls.
2008.01.19 [1.1.0] added support for optional extra favorites lists stored in separate tiddlers
2007.10.15 [1.0.0] combined MiniBrowser and MediaCenter inline scripts and converted to true plugin
2006.03.01 [0.0.0] inline script
<<<
!!!!!Code
***/
//{{{
version.extensions.MiniBrowserPlugin={major: 1, minor: 4, revision: 0, date: new Date(2008,9,30)};
//}}}
//{{{
config.shadowTiddlers.MiniBrowser="<<miniBrowser>>";
//}}}
//{{{
if (config.options.txtMiniBrowserWidth==undefined) config.options.txtMiniBrowserWidth="100%";
if (config.options.txtMiniBrowserHeight==undefined) config.options.txtMiniBrowserHeight="480";
//}}}
//{{{
config.macros.miniBrowser= {
favoritesList:
"MiniBrowserList",
handler: function(place,macroName,params,wikifier,paramString,tiddler) {
var noPlayer=params[0]&¶ms[0].toLowerCase()=="noplayer"; if (noPlayer) params.shift();
if (!config.macros.player) noPlayer=true; // if PlayerPlugin not installed
var expand=params[0]&¶ms[0].toLowerCase()=="expand"; if (expand) params.shift();
var hideControls=params[0]&¶ms[0].toLowerCase()=="hidecontrols"; if (hideControls) params.shift();
var url=(params[0]&&!store.tiddlerExists(params[0]))?params.shift():"";
hideControls=hideControls&&url.length; // if no initial URL, then show controls anyway
var w=config.options.txtMiniBrowserWidth;
var h=config.options.txtMiniBrowserHeight;
// create form
var guid=new Date().getTime()+Math.random().toString(); // globally unique ID
var html=this.html;
html=html.replace(/%id%/g,guid);
html=html.replace(/%noplayer%/g,noPlayer?"true":"");
html=html.replace(/%hidecontrols%/g,hideControls?"none":"block");
html=html.replace(/%bookmarksize%/g,expand?"70%":"20%");
html=html.replace(/%urlsize%/g,expand?"69.5%":"20%");
html=html.replace(/%linebreak%/g,expand?"<br>":"");
html=html.replace(/%favorites%/g,params[0]||config.macros.miniBrowser.favoritesList);
createTiddlyElement(place,"span").innerHTML=html;
// init form
document.getElementById("minibrowser_controls_"+guid).style.display=hideControls?"none":"block";
document.getElementById("minibrowser_resize_"+guid).style.display=hideControls?"none":"block";
document.getElementById("minibrowser_togglecontrols_"+guid).checked=!hideControls;
document.getElementById("minibrowser_form_"+guid).url.value=url;
document.getElementById("minibrowser_form_"+guid).w.value=w;
document.getElementById("minibrowser_form_"+guid).h.value=h;
if (noPlayer) { // hide "type" list no PlayerPlugin
document.getElementById("minibrowser_type_"+guid).style.display="none";
document.getElementById("minibrowser_url_"+guid).style.width="36%";
}
// load bookmarks droplist from HR-separated tiddler contents
var b=document.getElementById("minibrowser_bookmarks_"+guid);
while (b.options[1]) b.options[1]=null; // clear list but leave 'prompt' item
var p; while (p=params.shift()) this.getFavorites(b,p); // load custom bookmarks
if (b.length<2) this.getFavorites(b,config.macros.miniBrowser.favoritesList); // default list
// load initial URL (if any)
var place=document.getElementById("minibrowser_player_"+guid);
this.load(place,guid,"","",w,h,true,noPlayer);
this.go(document.getElementById("minibrowser_form_"+guid));
},
getFavorites: function(list,tid) {
var txt=store.getTiddlerText(tid); if (!txt||!txt.trim().length) return;
txt=this.getWikifiedData(txt);
var parts=txt.split("\n----\n");
for (var p=0; p<parts.length; p++) {
var lines=parts[p].split("\n");
var label=lines.shift()||""; // 1st line=display text
var value=lines.shift()||""; // 2nd line=item value
var indent=value&&value.length?"\xa0\xa0":"";
list.options[list.length]=new Option(indent+label,value,false,false);
}
},
getWikifiedData: // wikify tiddler content, then extract text WITH newlines and HRs included
function(txt) {
var e=createTiddlyElement(document.body,"div"); wikify(txt,e);
var breaks=e.getElementsByTagName("br");
for (var b=0; b<breaks.length; b++)
breaks[b].parentNode.insertBefore(document.createTextNode("\n"),breaks[b]);
var lines=e.getElementsByTagName("hr");
for (var l=0; l<lines.length; l++)
lines[l].parentNode.insertBefore(document.createTextNode("----\n"),lines[l]);
var items=e.getElementsByTagName("li");
for (var i=0; i<items.length; i++)
items[i].parentNode.insertBefore(document.createTextNode("\n"),items[i]);
var txt=getPlainText(e);
removeNode(e);
return txt.replace(/\r*/g,"").replace(/\n\n/g,"\n");
},
load: function(place,id,type,url,w,h,showcontrols,noPlayer) {
if (noPlayer) {
if (!place) place=document.getElementById(id).parentNode;
place.innerHTML="<iframe name='"+id+"' id='"+id+"' \
src='"+url+"' width='"+w+"' height='"+h+"' \
style='background:#fff;border:1px solid'></iframe>"
} else
config.macros.player.loadURL(place,id,type,url,w,h,showcontrols);
},
go: function(f) {
var url=f.url.value.trim();
if (!url.length) url=f.url.value=f.bookmarks.value.trim();
if (!url.length) { this.done(f); return false; }
var id=f.playerID.value;
document.getElementById("minibrowser_player_"+id).style.display="block";
document.getElementById("minibrowser_controls2_"+id).style.display="block";
this.load(null,id,f.type.value,f.url.value,f.w.value,f.h.value,f.ctrls.checked,f.noPlayer.value=="true");
var matched=false; for (var i=0; i<f.bookmarks.options.length; i++) // select matching bookmark
if (f.bookmarks.options[i].value==url) { f.bookmarks.selectedIndex=i; matched=true; break; }
if (!matched) f.bookmarks.selectedIndex=0;
f.done.disabled=false;
return false;
},
done: function(f) {
var id=f.playerID.value;
this.load(null,id,null,null,f.w.value,0,f.ctrls.checked,f.noPlayer.value=="true");
document.getElementById("minibrowser_player_"+id).style.display="none";
document.getElementById("minibrowser_controls2_"+id).style.display="none";
f.done.disabled=true;
return false;
},
fit: function(place) {
var trim=89; // fudge factor to account for the other controls + padding + borders. ADJUST THIS VALUE TO FIT LAYOUT
var t=story.findContainingTiddler(place);
if (!t) { t=place; while (t && t.className!='floatingPanel') t=t.parentNode; } if (!t) return;
var w="100%"; // horizontal stretching via CSS works, but vertical stretching doesn't... so:
var h=t.offsetHeight-trim; // workaround: get containing panel/tiddler height and subtract "trim" height
var f=place.form;
this.load(null,f.playerID.value,f.type.value,f.url.value,w,h,f.ctrls.checked,f.noPlayer.value=="true"); // reload player with new size
place.form.w.value=w; place.form.h.value=h; // update width/height input fields
},
add: function(place,title) {
var v=place.value; if (!v.length) return;
var d=prompt("Please enter a description for\n"+place.value); if (!d || !d.length) return;
var who=config.options.txtUserName;
var when=new Date();
var tid=store.getTiddler(title);
var txt="%0\n%1\n----\n%2".format([d,v,tid?tid.text:""]);
store.saveTiddler(title,title,txt,who,when,tid?tid.tags:[],tid?tid.fields:{});
if (!tid) story.displayTiddler(story.findContainingTiddler(place),title);
else story.refreshTiddler(title,1,true);
var here=story.findContainingTiddler(place);
if (here) story.refreshTiddler(here.getAttribute("tiddler"),1,true);
},
del: function(place,title) {
var v=place.value; if (!v.length) return;
var d=place.options[place.selectedIndex].text; if (!d.length) return;
if (!confirm("Are you sure you want to remove this favorite?\n\n"+d+"\n"+v)) return;
var tid=store.getTiddler(title); if (!tid) return;
var who=config.options.txtUserName;
var when=new Date();
var pat='%0\n%1\n----\n'.format([d.replace(/\xa0/g,''),v]); var re=new RegExp(pat,"i");
var txt=tid.text.replace(re,"");
store.saveTiddler(title,title,txt,who,when,tid?tid.tags:[],tid?tid.fields:{});
story.refreshTiddler(title,1,true);
var here=story.findContainingTiddler(place);
if (here) story.refreshTiddler(here.getAttribute("tiddler"),1,true);
},
html: "<form id='minibrowser_form_%id%' style='display:block;margin:0;padding:0' onsubmit='return config.macros.miniBrowser.go(this);'><!-- \
--><nobr><input type='hidden' name='playerID' value='%id%'><input type='hidden' name='noPlayer' value='%noplayer%'><!-- \
--><div id='minibrowser_controls_%id%' style='display:%hidecontrols%'><!-- \
--><input type='button' value='<' title='back' style='width:3%' \
onclick='try{window.frames[\"player_%id%\"].history.go(-1)}catch(e){window.history.go(-1)}' ><!-- \
--><input type='button' value='>' title='forward' style='width:3%' \
onclick='try{window.frames[\"player_%id%\"].history.go(+1)}catch(e){window.history.go(+1)}'><!-- \
--><input type='button' value='+' title='refresh'style='width:3%' \
onclick='try{window.frames[\"player_%id%\"].location.reload()}catch(e){;}'><!-- \
--><input type='button' value='x' title='stop'style='width:3%' \
onclick='window.stop()'><!-- \
--><select name='bookmarks' id='minibrowser_bookmarks_%id%' size='1' style='width:%bookmarksize%' \
onchange='this.form.url.value=this.value; return config.macros.miniBrowser.go(this.form);'><!-- \
--><option value=''>bookmarks...</option><!-- \
--></select><!-- \
--><input type='button' value='add' title='add URL to the bookmarks' style='width:6%' \
favorites=\"%favorites%\" \
onclick='config.macros.miniBrowser.add(this.form.url,this.getAttribute(\"favorites\"));'><!-- \
--><input type='button' value='del' title='remove URL from the bookmarks' style='width:6%' \
favorites=\"%favorites%\" \
onclick='config.macros.miniBrowser.del(this.form.bookmarks,this.getAttribute(\"favorites\"));'><!-- \
--><input type='button' value='edit' title='edit the bookmarks list' style='width:6%' \
favorites=\"%favorites%\" \
onclick='story.displayTiddler(null,this.getAttribute(\"favorites\"),2)'><!-- \
-->%linebreak%<!-- \
--><select name='type' id='minibrowser_type_%id%' size='1' style='width:12%' \
onchange='var opt=this.options; for (var i=0; i<opt.length; i++) \
if (i==this.selectedIndex) opt[i].text=opt[i].text.replace(/\xa0\xa0/,\"√\"); \
else opt[i].text=opt[i].text.replace(/√/,\"\xa0\xa0\"); \
if (this.selectedIndex==0) opt[1].text=opt[1].text.replace(/\xa0\xa0/,\"√\");'><!-- \
--><option value=''>type...</option><!-- \
--><option value=''>√ auto-detect</option><!-- \
--><option value='iframe'> web page</option><!-- \
--><option value='windows'> windows media</option><!-- \
--><option value='realone'> real one</option><!-- \
--><option value='quicktime'> quicktime</option><!-- \
--><option value='flash'> flash</option><!-- \
--><option value='image'> jpg/gif/png</option><!-- \
--></select><!-- \
--><input type='text' name='url' id='minibrowser_url_%id%' size='60' value='' style='width:%urlsize%' \
onfocus='this.select()'><!-- \
--><input type='submit' value='go' title='view URL in embedded player' style='width:6%'><!-- \
--><input type='button' value='open' title='view URL in a separate player' style='width:6%' \
onclick='if (this.form.url.value.length) window.open(this.form.url.value)'><!-- \
--><input type='button' value='done' name='done' disabled title='disconnect from URL' style='width:6%' \
onclick='return config.macros.miniBrowser.done(this.form);'><!-- \
--></div><!-- \
--><div id='minibrowser_player_%id%' style='display:none;text-align:center'></div><!-- \
--><span id='minibrowser_controls2_%id%' style='margin-top:2px;display:none;'><!-- \
--><div id='minibrowser_resize_%id%' style='display:%hidecontrols%;float:right'><!-- \
--> size: <input type='text' name='w' size='3' value='' style='' \
onfocus='this.select()'><!-- \
-->x<input type='text' name='h' size='3' value='' style='' \
onfocus='this.select()'><!-- \
--> <input type='submit' value='set' style='width:5em' \
onclick='var f=this.form; \
if(!f.w.value.trim().length) f.w.value=config.options.txtMiniBrowserWidth; \
if(!f.h.value.trim().length) f.h.value=config.options.txtMiniBrowserHeight; \
config.options.txtMiniBrowserWidth=f.w.value; config.options.txtMiniBrowserHeight=f.h.value; \
saveOptionCookie(\"txtMiniBrowserWidth\"); saveOptionCookie(\"txtMiniBrowserHeight\");'><!-- \
--><input type='submit' value='reset' style='width:5em' \
onclick='var f=this.form; f.ctrls.checked=true; f.w.value=\"100%\"; f.h.value=\"480\"; \
config.options.txtMiniBrowserWidth=f.w.value; config.options.txtMiniBrowserHeight=f.h.value; \
saveOptionCookie(\"txtMiniBrowserWidth\"); saveOptionCookie(\"txtMiniBrowserHeight\");'><!-- \
--><input type='button' value='fit' title='resize player to fit containing window' style='width:5em' \
onclick='config.macros.miniBrowser.fit(this)'><!-- \
--></div><!-- \
--> <input type='checkbox' name='ctrls' id='minibrowser_togglecontrols_%id%' title='toggle minibrowser controls' CHECKED \
onclick='document.getElementById(\"minibrowser_controls_%id%\").style.display=this.checked?\"block\":\"none\"; \
document.getElementById(\"minibrowser_resize_%id%\").style.display=this.checked?\"block\":\"none\";' \
><a href='' title='toggle minibrowser controls' \
onclick='this.previousSibling.click();return false;'>show controls</a><!-- \
--></span><!-- \
--></nobr></form> \
"
}
//}}}
/***
|Name|MoveablePanelPlugin|
|[[Source]]|http://www.TiddlyTools.com/#MoveablePanelPlugin|
|Documentation|http://www.TiddlyTools.com/#MoveablePanelPluginInfo|
|Version|2.1.2|
|Author|Eric Shulman - ELS Design Studios|
|[[License]]|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires|NestedSlidersPlugin|
|Overrides||
|Description|drag/stretch 'floating sliders' and other page elements|
Adds move and size mouse event handling and fold/unfold, and close/dock toolbar command items to any floating slider panel or tiddler element
!!!!!Documentation
>see [[MoveablePanelPluginInfo]]
!!!!!Revisions
<<<
2008.09.11 [2.1.2] corrected caching of transient attribute (use =="true" to convert string to boolean)
|please see [[MoveablePanelPluginInfo]] for additional revision details|
''2006.03.04 [1.0.0]'' Initial public release
<<<
!!!!!Code
***/
//{{{
version.extensions.MoveablePanelPlugin= {major: 2, minor: 1, revision: 2, date: new Date(2008,9,11)};
//}}}
//{{{
config.macros.moveablePanel= {
handler: function(place,macroName,params) {
var p=this.getPanel(place); if (!p) return;
var showfold=true; var showclose=true; var showhover=true;
var noedges=false; var param=null;
while (param=params.shift()) { param=param.toLowerCase();
if (param=="noclose") showclose=false;
if (param=="nofold") showfold=false;
if (param=="nohover") showhover=false;
if (param=="noedges") noedges=true;
}
if (!p.saved) p.saved= { // remember original panel event handlers, size, location, border
mouseover: p.onmouseover, mouseout: p.onmouseout, dblclick: p.ondblclick,
top: p.style.top, left: p.style.left, width: p.style.width, height: p.style.height,
position: p.style.position, border: p.style.border, title: p.title,
transient: p.getAttribute("transient")=="true"
};
// create control menu items
var html='<div class="toolbar" style="display:none;position:absolute;';
html+=(hasClass(p,"floatingPanel")?'right:1em;top:1em;':'right:.5em;top:-1em;')+'">';
var s='border:1px solid #666;background:#ccc;color:#666 !important;padding:0px .25em;-moz-border-radius:0;-webkit-border-radius:0';
if (showfold)
html+='<a href="javascript:;" title="FOLD: reduce panel size" style="'+s+'"'
+' onclick="return config.macros.moveablePanel.foldPanel(this,event)">−</a>';
if (showhover)
html+='<a href="javascript:;" title="SCROLLING: panel moves with page" style="'+s+'"'
+' onclick="return config.macros.moveablePanel.hoverPanel(this,event)">=</a>';
if (showclose) {
if (hasClass(p,"floatingPanel"))
html+='<a href="javascript:;" title="CLOSE: hide panel and reset size/position" style="'+s+'"'
+' onclick="return config.macros.moveablePanel.closePanel(this,event)">X</a>';
else
html+='<a href="javascript:;" title="DOCK: reset panel size/position" style="'+s+'"'
+' onclick="return config.macros.moveablePanel.dockPanel(this,event)">√</a>';
}
html+='</div>';
p.menudiv=createTiddlyElement(place,"span");
p.menudiv.innerHTML=html;
// init mouse handling and tooltip
p.setAttribute("noedges",noedges?"true":"false"); // for alternative mouseover/drag handling
p.onmousemove=function(event) { return config.macros.moveablePanel.setCursorPanel(this,event); };
p.onmousedown=function(event) { return config.macros.moveablePanel.moveOrSizePanel(this,event); };
p.ondblclick=function(event) { // DOUBLE-CLICK = DOCK
if (p.getAttribute("noedges")=="true" && !((isTop&&!isLeft&&!isRight)||(isBottom&&isRight))) // not over grab handles
return p.saved.dblclick?p.saved.dblclick.apply(this,arguments):true;
if (!config.macros.moveablePanel.isEdge(this,event)) // not over edge
return p.saved.dblclick?p.saved.dblclick.apply(this,arguments):true;
if (config.macros.moveablePanel.dockPanel(this,event)) // not docking
return p.saved.dblclick?p.saved.dblclick.apply(this,arguments):true;
else return false; // docked... done.
};
p.onmouseover=function(event) { // MOUSEOVER = SHOW MENU ITEMS
if(addClass instanceof Function)
addClass(this,"selected"); // so toolbar-classed items will display
if (this.getAttribute("undocked")=="true"||hasClass(this,"floatingPanel"))
this.menudiv.firstChild.style.display="inline";
if (this.saved.mouseover) return this.saved.mouseover.apply(this,arguments);
};
p.onmouseout=function(event) { // MOUSEOUT = HIDE MENU ITEMS
if(removeClass instanceof Function)
removeClass(this,"selected"); // so toolbar-classed items are hidden again
if (this.menudiv) this.menudiv.firstChild.style.display="none";
if (this.saved.mouseout) return this.saved.mouseout.apply(this,arguments);
};
// FIXUP for "floating sliders" (see NestedSlidersPlugin)
// prevent automatic trigger of adjustSliderPos() for mouse events on floating slider panel/button
// and make sure that slider button causes moveable panel to be close AND docked (if needed)
if (hasClass(p,"floatingPanel") && p.button) {
p.saved.mouseover=null; // discard previous mouse event handlers to prevent
p.saved.mouseout=null; // automatic triggering of adjustSliderPos() for mouseovers
p.button.onmouseover=null; // on slider panel and slider button
if(!p.button.saved_onclick) p.button.saved_onclick=p.button.onclick; // HIJACK SLIDER BUTTON
p.button.onclick=function(ev){
config.macros.moveablePanel.dockPanel(this.sliderPanel,ev); // DOCK PANEL FIRST...
return this.saved_onclick.apply(this,arguments); // ...THEN CLOSE IT
}
}
},
processed: function(event) {
event.cancelBubble=true; if (event.stopPropagation) event.stopPropagation(); return false;
},
getPanel: function(place) {
// find a floating panel or use containing element
var p=place; while (p && !(hasClass(p,"floatingPanel")||p.saved)) p=p.parentNode;
return p||place;
},
isEdge: function(place,event) {
if (!event) var event=window.event;
var p=this.getPanel(place); if (!p) return false;
var left=findPosX(p); var top=findPosY(p);
var width=p.offsetWidth; var height=p.offsetHeight;
var x=!config.browser.isIE?event.pageX:event.clientX;
var y=!config.browser.isIE?event.pageY:event.clientY;
if (x<left||x>=left+width||y<top||y>=top+height) return false;
var edgeWidth=10; var edgeHeight=10;
var isTop=(y-top<edgeHeight); var isLeft=(x-left<edgeWidth);
var isBottom=(top+height-y<edgeHeight); var isRight=(left+width-x<edgeWidth);
return isTop||isLeft||isBottom||isRight;
},
dockPanel: function(place,event) {
if (!event) var event=window.event;
var p=this.getPanel(place); if (!p) return true;
if (p.folded) this.foldPanel(p.foldButton,event);
if (p.hover) this.hoverPanel(p.hoverButton,event);
if (p.saved) {
p.style.top=p.saved.top; p.style.left=p.saved.left;
p.style.width=p.saved.width; p.style.height=p.saved.height;
p.style.position=p.saved.position;
if (p.saved.transient) p.setAttribute("transient","true");
p.setAttribute("undocked","");
}
if (hasClass(p,"floatingPanel") && window.adjustSliderPos) // see NestedSlidersPlugin
window.adjustSliderPos(p.parentNode,p.button,p);
return this.processed(event);
},
closePanel: function(place,event) {
var p=this.getPanel(place); if (!p) return true;
// if a slider button exists close the panel by calling slider button handler
if (p.button) { p.button.focus(); onClickNestedSlider({target:p.button}); }
return this.dockPanel(place,event); // and then reset panel state
},
foldPanel: function(place,event) {
if (!event) var event=window.event;
var p=this.getPanel(place); if (!p) return true;
if (!p.foldButton) p.foldButton=place;
if (p.folded) {
p.style.height=p.folded_savedheight;
p.style.overflow=p.folded_savedoverflow;
if (!hasClass(p,"floatingPanel")) p.menudiv.firstChild.style.top="-1em";
} else {
p.folded_savedheight=p.style.height; p.style.height="1em";
p.folded_savedoverflow=p.style.overflow; p.style.overflow="hidden";
if (!hasClass(p,"floatingPanel")) p.menudiv.firstChild.style.top="1em";
}
p.folded=!p.folded;
place.innerHTML=p.folded?"+":"−";
place.title=p.folded?"UNFOLD: restore panel size":"FOLD: reduce panel size";
return this.processed(event);
},
hoverPanel: function(place,event) {
if (!event) var event=window.event;
var p=this.getPanel(place); if (!p) return true;
if (!p.hoverButton) p.hoverButton=place;
if (p.hover) {
p.style.position=p.hover_savedposition;
if (p.getAttribute("undocked")!="true" && p.saved && p.saved.transient)
p.setAttribute("transient","true"); // see NestedSlidersPlugin
} else {
p.hover_savedposition=p.style.position; p.style.position="fixed";
if (p.saved.transient) p.setAttribute("transient","false");
}
p.hover=!p.hover;
place.innerHTML=p.hover?"^":"=";
place.title=p.hover?"HOVERING: panel stays in view when scrolling page":"SCROLLING: panel moves with page";
return this.processed(event);
},
setCursorPanel: function(place,event) {
if (!event) var event=window.event;
var p=this.getPanel(place); if (!p) return true;
var left=findPosX(p); var top=findPosY(p);
var width=p.offsetWidth; var height=p.offsetHeight;
var x=!config.browser.isIE?event.pageX:event.clientX;
var y=!config.browser.isIE?event.pageY:event.clientY;
if (x<left||x>=left+width||y<top||y>=top+height) return true; // not inside panel, let mousedown bubble through
var edgeWidth=10; var edgeHeight=10;
var isTop=(y-top<edgeHeight); var isLeft=(x-left<edgeWidth);
var isBottom=(top+height-y<edgeHeight); var isRight=(left+width-x<edgeWidth);
p.style.cursor="auto";
p.title=p.saved?p.saved.title:"";
if (!(isTop||isLeft||isBottom||isRight)) return true;
if (p.getAttribute("noedges")=="true") {
if (isTop&&!isLeft&&!isRight) {
p.style.cursor="move";
p.title="MOVE: drag top panel edge"
+(p.getAttribute("undocked")=="true"?", DOCK: double-click":"");
} else if (isBottom && isRight) {
p.style.cursor="se-resize";
p.title="RESIZE: drag lower right corner"
+(p.getAttribute("undocked")=="true"?", DOCK: double-click":"");
}
} else {
p.style.cursor=!event.shiftKey?"move":((isTop?'n':(isBottom?'s':''))+(isLeft?'w':(isRight?'e':''))+'-resize');
p.title="MOVE: drag panel edge, RESIZE: hold shift key"
+(p.getAttribute("undocked")=="true"?", DOCK: double-click":"");
}
return true; // let mouseover event bubble through
},
moveOrSizePanel: function(place,event) {
if (!event) var event=window.event;
var p=this.getPanel(place); if (!p) return true;
if (!this.isEdge(place,event)) return true;
if (!p.saved) p.saved= { // remember original panel event handlers, size, location, border
mouseover: p.onmouseover, mouseout: p.onmouseout, dblclick: p.ondblclick,
top: p.style.top, left: p.style.left, width: p.style.width, height: p.style.height,
position: p.style.position, border: p.style.border,
transient: p.getAttribute("transient")=="true"
};
var left=findPosX(p); var top=findPosY(p);
var width=p.offsetWidth; var height=p.offsetHeight;
var x=!config.browser.isIE?event.pageX:event.clientX;
var y=!config.browser.isIE?event.pageY:event.clientY;
var edgeWidth=10; var edgeHeight=10;
var isTop=(y-top<edgeHeight); var isLeft=(x-left<edgeWidth);
var isBottom=(top+height-y<edgeHeight); var isRight=(left+width-x<edgeWidth);
var sizing=event.shiftKey; // remember this for use during mousemove tracking
if (p.getAttribute("noedges")=="true") {
if (!((isTop&&!isLeft&&!isRight)||(isBottom&&isRight))) return true; // not over grab handle
var sizing=isBottom&&isRight;
}
var adjustLeft=0; var adjustTop=0;
// adjustment for relative container
var pp=p.parentNode; while (pp && !(pp.style&&pp.style.position=='relative')) pp=pp.parentNode;
if (pp) { adjustLeft+=findPosX(pp); adjustTop+=findPosY(pp); }
// adjustment for floating slider container
var pp=p.parentNode; while (pp && !hasClass(pp,"floatingPanel")) pp=pp.parentNode;
if (pp) { adjustLeft+=findPosX(pp); adjustTop+=findPosY(pp); }
// start tracking mousemove events
this.activepanel=p;
var target=p; // if 'capture' handling not supported, track within panel only
if (document.body.setCapture) { document.body.setCapture(); var target=document.body; } // IE
if (window.captureEvents) { window.captureEvents(Event.MouseMove|Event.MouseUp,true); var target=window; } // moz
if (target.onmousemove!=undefined) target.saved_mousemove=target.onmousemove;
target.onmousemove=function(e){
if (!e) var e=window.event;
var p=config.macros.moveablePanel.activepanel;
if (!p) { this.onmousemove=this.saved_mousemove?this.saved_mousemove:null; return; }
// PROBLEM: p.offsetWidth and p.offsetHeight do not seem to account for padding or borders
// WORKAROUND: subtract padding and border (in px) when calculating new panel width and height
// TBD: get these values from p.style... convert to px as needed.
var paddingWidth=10.6667; var paddingHeight=10.6667;
var borderWidth=1; var borderHeight=1;
var adjustWidth=-(paddingWidth*2+borderWidth*2);
var adjustHeight=-(paddingHeight*2+borderHeight*2);
if (p.style.position!="absolute"&&p.style.position!="fixed") {
// convert static/relative panel to movable absolute panel
p.style.position="absolute";
p.style.left=left+"px"; p.style.top=top+"px";
p.style.width=(width+adjustWidth)+"px"; p.style.top=(height+adjustHeight)+"px";
}
var newX=!config.browser.isIE?e.pageX:e.clientX;
var newY=!config.browser.isIE?e.pageY:e.clientY;
if (sizing) { // resize panel
// don't let panel get smaller than edge "grab" zones
var minWidth=edgeWidth*2-adjustWidth;
var minHeight=edgeHeight*2-adjustHeight;
if (p.folded) this.foldPanel(p.foldButton,e); // make sure panel is unfolded
if (isBottom) var newHeight=height+newY-y+1;
if (isTop) var newHeight=height-newY+y+1;
if (isLeft) var newWidth=width-newX+x+1;
if (isRight) var newWidth=width+newX-x+1;
if (isLeft||isRight) p.style.width=(newWidth>minWidth?newWidth:minWidth)+adjustWidth+"px";
if (isLeft) p.style.left=left-adjustLeft+newX-x+1+"px";
if (isTop||isBottom) p.style.height=(newHeight>minHeight?newHeight:minHeight)+adjustHeight+"px";
if (isTop) p.style.top=top-adjustTop+newY-y+1+"px";
p.setAttribute("undocked","true");
} else { // move panel
p.style.top=top-adjustTop+newY-y+1+"px";
p.style.left=left-adjustLeft+newX-x+1+"px";
if (p.saved && p.saved.transient) p.setAttribute("transient","false");
p.setAttribute("undocked","true");
}
var status=sizing?("size: "+p.style.width+","+p.style.height):("pos: "+p.style.left+","+p.style.top);
window.status=status.replace(/(\.[0-9]+)|px/g,""); // remove decimals and "px"
return config.macros.moveablePanel.processed(e);
};
// stop tracking mousemove events
if (target.onmouseup!=undefined) target.saved_mouseup=target.onmouseup;
target.onmouseup=function(e){
if (!e) var e=window.event;
if (this.releaseCapture) this.releaseCapture(); // IE
if (this.releaseEvents) this.releaseEvents(Event.MouseMove|Event.MouseUp); // moz
this.onmousemove=this.saved_mousemove?this.saved_mousemove:null;
this.onmouseup=this.saved_mouseup?this.saved_mouseup:null;
config.macros.moveablePanel.activepanel=null;
window.status="";
return config.macros.moveablePanel.processed(e);
};
return this.processed(event); // mousedown handled
}
};
//}}}
<<slider chkSliderLastFm LastFm "Radio»">>
<<tiddler NetTv>>
<html>
<br><a href="http://www.isCute.com/iscute/view.php?g=2647&c=cats+need+musik"><img src="http://ct.iscute.com/i92/3/2/27/f_44d11ab32519.gif" border=0 alt="Myspace Graphics"></a><br><a href="http://www.isCute.com/">Musikals kat?</a><br><img style="visibility:hidden;width:0px;height:0px;" border=0 width=0 height=0 src="http://counters.gigya.com/wildfire/IMP/CXNID=2000002.0NXC/bT*xJmx*PTEyMzYwMjc4ODQ2NDAmcHQ9MTIzNjAyNzg5NjA*NiZwPTMyMzAwMiZkPWlzY3V*ZWdyYXBoaWMmZz*xJnQ9Jm89ZDZhY2Y5OWNkMmRlNDMxYjg5Y2ZlNjY2NTVmMDQzYWU=.gif" />
</html>
/***
''NestedSlidersPlugin for TiddlyWiki version 1.2.x and 2.0''
^^author: Eric Shulman
source: http://www.TiddlyTools.com/#NestedSlidersPlugin
license: [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]^^
Quickly make any tiddler content into an expandable 'slider' panel, without needing to create a separate tiddler to contain the slider content. Optional syntax allows ''default to open'', ''custom button label/tooltip'' and ''automatic blockquote formatting.''
You can also 'nest' these sliders as deep as you like (see complex nesting example below), so that expandable 'tree-like' hierarchical displays can be created. This is most useful when converting existing in-line text content to create in-line annotations, footnotes, context-sensitive help, or other subordinate information displays.
For more details, please click on a section headline below:
++++!!!!![Configuration]>
Debugging messages for 'lazy sliders' deferred rendering:
<<option chkDebugLazySliderDefer>> show debugging alert when deferring slider rendering
<<option chkDebugLazySliderRender>> show debugging alert when deferred slider is actually rendered
===
++++!!!!![Usage]>
When installed, this plugin adds new wiki syntax for embedding 'slider' panels directly into tiddler content. Use {{{+++}}} and {{{===}}} to delimit the slider content. Additional optional syntax elements let you specify
*default to open
*cookiename
*heading level
*floater (with optional CSS width value)
*mouse auto rollover
*custom label/tooltip/accesskey
*automatic blockquote
*deferred rendering
The complete syntax, using all options, is:
//{{{
++++(cookiename)!!!!!^width^*[label=key|tooltip]>...
content goes here
===
//}}}
where:
* {{{+++}}} (or {{{++++}}}) and {{{===}}}^^
marks the start and end of the slider definition, respectively. When the extra {{{+}}} is used, the slider will be open when initially displayed.^^
* {{{(cookiename)}}}^^
saves the slider opened/closed state, and restores this state whenever the slider is re-rendered.^^
* {{{!}}} through {{{!!!!!}}}^^
displays the slider label using a formatted headline (Hn) style instead of a button/link style^^
* {{{^width^}}} (or just {{{^}}})^^
makes the slider 'float' on top of other content rather than shifting that content downward. 'width' must be a valid CSS value (e.g., "30em", "180px", "50%", etc.). If omitted, the default width is "auto" (i.e., fit to content)^^
* {{{*}}}^^
automatically opens/closes slider on "rollover" as well as when clicked^^
* {{{[label=key|tooltip]}}}^^
uses custom label/tooltip/accesskey. {{{=key}}} and {{{|tooltip}}} are optional. 'key' is must be a ''single letter only''. Default labels/tootips are: ">" (more) and "<" (less), with no default access key assignment.^^
* {{{">"}}} //(without the quotes)//^^
automatically adds blockquote formatting to slider content^^
* {{{"..."}}} //(without the quotes)//^^
defers rendering of closed sliders until the first time they are opened. //Note: deferred rendering may produce unexpected results in some cases. Use with care.//^^
//Note: to make slider definitions easier to read and recognize when editing a tiddler, newlines immediately following the {{{+++}}} 'start slider' or preceding the {{{===}}} 'end slider' sequence are automatically supressed so that excess whitespace is eliminated from the output.//
===
++++!!!!![Examples]>
simple in-line slider:
{{{
+++
content
===
}}}
+++
content
===
----
use a custom label and tooltip:
{{{
+++[label|tooltip]
content
===
}}}
+++[label|tooltip]
content
===
----
content automatically blockquoted:
{{{
+++>
content
===
}}}
+++>
content
===
----
all options combined //(default open, cookie, heading, sized floater, rollover, label/tooltip/key, blockquoted, deferred)//
{{{
++++(testcookie)!!!^30em^*[label=Z|click or press Alt-Z to open]>...
content
===
}}}
++++(testcookie)!!!^30em^*[label=Z|click or press Alt-Z to open]>...
content
===
----
complex nesting example:
{{{
+++^[get info...=I|click for information or press Alt-I]
put some general information here, plus a floating slider with more specific info:
+++^10em^[view details...|click for details]
put some detail here, which could include a rollover with a +++^25em^*[glossary definition]explaining technical terms===
===
===
}}}
+++^[get info...=I|click for information or press Alt-I]
put some general information here, plus a floating slider with more specific info:
+++^10em^[view details...|click for details]
put some detail here, which could include a rollover with a +++^25em^*[glossary definition]explaining technical terms===
===
===
----
nested floaters
>menu: <<tiddler NestedSlidersExample>>
(see [[NestedSlidersExample]] for definition)
----
===
!!!!!Installation
<<<
import (or copy/paste) the following tiddlers into your document:
''NestedSlidersPlugin'' (tagged with <<tag systemConfig>>)
<<<
!!!!!Revision History
<<<
''2006.05.11 - 1.9.0'' added optional '^width^' syntax for floating sliders and '=key' syntax for setting an access key on a slider label
''2006.05.09 - 1.8.0'' in onClickNestedSlider(), when showing panel, set focus to first child input/textarea/select element
''2006.04.24 - 1.7.8'' in adjustSliderPos(), if floating panel is contained inside another floating panel, subtract offset of containing panel to find correct position
''2006.02.16 - 1.7.7'' corrected deferred rendering to account for use-case where show/hide state is tracked in a cookie
''2006.02.15 - 1.7.6'' in adjustSliderPos(), ensure that floating panel is positioned completely within the browser window (i.e., does not go beyond the right edge of the browser window)
''2006.02.04 - 1.7.5'' add 'var' to unintended global variable declarations to avoid FireFox 1.5.0.1 crash bug when assigning to globals
''2006.01.18 - 1.7.4'' only define adjustSliderPos() function if it has not already been provided by another plugin. This lets other plugins 'hijack' the function even when they are loaded first.
''2006.01.16 - 1.7.3'' added adjustSliderPos(place,btn,panel,panelClass) function to permit specialized logic for placement of floating panels. While it provides improved placement for many uses of floating panels, it exhibits a relative offset positioning error when used within *nested* floating panels. Short-term workaround is to only adjust the position for 'top-level' floaters.
''2006.01.16 - 1.7.2'' added button property to slider panel elements so that slider panel can tell which button it belongs to. Also, re-activated and corrected animation handling so that nested sliders aren't clipped by hijacking Slider.prototype.stop so that "overflow:hidden" can be reset to "overflow:visible" after animation ends
''2006.01.14 - 1.7.1'' added optional "^" syntax for floating panels. Defines new CSS class, ".floatingPanel", as an alternative for standard in-line ".sliderPanel" styles.
''2006.01.14 - 1.7.0'' added optional "*" syntax for rollover handling to show/hide slider without requiring a click (Based on a suggestion by tw4efl)
''2006.01.03 - 1.6.2'' When using optional "!" heading style, instead of creating a clickable "Hn" element, create an "A" element inside the "Hn" element. (allows click-through in SlideShowPlugin, which captures nearly all click events, except for hyperlinks)
''2005.12.15 - 1.6.1'' added optional "..." syntax to invoke deferred ('lazy') rendering for initially hidden sliders
removed checkbox option for 'global' application of lazy sliders
''2005.11.25 - 1.6.0'' added optional handling for 'lazy sliders' (deferred rendering for initially hidden sliders)
''2005.11.21 - 1.5.1'' revised regular expressions: if present, a single newline //preceding// and/or //following// a slider definition will be suppressed so start/end syntax can be place on separate lines in the tiddler 'source' for improved readability. Similarly, any whitespace (newlines, tabs, spaces, etc.) trailing the 'start slider' syntax or preceding the 'end slider' syntax is also suppressed.
''2005.11.20 - 1.5.0'' added (cookiename) syntax for optional tracking and restoring of slider open/close state
''2005.11.11 - 1.4.0'' added !!!!! syntax to render slider label as a header (Hn) style instead of a button/link style
''2005.11.07 - 1.3.0'' removed alternative syntax {{{(((}}} and {{{)))}}} (so they can be used by other
formatting extensions) and simplified/improved regular expressions to trim multiple excess newlines
''2005.11.05 - 1.2.1'' changed name to NestedSlidersPlugin
more documentation
''2005.11.04 - 1.2.0'' added alternative character-mode syntax {{{(((}}} and {{{)))}}}
tweaked "eat newlines" logic for line-mode {{{+++}}} and {{{===}}} syntax
''2005.11.03 - 1.1.1'' fixed toggling of default tooltips ("more..." and "less...") when a non-default button label is used
code cleanup, added documentation
''2005.11.03 - 1.1.0'' changed delimiter syntax from {{{(((}}} and {{{)))}}} to {{{+++}}} and {{{===}}}
changed name to EasySlidersPlugin
''2005.11.03 - 1.0.0'' initial public release
<<<
!!!!!Credits
<<<
This feature was implemented by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]] with initial research and suggestions from RodneyGomes, GeoffSlocock, and PaulPetterson.
<<<
!!!!!Code
***/
//{{{
version.extensions.nestedSliders = {major: 1, minor: 9, revision: 0, date: new Date(2006,5,11)};
//}}}
//{{{
// options for deferred rendering of sliders that are not initially displayed
if (config.options.chkDebugLazySliderDefer==undefined) config.options.chkDebugLazySliderDefer=false;
if (config.options.chkDebugLazySliderRender==undefined) config.options.chkDebugLazySliderRender=false;
// default styles for 'floating' class
setStylesheet(".floatingPanel { position:absolute; z-index:10; padding:0.5em; margin:0em; \
background-color:#eee; color:#000; border:1px solid #000; text-align:left; }","floatingPanelStylesheet");
//}}}
//{{{
config.formatters.push( {
name: "nestedSliders",
match: "\\n?\\+{3}",
terminator: "\\s*\\={3}\\n?",
lookahead: "\\n?\\+{3}(\\+)?(\\([^\\)]*\\))?(\\!*)?(\\^(?:[^\\^\\*\\[\\>]*\\^)?)?(\\*)?(\\[[^\\]]*\\])?(\\>)?(\\.\\.\\.)?\\s*",
handler: function(w)
{
var lookaheadRegExp = new RegExp(this.lookahead,"mg");
lookaheadRegExp.lastIndex = w.matchStart;
var lookaheadMatch = lookaheadRegExp.exec(w.source)
if(lookaheadMatch && lookaheadMatch.index == w.matchStart)
{
// location for rendering button and panel
var place=w.output;
// default to closed, no cookie, no accesskey
var show="none"; var title=" ►"; var tooltip="show"; var cookie=""; var key="";
// extra "+", default to open
if (lookaheadMatch[1])
{ show="block"; title="◄"; tooltip="hide"; }
// cookie, use saved open/closed state
if (lookaheadMatch[2]) {
cookie=lookaheadMatch[2].trim().slice(1,-1);
cookie="chkSlider"+cookie;
if (config.options[cookie]==undefined)
{ config.options[cookie] = (show=="block") }
if (config.options[cookie])
{ show="block"; title="◄"; tooltip="hide"; }
else
{ show="none"; title=" ►"; tooltip="show"; }
}
// parse custom label/tooltip/accesskey: [label=X|tooltip]
if (lookaheadMatch[6]) {
title = lookaheadMatch[6].trim().slice(1,-1);
var pos=title.indexOf("|");
if (pos!=-1) { tooltip = title.substr(pos+1,title.length); title=title.substr(0,pos); }
if (title.substr(title.length-2,1)=="=") { key=title.substr(title.length-1,1); title=title.slice(0,-2); }
if (pos==-1) tooltip += " "+title; // default tooltip: "show/hide <title>"
}
// create the button
if (lookaheadMatch[3]) { // use "Hn" header format instead of button/link
var lvl=(lookaheadMatch[3].length>6)?6:lookaheadMatch[3].length;
var btn = createTiddlyElement(createTiddlyElement(place,"h"+lvl,null,null,null),"a",null,null,title);
btn.onclick=onClickNestedSlider;
btn.setAttribute("href","javascript:;");
btn.setAttribute("title",tooltip);
}
else
var btn = createTiddlyButton(place,title,tooltip,onClickNestedSlider);
btn.sliderCookie = cookie; // save the cookiename (if any) in the button object
btn.keyparam=key; // save the access key letter ("" if none)
if (key.length) {
btn.setAttribute("accessKey",key); // init access key
btn.onfocus=function(){this.setAttribute("accessKey",this.keyparam);}; // **reclaim** access key on focus
}
// "non-click" MouseOver open/close slider
if (lookaheadMatch[5]) btn.onmouseover=onClickNestedSlider;
// create slider panel
var panelClass=lookaheadMatch[4]?"floatingPanel":"sliderPanel";
var panel=createTiddlyElement(place,"div",null,panelClass,null);
panel.style.display = show;
if (lookaheadMatch[4] && lookaheadMatch[4].length>2) panel.style.width=lookaheadMatch[4].slice(1,-1); // custom width
panel.button = btn; // so the slider panel know which button it belongs to
btn.sliderPanel=panel;
// render slider (or defer until shown)
w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;
if ((show=="block")||!lookaheadMatch[8]) {
// render now if panel is supposed to be shown or NOT deferred rendering
w.subWikify(lookaheadMatch[7]?createTiddlyElement(panel,"blockquote"):panel,this.terminator);
// align slider/floater position with button
adjustSliderPos(place,btn,panel,panelClass);
}
else {
var src = w.source.substr(w.nextMatch);
var endpos=findMatchingDelimiter(src,"+++","===");
panel.setAttribute("raw",src.substr(0,endpos));
panel.setAttribute("blockquote",lookaheadMatch[7]?"true":"false");
panel.setAttribute("rendered","false");
w.nextMatch += endpos+3;
if (w.source.substr(w.nextMatch,1)=="\n") w.nextMatch++;
if (config.options.chkDebugLazySliderDefer) alert("deferred '"+title+"':\n\n"+panel.getAttribute("raw"));
}
}
}
}
)
// TBD: ignore 'quoted' delimiters (e.g., "{{{+++foo===}}}" isn't really a slider)
function findMatchingDelimiter(src,starttext,endtext) {
var startpos = 0;
var endpos = src.indexOf(endtext);
// check for nested delimiters
while (src.substring(startpos,endpos-1).indexOf(starttext)!=-1) {
// count number of nested 'starts'
var startcount=0;
var temp = src.substring(startpos,endpos-1);
var pos=temp.indexOf(starttext);
while (pos!=-1) { startcount++; pos=temp.indexOf(starttext,pos+starttext.length); }
// set up to check for additional 'starts' after adjusting endpos
startpos=endpos+endtext.length;
// find endpos for corresponding number of matching 'ends'
while (startcount && endpos!=-1) {
endpos = src.indexOf(endtext,endpos+endtext.length);
startcount--;
}
}
return (endpos==-1)?src.length:endpos;
}
//}}}
//{{{
window.onClickNestedSlider=function(e)
{
if (!e) var e = window.event;
var theTarget = resolveTarget(e);
var theLabel = theTarget.firstChild.data;
var theSlider = theTarget.sliderPanel
var isOpen = theSlider.style.display!="none";
// if using default button labels, toggle labels
if (theLabel==">") theTarget.firstChild.data = "◄";
else if (theLabel=="<") theTarget.firstChild.data = "►";
// if using default tooltips, toggle tooltips
if (theTarget.getAttribute("title")=="show")
theTarget.setAttribute("title","hide");
else if (theTarget.getAttribute("title")=="hide")
theTarget.setAttribute("title","show");
if (theTarget.getAttribute("title")=="show "+theLabel)
theTarget.setAttribute("title","hide "+theLabel);
else if (theTarget.getAttribute("title")=="hide "+theLabel)
theTarget.setAttribute("title","show "+theLabel);
// deferred rendering (if needed)
if (theSlider.getAttribute("rendered")=="false") {
if (config.options.chkDebugLazySliderRender)
alert("rendering '"+theLabel+"':\n\n"+theSlider.getAttribute("raw"));
var place=theSlider;
if (theSlider.getAttribute("blockquote")=="true")
place=createTiddlyElement(place,"blockquote");
wikify(theSlider.getAttribute("raw"),place);
theSlider.setAttribute("rendered","true");
}
// show/hide the slider
if(config.options.chkAnimate)
anim.startAnimating(new Slider(theSlider,!isOpen,e.shiftKey || e.altKey,"none"));
else
theSlider.style.display = isOpen ? "none" : "block";
// if showing panel, set focus to first 'focus-able' element in panel
if (theSlider.style.display!="none") {
var ctrls=theSlider.getElementsByTagName("*");
for (var c=0; c<ctrls.length; c++) {
var t=ctrls[c].tagName.toLowerCase();
if (t=="input" || t=="textarea" || t=="select")
{ ctrls[c].focus(); break; }
}
}
if (this.sliderCookie && this.sliderCookie.length)
{ config.options[this.sliderCookie]=!isOpen; saveOptionCookie(this.sliderCookie); }
// align slider/floater position with target button
adjustSliderPos(theSlider.parentNode,theTarget,theSlider,theSlider.className);
return false;
}
// hijack animation handler 'stop' handler so overflow is visible after animation has completed
Slider.prototype.coreStop = Slider.prototype.stop;
Slider.prototype.stop = function() { this.coreStop(); this.element.style.overflow = "visible"; }
// adjust panel position based on button position
if (window.adjustSliderPos==undefined) window.adjustSliderPos=function(place,btn,panel,panelClass) {
if (panelClass=="floatingPanel") {
var left=0;
var top=btn.offsetHeight;
if (place.style.position!="relative") {
var left=findPosX(btn);
var top=findPosY(btn)+btn.offsetHeight;
var p=place; while (p && p.className!='floatingPanel') p=p.parentNode;
if (p) { left-=findPosX(p); top-=findPosY(p); }
}
if (left+panel.offsetWidth > getWindowWidth()) left=getWindowWidth()-panel.offsetWidth-10;
panel.style.left=left+"px"; panel.style.top=top+"px";
}
}
function getWindowWidth() {
if(document.width!=undefined)
return document.width; // moz (FF)
if(document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) )
return document.documentElement.clientWidth; // IE6
if(document.body && ( document.body.clientWidth || document.body.clientHeight ) )
return document.body.clientWidth; // IE4
if(window.innerWidth!=undefined)
return window.innerWidth; // IE - general
return 0; // unknown
}
//}}}
[[Dr1]]@@position:relative;+++^37em^@[[Dr1]]<<moveablePanel name:Dr1>>
----
<<tiddler Dr1 >>
===@@
[[Dr2]]@@position:relative;+++^37em^@[[Dr2]]<<moveablePanel name:Dr2>>
----
<<tiddler Dr2 >>
===@@
[[DrPr]]@@position:relative;+++^37em^@[[DrPr]]<<moveablePanel name:DrPr>>
----
<<tiddler DrPr >>
===@@
<html>
<style>
.rolodex table {
border: 0px solid;
background-color:#eeeff;
}
.rolodex tr, .rolodex td {
border: 0px solid;
}
</style>
<span class="rolodex">
<table>
<tr>
<td align="right"><b>Forfatter(e):</b></td>
<td colspan="3"><input name=author type=text style="width:300%" /></td></tr>
<tr>
<td align="right"><b>Titel:</b></td>
<td colspan="3"><input name=booktitle type=text style="width:300%" /></td></tr>
<tr>
<td align="right"><b>Bibliografiske data:</b></td>
<td colspan="3"><input name=bibdata type=text style="width:300%" /></td></tr>
<tr>
<td align="right"><b>Tema:</b></td>
<td colspan="3"><input name=primtopic type=text style="width:300%" /></td></tr>
<tr>
<td align="right"><b>Ejer jeg den?</b></td>
<input name=mine type=checkbox /></td></tr>
<tr>
<td align="right"><b>Hvor jeg har den:</b></td>
<td colspan="3"><input name=wherekept type=text style="width:300%" /></td></tr>
<tr>
</span> </html>
! Om bogen/artiklen og links:
/***
|Name:|NewHerePlugin|
|Description:|Creates the new here and new journal macros|
|Version:|3.0 ($Rev: 3861 $)|
|Date:|$Date: 2008-03-08 10:53:09 +1000 (Sat, 08 Mar 2008) $|
|Source:|http://mptw.tiddlyspot.com/#NewHerePlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License|http://mptw.tiddlyspot.com/#TheBSDLicense|
***/
//{{{
merge(config.macros, {
newHere: {
handler: function(place,macroName,params,wikifier,paramString,tiddler) {
wikify("<<newTiddler "+paramString+" tag:[["+tiddler.title+"]]>>",place,null,tiddler);
}
},
newJournalHere: {
handler: function(place,macroName,params,wikifier,paramString,tiddler) {
wikify("<<newJournal "+paramString+" tag:[["+tiddler.title+"]]>>",place,null,tiddler);
}
}
});
//}}}
<html>
<style>
.rolodex table {
border: 0px solid;
background-color:#eeeff;
}
.rolodex tr, .rolodex td {
border: 0px solid;
}
</style>
<span class="rolodex">
<table>
<tr>
<td align="right"><b>Underemne:</b></td>
<td colspan="3"><input name=notetopic type=text style="width:300%" /></td></tr>
<tr>
<td align="right"><b>Kilde:</b></td>
<td colspan="3"><input name=abpp type=text style="width:300%" /></td></tr>
<tr>
</span> </html>
!Noter
<!--{{{-->
<a style="color: #5566ff">Det ser ud som om du er ved at lave eller ændre en ny note fra bunden og op!<br>
Skriv notens titel i tekstfeltet øverst, og notens tekst herunder. <br>
Tilføj det emne denne note hører under i det næstøverste tekstfelt. <br>
Anvend [[dobbelte firkantede paranteser]] til at omkranse flere-ords emner. <br>
Brug denne drop-down menu:<b><span macro='tagChooser'></span></b> til at vælge dinne nuværende emner og andre tags</a>
<!--}}}-->
----
minen: meta det: tilføje en skråstreg / akut strategi
----
Opgive normale instrumenter
----
Modtage rådgivning
----
Overisning
----
En linje har to sider
----
En meget lille objekt-centrum
----
Tillad en servitutter (en servitutter er nedlæggelse af en striktur)
----
Altid første skridt
----
Er der sektioner? Overvej overgange
----
Spørg folk til at arbejde mod deres bedre dom
----
Spørg din krop
----
Saml nogle af de elementer i en gruppe og behandle den gruppe
----
Balance sammenhæng princippet med den manglende princippet
----
Være beskidt
----
Være ekstravagant
----
Være mindre kritiske oftere
----
Indånder mere dybt
----
Broer-bygge-brænder
----
Cascades
----
Skift instrument roller
----
Skift ingenting og fortsætte med uplettet sammenhæng
----
Børn-speaking-sang
----
Klyngeanalyse
----
Overveje forskellige fading systemer
----
Konsultere andre kilder-lover-skuffende
----
Konvertere en melodiske element i et rytmisk element
----
Courage!
----
Klip en vital forbindelse
----
Dekorer, dekorere
----
Definer et område som »sikker« og bruge det som et anker
----
Ødelæg-intet-det vigtigste
----
Kassere en aksiom
----
Disciplineret selvstændig overbærenhed
----
Afbryde forbindelsen ønske
----
Opdag de opskrifter, du bruger, og opgive dem
----
Forvridende tid
----
Ikke gør noget så længe som muligt
----
Vær ikke bange for ting, fordi de er let at lave
----
Vær ikke bange for klichéer
----
Vær ikke bange for at vise dine talenter
----
Du må ikke bryde tavsheden
----
Ikke understrege en ting mere, end en anden
----
Gøre noget kedeligt
----
Gøre de ord brug for forandring?
----
Har vi brug huller?
----
Understrege forskelle
----
Understrege gentagelser
----
Understrege mangler
----
Stillet over for et valg, gøre begge dele (i lyset af Dieter Rot)
----
Feed optagelsen tilbage ud af de mellemstore
----
Udfyld hvert beat med noget
----
Fra ingenting til mere end ingenting
----
Ghost ekkoer
----
Giv spillet væk
----
Vige for din værste impuls
----
Gå udenfor. Luk døren.
----
Gå langsomt hele vejen rundt uden
----
Gå til en ekstrem, vende tilbage til dels
----
Honor dine fejl som en skjult hensigt
----
Hvordan ville du have gjort det?
----
Menneskevaerdige noget fri for fejl
----
Idiot skadefryd (?)
----
Forestille sig, at emnet som et sæt af frakoblet begivenheder
----
Ubetydeligt gradations
----
Intentioner-adel af ydmyghed af-troværdighed
----
I totalt mørke, eller i et meget stort værelse, meget roligt
----
I det umulige
----
Er det færdigt?
----
Er intonation korrekt?
----
Er stemningen passende?
----
Er der noget der mangler?
----
Det er meget muligt, (trods alt)
----
Bare fortsætte
----
Lyt til den stille stemme
----
Se på, i hvilken rækkefølge du gør tingene
----
Se nærmere på de mest pinlige detaljer og uddyber dem
----
Tabt i nytteløs område
----
Laveste fællesnævner check-enkelt beat-enkelt note-enkelt RIFF
----
Foretag en blank værdifulde ved at sætte det i en udsøgt ramme
----
Foretag en udtømmende liste over alt, hvad du kan gøre, og gøre de sidste ting på listen
----
Foretag en pludselig, destruktiv uforudsigelige handling; indarbejde
----
Mechanicalize noget idiosynkratiske
----
Muting og fortsætte
----
Ikke at bygge en mur, men gør en mursten
----
Når søgningen er i gang, noget vil blive fundet
----
Kun en del, ikke hele
----
Kun en del af hver slags
----
(Økologisk) maskiner
----
Åbenlyst modsætte sig forandringer
----
Spørgsmål de heroiske tilgang
----
Husk. Disse rolige aftener
----
Fjerne uklarheder og konvertere til specifikke
----
Fjern præcist og konvertere til uklarheder
----
Gentagelse er en form for forandring
----
Spore dine skridt
----
Revaluering (en følelse af varme)
----
Reverse
----
Kortslutning (eksempel; en mand spiser ærter med tanken om, at de vil forbedre hans manddom skovle dem lige ind i hans skød)
----
Simpel subtraktion
----
Simpelthen et spørgsmål om at arbejde
----
Spektrum analysen
----
Twist rygsøjlen
----
Put i Earplugs
----
Venstre kanal, højre kanal, center kanal
----
Stat problemet i ord så klart som muligt
----
Tag en pause
----
Tag væk elementerne i den rækkefølge, tilsyneladende uden betydning
----
Den manglende princippet
----
Det vigtigste er de ting de fleste let glemt
----
Båndet er nu musikken
----
Tænk på radioen
----
Rydde op
----
Mod den ubetydelige
----
Tillid til dig nu
----
Slå det op og ned
----
Brug en gammel idé
----
Brug en uacceptabel farve
----
Brug færre noter
----
Brug filtre
----
Brug `ukvalificerede" mennesker
----
Vand
----
Hvad er de sektioner dele af? Forestil dig en Caterpillar flytter
----
Hvad er du virkelig at tænke lige nu?
----
Hvad er realiteterne?
----
Hvilke fejl har du gøre sidste gang?
----
Hvad ville du gøre?
----
Hvad ville din nærmeste ven gøre?
----
Arbejde på en anden hastighed
----
Ville nogen ønsker det?
----
Du er en ingeniør
----
Du kan kun gøre en prik på et tidspunkt
----
Du behøver ikke at skamme sig over at bruge dine egne idéer
----
Stjæle en løsning. (22. juli)
----
Beskriv landskabet, hvor det hører hjemme. (9 august)
----
Hvad der ellers sker dette ud? (9 august)
----
Liste de kvaliteter det har. Liste dem, du gerne vil have. (9 august)
----
I stedet for at ændre de ting, ændre verden omkring det. (9 august)
----
Hvad ville gøre det virkelig vellykket? (9 august)
----
Hvem ville gøre det virkelig vellykket? (9 august)
----
Hvordan vil du forklare det til dine forældre? (9 august)
----
Prøv faking det. - Fra Stewart Brand (9 august)
----
Hvad var de filial punkter i udviklingen af denne enhed (20. august)
----
Tilbage op et par skridt. Hvad kunne du have gjort? (20. august)
----
Hvornår er det for? Hvem er det til? (23. august)
----
Hvad vil du gøre? Nu, hvad gør du bedst? (27. august)
----
Første arbejde alene, derefter arbejde i usædvanlige par. (8 sep)
----
Hvad senest imponeret dig? Hvordan er det samme? Hvad kan du lære af det? Hvad kunne du tage fra det? (10. september)
----
Tag væk så meget mystik som muligt. Hvad er der tilbage? (30. december)
----
Fjern den midterste, udvide kanter
----
(Billede af mand spotlighted)
----
Vær opmærksom på at forstyrre
----
Når du går i stå, se på alt sidelæns.
----
Tabt i nytteløs område.
----
Langsom tilberedning, hurtig udførelse
----
Er stilen ret?
----
Hvor er kanten?
----
Voice din mistanke
----
Hvad er den enkleste løsning?
----
Gøre det mere sensuel
----
Brug noget i nærheden som model
----
Tænk - inde i arbejds-og uden for arbejdet
----
Hvilken sammenhæng ville se ret?
----
Hvornår er det for?
----
Hvad at stige? Hvad at reducere? Hvad at bevare?
----
Hvordan ville en anden gøre det?
----
[img[http://www.modtryk.dk/pngs/titel/9788773948026.png]]<<formTiddler NewBibEntryTemplate>>
<data>{"author":"Jan Guillou","booktitle":"Ondskaben","primtopic":"Ondskab","mine":false,"wherekept":"Jeg har vist givet den væk?!","bibdata":"ISBN: 9788776070014"}</data>
!HUSK at ændre titelen til den aktuelle dato!!!
NB! Titlerne ændres når du tagger eller åbner igen!! - Hvis du vil beholde forslaget skal du kopiere (Ctrl+C) og sætte ind igen -
(redigér eller wysiwyg) så bliver det ved med at være det samme..
Ved kopiering:
Erstat titellinier med:
!!Sang/fortælling
{{{|sortable|k}}}
{{{|Titel|Kilde|nr|h}}}
Brug <<tiddler QuickEdit_convert>> på resten af teksten (commas to table)
<<tiddler KlikSelv>>
<html><p align="center"><textarea id="xclToTw" rows="10" cols="60"></textarea><br><button onclick="(function(){var ta=document.getElementById('xclToTw'); displayMessage('original: ' + ta.value); ta.value=ta.value.replace(/^|$|\t/gm, '|');})();" > Oversæt</button></p></html>
<!--{{{-->
<div class='header' macro='gradient vert [[ColorPalette::PrimaryLight]] [[ColorPalette::PrimaryMid]]'>
<div class='headerShadow'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
<div class='headerForeground'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
<div id='topMenu'><span class='topMenu' refresh='content' tiddler='TopMenu'></span></div>
</div>
<div id='mainMenu' refresh='content' tiddler='MainMenu'></div>
<div id='sidebar'>
<div id='sidebarOptions' refresh='content' force='true' tiddler='SideBarOptions'></div>
<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>
</div>
<div id='displayArea'>
<div id='messageArea'></div>
<div id='tiddlerDisplay'></div>
</div>
<!--}}}-->
/***
|''Name:''|PasswordOptionPlugin|
|''Description:''|Extends TiddlyWiki options with non encrypted password option.|
|''Version:''|1.0.2|
|''Date:''|Apr 19, 2007|
|''Source:''|http://tiddlywiki.bidix.info/#PasswordOptionPlugin|
|''Author:''|BidiX (BidiX (at) bidix (dot) info)|
|''License:''|[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D ]]|
|''~CoreVersion:''|2.2.0 (Beta 5)|
***/
//{{{
version.extensions.PasswordOptionPlugin = {
major: 1, minor: 0, revision: 2,
date: new Date("Apr 19, 2007"),
source: 'http://tiddlywiki.bidix.info/#PasswordOptionPlugin',
author: 'BidiX (BidiX (at) bidix (dot) info',
license: '[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D]]',
coreVersion: '2.2.0 (Beta 5)'
};
config.macros.option.passwordCheckboxLabel = "Save this password on this computer";
config.macros.option.passwordInputType = "password"; // password | text
setStylesheet(".pasOptionInput {width: 11em;}\n","passwordInputTypeStyle");
merge(config.macros.option.types, {
'pas': {
elementType: "input",
valueField: "value",
eventName: "onkeyup",
className: "pasOptionInput",
typeValue: config.macros.option.passwordInputType,
create: function(place,type,opt,className,desc) {
// password field
config.macros.option.genericCreate(place,'pas',opt,className,desc);
// checkbox linked with this password "save this password on this computer"
config.macros.option.genericCreate(place,'chk','chk'+opt,className,desc);
// text savePasswordCheckboxLabel
place.appendChild(document.createTextNode(config.macros.option.passwordCheckboxLabel));
},
onChange: config.macros.option.genericOnChange
}
});
merge(config.optionHandlers['chk'], {
get: function(name) {
// is there an option linked with this chk ?
var opt = name.substr(3);
if (config.options[opt])
saveOptionCookie(opt);
return config.options[name] ? "true" : "false";
}
});
merge(config.optionHandlers, {
'pas': {
get: function(name) {
if (config.options["chk"+name]) {
return encodeCookie(config.options[name].toString());
} else {
return "";
}
},
set: function(name,value) {config.options[name] = decodeCookie(value);}
}
});
// need to reload options to load passwordOptions
loadOptionsCookie();
/*
if (!config.options['pasPassword'])
config.options['pasPassword'] = '';
merge(config.optionsDesc,{
pasPassword: "Test password"
});
*/
//}}}
/***
|''Name:''|PasswordOptionPlugin|
|''Description:''|Extends TiddlyWiki options with non encrypted password option.|
|''Version:''|1.0.2|
|''Date:''|Apr 19, 2007|
|''Source:''|http://tiddlywiki.bidix.info/#PasswordOptionPlugin|
|''Author:''|BidiX (BidiX (at) bidix (dot) info)|
|''License:''|[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D ]]|
|''~CoreVersion:''|2.2.0 (Beta 5)|
***/
//{{{
version.extensions.PasswordOptionPlugin = {
major: 1, minor: 0, revision: 2,
date: new Date("Apr 19, 2007"),
source: 'http://tiddlywiki.bidix.info/#PasswordOptionPlugin',
author: 'BidiX (BidiX (at) bidix (dot) info',
license: '[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D]]',
coreVersion: '2.2.0 (Beta 5)'
};
config.macros.option.passwordCheckboxLabel = "Save this password on this computer";
config.macros.option.passwordInputType = "password"; // password | text
setStylesheet(".pasOptionInput {width: 11em;}\n","passwordInputTypeStyle");
merge(config.macros.option.types, {
'pas': {
elementType: "input",
valueField: "value",
eventName: "onkeyup",
className: "pasOptionInput",
typeValue: config.macros.option.passwordInputType,
create: function(place,type,opt,className,desc) {
// password field
config.macros.option.genericCreate(place,'pas',opt,className,desc);
// checkbox linked with this password "save this password on this computer"
config.macros.option.genericCreate(place,'chk','chk'+opt,className,desc);
// text savePasswordCheckboxLabel
place.appendChild(document.createTextNode(config.macros.option.passwordCheckboxLabel));
},
onChange: config.macros.option.genericOnChange
}
});
merge(config.optionHandlers['chk'], {
get: function(name) {
// is there an option linked with this chk ?
var opt = name.substr(3);
if (config.options[opt])
saveOptionCookie(opt);
return config.options[name] ? "true" : "false";
}
});
merge(config.optionHandlers, {
'pas': {
get: function(name) {
if (config.options["chk"+name]) {
return encodeCookie(config.options[name].toString());
} else {
return "";
}
},
set: function(name,value) {config.options[name] = decodeCookie(value);}
}
});
// need to reload options to load passwordOptions
loadOptionsCookie();
/*
if (!config.options['pasPassword'])
config.options['pasPassword'] = '';
merge(config.optionsDesc,{
pasPassword: "Test password"
});
*/
//}}}
[[Udskriv til pdf|http://savepageaspdf.pdfonline.com/pdfonline/pdfonline.asp? cURL=<data:post.url/>&authorhttp://savepageaspdf.pdfonline.com/pdfonline/pdfonline.asp? cURL=http://sang.tiddlyspot.com/&author_id=AB9CAD14-7AED-4591-8C53-5C553A994451]]
/***
''CheckboxPlugin for TiddlyWiki version 1.2.x and 2.0''
^^author: Eric Shulman
source: http://www.elsdesign.com/tiddlywiki/#CheckboxPlugin
license: [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]^^
Add checkboxes to your tiddler content. Checkbox states can be preserved in the document by either automatically modifying the tiddler content or setting/removing tags on specified tiddlers, or they may be saved as local cookies by assigning an optional 'chkID' to the checkbox. Add custom javascript for programmatic initialization and onClick handling for any checkbox. Also provides access to checkbox DOM element data and tracks the checkbox state in TiddlyWiki's config.options[] internal data.
!!!!!Usage
<<<
The checkbox syntax, including all optional parameters, is contained inside a matched set of [ and ] brackets.
{{{ [x=id(title:tag){init_script}{onclick_script}] }}}
An alternative syntax lets you place the optional parameters ''outside'' the [ and ] brackets, and is provided for backward-compatibility with existing content that may include checkbox definitions based on earlier releases of this plugin:
{{{ [x]=id(title:tag){init_script}{onclick_script} }}}
//{{{
[ ]or[_] and [x]or[X]
//}}}
Simple checkboxes. The current unchecked/checked state is indicated by the character between the {{{[}}} and {{{]}}} brackets ("_" means unchecked, "X" means checked). When you click on a checkbox, the current state is retained by directly modifying the tiddler content to place the corresponding "_" or "X" character in between the brackets
//{{{
[x=id]
//}}}
Assign an optional ID to the checkbox so you can use {{{document.getElementByID("id")}}} to manipulate the checkbox DOM element, as well as tracking the current checkbox state in {{{config.options["id"]}}}. If the ID starts with "chk" the checkbox state will also be saved in a cookie, so it can be automatically restored whenever the checkbox is re-rendered (overrides any default {{{[x]}}} or {{{[_]}}} value). If a cookie value is kept, the "_" or "X" character in the tiddler content remains unchanged, and is only applied as the default when a cookie-based value is not currently defined.
//{{{
[x(title:tag)]
//}}}
Initializes and tracks the current checkbox state by setting or removing ("TogglyTagging") a particular tag value from a specified tiddler. If you omit the tiddler title (and the ":" separator), the specified tag is assigned to the current tiddler. If you omit the tag value, as in {{{(title:)}}}, the default tag, {{{checked}}}, is assumed. Omitting both the title and tag, {{{()}}}, tracks the checkbox state by setting the "checked" tag on the current tiddler. When tag tracking is used, the "_" or "X" character in the tiddler content remains unchanged, and is not used to set or track the checkbox state. If a tiddler title named in the tag does not exist, the checkbox state defaults to //unselected//. When the checkbox is subsequently changed to //selected//, it will automatically (and silently) create the missing tiddler and then add the tag to it.
//{{{
[x{javascript}{javascript}]
//}}}
You can define optional javascript code segments to add custom initialization and/or 'onClick' handling to a checkbox. The current checkbox state (and it's other DOM attributes) can be set or read from within these code segments by reference to the default context-object, 'this'.
The first code segment will be executed when the checkbox is initially displayed, so that you can programmatically determine it's starting checked/unchecked state. The second code segment (if present) is executed whenever the checkbox is clicked, so that you can perform programmed responses or intercept and override the checkbox state based on complex logic using the TW core API or custom functions defined in plugins (e.g. testing a particular tiddler title to see if certain tags are set or setting some tags when the checkbox is clicked).
Note: if you want to use the default checkbox initialization processing with a custom onclick function, use this syntax: {{{ [x=id{}{javascript}] }}}
<<<
!!!!!Examples
<<<
//{{{
[X] label
[_] label
//}}}
checked and unchecked static default values
[X] label
[_] label
//{{{
[_=demo] label
//}}}
document-based value (id='demo', no cookie)
[_=demo] label
//{{{
[_=chkDemo] label
//}}}
cookie-based value (id='chkDemo')
[_=chkDemo] label
//{{{
[_(CheckboxPlugin:demotag)] toggle 'demotag'
//}}}
tag-based value (TogglyTagging)
[_(CheckboxPlugin:demotag)] toggle 'demotag'
<html><a href="javascript:;" onclick="alert(store.getTiddler(story.findContainingTiddler(this).id.substr(7)).tags)">click to view tags</a></html>
//{{{
[X{this.checked=true}{alert(this.checked?"on":"off")}] message box with checkbox state
//}}}
custom init and onClick functions
[X{this.checked=true}{alert(this.checked?"on":"off")}] message box with checkbox state
Retrieving option values:
config.options['demo']=<script>return config.options['demo']?"true":"false";</script>
config.options['chkDemo']=<script>return config.options['chkDemo']?"true":"false";</script>
!!!!!Installation
import (or copy/paste) the following tiddlers into your document:
''CheckboxPlugin'' (tagged with <<tag systemConfig>>)
<<<
!!!!!Revision History
<<<
++++[2006.01.10 - 2.0.1]
when toggling tags, force refresh of the 'tag tiddler'. For example, if you toggle the "systemConfig" tag on a plugin, the corresponding "systemConfig" TIDDLER will be automatically refreshed (if currently displayed), so that the 'tagged' list in that tiddler will remain up-to-date.
===
++++[2006.01.04 - 2.0.0]
update for ~TW2.0
===
++++[2005.12.27 - 1.1.2]
Fix lookAhead regExp handling for """[x=id]""", which had been including the "]" in the extracted ID.
Added check for "chk" prefix on ID before calling saveOptionCookie()
===
++++[2005.12.26 - 1.1.2]
Corrected use of toUpperCase() in tiddler re-write code when comparing """[X]""" in tiddler content with checkbox state. Fixes a problem where simple checkboxes could be set, but never cleared.
===
++++[2005.12.26 - 1.1.0]
Revise syntax so all optional parameters are included INSIDE the [ and ] brackets. Backward compatibility with older syntax is supported, so content changes are not required when upgrading to the current version of this plugin. Based on a suggestion by GeoffSlocock
===
++++[2005.12.25 - 1.0.0]
added support for tracking checkbox state using tags ("TogglyTagging")
Revised version number for official post-beta release.
===
+++[2005.12.08 - 0.9.3]
support separate 'init' and 'onclick' function definitions.
===
+++[2005.12.08 - 0.9.2]
clean up lookahead pattern
===
+++[2005.12.07 - 0.9.1]
only update tiddler source content if checkbox state is actually different. Eliminates unnecessary tiddler changes (and 'unsaved changes' warnings)
===
+++[2005.12.07 - 0.9.0]
initial BETA release
===
<<<
!!!!!Credits
<<<
This feature was created by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]]
<<<
!!!!!Code
***/
//{{{
version.extensions.CheckboxPlugin = {major: 2, minor: 0, revision:1 , date: new Date(2006,1,10)};
//}}}
// // 1.2.x compatibility
//{{{
if (!window.story) window.story=window;
if (!store.getTiddler) store.getTiddler=function(title){return store.tiddlers[title]}
if (!store.addTiddler) store.addTiddler=function(tiddler){store.tiddlers[tiddler.title]=tiddler}
if (!store.deleteTiddler) store.deleteTiddler=function(title){delete store.tiddlers[title]}
//}}}
//{{{
config.formatters.push( {
name: "checkbox",
match: "\\[[xX_ ][\\]\\=\\(\\{]",
lookahead: "\\[([xX_ ])(\\])?(=[^\\s\\(\\]{]+)?(\\([^\\)]*\\))?({[^}]*})?({[^}]*})?(\\])?",
handler: function(w)
{
var lookaheadRegExp = new RegExp(this.lookahead,"mg");
lookaheadRegExp.lastIndex = w.matchStart;
var lookaheadMatch = lookaheadRegExp.exec(w.source)
if(lookaheadMatch && lookaheadMatch.index == w.matchStart)
{
// get params
var checked=lookaheadMatch[1];
var id=lookaheadMatch[3];
var tag=lookaheadMatch[4];
var fn_init=lookaheadMatch[5];
var fn_click=lookaheadMatch[6];
// create checkbox element
var c = document.createElement("input");
c.setAttribute("type","checkbox");
c.onclick=onClickCheckbox;
c.srcpos=w.matchStart+1; // remember location of "X"
w.output.appendChild(c);
// set default state
c.checked=(checked.toUpperCase()=="X");
// get/set state by ID
if (id) {
c.id=id.substr(1); // trim off leading "="
if (config.options[c.id]!=undefined)
c.checked=config.options[c.id];
else
config.options[c.id]=c.checked;
}
// get/set state by tag
if (tag) {
c.tiddler=story.findContainingTiddler(w.output).id.substr(7);
c.tag=tag.substr(1,tag.length-2).trim(); // trim off parentheses
var pos=c.tag.indexOf(":");
if (pos==0) { c.tag=tag.substr(1); }
if (pos>0) { c.tiddler=c.tag.substr(0,pos); c.tag=c.tag.substr(pos+1); }
if (!c.tag.length) c.tag="checked";
var t=store.getTiddler(c.tiddler);
c.checked = (t && t.tags)?(t.tags.find(c.tag)!=null):false;
}
if (fn_init) c.fn_init=fn_init.trim().substr(1,fn_init.length-2); // trim off surrounding { and } delimiters
if (fn_click) c.fn_click=fn_click.trim().substr(1,fn_click.length-2);
c.onclick(); // compute initial state and save in tiddler/config/cookie
w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;
}
}
}
)
//}}}
//{{{
function onClickCheckbox()
{
if (this.fn_init)
// custom function hook to set initial state (run only once)
{ try { eval(this.fn_init); this.fn_init=null; } catch(e) { displayMessage("Checkbox init error: "+e.toString()); } }
else if (this.fn_click)
// custom function hook to override or react to changes in checkbox state
{ try { eval(this.fn_click) } catch(e) { displayMessage("Checkbox click error: "+e.toString()); } }
if (this.id)
// save state in config AND cookie (only when ID starts with 'chk')
{ config.options[this.id]=this.checked; if (this.id.substr(0,3)=="chk") saveOptionCookie(this.id); }
if ((!this.id || this.id.substr(0,3)!="chk") && !this.tag) {
// save state in tiddler content only if not using cookie or tag tracking
var t=store.getTiddler(story.findContainingTiddler(this).id.substr(7));
if (this.checked!=(t.text.substr(this.srcpos,1).toUpperCase()=="X")) { // if changed
t.set(null,t.text.substr(0,this.srcpos)+(this.checked?"X":"_")+t.text.substr(this.srcpos+1),null,null,t.tags);
store.setDirty(true);
}
}
if (this.tag) {
var t=store.getTiddler(this.tiddler);
if (!t) { t=(new Tiddler()); t.set(this.tiddler,"",config.options.txtUserName,(new Date()),null); store.addTiddler(t); }
var tagged=(t.tags && t.tags.find(this.tag)!=null);
if (this.checked && !tagged) { t.tags.push(this.tag); store.setDirty(true); }
if (!this.checked && tagged) { t.tags.splice(t.tags.find(this.tag),1); store.setDirty(true); }
story.refreshTiddler(this.tag,null,true); // if "tag tiddler" is showing, force a display update
}
return true;
}
//}}}
# Print en html-fil via knappen i Tiddlermenuen.<br>Printet åbnes i et nyt vindue eller faneblad og kan nu udskrives med en almindelig printer.
# Print til en pdf-fil online via knappen øverst tv. i hjemmesiden.<br>Hvis du har klikket "mere" i tiddlermenuen og valgt "permalink" //(Eller <<permaview>> i@@padding-left: 20px;{{purple{<<tiddler ToggleRightSidebar with: "(Sidepanel)">>}}}@@)// vil der blive lavet en pdf med indholdet af den åbne tiddler. //(Ellers er det [[startsiden|Sang]])//
**Tip: Det er også "permalink-knappen" du skal bruge hvis du vil give andre et link til at åbne hjemmesiden med netop denne tiddler åben.
Måder at lave tabeller på:
!!Den hurtige:
* Åben [[RegneArk]]
* Indskriv sange i regnearket - i fanebladet "Indsættelsesskabelon" (Bliver automatisk gemt på nettet (som Google docs)) <br>//Udskriv evt fra Regnearket @@color(#cc3300):(Intet er gemt her i Sang 08/09 endnu)@@//
** Kopiér indholdet i regnearket.
** Klik <<newJournal label:"Ny FredagsSangtime" tag:"Sang" text:"!HUSK at ændre titelen til den aktuelle dato!!!
!!Fredagssangtimen
|sortable|k
" >> eller <<newJournal label:"Ny Sang/fortælling" tag:"Sang" text:"!HUSK at ændre titelen til den aktuelle dato!!!
!!Sang/fortælling
|sortable|k
" >>
** Ændre titlen til den aktuelle dato
** Indsæt regnearksinholdet under |sortable|k
** Markér det netop indkopierede
** Klik convert i QuickEditMenuen
** Vælg tab -> table (Slet evt overskydende || i bunden af resultatet)
** Færdig
** Nu har vi en sortérbar tabel med dd. og tagget Sang. (= Flueben i [[Aktuel|Sang]] er sat automatisk!)
!!! Husk at gemme!!
/***
|Name|QuickEditPlugin|
|Source|http://www.TiddlyTools.com/#QuickEditPlugin|
|Documentation|http://www.TiddlyTools.com/#QuickEditPlugin|
|Version|2.4.1|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 3.0 License|http://creativecommons.org/licenses/by-sa/3.0/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides||
|Description|Support functions for ~QuickEdit package: styles, utility functions, and 'toggleQuickEdit' command|
!!!!!Revisions
<<<
2008.09.07 [2.4.1] added removeOptionCookie() function for compatibility with [[CookieManagerPlugin]]
2008.05.17 [2.4.0] copied code from StickyPopupPlugin to remove dependency
2008.05.12 [2.3.0] added "toggleQuickEdit" command handler (replaces inline script command)
2008.01.11 [2.2.0] converted from inline script
2007.03.29 [1.0.0] initial release (as inline script)
<<<
!!!!!Code
***/
//{{{
version.extensions.QuickEditPlugin= {major: 2, minor: 4, revision: 1, date: new Date(2008,9,7)};
// SET STYLESHEET (for toolbar button style)
setStylesheet(".quickEdit a { border:2px outset ButtonFace; -moz-appearance:button; padding:0px 3px; \
background-color:ButtonFace; color:ButtonText !important; line-height:200%; font-weight:normal; }", "quickEditStyles");
// if removeOptionCookie() function is not defined by TW core, define it here.
if (window.removeOptionCookie===undefined) {
window.removeOptionCookie=function(cookie) {
var ex=new Date(); ex.setTime(ex.getTime()-1000); // immediately expire cookie
document.cookie = cookie+"=novalue; path=/; expires="+ex.toGMTString();
}
}
// UTILITY FUNCTIONS
config.quickEdit = {
getField: function(where) {
var here=story.findContainingTiddler(where); if (!here) return null;
var e=story.getTiddlerField(here.getAttribute("tiddler"),"text");
if (e&&e.getAttribute("edit")=="text") return e;
return null;
},
setSelection: function(where,newtext) {
var e=this.getField(where); if (!e) return false;
e.focus(); replaceSelection(e,newtext);
return false;
},
wrapSelection: function(where,before,after) {
var e=this.getField(where); if (!e) return false;
e.focus(); replaceSelection(e,before+config.quickEdit.getSelection(e)+after);
return false;
},
getSelection: function(e) {
var seltext="";
if (e&&e.setSelectionRange)
seltext=e.value.substr(e.selectionStart,e.selectionEnd-e.selectionStart);
else if (document.selection) {
var range = document.selection.createRange();
if (range.parentElement()==e) seltext=range.text
}
return seltext;
},
promptForFilename: function(msg,path,file) {
if(window.Components) { // moz
try {
netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
var nsIFilePicker = window.Components.interfaces.nsIFilePicker;
var picker = Components.classes['@mozilla.org/filepicker;1'].createInstance(nsIFilePicker);
picker.init(window, msg, nsIFilePicker.modeOpen);
var thispath = Components.classes['@mozilla.org/file/local;1'].createInstance(Components.interfaces.nsILocalFile);
thispath.initWithPath(path);
picker.displayDirectory=thispath;
picker.defaultExtension='jpg';
picker.defaultString=file;
picker.appendFilters(nsIFilePicker.filterAll|nsIFilePicker.filterImages);
if (picker.show()!=nsIFilePicker.returnCancel)
var result="file:///"+picker.file.persistentDescriptor.replace(/\\/g,'/');
}
catch(e) { alert('error during local file access: '+e.toString()) }
}
else { // IE
try { // XP only
var s = new ActiveXObject('UserAccounts.CommonDialog');
s.Filter='All files|*.*|JPG files|*.jpg|GIF files|*.gif|PNG files|*.png|';
s.FilterIndex=1; // default to JPG files;
s.InitialDir=path;
s.FileName=file;
if (s.showOpen()) var result=s.FileName;
}
catch(e) { var result=prompt(msg,path+file); } // fallback for non-XP IE
}
return result;
}
}
//}}}
//{{{
if (config.options.chkShowQuickEdit===undefined) config.options.chkShowQuickEdit=false;
config.commands.toggleQuickEdit = {
hideReadOnly: true,
getText: function() { return config.options.chkShowQuickEdit?'\u221Aquickedit':'quickedit'; },
tooltip: 'show QuickEdit toolbar buttons',
handler: function(event,src,title) {
config.options.chkShowQuickEdit=!config.options.chkShowQuickEdit;
config.macros.option.propagateOption("chkShowQuickEdit","checked", config.options.chkShowQuickEdit,"input");
// save cookie when toolbar shown, remove cookie when toolbar hidden
if (config.options.chkShowQuickEdit) saveOptionCookie("chkShowQuickEdit");
else removeOptionCookie("chkShowQuickEdit");
// set link and title based on option state
src.innerHTML=config.commands.toggleQuickEdit.getText();
// refresh all actively displayed tiddler editor(s)
story.forEachTiddler(function(t,e){if (story.isDirty(t)) refreshElements(e);});
return false;
}
};
//}}}
// // COPIED FROM [[StickyPopupPlugin]] TO ELIMINATE PLUGIN DEPENDENCY
//{{{
if (config.options.chkStickyPopups==undefined) config.options.chkStickyPopups=false;
Popup.stickyPopup_onDocumentClick = function(ev)
{
// if click is in a sticky popup, ignore it so popup will remain visible
var e = ev ? ev : window.event; var target = resolveTarget(e);
var p=target; while (p) {
if (hasClass(p,"popup") && (hasClass(p,"sticky")||config.options.chkStickyPopups)) break;
else p=p.parentNode;
}
if (!p) // not in sticky popup (or sticky popups disabled)... use normal click handling
Popup.onDocumentClick(ev);
return true;
};
try{removeEvent(document,"click",Popup.onDocumentClick);}catch(e){};
try{addEvent(document,"click",Popup.stickyPopup_onDocumentClick);}catch(e){};
//}}}
/%
|Name|QuickEditToolbar|
|Source|http://www.TiddlyTools.com/#QuickEditToolbar|
|Version|2.1.0|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.2|
|Type|script|
|Requires|QuickEditPlugin, InlineJavascriptPlugin|
|Optional|QuickEdit_replace, QuickEdit_split, QuickEdit_link, QuickEdit_macro, QuickEdit_image, QuickEdit_tiddler, QuickEdit_file, QuickEdit_format, QuickEdit_sort|
|Overrides||
|Description|quickly insert TiddlyWiki tiddler links or common formatting sequences directly into tiddler content|
Usage (in EditTemplate): <div macro='tiddler QuickEditToolbar with: show'></div>
where "show" is an OPTIONAL keyword to force the toolbar to be displayed regardless of the current 'toggle' state
%/<<tiddler HideTiddlerTags>>/%
TOOLBAR DEFINITIONS BEGIN HERE...
= = = = = = = = = = = = = = = = =
%/{{hidden fine center quickEdit{
<script>
// note: always show toolbar when directly viewing the tiddler containing the actual toolbar definition!
var here=story.findContainingTiddler(place); if (here) var tid=here.getAttribute("tiddler");
var show="$1"!="$"+"1"||config.options.chkShowQuickEdit||tid=="QuickEditToolbar"
place.style.display=show?"block":"none";
</script>/%
%/<<tiddler QuickEdit_replace>>/%
%/<<tiddler QuickEdit_split>>/%
%/<<tiddler QuickEdit_sort>>/%
%/<<tiddler QuickEdit_tiddler>>/%
%/<<tiddler QuickEdit_file>>/%
%/ /% (SPACER)
%/<<tiddler QuickEdit_format>>/%
%/<<tiddler QuickEdit_align>>/%
%/<<tiddler QuickEdit_color>>/%
%/<<tiddler QuickEdit_font>>/%
%/<<tiddler QuickEdit_css>>/%
%/ /% (SPACER)
%/<<tiddler QuickEdit_link>>/%
%/<<tiddler QuickEdit_macro>>/%
%/<<tiddler QuickEdit_image>>/%
%/<<tiddler QuickEdit_convert>>/%
%/}}}
/%
|Name|QuickEdit_align|
|Source|http://www.TiddlyTools.com/#QuickEdit_align|
|Version|2.2.0|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.2|
|Type|script|
|Requires|QuickEditPlugin|
|Overrides||
|Description|definition for toolbar button for text alignment|
Usage:
QuickEditToolbar: <<tiddler QuickEdit_align>>
OR
EditTemplate: <span class='toolbar' macro='tiddler QuickEdit_align'></span>
**** ALIGNMENT ****
%/<html><hide linebreaks><a href="javascript:;" class="tiddlyLink"
title="align text"
onclick="var p=Popup.create(this); if (!p) return false; p.className+=' sticky smallform';
var s=createTiddlyElement(p,'select'); s.button=this;
s.options[0]=new Option('select text alignment...','');
s.onchange=function(){
config.quickEdit.wrapSelection(this.button,'{{'+this.value+'{','}}}');
Popup.remove(); return false;
};
s.options[s.length]=new Option('left','left');
s.options[s.length-1].title='{{left{...}}}';
s.options[s.length]=new Option('center','center');
s.options[s.length-1].title='{{center{...}}}';
s.options[s.length]=new Option('right','right');
s.options[s.length-1].title='{{right{...}}}';
s.options[s.length]=new Option('justify','justify');
s.options[s.length-1].title='{{justify{...}}}';
s.options[s.length]=new Option('float left','float left');
s.options[s.length-1].title='{{floatleft{...}}}';
s.options[s.length]=new Option('float right','float right');
s.options[s.length-1].title='{{floatright{...}}}';
Popup.show(p,false);
event.cancelBubble=true;if(event.stopPropagation)event.stopPropagation();return false;"
>align</a></html>
/%
|Name|QuickEdit_color|
|Source|http://www.TiddlyTools.com/#QuickEdit_color|
|Version|2.2.0|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.2|
|Type|script|
|Requires|QuickEditPlugin|
|Overrides||
|Description|definition of toolbar button for "color" command|
Usage:
QuickEditToolbar: <<tiddler QuickEdit_color>>
OR
EditTemplate: <span class='toolbar' macro='tiddler QuickEdit_color'></span>
**** COLOR ****
%/<html><hide linebreaks><a href="javascript:;" class="tiddlyLink"
title="text/background color - @@color:#RGB;background-color:#RGB;...@@"
onclick="var p=Popup.create(this,null,'popup sticky smallform'); if (!p) return false;
p.style.padding='2px';
function hex(d) { return '0123456789ABCDEF'.substr(d,1); }
var fg=createTiddlyElement(p,'select'); fg.button=this;
fg.style.width='12em';
fg.options[0]=new Option('text color...','');
fg.options[1]=new Option('\xa0 or enter a value','_ask');
fg.options[2]=new Option('\xa0 or use default color','');
for (var r=0;r<16;r+=3) for (var g=0;g<16;g+=3) for (var b=0;b<16;b+=3) {
var label=hex(r)+hex(g)+hex(b);
fg.options[fg.length]=new Option(label,'#'+label);
fg.options[fg.length-1].style.color='#'+label;
}
fg.onchange=function(){ var val=this.value;
if (val=='_ask') { val=prompt('Enter a CSS color value');
if (!val||!val.length) return false; }
this.options[0].value=val; this.options[0].text=val.length?'text: '+val:'text color...';
var bg=this.nextSibling;
for (var i=3;i<bg.options.length;i++) bg.options[i].style.color=val;
var preview=this.nextSibling.nextSibling.nextSibling;
var t=config.quickEdit.getSelection(config.quickEdit.getField(this.button));
t=t.replace(/^@@(color\:.+;)?(background-color\:.+;)?/,'').replace(/@@$/,'');
if (!t.length) t='~AaBbCcDdEeFfGgHhIiJj 1234567890';
var fg=this.value; if (fg.length) fg='color:'+fg+';';
var bg=this.nextSibling.value; if (bg.length) bg='background-color:'+bg+';';
if (fg.length||bg.length) t='@@'+fg+bg+t+'@@';
removeChildren(preview); wikify(t,preview);
this.selectedIndex=0; return false;
};
var bg=createTiddlyElement(p,'select'); bg.button=this;
bg.style.width='12em';
bg.options[0]=new Option('background color...','');
bg.options[1]=new Option('\xa0 or enter a value','_ask');
bg.options[2]=new Option('\xa0 or use default color','');
for (var r=0;r<16;r+=3) for (var g=0;g<16;g+=3) for (var b=0;b<16;b+=3) {
var label=hex(15-r)+hex(15-g)+hex(15-b);
bg.options[bg.length]=new Option(label,'#'+label);
bg.options[bg.length-1].style.backgroundColor='#'+label;
}
bg.onchange=function(){ var val=this.value;
if (val=='_ask') { val=prompt('Enter a CSS color value');
if (!val||!val.length) return false; }
this.options[0].value=val;
this.options[0].text=val.length?'background: '+val:'background color...';
var fg=this.previousSibling;
for (var i=3;i<fg.options.length;i++) fg.options[i].style.backgroundColor=val;
var preview=this.nextSibling.nextSibling;
var t=config.quickEdit.getSelection(config.quickEdit.getField(this.button));
t=t.replace(/^@@(color\:.+;)?(background-color\:.+;)?/,'').replace(/@@$/,'');
if (!t.length) t='~AaBbCcDdEeFfGgHhIiJj 1234567890';
var fg=this.previousSibling.value; if (fg.length) fg='color:'+fg+';';
var bg=this.value; if (bg.length) bg='background-color:'+bg+';';
if (fg.length||bg.length) t='@@'+fg+bg+t+'@@';
removeChildren(preview); wikify(t,preview);
this.selectedIndex=0; return false;
};
var b=createTiddlyElement(p,'input',null,null,null,{type:'button'}); b.button=this;
b.value='ok'; b.style.width='4em';
b.onclick=function() {
var fg=this.previousSibling.previousSibling.value; if (fg.length) fg='color:'+fg+';';
var bg=this.previousSibling.value; if (bg.length) bg='background-color:'+bg+';';
var t=config.quickEdit.getSelection(config.quickEdit.getField(this.button));
t=t.replace(/^@@(color\:.+;)?(background-color\:.+;)?/,'').replace(/@@$/,'');
if (fg.length||bg.length) config.quickEdit.setSelection(this.button,'@@'+fg+bg+t+'@@');
Popup.remove(); return false;
};
var preview=createTiddlyElement(p,'div',null,'viewer'); var s=preview.style;
s.border='1px solid'; s.margin='2px'; s.width='24em'; s.padding='3px'; s.MozBorderRadius='3px';
s.overflow='hidden'; s.textAlign='center'; s.whiteSpace='normal';
var t=config.quickEdit.getSelection(config.quickEdit.getField(this));
wikify(t.length?t:'~AaBbCcDdEeFfGgHhIiJj 1234567890',preview);
Popup.show(p,false);
event.cancelBubble=true;if(event.stopPropagation)event.stopPropagation();return false;"
>color</a></html>
/%
|Name|QuickEdit_convert|
|Source|http://www.TiddlyTools.com/#QuickEdit_convert|
|Version|2.2.0|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.2|
|Type|script|
|Requires|QuickEditPlugin|
|Overrides||
|Description|toolbar button for converting tab/comma-separated data to/from table format|
Usage:
QuickEditToolbar: <<tiddler QuickEdit_convert>>
OR
EditTemplate: <span class='toolbar' macro='tiddler QuickEdit_convert'></span>
%/<html><hide linebreaks><a href="javascript:;" class="tiddlyLink"
title="convert between tab-separated, comma-separated data and wiki table formats"
onclick="var e=config.quickEdit.getField(this);
if (e) e.focus(); var txt=config.quickEdit.getSelection(e);
var p=Popup.create(this); if (!p) return false; p.className+=' sticky smallform';
var s=createTiddlyElement(p,'select'); s.button=this;
s.onchange=function(){
if (!this.value) return false;
var e=config.quickEdit.getField(this.button); if (!e) return false;
e.focus(); var txt=config.quickEdit.getSelection(e);
switch(this.value) {
case 'tabsToTable':
txt=txt.replace(/\t/g,'|').replace(/^|$/g,'|');
txt=txt.replace(/\n/g,'|\n|').replace(/^\|$/g,'');
break;
case 'tableToTabs':
txt=txt.replace(/\t/g,' ').replace(/\|/g,'\t');
txt=txt.replace(/^\t/g,'').replace(/\t$/g,'');
txt=txt.replace(/\n\t/g,'\n').replace(/\t\n/g,'\n');
break;
case 'commasToTable':
txt=txt.replace(/,/g,'|').replace(/^|$/g,'|');
txt=txt.replace(/\n/g,'|\n|').replace(/^\|$/g,'');
break;
case 'tableToCommas':
txt=txt.replace(/,/g,' ').replace(/\|/g,',');
txt=txt.replace(/^,/g,'').replace(/,$/g,'');
txt=txt.replace(/\n,/g,'\n').replace(/,\n/g,'\n');
break;
case 'tabsToCommas':
txt=txt.replace(/\t/g,',');
break;
case 'commasToTabs':
txt=txt.replace(/,/g,'\t');
break;
}
replaceSelection(e,txt);
Popup.remove(); return false;
};
s.options[0]=new Option('select a converter...','');
if (txt.indexOf(',')!=-1) {
s.options[s.length]=new Option('commas -> table','commasToTable');
s.options[s.length]=new Option('commas -> tabs','commasToTabs');
}
if (txt.indexOf('\t')!=-1) {
s.options[s.length]=new Option('tabs -> table','tabsToTable');
s.options[s.length]=new Option('tabs -> commas','tabsToCommas');
}
if (txt.indexOf('|')!=-1) {
s.options[s.length]=new Option('table -> tabs','tableToTabs');
s.options[s.length]=new Option('table -> commas','tableToCommas');
}
if (s.options.length==1) {
s.options[0]=new Option('select some text first...','');
if (txt.length) alert('There are no converters that can be applied, because the selected text does not contain any tabs, commas, or TiddlyWiki table syntax.');
}
Popup.show(p,false);
event.cancelBubble=true;if(event.stopPropagation)event.stopPropagation();return false;"
>convert</a></html>
/%
|Name|QuickEdit_convert|
|Source|http://www.TiddlyTools.com/#QuickEdit_convert|
|Version|2.2.0|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.2|
|Type|script|
|Requires|QuickEditPlugin|
|Overrides||
|Description|toolbar button for converting tab/comma-separated data to/from table format|
Usage:
QuickEditToolbar: <<tiddler QuickEdit_convert>>
OR
EditTemplate: <span class='toolbar' macro='tiddler QuickEdit_convert'></span>
%/<html><hide linebreaks><a href="javascript:;" class="tiddlyLink"
title="Konverter mellem tab-sparerede, komma-separerede data og wiki tabel formater"
onclick="var e=config.quickEdit.getField(this);
if (e) e.focus(); var txt=config.quickEdit.getSelection(e);
var p=Popup.create(this); if (!p) return false; p.className+=' sticky smallform';
var s=createTiddlyElement(p,'select'); s.button=this;
s.onchange=function(){
if (!this.value) return false;
var e=config.quickEdit.getField(this.button); if (!e) return false;
e.focus(); var txt=config.quickEdit.getSelection(e);
switch(this.value) {
case 'tabsToTable':
txt=txt.replace(/\t/g,'|').replace(/^|$/g,'|');
txt=txt.replace(/\n/g,'|\n|').replace(/^\|$/g,'');
break;
case 'tableToTabs':
txt=txt.replace(/\t/g,' ').replace(/\|/g,'\t');
txt=txt.replace(/^\t/g,'').replace(/\t$/g,'');
txt=txt.replace(/\n\t/g,'\n').replace(/\t\n/g,'\n');
break;
case 'commasToTable':
txt=txt.replace(/,/g,'|').replace(/^|$/g,'|');
txt=txt.replace(/\n/g,'|\n|').replace(/^\|$/g,'');
break;
case 'tableToCommas':
txt=txt.replace(/,/g,' ').replace(/\|/g,',');
txt=txt.replace(/^,/g,'').replace(/,$/g,'');
txt=txt.replace(/\n,/g,'\n').replace(/,\n/g,'\n');
break;
case 'tabsToCommas':
txt=txt.replace(/\t/g,',');
break;
case 'commasToTabs':
txt=txt.replace(/,/g,'\t');
break;
}
replaceSelection(e,txt);
Popup.remove(); return false;
};
s.options[0]=new Option('vælg en konverter...','');
if (txt.indexOf(',')!=-1) {
s.options[s.length]=new Option('commas -> table','kommaer til tabel');
s.options[s.length]=new Option('commas -> tabs','kommaer til faneblade');
}
if (txt.indexOf('\t')!=-1) {
s.options[s.length]=new Option('tabs -> table','faneblade til tabel');
s.options[s.length]=new Option('tabs -> commas','fnaeblade til kommaer');
}
if (txt.indexOf('|')!=-1) {
s.options[s.length]=new Option('table -> tabs','tabel til faneblade');
s.options[s.length]=new Option('table -> commas','tabel til kommaer');
}
if (s.options.length==1) {
s.options[0]=new Option('vælgt noget tekst først...','');
if (txt.length) alert('Ingen konvertere kan anvendes, fordi den valgte tekst ikke indeholder nogle faneblade, kommaer, eller TiddlyWiki tabel syntaks.');
}
Popup.show(p,false);
event.cancelBubble=true;if(event.stopPropagation)event.stopPropagation();return false;"
>Konvertér</a></html>
/%
|Name|QuickEdit_font|
|Source|http://www.TiddlyTools.com/#QuickEdit_font|
|Version|2.2.0|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.2|
|Type|script|
|Requires|QuickEditPlugin|
|Overrides||
|Description|definition for toolbar button that set font-family CSS attribute|
Usage:
QuickEditToolbar: <<tiddler QuickEdit_font>>
OR
EditTemplate: <span class='toolbar' macro='tiddler QuickEdit_macro'></span>
%/<html><hide linebreaks><a href="javascript:;" class="tiddlyLink"
title="set font-family CSS attribute - @@font-family:facename;...@@"
onclick="var p=Popup.create(this); if (!p) return false; p.className+=' sticky smallform';
var s=createTiddlyElement(p,'select'); s.button=this;
s.options[0]=new Option('select a font family...','');
s.onchange=function(){
if (this.value=='_edit')
story.displayTiddler(story.findContainingTiddler(this.button),'QuickEdit_fontList',DEFAULT_EDIT_TEMPLATE);
else
config.quickEdit.wrapSelection(this.button,'@@font-family:\x22'+this.value+'\x22;','@@');
Popup.remove(); return false;
};
var fonts=store.getTiddlerText('QuickEdit_fontList','').split('\n');
for (var i=0; i<fonts.length; i++) {
if (!fonts[i].length) continue;
s.options[s.length]=new Option(fonts[i],fonts[i]);
s.options[s.length-1].style.fontFamily=fonts[i];
}
s.options[s.length]=new Option('[Edit font list...]','_edit');
s.options[s.length-1].title='enter fonts, one per line...';
Popup.show(p,false);
event.cancelBubble=true;if(event.stopPropagation)event.stopPropagation();return false;"
>font</a></html>
Arial,helvetica,sans-serif
Times New Roman,times,serif
Verdana,sans-serif
Courier,monospaced
/%
|Name|QuickEdit_format|
|Source|http://www.TiddlyTools.com/#QuickEdit_format|
|Version|2.2.0|
|Author|Eric Shulman - ELS Design Studios (*This version has been slightly modified by Dave Gifford*)|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.2|
|Type|script|
|Requires|QuickEditPlugin|
|Overrides||
|Description|definition for toolbar button for text formatting|
Usage:
QuickEditToolbar: <<tiddler QuickEdit_format>>
OR
EditTemplate: <span class='toolbar' macro='tiddler QuickEdit_format'></span>
%/<html><hide linebreaks><a href="javascript:;" class="tiddlyLink" title="''bold''" accesskey="B"
onclick="config.quickEdit.wrapSelection(this,'\x27\x27','\x27\x27'); return false;"
> B </a></html>/%
%/<html><hide linebreaks><a href="javascript:;" class="tiddlyLink" title="//italics//" accesskey="I"
onclick="config.quickEdit.wrapSelection(this,'//','//'); return false;"
> I </a></html>/%
%/<html><hide linebreaks><a href="javascript:;" class="tiddlyLink" title="__underline__" accesskey="U"
onclick="config.quickEdit.wrapSelection(this,'__','__'); return false;"
> U </a></html>/%
%/ /% SPACER
%/<html><hide linebreaks><a href="javascript:;" class="tiddlyLink"
title="format text"
onclick="var p=Popup.create(this); if (!p) return false; p.className+=' sticky smallform';
var s=createTiddlyElement(p,'select'); s.button=this;
s.options[0]=new Option('select text format...','');
s.onchange=function(){
var parts=this.value.split(',');
config.quickEdit.wrapSelection(this.button,parts[0],parts[1]);
Popup.remove(); return false;
};
s.options[s.length]=new Option('superscript','^^,^^');
s.options[s.length-1].title='^^superscript^^';
s.options[s.length]=new Option('subscript','~~,~~');
s.options[s.length-1].title='~~subcript~~';
s.options[s.length]=new Option('blockquote','\n\<\<\<\n,\n\<\<\<\n');
s.options[s.length-1].title='indented blockquote - \<\<\<';
s.options[s.length]=new Option('monospaced','{{{,}}}');
s.options[s.length-1].title='inline monospaced text - {{{...}}}';
s.options[s.length]=new Option('pre','\n{{{\n,\n}}}\n');
s.options[s.length-1].title='multi-line monospaced text box - {{{...}}}';
s.options[s.length]=new Option('heading 1','\n!,\n');
s.options[s.length-1].title='H1 heading - !';
s.options[s.length]=new Option('heading 2','\n!!,\n');
s.options[s.length-1].title='H2 heading - !';
s.options[s.length]=new Option('heading 3','\n!!!,\n');
s.options[s.length-1].title='H3 heading - !';
s.options[s.length]=new Option('heading 4','\n!!!!,\n');
s.options[s.length-1].title='H4 heading - !';
s.options[s.length]=new Option('heading 5','\n!!!!!,\n');
s.options[s.length-1].title='H5 heading - !';
s.options[s.length]=new Option('comment','/%,%/');
s.options[s.length-1].title='comment (hidden content) - /%...%/';
s.options[s.length]=new Option('HTML','<html>,<\x2fhtml>');
s.options[s.length-1].title='HTML syntax - <html>...<\x2fhtml>';
Popup.show(p,false);
event.cancelBubble=true;if(event.stopPropagation)event.stopPropagation();return false;"
>format</a></html>
/%
|Name|QuickEdit_image|
|Source|http://www.TiddlyTools.com/#QuickEdit_image|
|Version|2.2.0|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.2|
|Type|script|
|Requires|QuickEditPlugin|
|Overrides||
|Description|definition for toolbar buttons that insert embedded image references|
Usage:
QuickEditToolbar: <<tiddler QuickEdit_image>>
OR
EditTemplate: <span class='toolbar' macro='tiddler QuickEdit_image'></span>
**** INSERT IMAGE ****
%/<html><hide linebreaks><a href="javascript:;" class="tiddlyLink"
title="embed an image (jpg/gif/png) - [img[tooltip|URL]] or [img[tooltip|path/to/file.ext]]"
onclick="var fn=config.quickEdit.promptForFilename('Enter/select an image file',getLocalPath(document.location.href),'');
if (!fn) return false; /* cancelled by user */
var tip=prompt('Enter a tooltip for this image',''); if (!tip) tip=''; else tip+='|';
return config.quickEdit.setSelection(this,'[img['+tip+fn+']]');"
>image</a></html>
/%
|Name|QuickEdit_link|
|Source|http://www.TiddlyTools.com/#QuickEdit_link|
|Version|2.2.1|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.2|
|Type|script|
|Requires|QuickEditPlugin|
|Overrides||
|Description|toolbar button that inserts a ~PrettyTiddlyLink to a tiddler or external file|
Usage:
QuickEditToolbar: <<tiddler QuickEdit_link>>
OR
EditTemplate: <span class='toolbar' macro='tiddler QuickEdit_link'></span>
**** INSERT LINK ****
%/<html><hide linebreaks><a href="javascript:;" class="tiddlyLink"
title="add a 'PrettyLink' to another tiddler - [[link text|TiddlerName]]"
onclick="var p=Popup.create(this); if (!p) return false; p.className+=' sticky smallform';
var s=createTiddlyElement(p,'select'); s.button=this;
s.options[0]=new Option('select a tiddler or file...','');
s.onchange=function(){
var title=this.value; var txt=title;
if (title=='_file') {
title=config.quickEdit.promptForFilename('Select a file',
getLocalPath(document.location.href),'');
if (!title) { this.selectedIndex=0; this.focus(); return false; }
var txt=title.substr(title.lastIndexOf('/')+1);
}
var txt=prompt('Enter the text to display for this link',txt);
if (!txt) { this.selectedIndex=0; this.focus(); return false; }
config.quickEdit.setSelection(this.button,'[['+txt+'|'+title+']]');
Popup.remove(); return false;
};
s.options[s.length]=new Option('[browse for file...]','_file');
var tids=store.getTiddlers('title');
for (var t=0; t<tids.length; t++) {
s.options[s.length]=new Option(tids[t].title,tids[t].title);
s.options[s.length-1].title=tids[t].getSubtitle();
}
var s=createTiddlyElement(p,'select');
s.options[0]=new Option('match tag...','');
s.onchange=function(){
var tag=this.value;
var tids=tag.length?store.getTaggedTiddlers(tag,'title'):store.getTiddlers('title');
var list=this.previousSibling;
while (list.length) list.options[0]=null;
var prompt='select a tiddler or file...';
if (tag.length) prompt='select a tagged tiddler ['+tids.length+' matches]...';
list.options[0]=new Option(prompt,'');
if (!tag.length) list.options[list.length]=new Option('[browse for file...]','_file');
for (var t=0; t<tids.length; t++) {
list.options[list.length]=new Option(tids[t].title,tids[t].title);
list.options[list.length-1].title=tids[t].getSubtitle();
}
};
var tags=store.getTags();
for (var t=0; t<tags.length; t++) s.options[s.length]=new Option(tags[t][0],tags[t][0]);
Popup.show(p,false);
event.cancelBubble=true;if(event.stopPropagation)event.stopPropagation();return false;"
>link</a></html>
/***
|Name:|QuickOpenTagPlugin|
|Description:|Changes tag links to make it easier to open tags as tiddlers|
|Version:|3.0.1 ($Rev: 3861 $)|
|Date:|$Date: 2008-03-08 10:53:09 +1000 (Sat, 08 Mar 2008) $|
|Source:|http://mptw.tiddlyspot.com/#QuickOpenTagPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
***/
//{{{
config.quickOpenTag = {
dropdownChar: (document.all ? "\u25bc" : "\u25be"), // the little one doesn't work in IE?
createTagButton: function(place,tag,excludeTiddler) {
// little hack so we can do this: <<tag PrettyTagName|RealTagName>>
var splitTag = tag.split("|");
var pretty = tag;
if (splitTag.length == 2) {
tag = splitTag[1];
pretty = splitTag[0];
}
var sp = createTiddlyElement(place,"span",null,"quickopentag");
createTiddlyText(createTiddlyLink(sp,tag,false),pretty);
var theTag = createTiddlyButton(sp,config.quickOpenTag.dropdownChar,
config.views.wikified.tag.tooltip.format([tag]),onClickTag);
theTag.setAttribute("tag",tag);
if (excludeTiddler)
theTag.setAttribute("tiddler",excludeTiddler);
return(theTag);
},
miniTagHandler: function(place,macroName,params,wikifier,paramString,tiddler) {
var tagged = store.getTaggedTiddlers(tiddler.title);
if (tagged.length > 0) {
var theTag = createTiddlyButton(place,config.quickOpenTag.dropdownChar,
config.views.wikified.tag.tooltip.format([tiddler.title]),onClickTag);
theTag.setAttribute("tag",tiddler.title);
theTag.className = "miniTag";
}
},
allTagsHandler: function(place,macroName,params) {
var tags = store.getTags(params[0]);
var filter = params[1]; // new feature
var ul = createTiddlyElement(place,"ul");
if(tags.length == 0)
createTiddlyElement(ul,"li",null,"listTitle",this.noTags);
for(var t=0; t<tags.length; t++) {
var title = tags[t][0];
if (!filter || (title.match(new RegExp('^'+filter)))) {
var info = getTiddlyLinkInfo(title);
var theListItem =createTiddlyElement(ul,"li");
var theLink = createTiddlyLink(theListItem,tags[t][0],true);
var theCount = " (" + tags[t][1] + ")";
theLink.appendChild(document.createTextNode(theCount));
var theDropDownBtn = createTiddlyButton(theListItem," " +
config.quickOpenTag.dropdownChar,this.tooltip.format([tags[t][0]]),onClickTag);
theDropDownBtn.setAttribute("tag",tags[t][0]);
}
}
},
// todo fix these up a bit
styles: [
"/*{{{*/",
"/* created by QuickOpenTagPlugin */",
".tagglyTagged .quickopentag, .tagged .quickopentag ",
" { margin-right:1.2em; border:1px solid #eee; padding:2px; padding-right:0px; padding-left:1px; }",
".quickopentag .tiddlyLink { padding:2px; padding-left:3px; }",
".quickopentag a.button { padding:1px; padding-left:2px; padding-right:2px;}",
"/* extra specificity to make it work right */",
"#displayArea .viewer .quickopentag a.button, ",
"#displayArea .viewer .quickopentag a.tiddyLink, ",
"#mainMenu .quickopentag a.tiddyLink, ",
"#mainMenu .quickopentag a.tiddyLink ",
" { border:0px solid black; }",
"#displayArea .viewer .quickopentag a.button, ",
"#mainMenu .quickopentag a.button ",
" { margin-left:0px; padding-left:2px; }",
"#displayArea .viewer .quickopentag a.tiddlyLink, ",
"#mainMenu .quickopentag a.tiddlyLink ",
" { margin-right:0px; padding-right:0px; padding-left:0px; margin-left:0px; }",
"a.miniTag {font-size:150%;} ",
"#mainMenu .quickopentag a.button ",
" /* looks better in right justified main menus */",
" { margin-left:0px; padding-left:2px; margin-right:0px; padding-right:0px; }",
"#topMenu .quickopentag { padding:0px; margin:0px; border:0px; }",
"#topMenu .quickopentag .tiddlyLink { padding-right:1px; margin-right:0px; }",
"#topMenu .quickopentag .button { padding-left:1px; margin-left:0px; border:0px; }",
"/*}}}*/",
""].join("\n"),
init: function() {
// we fully replace these builtins. can't hijack them easily
window.createTagButton = this.createTagButton;
config.macros.allTags.handler = this.allTagsHandler;
config.macros.miniTag = { handler: this.miniTagHandler };
config.shadowTiddlers["QuickOpenTagStyles"] = this.styles;
store.addNotification("QuickOpenTagStyles",refreshStyles);
}
}
config.quickOpenTag.init();
//}}}
/***
|Name|QuoteOfTheDayPlugin|
|Source|http://www.TiddlyTools.com/#QuoteOfTheDayPlugin|
|Documentation|http://www.TiddlyTools.com/#QuoteOfTheDayPluginInfo|
|Version|1.4.1|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides||
|Description|Display a randomly selected "quote of the day" from a list defined in a separate tiddler|
!!!!!Documentation
>see [[QuoteOfTheDayPluginInfo]]
!!!!!Revisions
<<<
2008.03.21 [1.4.1] in showNextItem(), corrected handling for random selection so that //initial// index value will randomized correctly instead of always showing first item, even when randomizing. Thanks to Riccardo Gherardi for finding this.
| Please see [[QuoteOfTheDayPluginInfo]] for previous revision details |
2005.10.21 [1.0.0] Initial Release. Based on a suggestion by M.Russula
<<<
!!!!!Code
***/
//{{{
version.extensions.QOTD = {major: 1, minor: 4, revision: 1, date: new Date(2008,3,21)};
config.macros.QOTD = {
clickTooltip: "click to view another item",
timerTooltip: "auto-timer stopped... 'mouseout' to restart timer",
timerClickTooltip: "auto-timer stopped... click to view another item, or 'mouseout' to restart timer",
handler:
function(place,macroName,params) {
var tid=params.shift(); // source tiddler containing HR-separated quotes
var p=params.shift();
var click=true; // allow click for next item
var inline=false; // wrap in slider for animation effect
var random=true; // pick an item at random (default for "quote of the day" usage)
var folder=false; // use local filesystem folder list
var cookie=""; // default to no cookie
var next=0; // default to first item (or random item)
while (p) {
if (p.toLowerCase()=="noclick") var click=false;
if (p.toLowerCase()=="inline") var inline=true;
if (p.toLowerCase()=="norandom") var random=false;
if (p.toLowerCase().substr(0,7)=="cookie:") var cookie=p.substr(8);
if (!isNaN(p)) var delay=p;
p=params.shift();
}
if ((click||delay) && !inline) {
var panel = createTiddlyElement(null,"div",null,"sliderPanel");
panel.style.display="none";
place.appendChild(panel);
var here=createTiddlyElement(panel,click?"a":"span",null,"QOTD");
}
else
var here=createTiddlyElement(place,click?"a":"span",null,"QOTD");
here.id=(new Date()).convertToYYYYMMDDHHMMSSMMM()+Math.random().toString(); // unique ID
// get items from tiddler or file list
var list=store.getTiddlerText(tid,"");
if (!list||!list.length) { // not a tiddler... maybe an image directory?
var list=this.getImageFileList(tid);
if (!list.length) { // maybe relative path... fixup and try again
var h=document.location.href;
var p=getLocalPath(decodeURIComponent(h.substr(0,h.lastIndexOf("/")+1)));
var list=this.getImageFileList(p+tid);
}
}
if (!list||!list.length) return false; // no contents... nothing to display!
here.setAttribute("list",list);
if (delay) here.setAttribute("delay",delay);
here.setAttribute("random",random);
here.setAttribute("cookie",cookie);
if (click) {
here.title=this.clickTooltip
if (!inline) here.style.display="block";
here.setAttribute("href","javascript:;");
here.onclick=function(event)
{ config.macros.QOTD.showNextItem(this); }
}
if (config.options["txtQOTD_"+cookie]!=undefined) next=parseInt(config.options["txtQOTD_"+cookie]);
here.setAttribute("nextItem",next);
config.macros.QOTD.showNextItem(here);
if (delay) {
here.title=click?this.timerClickTooltip:this.timerTooltip
here.onmouseover=function(event)
{ clearTimeout(this.ticker); };
here.onmouseout=function(event)
{ this.ticker=setTimeout("config.macros.QOTD.tick('"+this.id+"')",this.getAttribute("delay")); };
here.ticker=setTimeout("config.macros.QOTD.tick('"+here.id+"')",delay);
}
},
tick: function(id) {
var here=document.getElementById(id); if (!here) return;
config.macros.QOTD.showNextItem(here);
here.ticker=setTimeout("config.macros.QOTD.tick('"+id+"')",here.getAttribute("delay"));
},
showNextItem:
function (here) {
// hide containing slider panel (if any)
var p=here.parentNode;
if (p.className=="sliderPanel") p.style.display = "none"
// get a new quote
var index=here.getAttribute("nextItem");
var items=here.getAttribute("list").split("\n----\n");
if (index<0||index>=items.length) index=0;
if (here.getAttribute("random")=="true") index=Math.floor(Math.random()*items.length);
var txt=items[index];
// re-render quote display element, and advance index counter
removeChildren(here); wikify(txt,here);
index++; here.setAttribute("nextItem",index);
var cookie=here.getAttribute("cookie");
if (cookie.length) {
config.options["txtQOTD_"+cookie]=index.toString();
saveOptionCookie("txtQOTD_"+cookie);
}
// redisplay slider panel (if any)
if (p.className=="sliderPanel") {
if(anim && config.options.chkAnimate)
anim.startAnimating(new Slider(p,true,false,"none"));
else p.style.display="block";
}
},
getImageFileList: function(cwd) { // returns HR-separated list of image files
function isImage(fn) {
var ext=fn.substr(fn.length-3,3).toLowerCase();
return ext=="jpg"||ext=="gif"||ext=="png";
}
var files=[];
if (config.browser.isIE) {
cwd=cwd.replace(/\//g,"\\");
// IE uses ActiveX to read filesystem info
var fso = new ActiveXObject("Scripting.FileSystemObject");
if(!fso.FolderExists(cwd)) return [];
var dir=fso.GetFolder(cwd);
for(var f=new Enumerator(dir.Files); !f.atEnd(); f.moveNext())
if (isImage(f.item().path)) files.push("[img[%0]]".format(["file:///"+f.item().path.replace(/\\/g,"/")]));
} else {
// FireFox (mozilla) uses "components" to read filesystem info
// get security access
if(!window.Components) return;
try { netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"); }
catch(e) { alert(e.description?e.description:e.toString()); return []; }
// open/validate directory
var file=Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
try { file.initWithPath(cwd); } catch(e) { return []; }
if (!file.exists() || !file.isDirectory()) { return []; }
var folder=file.directoryEntries;
while (folder.hasMoreElements()) {
var f=folder.getNext().QueryInterface(Components.interfaces.nsILocalFile);
if (f instanceof Components.interfaces.nsILocalFile)
if (isImage(f.path)) files.push("[img[%0]]".format(["file:///"+f.path.replace(/\\/g,"/")]));
}
}
return files.join("\n----\n");
}
}
//}}}
/***
|Name|QuoteOfTheDayPluginInfo|
|Source|http://www.TiddlyTools.com/#QuoteOfTheDayPlugin|
|Documentation|http://www.TiddlyTools.com/#QuoteOfTheDayPluginInfo|
|Version|1.4.1|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|documentation|
|Requires||
|Overrides||
|Description|Documentation for QuoteOfTheDayPlugin|
!!!!!Usage
<<<
{{{<<QOTD tiddlername norandom noclick inline cookie:cookiename delay>>}}}
* ''tiddlername'' is the name of a tiddler containing your list of quotes, each separated by a horizontal line (use {{{----}}} on a line by itself).
* Each time the macro is rendered it will display a different quotation, selected at random from the specified tiddler. To display quotes in the sequence in which they occur in the tiddler, you can use the ''norandom'' keyword.
* When using ''norandom'', you can also specify an optional ''cookie:cookiename'' parameter which will be used to track the //index// of the next quote to be displayed, so that each subsequent rendering of the macro can continue the sequence of quotes as entered in the source tiddler, even in between browser sessions.
* By default, clicking on the rendered quote will select and display another random quote. Use the optional ''noclick'' keyword parameter to disable this "onClick" handling.
* By default, a clickable or timed quote will be displayed insider a 'slider' panel, so that standard TW animation effects will be used. However, slider panels are always rendered as "block-level" content, forcing a newline both before and after the slider panel. Use the ''inline'' keyword parameter to bypass this side-effect and display a clickable/timed quote without automatically adding surrounding linebreaks.
* The quote can also be refreshed automatically, by specifying a numeric ''delay'' parameter (in milliseconds) which enables a countdown timer. When the mouse is over the quote, the timer is automatically stopped. Moving the mouse away from the quote content restarts the timer.
<<<
!!!!!Example
<<<
{{{<<QOTD ObligueStrategies 10000>>}}}
<<QOTD ObligueStrategies 10000>>
<<<
!!!!!Revisions
<<<
2008.03.21 [1.4.1] in showNextItem(), corrected handling for random selection so that //initial// index value will randomized correctly instead of always showing first item, even when randomizing. Thanks to Riccardo Gherardi for finding this.
2008.01.16 [1.4.0] support using a local image file directory instead of tiddler name for getting list of items. If specified tiddler does not exist in the document, macro attempts to use tiddlername as a local directory name (using either absolute or relative path) and get list of all JPG/GIF/PNG files.
2007.08.06 [1.3.0] added support for "cookie:cookiename" param
2007.05.03 [1.2.1] corrected logic for handling "inline" display (i.e., bypass slider and use of 'block' for quote elements)
2007.05.03 [1.2.0] added sliderPanel wrapper around quote to take advantage of core-supported slider animation. Use "noslider"/"inline" keyword param to suppress use of slider. Also added tooltips for click, delay, and click+delay modes.
2007.04.16 [1.1.2] code cleanup
2007.04.16 [1.1.1] onClick handling now supports sequential as well as random order
2007.04.14 [1.1.0] added onClick handling for selecting and display a new random quote
2005.10.21 [1.0.0] Initial Release. Based on a suggestion by M.Russula
<<<
<html><div align="left"><iframe src="http://spreadsheets.google.com/ccc?key=pqdy--SaXp5wwjIoujXgGbQ" frameborder="0" width="100%" height="600"></iframe></div></html>
<<siteMap [[Sang]] . sliders>>
<<flickrGreetingCookie>>
<<slideShow tag:Sangtime noClicks>>
Lav en sangtime:
<<newJournal label:"Ny FredagsSangtime" tag:"Sang" text:"!HUSK at ændre titelen til den aktuelle dato!!!
!!Fredagssangtimen
|sortable|k
nr,Titel,Kilde,nr/s,Pianist,ny,h
" >>
<<newJournal label:"Ny Sang/fortælling" tag:"Sang" text:"!HUSK at ændre titelen til den aktuelle dato!!X
!!Sang/fortælling
|sortable|k
nr,Titel,Kilde,nr/s,Pianist,ny,h
" >>
Læs SangtimeInstruktioner eller [[Den helt nemme]]!!
Kørt fast? - [[klik her|Tilfældige sange]] eller på en af disse <<newJournal label:"FredagsHjælp" text:{{"<<formTiddler FredagsTemplate\>\>"}} tag:"Sang">> <<newJournal label:"OnsdagsHjælp" text:{{"<<formTiddler OnsdagsTemplate\>\>"}} tag:"Sang">> eller <<tag Hjælp>>
Hold et chatmøde med en kollega via [[KlikSelv+Chat]] eller giv en uforbeholden "speak-kommentar" - eller indskrevet evt. tegnet kommentar til oversigten [[her|Voicethread - med video eller audiokommentarer]].
Du kan ovenikøbet redigere listen direkte på nettet i et online regneark [[her|Oversigt - sangbogen - sangmappen]].
Mvh MM
//Bemærk "slide »"-knappen ud for hver tiddler der er tagget "Sang" nederst på siden. (Alle indtastninger der tagges "Sang" havner automatisk på listen!!)
Klik på slide » og se indholdet af hver tiddler.//
|sortable|k
|Titel|nr|h
|Aftensang|19|
|Altid frejdig, når du går |23|
|Anemonesangen |153|
|April, april (A) |158|
|At kende sig selv |205|
|At lære er at ville (A) |108|
|At samles, skilles ad |264|
|Barndommens land|114|
|Bedstefar tag dine tænder på (A) |158|
|Bladet i bogen sig vender|126|
|Bliv! Råbte Herren i de tomme sale|148|
|Blomstre som en rosengård|35|
|Blæsten går frisk over Limfjordens vande|83|
|Bornholm, Bornholm, Bornholm |88|
|Cafe Måneskin|257|
|Crying in the rain |289|
|Dagen før|233|
|Dagen går med raske fjed |22|
|Danmark frit (A)|130|
|Danmark, nu blunder den lyse nat|160|
|Danmarks-kanon|235|
|De dybeste lag |44|
|De evige tre (A)|195|
|De levendes land (A) |90|
|De nære ting |209|
|De ord, jeg synger |115|
|De små børns smil |109|
|Decembernat |47|
|Decembersang|48|
|Dejlig er den himmel blå |50|
|Dejlig er jorden|52|
|Dejligst af alle glæder (A) |198|
|Den blå anemone |146|
|Den danske sang |84|
|Den grønne søde vår |134|
|Den himmelblå|66|
|Den kedsom vinter gik sin gang |135|
|Den lille lysegrønne sang |157|
|Den mørke nat forgangen er |5|
|Den røde tråd|258|
|Den signede dag med fryd vi ser|1|
|Den spillemand snapped fiolen fra væg|211|
|Der bor en kraft i sindet |274|
|Der dukker af disen (A) |85|
|Der er et yndigt land|67|
|Der er noget galt i Danmark |234|
|Der er noget i luften|31|
|Der går i nat et glædesbud|42|
|Der stode tre skalke |187|
|Der truer os i tiden (A) |106|
|Derfor kan vort øje glædes |104|
|Desertøren|229|
|Det bedste jeg ved |246|
|Det drømmende vand|232|
|Det er angstens sved, han sveder |45|
|Det er forår, alting klippes ned |156|
|Det er hvidt herude |180|
|Det er i dag et vejr |136|
|Det er lærkernes tid |137|
|Det er os, det er os |131|
|Det er så køhnt, det er så dejle |139|
|Det er så sandt|46|
|Det haver så nyligen regnet |127|
|Det kimer nu til julefest |53|
|Det lysner over agres felt|172|
|Det løvfald, som vi kom så alt for nær |174|
|Det' sørme det' sandt december |48|
|Det var en lørdag aften |191|
|Det øjeblik vi lever i |116|
|DGI blues|268|
|Du danske sommer|161|
|Du gamla, du fria, du fjållhoga Nord |69|
|Du ka' gør', hva' du vil |263|
|Du kom med alt det der var dig |194|
|Du skal plante et træ|119|
|Du, som har tændt millioner af stjerner |26|
|Duerne flyver|276|
|Dybt hælder året i sin gang |41|
|Efterårskanon |244|
|En enkel sang om frihed |227|
|En kæde af evige bånd |267|
|En lærke letted (A) |130|
|En rose så jeg skyde |54|
|En stjerne fødes (L'94)|265|
|En sømand har sin enegang|216|
|En yndig og frydefuld sommertid |193|
|Engang var frihed ordet (A) |110|
|Er lyset for de lærde blot (A) |91|
|Et barn er født i Betlehem |55|
|Et jævnt og muntert virksomt liv |93|
|Fire påskeliljer|145|
|Folkeligt skal alt nu være (A) |94|
|For en fremmed barskt og fattigt |81|
|For længe sid'n, i Betlehem|65|
|Forunderligt at sige|56|
|Forår|155|
|Forår ved Mariager fjord (A) |197|
|Forårsdag|147|
|Forårsskibet|148|
|Fred hviler over land og by (A) |21|
|Frihed er det bedste guld |107|
|Gi' dem himlen tilbage |111|
|Gi' mig en dag|199|
|Giv mig, Gud, en salmetunge |33|
|Glade jul, dejlige jul|58|
|Glæden, sorgen og lykken (A) |198|
|Go jawten, go jawten |212|
|Go' nu nat|27|
|Godmorgen, lille land |82|
|Grundlovssangen |86|
|Græshoppen og valmuen|207|
|Gå stille og tyst gennem verden |105|
|Han kommer med sommer |162|
|Happy Christmas (War is over) |287|
|Har du visor, min vän |200|
|Hele verden er vores |226|
|Hey Jude|293|
|Hil dig, frelser og forsoner |36|
|Hilsen til forårssolen |156|
|Himmel og hav|245|
|Hist, hvor vejen slår en bugt |217|
|Holger Danskes mærke |123|
|Hvad er det, min Marie! (A)|203|
|Hvad solskin er for det sorte muld (A) |92|
|Hvem sidder der bag skærmen |220|
|Hvergang en sommer |167|
|Hvide skyer falder ned |245|
|Hvor smiler fager den danske kyst |76|
|Hvorfor går min elskede |208|
|Hymnen til Afrika|112|
|Højt fra træets grønne top|60|
|I al sin glans nu stråler solen |39|
|I alle de riger og lande |123|
|I dag er landet vort |87|
|I Danmark er jeg født (A) |78|
|I det spæde morgengry |9|
|I hjerterne begynder |272|
|I skovens dybe, stille ro (A) |20|
|I sne står urt og busk i skjul |182|
|I østen stiger solen op |3|
|Imagine|292|
|Imellem Esbjerg og Fanø|262|
|Ind til dig igen|206|
|Ind under jul, hvor er det trist |49|
|Ja, vi elsker dette landet|70|
|Jeg bærer med smil min byrde |97|
|Jeg ejer både mark og eng |225|
|Jeg elsker de grønne lunde |75|
|Jeg elsker den brogede verden |98|
|Jeg fandt en sang på vejen |247|
|Jeg går i solen og traller |236|
|Jeg har fanget mig en myg |237|
|Jeg kender et land (A) |90|
|Jeg plukker fløjlsgræs |149|
|Jeg rutter med glædens |99|
|Jeg ser de bøgelyse øer |74|
|Jeg ved en lærkerede|151|
|Jeg ved, hvor der findes en have så skøn |73|
|Jeg vil male dagen blå |228|
|Jens vejmand|220|
|Jo, jo gøgleri er en nobel kunst |100|
|Jordens åndedrag |117|
|Julen har bragt velsignet bud |57|
|Juletræet med sin pynt |61|
|Juni|168|
|Jyden han æ stærk å sej |210|
|Jylland mellem tvende have |72|
|Kald det kærlighed |201|
|Kalendervender Tage |248|
|Kirsten og vejen fra Gurre |174|
|Kom, fred, og fyld den hele dag |231|
|Kom, glade overgivenhed |218|
|Kom, maj, du søde milde |133|
|Kom og dans|251|
|Kom, tro, og kom, glæde |64|
|Kommer hid, l piger små|124|
|Kong Kristjan stod ved højen mast |283|
|Kringsatt av fjender |101|
|Kumbaya|285|
|Kærlighedsrosen |193|
|Lad det leve|263|
|Leaving on a Jet-plane |295|
|Lermennesket |113|
|Let it be|291|
|Let it grow |296|
|Lille Messias|63|
|Livet er en morgengave (A) |118|
|Livstræet|120|
|Love is all around |297|
|Lovsynger Herren |34|
|Luk døren op og se |150|
|Lysfyldt morgen|125|
|Lær mig, nattens stjerne |17|
|Løft dit hoved, du raske gut |89|
|Mads Doss|221|
|Marken er mejet |169|
|Mary boy child|288|
|Med kåde smil den lyse sol |80|
|Med mor til fodbold |250|
|Menneskelivet er underligt |96|
|Mi nååbo, Pe Sme |219|
|Midsommervisen (A) |164|
|Morgengry|10|
|Morgenstund har guld i mund (A) |6|
|Musens sang|213|
|Mørk er november |178|
|Mørkets sang|273|
|Nanna|261|
|Natten er blid|18|
|Natten er så stille |16|
|Nattergalen, kender du den |154|
|Nattergalen på sin gren |259|
|Nocturne|24|
|Noget om helte (A)|118|
|Noget om skærsommernætter |163|
|Nu er dagen fuld af sang |140|
|Nu er det længe siden |173|
|Nu er jord og himmel stille (A)|25|
|Nu falmer skoven trindt om land (A) |175|
|Nu har vi altså jul igen |62|
|Nu hviler mark og enge |15|
|Nu lyser løv i lunde |141|
|Nu nejer blomsterne |163|
|Nu rinder solen op af østerlide (A) |2|
|Nu skal det åbenbares (A) |95|
|Nu skal vi ha' gilde |241|
|Nu tændes tusind julelys |51|
|Når egene knoppes |166|
|Når vinteren rinder i grøft og i grav |142|
|O come, all ye faithful |284|
|O, Færø, så fager |71|
|Og det blev vår|152|
|Ole sad på en knold og sang |222|
|Om lidt|271|
|One hand, One heart|299|
|Op, al den ting, som Gud har gjort |32|
|Opvåvni|144|
|Papirsklip|256|
|Per spelmann |186|
|Påske|150|
|Påskeblomst! Hvad vil du her |38|
|Ramund|188|
|Regnvejrsdag i november |228|
|Romeo|260|
|Roselil og hendes moder|189|
|Ræven er ude med halen så lang |202|
|Røverne fra Kardemommeby |249|
|Sang i det grønne |129|
|Sangen har lysning |102|
|Santa Claus is comin' to town |286|
|Sat her i forvirringstiden|121|
|Se, det summer af sol over engen (A) |159|
|Se, hvilken morgenstund |11|
|Se Norges blomsterdal|223|
|Se, nu stiger solen af havets skød (A) |4|
|Sensommerkanon|242|
|Sensommervise |171|
|Septembers himmel|170|
|Sig månen langsomt hæver |12|
|Sig nærmer tiden |103|
|Skal vi ikke være venner |270|
|Skipper Klements morgensang |132|
|Skoven er så underfuld |177|
|Skuld gammel venskab |224|
|Skyerne gråne|30|
|Skærm jeres huse med grav og planke |132|
|Skønjomfruen går i dansen |190|
|Sneflokke kommer vrimlende |181|
|Snemand Frost og frøken Tø (A) |183|
|Solhvervssang|179|
|Solkanon |243|
|Solsikke|176|
|Som dybest brønd|128|
|Som en rejselysten flåde |77|
|Som forårssolen morgenrød |37|
|Sommerens ø |167|
|Sommersalme |40|
|Soon and very soon |298|
|Sov på min arm|24|
|Spurven sidder stum bag kvist |185|
|Stenen slår smut på det danske vand |275|
|Stilfærdigt farvel|266|
|Stille, hjerte, sol går ned |13|
|Stjernefart|253|
|Stjerner dukker frem |18|
|Storken|162|
|Summer nights (Grease) |306|
|Svantes lykkelige dag |11|
|Svinehyrden |252|
|Swing low|301|
|Sæt grammofonen i stå |214|
|Søren Bramfris lærkesang |215|
|Så længe skuden kan gå |279|
|Så tænder vi et lys i kvæld |28|
|Tag del i det, der er din tid |269|
|Take it easy, boy, boy |304|
|Tears in heaven |302|
|That's what friends are for|309|
|The Rose|305|
|Those were the days|308|
|Til Dem, hr. præsident|229|
|Til himlene rækker din miskundhed, Gi|1 8|
|Til min Marie (A)|203|
|Til ungdommen|101|
|Till havs med solfyllda segel|240|
|To be or not to be|303|
|To gyldne sommerfugle (A)|197|
|Tusind stykker|282|
|Underlige aftenlufte|14|
|Valmuevejen|254|
|Velkommen i den grønne lund|129|
|Velkommen igen, Guds engle små (A;|59|
|Velkommen, lærkelil (A)|143|
|Vem kan segla forutan vind|192|
|Veninde, tag frakken og støvlerne på|47|
|Vennekredsen|238|
|Vennesang|277|
|Veronica|196|
|Vi, der valgte regnen|122|
|Vi elsker vort land (A)|164|
|Vi vil plante et træ|230|
|Vipper springe over klinge|165|
|Visen om de atten svaner|204|
|VLTJ|280|
|Vor sol er blevet kold (A)|179|
|Vort modersmål er dejligt|79|
|Vær lidt varsom|184|
|Vær velkommen, Herrens år (advent|29|
|Vær velkommen, Herrens år (nytår)|43|
|Være vind|278|
|Vågn nu op af dine drømme |239|
|Vågn op og slå på dine strenge|7|
|Våren er i luften|138|
|Vårt land, vårt land, vårt fosterland |68|
|Vårvise|255|
|War is over|287|
|What a wonderful world |300|
|Whiskey in the Jar|307|
|Wonderful tonight|294|
|Yesterday|290|
|Æbler lyser rødt på træernes grene |171|
|Åbent landskab|281|
Aftensang ,(b) , 19
----
Altid frejdig når du går ,(b) , 23
----
Anemonesangen ,(b) , 153
----
April april (A) ,(b) , 158
----
At kende sig selv ,(b) , 205
----
At lære er at ville (A) ,(b) , 108
----
At samles skilles ad ,(b) , 264
----
Barndommens land ,(b) , 114
----
Bedstefar tag dine tænder på (A) ,(b) , 158
----
Bladet i bogen sig vender ,(b) , 126
----
Bliv! Råbte Herren i de tomme sale ,(b) , 148
----
Blomstre som en rosengård ,(b) , 35
----
Blæsten går frisk over Limfjordens vande ,(b) , 83
----
Bornholm Bornholm Bornholm ,(b) , 88
----
Cafe Måneskin ,(b) , 257
----
Crying in the rain ,(b) , 289
----
Dagen før ,(b) , 233
----
Dagen går med raske fjed ,(b) , 22
----
Danmark frit (A) ,(b) , 130
----
Danmark nu blunder den lyse nat ,(b) , 160
----
Danmarks-kanon ,(b) , 235
----
De dybeste lag ,(b) , 44
----
De evige tre (A) ,(b) , 195
----
De levendes land (A) ,(b) , 90
----
De nære ting ,(b) , 209
----
De ord jeg synger ,(b) , 115
----
De små børns smil ,(b) , 109
----
Decembernat ,(b) , 47
----
Decembersang ,(b) , 48
----
Dejlig er den himmel blå ,(b) , 50
----
Dejlig er jorden ,(b) , 52
----
Dejligst af alle glæder (A) ,(b) , 198
----
Den blå anemone ,(b) , 146
----
Den danske sang ,(b) , 84
----
Den grønne søde vår ,(b) , 134
----
Den himmelblå ,(b) , 66
----
Den kedsom vinter gik sin gang ,(b) , 135
----
Den lille lysegrønne sang ,(b) , 157
----
Den mørke nat forgangen er ,(b) , 5
----
Den røde tråd ,(b) , 258
----
Den signede dag med fryd vi ser ,(b) , 1
----
Den spillemand snapped fiolen fra væg ,(b) , 211
----
Der bor en kraft i sindet ,(b) , 274
----
Der dukker af disen (A) ,(b) , 85
----
Der er et yndigt land ,(b) , 67
----
Der er noget galt i Danmark ,(b) , 234
----
Der er noget i luften ,(b) , 31
----
Der går i nat et glædesbud ,(b) , 42
----
Der stode tre skalke ,(b) , 187
----
Der truer os i tiden (A) ,(b) , 106
----
Derfor kan vort øje glædes ,(b) , 104
----
Desertøren ,(b) , 229
----
Det bedste jeg ved ,(b) , 246
----
Det drømmende vand ,(b) , 232
----
Det er angstens sved han sveder ,(b) , 45
----
Det er forår alting klippes ned ,(b) , 156
----
Det er hvidt herude ,(b) , 180
----
Det er i dag et vejr ,(b) , 136
----
Det er lærkernes tid ,(b) , 137
----
Det er os det er os ,(b) , 131
----
Det er så køhnt det er så dejle ,(b) , 139
----
Det er så sandt ,(b) , 46
----
Det haver så nyligen regnet ,(b) , 127
----
Det kimer nu til julefest ,(b) , 53
----
Det lysner over agres felt ,(b) , 172
----
Det løvfald som vi kom så alt for nær ,(b) , 174
----
Det' sørme det' sandt december ,(b) , 48
----
Det var en lørdag aften ,(b) , 191
----
Det øjeblik vi lever i ,(b) , 116
----
DGI blues ,(b) , 268
----
Du danske sommer ,(b) , 161
----
Du gamla du fria du fjållhoga Nord ,(b) , 69
----
Du ka' gør' hva' du vil ,(b) , 263
----
Du kom med alt det der var dig ,(b) , 194
----
Du skal plante et træ ,(b) , 119
----
Du som har tændt millioner af stjerner ,(b) , 26
----
Duerne flyver ,(b) , 276
----
Dybt hælder året i sin gang ,(b) , 41
----
Efterårskanon ,(b) , 244
----
En enkel sang om frihed ,(b) , 227
----
En kæde af evige bånd ,(b) , 267
----
En lærke letted (A) ,(b) , 130
----
En rose så jeg skyde ,(b) , 54
----
En stjerne fødes (L'94) ,(b) , 265
----
En sømand har sin enegang ,(b) , 216
----
En yndig og frydefuld sommertid ,(b) , 193
----
Engang var frihed ordet (A) ,(b) , 110
----
Er lyset for de lærde blot (A) ,(b) , 91
----
Et barn er født i Betlehem ,(b) , 55
----
Et jævnt og muntert virksomt liv ,(b) , 93
----
Fire påskeliljer ,(b) , 145
----
Folkeligt skal alt nu være (A) ,(b) , 94
----
For en fremmed barskt og fattigt ,(b) , 81
----
For længe sid'n i Betlehem ,(b) , 65
----
Forunderligt at sige ,(b) , 56
----
Forår ,(b) , 155
----
Forår ved Mariager fjord (A) ,(b) , 197
----
Forårsdag ,(b) , 147
----
Forårsskibet ,(b) , 148
----
Fred hviler over land og by (A) ,(b) , 21
----
Frihed er det bedste guld ,(b) , 107
----
Gi' dem himlen tilbage ,(b) , 111
----
Gi' mig en dag ,(b) , 199
----
Giv mig Gud en salmetunge ,(b) , 33
----
Glade jul dejlige jul ,(b) , 58
----
Glæden sorgen og lykken (A) ,(b) , 198
----
Go jawten go jawten ,(b) , 212
----
Go' nu nat ,(b) , 27
----
Godmorgen lille land ,(b) , 82
----
Grundlovssangen ,(b) , 86
----
Græshoppen og valmuen ,(b) , 207
----
Gå stille og tyst gennem verden ,(b) , 105
----
Han kommer med sommer ,(b) , 162
----
Happy Christmas (War is over) ,(b) , 287
----
Har du visor min vän ,(b) , 200
----
Hele verden er vores ,(b) , 226
----
Hey Jude ,(b) , 293
----
Hil dig frelser og forsoner ,(b) , 36
----
Hilsen til forårssolen ,(b) , 156
----
Himmel og hav ,(b) , 245
----
Hist hvor vejen slår en bugt ,(b) , 217
----
Holger Danskes mærke ,(b) , 123
----
Hvad er det min Marie! (A) ,(b) , 203
----
Hvad solskin er for det sorte muld (A) ,(b) , 92
----
Hvem sidder der bag skærmen ,(b) , 220
----
Hvergang en sommer ,(b) , 167
----
Hvide skyer falder ned ,(b) , 245
----
Hvor smiler fager den danske kyst ,(b) , 76
----
Hvorfor går min elskede ,(b) , 208
----
Hymnen til Afrika ,(b) , 112
----
Højt fra træets grønne top ,(b) , 60
----
I al sin glans nu stråler solen ,(b) , 39
----
I alle de riger og lande ,(b) , 123
----
I dag er landet vort ,(b) , 87
----
I Danmark er jeg født (A) ,(b) , 78
----
I det spæde morgengry ,(b) , 9
----
I hjerterne begynder ,(b) , 272
----
I skovens dybe stille ro (A) ,(b) , 20
----
I sne står urt og busk i skjul ,(b) , 182
----
I østen stiger solen op ,(b) , 3
----
Imagine ,(b) , 292
----
Imellem Esbjerg og Fanø ,(b) , 262
----
Ind til dig igen ,(b) , 206
----
Ind under jul hvor er det trist ,(b) , 49
----
Ja vi elsker dette landet ,(b) , 70
----
Jeg bærer med smil min byrde ,(b) , 97
----
Jeg ejer både mark og eng ,(b) , 225
----
Jeg elsker de grønne lunde ,(b) , 75
----
Jeg elsker den brogede verden ,(b) , 98
----
Jeg fandt en sang på vejen ,(b) , 247
----
Jeg går i solen og traller ,(b) , 236
----
Jeg har fanget mig en myg ,(b) , 237
----
Jeg kender et land (A) ,(b) , 90
----
Jeg plukker fløjlsgræs ,(b) , 149
----
Jeg rutter med glædens ,(b) , 99
----
Jeg ser de bøgelyse øer ,(b) , 74
----
Jeg ved en lærkerede ,(b) , 151
----
Jeg ved hvor der findes en have så skøn ,(b) , 73
----
Jeg vil male dagen blå ,(b) , 228
----
Jens vejmand ,(b) , 220
----
Jo jo gøgleri er en nobel kunst ,(b) , 100
----
Jordens åndedrag ,(b) , 117
----
Julen har bragt velsignet bud ,(b) , 57
----
Juletræet med sin pynt ,(b) , 61
----
Juni ,(b) , 168
----
Jyden han æ stærk å sej ,(b) , 210
----
Jylland mellem tvende have ,(b) , 72
----
Kald det kærlighed ,(b) , 201
----
Kalendervender Tage ,(b) , 248
----
Kirsten og vejen fra Gurre ,(b) , 174
----
Kom fred og fyld den hele dag ,(b) , 231
----
Kom glade overgivenhed ,(b) , 218
----
Kom maj du søde milde ,(b) , 133
----
Kom og dans ,(b) , 251
----
Kom tro og kom glæde ,(b) , 64
----
Kommer hid l piger små ,(b) , 124
----
Kong Kristjan stod ved højen mast ,(b) , 283
----
Kringsatt av fjender ,(b) , 101
----
Kumbaya ,(b) , 285
----
Kærlighedsrosen ,(b) , 193
----
Lad det leve ,(b) , 263
----
Leaving on a Jet-plane ,(b) , 295
----
Lermennesket ,(b) , 113
----
Let it be ,(b) , 291
----
Let it grow ,(b) , 296
----
Lille Messias ,(b) , 63
----
Livet er en morgengave (A) ,(b) , 118
----
Livstræet ,(b) , 120
----
Love is all around ,(b) , 297
----
Lovsynger Herren ,(b) , 34
----
Luk døren op og se ,(b) , 150
----
Lysfyldt morgen ,(b) , 125
----
Lær mig nattens stjerne ,(b) , 17
----
Løft dit hoved du raske gut ,(b) , 89
----
Mads Doss ,(b) , 221
----
Marken er mejet ,(b) , 169
----
Mary boy child ,(b) , 288
----
Med kåde smil den lyse sol ,(b) , 80
----
Med mor til fodbold ,(b) , 250
----
Menneskelivet er underligt ,(b) , 96
----
Mi nååbo Pe Sme ,(b) , 219
----
Midsommervisen (A) ,(b) , 164
----
Morgengry ,(b) , 10
----
Morgenstund har guld i mund (A) ,(b) , 6
----
Musens sang ,(b) , 213
----
Mørk er november ,(b) , 178
----
Mørkets sang ,(b) , 273
----
Nanna ,(b) , 261
----
Natten er blid ,(b) , 18
----
Natten er så stille ,(b) , 16
----
Nattergalen kender du den ,(b) , 154
----
Nattergalen på sin gren ,(b) , 259
----
Nocturne ,(b) , 24
----
Noget om helte (A) ,(b) , 118
----
Noget om skærsommernætter ,(b) , 163
----
Nu er dagen fuld af sang ,(b) , 140
----
Nu er det længe siden ,(b) , 173
----
Nu er jord og himmel stille (A) ,(b) , 25
----
Nu falmer skoven trindt om land (A) ,(b) , 175
----
Nu har vi altså jul igen ,(b) , 62
----
Nu hviler mark og enge ,(b) , 15
----
Nu lyser løv i lunde ,(b) , 141
----
Nu nejer blomsterne ,(b) , 163
----
Nu rinder solen op af østerlide (A) ,(b) , 2
----
Nu skal det åbenbares (A) ,(b) , 95
----
Nu skal vi ha' gilde ,(b) , 241
----
Nu tændes tusind julelys ,(b) , 51
----
Når egene knoppes ,(b) , 166
----
Når vinteren rinder i grøft og i grav ,(b) , 142
----
O come all ye faithful ,(b) , 284
----
O Færø så fager ,(b) , 71
----
Og det blev vår ,(b) , 152
----
Ole sad på en knold og sang ,(b) , 222
----
Om lidt ,(b) , 271
----
One hand One heart ,(b) , 299
----
Op al den ting som Gud har gjort ,(b) , 32
----
Opvåvni ,(b) , 144
----
Papirsklip ,(b) , 256
----
Per spelmann ,(b) , 186
----
Påske ,(b) , 150
----
Påskeblomst! Hvad vil du her ,(b) , 38
----
Ramund ,(b) , 188
----
Regnvejrsdag i november ,(b) , 228
----
Romeo ,(b) , 260
----
Roselil og hendes moder ,(b) , 189
----
Ræven er ude med halen så lang ,(b) , 202
----
Røverne fra Kardemommeby ,(b) , 249
----
Sang i det grønne ,(b) , 129
----
Sangen har lysning ,(b) , 102
----
Santa Claus is comin' to town ,(b) , 286
----
Sat her i forvirringstiden ,(b) , 121
----
Se det summer af sol over engen (A) ,(b) , 159
----
Se hvilken morgenstund ,(b) , 11
----
Se Norges blomsterdal ,(b) , 223
----
Se nu stiger solen af havets skød (A) ,(b) , 4
----
Sensommerkanon ,(b) , 242
----
Sensommervise ,(b) , 171
----
Septembers himmel ,(b) , 170
----
Sig månen langsomt hæver ,(b) , 12
----
Sig nærmer tiden ,(b) , 103
----
Skal vi ikke være venner ,(b) , 270
----
Skipper Klements morgensang ,(b) , 132
----
Skoven er så underfuld ,(b) , 177
----
Skuld gammel venskab ,(b) , 224
----
Skyerne gråne ,(b) , 30
----
Skærm jeres huse med grav og planke ,(b) , 132
----
Skønjomfruen går i dansen ,(b) , 190
----
Sneflokke kommer vrimlende ,(b) , 181
----
Snemand Frost og frøken Tø (A) ,(b) , 183
----
Solhvervssang ,(b) , 179
----
Solkanon ,(b) , 243
----
Solsikke ,(b) , 176
----
Som dybest brønd ,(b) , 128
----
Som en rejselysten flåde ,(b) , 77
----
Som forårssolen morgenrød ,(b) , 37
----
Sommerens ø ,(b) , 167
----
Sommersalme ,(b) , 40
----
Soon and very soon ,(b) , 298
----
Sov på min arm ,(b) , 24
----
Spurven sidder stum bag kvist ,(b) , 185
----
Stenen slår smut på det danske vand ,(b) , 275
----
Stilfærdigt farvel ,(b) , 266
----
Stille hjerte sol går ned ,(b) , 13
----
Stjernefart ,(b) , 253
----
Stjerner dukker frem ,(b) , 18
----
Storken ,(b) , 162
----
Summer nights (Grease) ,(b) , 306
----
Svantes lykkelige dag ,(b) , 11
----
Svinehyrden ,(b) , 252
----
Swing low ,(b) , 301
----
Sæt grammofonen i stå ,(b) , 214
----
Søren Bramfris lærkesang ,(b) , 215
----
Så længe skuden kan gå ,(b) , 279
----
Så tænder vi et lys i kvæld ,(b) , 28
----
Tag del i det der er din tid ,(b) , 269
----
Take it easy boy boy ,(b) , 304
----
Tears in heaven ,(b) , 302
----
That's what friends are for ,(b) , 309
----
The Rose ,(b) , 305
----
Those were the days ,(b) , 308
----
Til Dem hr. præsident ,(b) , 229
----
Til himlene rækker din miskundhed Gi ,(b) , 1 8
----
Til min Marie (A) ,(b) , 203
----
Til ungdommen ,(b) , 101
----
Till havs med solfyllda segel ,(b) , 240
----
To be or not to be ,(b) , 303
----
To gyldne sommerfugle (A) ,(b) , 197
----
Tusind stykker ,(b) , 282
----
Underlige aftenlufte ,(b) , 14
----
Valmuevejen ,(b) , 254
----
Velkommen i den grønne lund ,(b) , 129
----
Velkommen igen Guds engle små (A; ,(b) , 59
----
Velkommen lærkelil (A) ,(b) , 143
----
Vem kan segla forutan vind ,(b) , 192
----
Veninde tag frakken og støvlerne på ,(b) , 47
----
Vennekredsen ,(b) , 238
----
Vennesang ,(b) , 277
----
Veronica ,(b) , 196
----
Vi der valgte regnen ,(b) , 122
----
Vi elsker vort land (A) ,(b) , 164
----
Vi vil plante et træ ,(b) , 230
----
Vipper springe over klinge ,(b) , 165
----
Visen om de atten svaner ,(b) , 204
----
VLTJ ,(b) , 280
----
Vor sol er blevet kold (A) ,(b) , 179
----
Vort modersmål er dejligt ,(b) , 79
----
Vær lidt varsom ,(b) , 184
----
Vær velkommen Herrens år (advent ,(b) , 29
----
Vær velkommen Herrens år (nytår) ,(b) , 43
----
Være vind ,(b) , 278
----
Vågn nu op af dine drømme ,(b) , 239
----
Vågn op og slå på dine strenge ,(b) , 7
----
Våren er i luften ,(b) , 138
----
Vårt land vårt land vårt fosterland ,(b) , 68
----
Vårvise ,(b) , 255
----
War is over ,(b) , 287
----
What a wonderful world ,(b) , 300
----
Whiskey in the Jar ,(b) , 307
----
Wonderful tonight ,(b) , 294
----
Yesterday ,(b) , 290
----
Æbler lyser rødt på træernes grene ,(b) , 171
----
Åbent landskab ,(b) , 281
|sortable|k
|Titel,Kilde,nr|h
|<<QOTD SangBogen2>>|
|<<QOTD SangBogen2>>|
|<<QOTD SangBogen2>>|
|<<QOTD SangBogen2>>|
|<<QOTD SangBogen2>>|
|<<QOTD SangBogen2>>|
|sortable|k
|Bogen:|Titel nr|h
|1|<<QOTD SangBogen2 3700>>|
|2|<<QOTD SangBogen2 4000>>|
|3|<<QOTD SangBogen2 4300>>|
|4|<<QOTD SangBogen2 4600>>|
|5|<<QOTD SangBogen2 4900>>|
|sortable|k
|Titel|Side|h
|Andreas sang|21|
|Barndommens gade|22|
|Buster|4|
|Byens hotel|50|
|California Dreamin'|42|
|Can’t Help Falling In Love|24|
|Dagen er din|6|
|Dansevise|27|
|Danskerne findes i mange modeller|30|
|De smukke unge mennesker|45|
|Den gamle spillemand|15|
|Det som lysner over vangen|27|
|Dream A Little Dream of Me|34|
|Du satte dig selv|12|
|Eight Days A Week|13|
|Elefantens vuggevise|47|
|En sang af sommer|40|
|Fly Me To The Moon|44|
|Gem et lille smil|46|
|Gi’ os lyset tilbage|10|
|Go Down Moses|9|
|Hvor du sætter din fod|39|
|Hvor længe vil du ydmyge dig?|28|
|Hymne til sangen|14|
|Hører du nogen kalde|31|
|Inderst inde|19|
|Indianer|11|
|Jeg mødte en sang|41|
|Joanna|34|
|Jutlandia|16|
|Kajs sang|21|
|Killing Me Softly|17|
|Kvinde min|18|
|Kære linedanser|55|
|Love Is A Matter Of Difference|52|
|Magi i luften|51|
|Masser af succes|59|
|Masser af succes|54|
|Menneske din egen magt|20|
|Midt om natten|43|
|Noget i dig selv|26|
|Puff|23|
|Solen begynder at gløde|29|
|Som jorden sang sin første sang|37|
|Stand by me|7|
|Sådan nogen som os|38|
|Sång till friheten|25|
|This Is My Life|21|
|Ud under åben himmel|36|
|Udsigt i kikkert|3|
|Vi har kun én sol|8|
|Vågner i natten|48|
|With A Little Help|35|
|You’ve Got A Friend|32|
Andreas sang,(m), 21
----
Barndommens gade,(m), 22
----
Buster,(m), 4
----
Byens hotel,(m), 50
----
California Dreamin',(m), 42
----
Can’t Help Falling In Love,(m), 24
----
Dagen er din,(m), 6
----
Dansevise,(m), 27
----
Danskerne findes i mange modeller,(m), 30
----
De smukke unge mennesker,(m), 45
----
Den gamle spillemand,(m), 15
----
Det som lysner over vangen,(m), 27
----
Dream A Little Dream of Me,(m), 34
----
Du satte dig selv,(m), 12
----
Eight Days A Week,(m), 13
----
Elefantens vuggevise,(m), 47
----
En sang af sommer,(m), 40
----
Fly Me To The Moon,(m), 44
----
Gem et lille smil,(m), 46
----
Gi’ os lyset tilbage,(m), 10
----
Go Down Moses,(m), 9
----
Hvor du sætter din fod,(m), 39
----
Hvor længe vil du ydmyge dig?,(m), 28
----
Hymne til sangen,(m), 14
----
Hører du nogen kalde,(m), 31
----
Inderst inde,(m), 19
----
Indianer,(m), 11
----
Jeg mødte en sang,(m), 41
----
Joanna,(m), 34
----
Jutlandia,(m), 16
----
Kajs sang,(m), 21
----
Killing Me Softly,(m), 17
----
Kvinde min,(m), 18
----
Kære linedanser,(m), 55
----
Love Is A Matter Of Difference,(m), 52
----
Magi i luften,(m), 51
----
Masser af succes,(m), 59
----
Masser af succes,(m), 54
----
Menneske din egen magt,(m), 20
----
Midt om natten,(m), 43
----
Noget i dig selv,(m), 26
----
Puff,(m), 23
----
Solen begynder at gløde,(m), 29
----
Som jorden sang sin første sang,(m), 37
----
Stand by me,(m), 7
----
Sådan nogen som os,(m), 38
----
Sång till friheten,(m), 25
----
This Is My Life,(m), 21
----
Ud under åben himmel,(m), 36
----
Udsigt i kikkert,(m), 3
----
Vi har kun én sol,(m), 8
----
Vågner i natten,(m), 48
----
With A Little Help,(m), 35
----
You’ve Got A Friend,(m), 32
|sortable|k
|Titel, Kilde, side|h
|<<QOTD SangMappen2>>|
|<<QOTD SangMappen2>>|
|<<QOTD SangMappen2>>|
|<<QOTD SangMappen2>>|
|<<QOTD SangMappen2>>|
|<<QOTD SangMappen2>>|
|sortable|k
|Mappen:|Titel side|h
|1|<<QOTD SangMappen2 8800>>|
|2|<<QOTD SangMappen2 9100>>|
|3|<<QOTD SangMappen2 9400>>|
|4|<<QOTD SangMappen2 9700>>|
|5|<<QOTD SangMappen2 10000>>|
<html><object type="application/x-shockwave-flash" data="http://www.99chats.com/chat.swf?r=352" width="600" height="250"><param name="movie" value="http://www.99chats.com/chat.swf?r=352" /><param name="bgcolor" value="#FFFFFF" /><embed src="http://www.99chats.com/chat.swf?r=352" type="application/x-shockwave-flash" width="600" height="250" bgcolor="#FFFFFF"></embed><br><a href="http://www.99chats.com/">Chat</a></object></html>
<!--{{{-->
<div class='toolbar' macro='toolbar [[ToolbarCommands::ViewToolbar]]'>
</span> <span class='toolbar' macro='toolbar snapshotPrint'></span>
<span macro='newHere label:"ny her"'></span> </div>
<div class='title' macro='view title'></div>
<div class='tagged' macro='tags'></div>
<div class='viewer' macro='view text wikified'></div>
<div class='tagClear'></div>
<div class="tagglyTagging" macro="tagglyTagging"></div>
<!--}}}-->
*Klik på <<newJournal label:"Ny FredagsSangtime" tag:"Sang" text:"!HUSK at ændre titelen til den aktuelle dato!!!
!!Fredagssangtimen
|sortable|k
|Nr|Titel|Mappe|Side|Ny|Piano|h
|1||||||
|2||||||
|3||||||
|4||||||
|5||||||
|6||||||
|7||||||
|8||||||
|9||||||
|10||||||
|11||||||
|12||||||
|13||||||
|14||||||" >> eller <<newJournal label:"Ny Sang/fortælling" tag:"Sang" text:"!HUSK at ændre titelen til den aktuelle dato!!!
!!Sang/fortælling
|sortable|k
|Nr|Titel|Mappe|Side|Ny|Piano|h
|1||||||
|2||||||
|3||||||
|4||||||
|5||||||
|6||||||
|7||||||
|8||||||
|9||||||
|10||||||
|11||||||
|12||||||" >>
* Her er der hjælp i form af færdige tabeller med tilfældige numre - klik på en titel og få et nyt forslag. <<newJournal label:"FredagsHjælp" text:{{"<<formTiddler FredagsTemplate\>\>"}} tag:"Sang">> eller <<newJournal label:"OnsdagsHjælp" text:{{"<<formTiddler OnsdagsTemplate\>\>"}} tag:"Sang">>
*Husk at ændre på datoen så den svarer til den aktuelle dato (//Du kan også bare klikke på datoen på kalenderen i stedet for at bruge knapperne!//)
!!Den næst nemmeste metode
(Den nemmeste er hjælpknapperne herover!)
beskrives her: [[Den helt nemme]] //(Så gør vi som vi plejer!)//
!!Den mere avancerede metode, der bruger et regneark undervejs:
*Åben et regneark. ~OpenOfficeCalc eller Microsoft Ecxel.
*Kopier denne linie ind i regnearket (//Copy/paste//):
|Nr|Titel|Mappe|Side|Ny|Piano|
*Skriv sangene ind i arket
*Kopier det indskrevne (//Ctrl+C//)
*Skift til ''Sang 08/09'' igen
*Klik på [[Værktøj]] - åben [[Oversæt excel til skema]] - indsæt det kopierede (//Ctrl+V//)
*Klik på Oversæt-knappen
*Kopier resultatet ind i den tiddler som du lavede i starten af denne gennemgang..
*Klik @@color(#0099cc):færdig@@
*Hvis du satte teksten ind under {{{|sortable|k}}} har du nu et sorterbart skema. (//NB:Skemaet bliver ikke sorterbart hvis du bruger kalenderen! - med mindre du selv tilføjer {{{|sortable|k}}} øverst i tiddleren.//)
*For at ændre på rækkefølgen skal du dobbltklikke på tekstfeltet og ændre numrene ud for sangene. Klik @@color(#0099cc):færdig@@ - derefter klikker du blot på "Nr-overskriften" og tabellen sorteres efter nummer (//Det er måske nemmere at bestemme rækkefølgen allerede i regnearket vha sortering via numrene...//) - udskriv vha @@color(#0099cc):print@@ (//Vælg tiddler: 'Navn:aktuel dato' (content only)//)
*Husk at gemme!! {{bluearrow{►}}}@@color(#3399cc):<<tiddler ToggleRightSidebar with: "(Sidepanel)">>@@ {{bluearrow{►}}} <<slider chkSliderOptionsPanel OptionsPanel "Muligheder »" "Change TiddlyWiki advanced options">> skriv kode: kultur {{bluearrow{►}}} <<upload http://sang.tiddlyspot.com/store.cgi index.html . . sang>>.
Se også [[Den helt nemme]] og [[Print - hvordan?]]
Mvh MM
<!--{{{-->
<div class='toolbar' macro='toolbar [[ToolbarCommands::ViewToolbar]]'> <span macro="toggleTag Sang . Aktuel"></span> eller <span macro="toggleTag SangArkiv . Arkivér"></span>
</span> <span class='toolbar' macro='toolbar snapshotPrint'></span>
<span macro='newHere label:"ny her"'></span> </div>
<div class='title' macro='view title'></div>
<div class='tagged' macro='tags'></div>
<div class='viewer' macro='view text wikified'></div>
<div class='tagClear'></div>
<div class="tagglyTagging" macro="tagglyTagging"></div>
<!--}}}-->
/***
|Name:|SaveCloseTiddlerPlugin|
|Description:|Provides two extra toolbar commands, saveCloseTiddler and cancelCloseTiddler|
|Version:|3.0 ($Rev: 5502 $)|
|Date:|$Date: 2008-06-10 23:31:39 +1000 (Tue, 10 Jun 2008) $|
|Source:|http://mptw.tiddlyspot.com/#SaveCloseTiddlerPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
To use these you must add them to the tool bar in your EditTemplate
***/
//{{{
merge(config.commands,{
saveCloseTiddler: {
text: 'færdig/luk',
tooltip: 'Gem ændringer til denne tiddler og luk den',
handler: function(ev,src,title) {
var closeTitle = title;
var newTitle = story.saveTiddler(title,ev.shiftKey);
if (newTitle)
closeTitle = newTitle;
return config.commands.closeTiddler.handler(ev,src,closeTitle);
}
},
cancelCloseTiddler: {
text: 'fortryd/luk',
tooltip: 'Fortryd ændringer til denne tiddler og luk den',
handler: function(ev,src,title) {
// the same as closeTiddler now actually
return config.commands.closeTiddler.handler(ev,src,title);
}
}
});
//}}}
//{{{
window.reportSearchResults=function(text,matches)
{
var title=config.macros.search.reportTitle
var q = config.options.chkRegExpSearch ? "/" : "'";
var body="\n";
// numbered list of links to matching tiddlers
body+="\n<<<";
for(var t=0;t<matches.length;t++) {
var date=config.options.chkSearchByDate?(matches[t].modified.formatString('YYYY.0MM.0DD 0hh:0mm')+" "):"";
body+="\n# "+date+"[["+matches[t].title+"]]";
}
body+="\n<<<\n";
// create/update the tiddler
var tiddler=store.getTiddler(title); if (!tiddler) tiddler=new Tiddler();
tiddler.set(title,body,config.options.txtUserName,(new Date()),"excludeLists excludeSearch");
store.addTiddler(tiddler); story.closeTiddler(title);
// use alternate "search again" label in <<search>> macro
var oldprompt=config.macros.search.label;
config.macros.search.label="search again";
// render/refresh tiddler
story.displayTiddler(null,title,1);
store.notify(title,true);
// restore standard search label
config.macros.search.label=oldprompt;
}
//}}}
/***
|Name|SearchOptionsPlugin|
|Source|http://www.TiddlyTools.com/#SearchOptionsPlugin|
|Documentation|http://www.TiddlyTools.com/#SearchOptionsPluginInfo|
|Version|2.6.1|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides|Story.prototype.search, TiddlyWiki.prototype.search, config.macros.search.onKeyPress|
|Description|extend core search function with additional user-configurable options|
Extend core search function with additional user-configurable options including generating a ''list of matching tiddlers'' instead of immediately displaying all matches.
!!!!!Documentation
>see [[SearchOptionsPluginInfo]]
!!!!!Configuration
<<<
<<option chkSearchTitles>> Search in titles
<<option chkSearchText>> Search in tiddler text
<<option chkSearchTags>> Search in tags
<<option chkSearchFields>> Search in data fields
<<option chkSearchShadows>> Search shadow tiddlers
<<option chkSearchTitlesFirst>> Show title matches first
<<option chkSearchByDate>> Sort matching tiddlers by date
<<option chkSearchList>> Show list of matches in [[SearchResults]]
<<option chkSearchIncremental>> Incremental (key-by-key) searching
<<<
!!!!!Revisions
<<<
2007.02.17 [2.6.1] added redefinition of config.macros.search.onKeyPress() to restore check to bypass key-by-key searching (i.e., when chkSearchIncremental==false), which had been unintentionally removed with v2.6.0
|please see [[SearchOptionsPluginInfo]] for additional revision details|
2005.10.18 [1.0.0] Initial Release
<<<
!!!!!Code
***/
//{{{
version.extensions.searchOptions = {major: 2, minor: 6, revision: 1, date: new Date(2007,2,17)};
if (config.options.chkSearchTitles===undefined) config.options.chkSearchTitles=true;
if (config.options.chkSearchText===undefined) config.options.chkSearchText=true;
if (config.options.chkSearchTags===undefined) config.options.chkSearchTags=true;
if (config.options.chkSearchFields===undefined) config.options.chkSearchFields=true;
if (config.options.chkSearchTitlesFirst===undefined) config.options.chkSearchTitlesFirst=false;
if (config.options.chkSearchList===undefined) config.options.chkSearchList=false;
if (config.options.chkSearchByDate===undefined) config.options.chkSearchByDate=false;
if (config.options.chkSearchIncremental===undefined) config.options.chkSearchIncremental=true;
if (config.options.chkSearchShadows===undefined) config.options.chkSearchShadows=false;
if (config.optionsDesc) {
config.optionsDesc.chkSearchTitles="Search in tiddler titles";
config.optionsDesc.chkSearchText="Search in tiddler text";
config.optionsDesc.chkSearchTags="Search in tiddler tags";
config.optionsDesc.chkSearchFields="Search in tiddler data fields";
config.optionsDesc.chkSearchShadows="Search in shadow tiddlers";
config.optionsDesc.chkSearchTitlesFirst="Search results show title matches first";
config.optionsDesc.chkSearchList="Search results show list of matching tiddlers";
config.optionsDesc.chkSearchByDate="Search results sorted by modification date ";
config.optionsDesc.chkSearchIncremental="Incremental searching";
} else {
config.shadowTiddlers.AdvancedOptions += "\n<<option chkSearchTitles>> Search in tiddler titles"
+"\n<<option chkSearchText>> Search in tiddler text"
+"\n<<option chkSearchTags>> Search in tiddler tags"
+"\n<<option chkSearchFields>> Search in tiddler data fields"
+"\n<<option chkSearchShadows>> Search in shadow tiddlers"
+"\n<<option chkSearchTitlesFirst>> Search results show title matches first"
+"\n<<option chkSearchList>> Search results show list of matching tiddlers"
+"\n<<option chkSearchByDate>> Search results sorted by modification date"
+"\n<<option chkSearchIncremental>> Incremental searching";
}
if (config.macros.search.reportTitle==undefined)
config.macros.search.reportTitle="SearchResults";
config.macros.search.onKeyPress = function(e)
{
if(!e) var e = window.event;
switch(e.keyCode)
{
case 13: // Ctrl-Enter
case 10: // Ctrl-Enter on IE PC
config.macros.search.doSearch(this);
break;
case 27: // Escape
this.value = "";
clearMessage();
break;
}
if (config.options.chkSearchIncremental) {
if(this.value.length > 2)
{
if(this.value != this.getAttribute("lastSearchText"))
{
if(config.macros.search.timeout)
clearTimeout(config.macros.search.timeout);
var txt = this;
config.macros.search.timeout = setTimeout(function() {config.macros.search.doSearch(txt);},500);
}
}
else
{
if(config.macros.search.timeout)
clearTimeout(config.macros.search.timeout);
}
}
}
//}}}
//{{{
Story.prototype.search = function(text,useCaseSensitive,useRegExp)
{
highlightHack = new RegExp(useRegExp ? text : text.escapeRegExp(),useCaseSensitive ? "mg" : "img");
var matches = store.search(highlightHack,config.options.chkSearchByDate?"modified":"title","excludeSearch");
if (config.options.chkSearchByDate) matches=matches.reverse(); // most recent changes first
var q = useRegExp ? "/" : "'";
clearMessage();
if (!matches.length) {
if (config.options.chkSearchList) discardSearchResults();
displayMessage(config.macros.search.failureMsg.format([q+text+q]));
} else {
if (config.options.chkSearchList)
reportSearchResults(text,matches);
else {
var titles = []; for(var t=0; t<matches.length; t++) titles.push(matches[t].title);
this.closeAllTiddlers(); story.displayTiddlers(null,titles);
displayMessage(config.macros.search.successMsg.format([matches.length, q+text+q]));
}
}
highlightHack = null;
}
TiddlyWiki.prototype.search = function(searchRegExp,sortField,excludeTag)
{
var candidates = this.reverseLookup("tags",excludeTag,false,sortField);
// scan for matching titles first...
var results = [];
if (config.options.chkSearchTitles) {
for(var t=0; t<candidates.length; t++)
if(candidates[t].title.search(searchRegExp)!=-1)
results.push(candidates[t]);
if (config.options.chkSearchShadows)
for (var t in config.shadowTiddlers)
if ((t.search(searchRegExp)!=-1) && !store.tiddlerExists(t))
results.push((new Tiddler()).assign(t,config.shadowTiddlers[t]));
}
// then scan for matching text, tags, or field data
for(var t=0; t<candidates.length; t++) {
if (config.options.chkSearchText && candidates[t].text.search(searchRegExp)!=-1)
results.pushUnique(candidates[t]);
if (config.options.chkSearchTags && candidates[t].tags.join(" ").search(searchRegExp)!=-1)
results.pushUnique(candidates[t]);
if (config.options.chkSearchFields && store.forEachField!=undefined) // requires TW2.1 or above
store.forEachField(candidates[t],
function(tid,field,val) { if (val.search(searchRegExp)!=-1) results.pushUnique(candidates[t]); },
true); // extended fields only
}
// then check for matching text in shadows
if (config.options.chkSearchShadows)
for (var t in config.shadowTiddlers)
if ((config.shadowTiddlers[t].search(searchRegExp)!=-1) && !store.tiddlerExists(t))
results.pushUnique((new Tiddler()).assign(t,config.shadowTiddlers[t]));
// if not 'titles first', or sorting by modification date, re-sort results to so titles, text, tag and field matches are mixed together
if(!sortField) sortField = "title";
var bySortField=function (a,b) {if(a[sortField] == b[sortField]) return(0); else return (a[sortField] < b[sortField]) ? -1 : +1; }
if (!config.options.chkSearchTitlesFirst || config.options.chkSearchByDate) results.sort(bySortField);
return results;
}
// REPORT GENERATOR
if (!window.reportSearchResults) window.reportSearchResults=function(text,matches)
{
var title=config.macros.search.reportTitle
var q = config.options.chkRegExpSearch ? "/" : "'";
var body="\n";
// summary: nn tiddlers found matching '...', options used
body+="''"+config.macros.search.successMsg.format([matches.length,q+"{{{"+text+"}}}"+q])+"''\n";
body+="^^//searched in:// ";
body+=(config.options.chkSearchTitles?"''titles'' ":"");
body+=(config.options.chkSearchText?"''text'' ":"");
body+=(config.options.chkSearchTags?"''tags'' ":"");
body+=(config.options.chkSearchFields?"''fields'' ":"");
body+=(config.options.chkSearchShadows?"''shadows'' ":"");
if (config.options.chkCaseSensitiveSearch||config.options.chkRegExpSearch) {
body+=" //with options:// ";
body+=(config.options.chkCaseSensitiveSearch?"''case sensitive'' ":"");
body+=(config.options.chkRegExpSearch?"''text patterns'' ":"");
}
body+="^^";
// numbered list of links to matching tiddlers
body+="\n<<<";
for(var t=0;t<matches.length;t++) {
var date=config.options.chkSearchByDate?(matches[t].modified.formatString('YYYY.0MM.0DD 0hh:0mm')+" "):"";
body+="\n# "+date+"[["+matches[t].title+"]]";
}
body+="\n<<<\n";
// open all matches button
body+="<html><input type=\"button\" href=\"javascript:;\" ";
body+="onclick=\"story.displayTiddlers(null,["
for(var t=0;t<matches.length;t++)
body+="'"+matches[t].title.replace(/\'/mg,"\\'")+"'"+((t<matches.length-1)?", ":"");
body+="],1);\" ";
body+="accesskey=\"O\" ";
body+="value=\"open all matching tiddlers\"></html> ";
// discard search results button
body+="<html><input type=\"button\" href=\"javascript:;\" ";
body+="onclick=\"story.closeTiddler('"+title+"'); store.deleteTiddler('"+title+"'); store.notify('"+title+"',true);\" ";
body+="value=\"discard "+title+"\"></html>";
// search again
body+="\n\n----\n";
body+="<<search \""+text+"\">>\n";
body+="<<option chkSearchTitles>>titles ";
body+="<<option chkSearchText>>text ";
body+="<<option chkSearchTags>>tags";
body+="<<option chkSearchFields>>fields";
body+="<<option chkSearchShadows>>shadows";
body+="<<option chkCaseSensitiveSearch>>case-sensitive ";
body+="<<option chkRegExpSearch>>text patterns";
body+="<<option chkSearchByDate>>sort by date";
// create/update the tiddler
var tiddler=store.getTiddler(title); if (!tiddler) tiddler=new Tiddler();
tiddler.set(title,body,config.options.txtUserName,(new Date()),"excludeLists excludeSearch temporary");
store.addTiddler(tiddler); story.closeTiddler(title);
// use alternate "search again" label in <<search>> macro
var oldprompt=config.macros.search.label;
config.macros.search.label="search again";
// render/refresh tiddler
story.displayTiddler(null,title,1);
store.notify(title,true);
// restore standard search label
config.macros.search.label=oldprompt;
}
if (!window.discardSearchResults) window.discardSearchResults=function()
{
// remove the tiddler
story.closeTiddler(config.macros.search.reportTitle);
store.deleteTiddler(config.macros.search.reportTitle);
}
//}}}
//{{{
window.reportSearchResults=function(text,matches)
{
var title=config.macros.search.reportTitle
var q = config.options.chkRegExpSearch ? "/" : "'";
var body="\n";
// numbered list of links to matching tiddlers
body+="\n<<<";
for(var t=0;t<matches.length;t++) {
var date=config.options.chkSearchByDate?(matches[t].modified.formatString('YYYY.0MM.0DD 0hh:0mm')+" "):"";
body+="\n# "+date+"[["+matches[t].title+"]]";
}
body+="\n<<<\n";
// create/update the tiddler
var tiddler=store.getTiddler(title); if (!tiddler) tiddler=new Tiddler();
tiddler.set(title,body,config.options.txtUserName,(new Date()),"excludeLists excludeSearch");
store.addTiddler(tiddler); story.closeTiddler(title);
// use alternate "search again" label in <<search>> macro
var oldprompt=config.macros.search.label;
config.macros.search.label="search again";
// render/refresh tiddler
story.displayTiddler(null,title,1);
store.notify(title,true);
// restore standard search label
config.macros.search.label=oldprompt;
}
//}}}
<<<
# [[Acknowledgements & license]]
# [[ForEachTiddlerPlugin]]
# [[InlineJavascriptPlugin]]
# [[Instructions]]
# [[NestedSlidersPlugin(withGiffmexTweak)]]
# [[QuickEditToolbar]]
# [[QuickEdit_format]]
# [[QuickOpenTagPlugin]]
# [[SearchOptions plugin tweaks]]
# [[SearchOptionsPlugin]]
# [[SearchOptionsPlugin tweaks]]
# [[SiteMapMacro]]
# [[TagglyTaggingPlugin]]
# [[ToggleTagPlugin]]
<<<
<html><div align="center"><iframe src="http://41336.shoutbox.us/" frameborder="0" width="152" height="300"></iframe></div></html>
<<search>><<option chkUseYourSearch>><<closeAll>><<permaview>><<newTiddler>><<newJournal "DD MMM YYYY" "journal">><<newJournal "DD MMM YYYY" label:"Ny med kommentar" text:{{"<<comments\>\>"}} tag:"comment">><<newTiddler title: 'Ny IFrame - udskift XXXX herunder med den hjemmeside du vil bruge' text: '<html><div align="center"><iframe src="http://XXXX" frameborder="0" width="100%" height="600"></iframe></div></html>' tag: 'iframe' label:'ny IFrame'>><<newTiddler label:"Ny bog/artikel" text:{{"<<formTiddler NewBibEntryTemplate\>\>"}} tag:"authorbook""Bøger">><<saveChanges>><<tiddler TspotSidebar>>{{tuduSlider{<<slider chkBookSummary Bibliografi 'Bibliografi »'>>}}}<<slider chkSliderOptionsPanel OptionsPanel "Muligheder »" "Change TiddlyWiki advanced options">><<slider chkShoutBox ShoutBox 'Kontakt »'>>
<<slider txtMainTabSlider SideBarTabsSlider 'tabs »' 'tiddlers, timeline, all, tags, and more'>>
<<tabs txtMainTab "Tidslinie" "Tidslinie" TabTimeline "Alle" "Alle tiddlere" TabAll "Tags" "Alle tags" TabTags "Flere" "Flere lister" TabMore>>
Sidste ord:
Den er så tam, at man kan putte hovedet ind i munden på den...
----
Sidste ord:
Det her er en spiselig svamp...
----
Sidste ord:
Klip den røde ledning over først...
----
Sidste ord:
Chefen er da ligeglad...
----
Sidste ord:
Det koster kun det halve ved det her flyselskab...
----
Sidste ord:
Jeg tror, den er død..
----
Sidste ord:
Jeg går over broen først...
----
Sidste ord:
Hvad min bedre halvdel ikke ved, har min bedre halvdel heller ikke ondt af...
----
Sidste ord:
Hells hva` for noget?
----
Sidste ord:
Kom nu! Der sker ikke noget..
/***
|Name|SinglePageModePlugin|
|Source|http://www.TiddlyTools.com/#SinglePageModePlugin|
|Documentation|http://www.TiddlyTools.com/#SinglePageModePluginInfo|
|Version|2.8.2|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides|Story.prototype.displayTiddler(), Story.prototype.displayTiddlers()|
|Description|Show tiddlers one at a time with automatic permalink, or always open tiddlers at top/bottom of page.|
This plugin allows you to configure TiddlyWiki to navigate more like a traditional multipage web site with only one tiddler displayed at a time.
!!!!!Documentation
>see [[SinglePageModePluginInfo]]
!!!!!Configuration
<<<
<<option chkSinglePageMode>> Display one tiddler at a time
><<option chkSinglePageKeepFoldedTiddlers>> Don't auto-close folded tiddlers
><<option chkSinglePagePermalink>> Automatically permalink current tiddler
<<option chkTopOfPageMode>> Always open tiddlers at the top of the page
<<option chkBottomOfPageMode>> Always open tiddlers at the bottom of the page
<<option chkSinglePageAutoScroll>> Automatically scroll tiddler into view (if needed)
Notes:
* The "display one tiddler at a time" option can also be //temporarily// set/reset by including a 'paramifier' in the document URL: {{{#SPM:true}}} or {{{#SPM:false}}}.
* If more than one display mode is selected, 'one at a time' display takes precedence over both 'top' and 'bottom' settings, and if 'one at a time' setting is not used, 'top of page' takes precedence over 'bottom of page'.
* When using Apple's Safari browser, automatically setting the permalink causes an error and is disabled.
<<<
!!!!!Revisions
<<<
2008.03.14 [2.8.2] in displayTiddler(), if editing specified tiddler, just move it to top/bottom of story *without* re-rendering (prevents discard of partial edits).
| Please see [[SinglePageModePluginInfo]] for previous revision details |
2005.08.15 [1.0.0] Initial Release. Support for BACK/FORWARD buttons adapted from code developed by Clint Checketts.
<<<
!!!!!Code
***/
//{{{
version.extensions.SinglePageMode= {major: 2, minor: 8, revision: 2, date: new Date(2008,3,14)};
//}}}
//{{{
config.paramifiers.SPM = { onstart: function(v) {
config.options.chkSinglePageMode=eval(v);
if (config.options.chkSinglePageMode && config.options.chkSinglePagePermalink && !config.browser.isSafari) {
config.lastURL = window.location.hash;
if (!config.SPMTimer) config.SPMTimer=window.setInterval(function() {checkLastURL();},1000);
}
} };
//}}}
//{{{
if (config.options.chkSinglePageMode==undefined) config.options.chkSinglePageMode=false;
if (config.options.chkSinglePageKeepFoldedTiddlers==undefined) config.options.chkSinglePageKeepFoldedTiddlers=true;
if (config.options.chkSinglePagePermalink==undefined) config.options.chkSinglePagePermalink=true;
if (config.options.chkTopOfPageMode==undefined) config.options.chkTopOfPageMode=false;
if (config.options.chkBottomOfPageMode==undefined) config.options.chkBottomOfPageMode=false;
if (config.options.chkSinglePageAutoScroll==undefined) config.options.chkSinglePageAutoScroll=true;
if (config.optionsDesc) {
config.optionsDesc.chkSinglePageMode="Display one tiddler at a time";
config.optionsDesc.chkSinglePageKeepFoldedTiddlers="Don't auto-close folded tiddlers";
config.optionsDesc.chkSinglePagePermalink="Automatically permalink current tiddler";
config.optionsDesc.chkSinglePageAutoScroll="Automatically scroll tiddler into view (if needed)";
config.optionsDesc.chkTopOfPageMode="Always open tiddlers at the top of the page";
config.optionsDesc.chkBottomOfPageMode="Always open tiddlers at the bottom of the page";
} else {
config.shadowTiddlers.AdvancedOptions += "\
\n<<option chkSinglePageMode>> Display one tiddler at a time \
\n<<option chkSinglePageKeepFoldedTiddlers>> Don't auto-close folded tiddlers \
\n<<option chkSinglePagePermalink>> Automatically permalink current tiddler \
\n<<option chkSinglePageAutoScroll>> Automatically scroll tiddler into view (if needed) \
\n<<option chkTopOfPageMode>> Always open tiddlers at the top of the page \
\n<<option chkBottomOfPageMode>> Always open tiddlers at the bottom of the page";
}
//}}}
//{{{
config.SPMTimer = 0;
config.lastURL = window.location.hash;
function checkLastURL()
{
if (!config.options.chkSinglePageMode)
{ window.clearInterval(config.SPMTimer); config.SPMTimer=0; return; }
if (config.lastURL == window.location.hash) return; // no change in hash
var tids=convertUTF8ToUnicode(decodeURIComponent(window.location.hash.substr(1))).readBracketedList();
if (tids.length==1) // permalink (single tiddler in URL)
story.displayTiddler(null,tids[0]);
else { // restore permaview or default view
config.lastURL = window.location.hash;
if (!tids.length) tids=store.getTiddlerText("DefaultTiddlers").readBracketedList();
story.closeAllTiddlers();
story.displayTiddlers(null,tids);
}
}
if (Story.prototype.SPM_coreDisplayTiddler==undefined)
Story.prototype.SPM_coreDisplayTiddler=Story.prototype.displayTiddler;
Story.prototype.displayTiddler = function(srcElement,title,template,animate,slowly)
{
var opt=config.options;
if (opt.chkSinglePageMode) {
// close all tiddlers except current tiddler, tiddlers being edited, and tiddlers that are folded (optional)
story.forEachTiddler(function(tid,elem) {
if ( tid==title
|| elem.getAttribute("dirty")=="true"
|| (opt.chkSinglePageKeepFoldedTiddlers && elem.getAttribute("folded")=="true"))
return;
story.closeTiddler(tid);
});
}
else if (opt.chkTopOfPageMode)
arguments[0]=null;
else if (opt.chkBottomOfPageMode)
arguments[0]="bottom";
if (opt.chkSinglePageMode && opt.chkSinglePagePermalink && !config.browser.isSafari) {
window.location.hash = encodeURIComponent(convertUnicodeToUTF8(String.encodeTiddlyLink(title)));
config.lastURL = window.location.hash;
document.title = wikifyPlain("SiteTitle") + " - " + title;
if (!config.SPMTimer) config.SPMTimer=window.setInterval(function() {checkLastURL();},1000);
}
var tiddlerElem=document.getElementById(story.idPrefix+title); // ==null unless tiddler is already display
if (tiddlerElem && tiddlerElem.getAttribute("dirty")=="true") { // editing... move tiddler without re-rendering
var isTopTiddler=(tiddlerElem.previousSibling==null);
if (!isTopTiddler && (opt.chkSinglePageMode || opt.chkTopOfPageMode))
tiddlerElem.parentNode.insertBefore(tiddlerElem,tiddlerElem.parentNode.firstChild);
else if (opt.chkBottomOfPageMode)
tiddlerElem.parentNode.insertBefore(tiddlerElem,null);
else this.SPM_coreDisplayTiddler.apply(this,arguments); // let CORE render tiddler
} else
this.SPM_coreDisplayTiddler.apply(this,arguments); // let CORE render tiddler
var tiddlerElem=document.getElementById(story.idPrefix+title);
if (tiddlerElem&&opt.chkSinglePageAutoScroll) {
var yPos=ensureVisible(tiddlerElem); // scroll to top of tiddler
var isTopTiddler=(tiddlerElem.previousSibling==null);
if (opt.chkSinglePageMode||opt.chkTopOfPageMode||isTopTiddler)
yPos=0; // scroll to top of page instead of top of tiddler
if (opt.chkAnimate) // defer scroll until 200ms after animation completes
setTimeout("window.scrollTo(0,"+yPos+")",config.animDuration+200);
else
window.scrollTo(0,yPos); // scroll immediately
}
}
if (Story.prototype.SPM_coreDisplayTiddlers==undefined)
Story.prototype.SPM_coreDisplayTiddlers=Story.prototype.displayTiddlers;
Story.prototype.displayTiddlers = function() {
// suspend single-page mode (and/or top/bottom display options) when showing multiple tiddlers
var opt=config.options;
var saveSPM=opt.chkSinglePageMode; opt.chkSinglePageMode=false;
var saveTPM=opt.chkTopOfPageMode; opt.chkTopOfPageMode=false;
var saveBPM=opt.chkBottomOfPageMode; opt.chkBottomOfPageMode=false;
this.SPM_coreDisplayTiddlers.apply(this,arguments);
opt.chkBottomOfPageMode=saveBPM;
opt.chkTopOfPageMode=saveTPM;
opt.chkSinglePageMode=saveSPM;
}
//}}}
/***
| Name:|SiteMapMacro|
| Author:|Simon Baird|
| Location:|http://simonbaird.com/mptw/#SiteMapMacro|
| Version:|1.0.3, 15-Mar-06|
!!Examples
See SiteMap and SliderSiteMap for example usage.
!!Parameters
* Name of tiddler to start at
* Max depth (a number)
* Format (eg, nested, see formats below)
* Don't show root flag (anything other than null turns it on)
* Tags - a string containing a bracketed list of tags that we are interested in
!!History
* 1.0.3 (15-Mar-06)
** added tag filtering
* 1.0.2 (15-Mar-06)
** Added json format and dontshowroot option
* 1.0.1 (9-Mar-06)
** Added selectable formats and fixed nested slider format
* 1.0.0 (8-Mar-06)
** first release
***/
//{{{
version.extensions.SiteMapMacro = {
major: 1,
minor: 0,
revision: 3,
date: new Date(2006,3,15),
source: "http://simonbaird.com/mptw/#SiteMapMacro"
};
config.macros.siteMap = {
formats: {
bullets: {
formatString: "%0[[%1]]\n%2",
indentString: "*"
},
// put this in your StyleSheet to make it look good.
// .sliderPanel { margin-left: 2em; }
sliders: {
formatString: "[[%1]]+++\n%2===\n\n",
formatStringLeaf: "[[%1]]\n"
},
openSliders: {
formatString: "[[%1]]++++\n%2===\n\n",
formatStringLeaf: "[[%1]]\n"
},
popups: {
formatString: "[[%1]]+++^\n%2===\n\n",
formatStringLeaf: "[[%1]]\n"
},
// these don't work too well
openPopups: {
formatString: "[[%1]]++++^\n%2===\n\n",
formatStringLeaf: "[[%1]]\n"
},
// this is a little nuts but it works
json: {
formatString: '\n%0{"%1":[%2\n%0]}',
formatStringLeaf: '\n%0"%1"',
indentString: " ",
separatorString: ","
}
},
defaultFormat: "bullets",
treeTraverse: function(title,depth,maxdepth,format,dontshowroot,tags,excludetags) {
var tiddler = store.getTiddler(title);
var tagging = store.getTaggedTiddlers(title);
if (dontshowroot)
depth = 0;
var indent = "";
if (this.formats[format].indentString)
for (var j=0;j<depth;j++)
indent += this.formats[format].indentString;
var childOutput = "";
if (!maxdepth || depth < parseInt(maxdepth))
for (var i=0;i<tagging.length;i++)
if (tagging[i].title != title) {
if (this.formats[format].separatorString && i != 0)
childOutput += this.formats[format].separatorString;
childOutput += this.treeTraverse(tagging[i].title,depth+1,maxdepth,format,null,tags,excludetags);
}
if (childOutput == "" && (
(tags && tags != "" && !tiddler.tags.containsAll(tags.readBracketedList())) ||
(excludetags && excludetags != "" && tiddler.tags.containsAny(excludetags.readBracketedList()))
)
) {
// so prune it cos it doesn't have the right tags and neither do any of it's children
return "";
}
if (dontshowroot)
return childOutput;
if (this.formats[format].formatStringLeaf && childOutput == "") {
// required for nestedSliders
return this.formats[format].formatStringLeaf.format([indent,title,childOutput]);
}
return this.formats[format].formatString.format([indent,title,childOutput]);
},
handler: function (place,macroName,params,wikifier,paramString,tiddler) {
wikify(this.treeTraverse(
params[0] && params[0] != '.' ? params[0] : tiddler.title, 1,
params[1] && params[1] != '.' ? params[1] : null, // maxdepth
params[2] && params[2] != '.' ? params[2] : this.defaultFormat, // format
params[3] && params[3] != '.' ? params[3] : null, // dontshowroot
params[4] && params[4] != '.' ? params[4] : null, // tags
params[5] && params[5] != '.' ? params[5] : null // excludetags
),place);
}
}
//}}}
@@font-family: Verdana, sans-serif;sang og fortælletimer på HU ~TiddlyWiki@@
@@font-size: 1.5em;''Sang 08/09''@@
/***
|''Name:''|SlideShowPlugin|
|''Description:''|Creates a slide show from a group of tiddlers|
|''Author:''|Paulo Soares|
|''Version:''|2.0.2|
|''Date:''|2009-03-26|
|''Source:''|http://www.math.ist.utl.pt/~psoares/addons.html|
|''Documentation:''|[[SlideShowPlugin Documentation|SlideShowPluginDoc]]|
|''License:''|[[Creative Commons Attribution-Share Alike 3.0 License|http://creativecommons.org/licenses/by-sa/3.0/]]|
|''~CoreVersion:''|2.5.0|
***/
//{{{
if(!version.extensions.SlideShowPlugin) { //# ensure that the plugin is only installed once
version.extensions.SlideShowPlugin = {installed: true};
(function($) {
config.macros.slideShow = {};
config.macros.slideShow.text = {
label: "slide show", tooltip: "Start slide show",
quit: {label: "x", tooltip: "Quit the slide show"},
firstSlide: {label: "<<", tooltip: "Go to first slide"},
previous: {label: "<", tooltip: "Go back"},
next: {label: ">", tooltip: "Advance"},
lastSlide: {label: ">>", tooltip: "Go to last slide"},
goto: {label: "Go to slide:"},
resetClock: {tooltip: "Reset the clock"},
clockFormat: "0hh:0mm:0ss",
overlay: "overlay"
};
config.macros.slideShow.handler = function(place,macroName,params,wikifier,paramString,tiddler){
var args = paramString.parseParams(null,null,true);
this.label = getParam(args,"label",this.text.label);
this.tooltip = getParam(args,"tooltip",this.text.tooltip);
var onclick = function(){config.macros.slideShow.onClick(tiddler,paramString);};
createTiddlyButton(place,this.label,this.tooltip,onclick);
}
config.macros.slideShow.onClick = function(tiddler,paramString) {
var i, args = paramString.parseParams(null,null,true);
var argsArray = paramString.readMacroParams();
this.clicks = ($.inArray('noClicks',argsArray) < 0);
this.keyboard = ($.inArray('noKeyboard',argsArray) < 0);
this.showAll = ($.inArray('showAll',argsArray) > -1);
this.cycle = ($.inArray('cycle',argsArray) > -1);
this.overlays = ($.inArray('noOverlays',argsArray) < 0);
this.theme = getParam(args,"theme");
this.tag = getParam(args,"tag");
this.sort = getParam(args,"sort");
this.auto = getParam(args,"auto",0);
this.header = getParam(args,"header",tiddler.title);
this.footer = getParam(args,"footer","");
this.clock = getParam(args,"clock");
this.blocked = 0;
if(this.clock){
var startTime = new Date(0);
this.clockCorrection=startTime.getTimezoneOffset()*60000;
startTime = new Date();
this.clockMultiplier = 1;
this.clockInterval = 0;
var clockType= parseFloat(this.clock);
if(clockType < 0) {
this.clockMultiplier = -1;
this.clockInterval = -clockType*60000;
} else if(clockType == 0){
this.clockCorrection = 0;
startTime = new Date(0);
}
this.clockStartTime=startTime.getTime();
}
this.slides = [];
this.openTiddlers = [];
$("#tiddlerDisplay > *").each(function(){config.macros.slideShow.openTiddlers.push($(this).attr('tiddler'))});
var count = 0;
this.slideTOC=[];
if(this.tag){
var content = store.getTaggedTiddlers(this.tag,this.sort);
for (i=0; i<content.length; i++){
count++;
this.buildTOC(count,content[i].title);
this.slides.push(content[i].title);
}
} else {
var content = tiddler.text.readBracketedList();
for (i=0; i<content.length; i++){
if(store.tiddlerExists(content[i])){
count++;
this.buildTOC(count,content[i]);
this.slides.push(content[i]);
}
}
}
this.nSlides = this.slides.length;
if(this.nSlides==0) return;
clearMessage();
this.toggleSlideStyles();
if(!this.showAll){
//Attach the key and mouse listeners
if(this.keyboard && !$("#tiddlerDisplay").hasClass("noKeyboard")) $(document).bind("keyup",config.macros.slideShow.keys);
if(this.clicks){
$("#displayArea").bind("mousedown",config.macros.slideShow.clicker);
document.oncontextmenu = function(){return false;}
}
if(this.clock) this.slideClock=setInterval(this.setClock, 1000);
if(this.auto>0){
this.autoAdvance=setInterval(config.macros.slideShow.next, this.auto*1000);
}
this.showSlide(1);
} else {
story.closeAllTiddlers();
story.displayTiddlers(null,this.slides,this.viewTemplate);
$("#slideHeader").text(this.header);
$("#slideFooter").text(this.footer);
$(document).bind("keyup",config.macros.slideShow.endSlideShow);
}
return false;
}
config.macros.slideShow.buildNavigator = function() {
//Create the navigation bar
var i, slidefooter = $("#controlBar")[0];
if(!slidefooter) return;
$(slidefooter).addClass("slideFooterOff noClicks");
var navigator = createTiddlyElement(slidefooter,"SPAN","navigator");
//Make it so that when the footer is hovered over the class will change to make it visible
$(slidefooter).bind("mouseenter mouseleave", function(e){$(this).toggleClass("slideFooterOff");});
//Create the control buttons for the navigation
createTiddlyButton(navigator,this.text.firstSlide.label,this.text.firstSlide.tooltip,this.firstSlide,"button");
createTiddlyButton(navigator,this.text.previous.label,this.text.previous.tooltip,this.previous,"button");
createTiddlyButton(navigator,this.text.quit.label,this.text.quit.tooltip,this.endSlideShow,"button");
createTiddlyButton(navigator,this.text.next.label,this.text.next.tooltip,this.next,"button");
createTiddlyButton(navigator,this.text.lastSlide.label,this.text.lastSlide.tooltip,this.lastSlide,"button");
if(this.clock){
if(this.clock == 0){
createTiddlyElement(navigator,"SPAN","slideClock");
} else {
createTiddlyButton(navigator," ",this.text.resetClock.tooltip,this.resetClock,"button","slideClock");
}
this.setClock();
}
var index = createTiddlyElement(slidefooter,"SPAN","slideCounter");
index.onclick = this.toggleTOC;
var toc = createTiddlyElement(slidefooter,"SPAN","toc");
var tocLine;
for(i=0; i<this.slideTOC.length; i++){
$(toc).append(this.slideTOC[i][2].replace(/H[123456]/gi,"div"));
tocLine = toc.lastChild;
$(tocLine).addClass("tocLevel"+this.slideTOC[i][1]).css("cursor", "pointer").hover(function () {
$(this).addClass("highlight");}, function () {
$(this).removeClass("highlight");});
tocLine.setAttribute("slide",this.slideTOC[i][0]);
$(tocLine).bind("click",config.macros.slideShow.showSlideFromTOC);
}
//Input box to jump to specific slide
var tocItem = createTiddlyElement(toc,"DIV",null,"tocJumpItem",this.text.goto.label);
var tocJumpInput = createTiddlyElement(tocItem,"INPUT","jumpInput");
tocJumpInput.type="text";
$(tocJumpInput).bind("keyup",config.macros.slideShow.jumpToSlide);
}
config.macros.slideShow.buildTOC = function(count,tiddler) {
var text = wikifyStatic(store.getTiddlerText(tiddler));
var matches = text.match(/<h[123456]>.*?<\/h[123456]>/mgi);
if(matches){
for (var j=0; j<matches.length; j++){
this.slideTOC.push([count,matches[j].charAt(2),matches[j]]);
}
}
}
config.macros.slideShow.showSlideFromTOC = function(e) {
var cm = config.macros.slideShow;
var slide = parseInt(e.target.getAttribute('slide'));
$("#toc").hide();
cm.showSlide(slide);
return false;
}
config.macros.slideShow.toggleTOC = function(){
$("#toc").toggle();
$("#jumpInput").focus().val('');
}
config.macros.slideShow.isInteger = function(s){
for (var i = 0; i < s.length; i++){
// Check that current character is number
var c = s.charAt(i);
if (((c < "0") || (c > "9"))) return false;
}
// All characters are numbers
return true;
}
config.macros.slideShow.jumpToSlide = function(e){
var cm = config.macros.slideShow;
if(e.which==13){
var input= $("#jumpInput").val();
if(cm.isInteger(input) && input>0 && input<=cm.nSlides){
$("#toc").hide();
cm.showSlide(input);
} else {$("#jumpInput").val('');}
}
return false;
}
config.macros.slideShow.toggleSlideStyles = function(){
var contentWrapper = $('#contentWrapper');
if(contentWrapper.hasClass("slideShowMode")){
refreshPageTemplate();
removeStyleSheet("SlideShowStyleSheet");
if(this.theme) removeStyleSheet(this.theme);
} else {
if(this.theme && store.getTiddlerText(this.theme+"##PageTemplate")){
refreshPageTemplate(this.theme+"##PageTemplate");
} else {
refreshPageTemplate("SlideShowPageTemplate");
}
if(this.theme && store.getTiddlerText(this.theme+"##ViewTemplate")){
this.viewTemplate = this.theme+"##ViewTemplate";
} else {
this.viewTemplate = "SlideShowViewTemplate";
}
setStylesheet(store.getRecursiveTiddlerText("SlideShowStyleSheet"),"SlideShowStyleSheet");
if(this.theme){
var theme = store.getRecursiveTiddlerText(this.theme+"##StyleSheet");
if(theme) setStylesheet(theme,this.theme);
}
this.buildNavigator();
$("#slideBlanker").hide();
}
contentWrapper.toggleClass("slideShowMode");
}
config.macros.slideShow.showSlide = function(n){
if(this.cycle) {
if(n>this.nSlides) {
n = 1;
} else if(n<1) {
n = this.nSlides;
}
} else {
if(n>this.nSlides || n<1) return;
}
story.closeAllTiddlers();
story.displayTiddler(null,this.slides[n-1],this.viewTemplate);
$("#slideHeader").text(this.header);
$("#slideFooter").text(this.footer);
this.curSlide = n;
$("#slideCounter").text(this.curSlide+"/"+this.nSlides);
if(this.overlays){
var contents = $(".viewer *");
this.numOverlays = 1;
while(1){
if(contents.hasClass(this.text.overlay+this.numOverlays)){
this.numOverlays++;
} else {break;}
}
this.numOverlays--;
this.showOverlay(0);
}
}
config.macros.slideShow.showOverlay = function(n){
var i, set, cm = config.macros.slideShow;
if(!cm.overlays || cm.numOverlays == 0 || n<0 || n>cm.numOverlays){return;}
for(i=1; i<n; i++){
set = $(".viewer "+"."+cm.text.overlay+i);
set.removeClass("currentOverlay nextOverlay");
set.addClass("previousOverlay");
}
set = $(".viewer "+"."+cm.text.overlay+n);
set.removeClass("previousOverlay nextOverlay");
set.addClass("currentOverlay");
for(i=n; i<config.macros.slideShow.numOverlays; i++){
set = $(".viewer "+"."+cm.text.overlay+(i+1));
set.removeClass("previousOverlay currentOverlay");
set.addClass("nextOverlay");
}
cm.curOverlay = n;
}
config.macros.slideShow.firstSlide = function(){
config.macros.slideShow.showSlide(1);
}
config.macros.slideShow.lastSlide = function(){
config.macros.slideShow.showSlide(config.macros.slideShow.nSlides);
}
config.macros.slideShow.next = function(){
var cm = config.macros.slideShow;
if(!cm.overlays || cm.numOverlays == 0 || cm.curOverlay == cm.numOverlays) {
cm.showSlide(cm.curSlide+1);
} else {
cm.showOverlay(cm.curOverlay+1);
}
}
config.macros.slideShow.previous = function(){
var cm = config.macros.slideShow;
if(!cm.overlays || cm.numOverlays == 0 || cm.curOverlay == 0) {
cm.showSlide(cm.curSlide-1);
cm.showOverlay(cm.numOverlays);
} else {
cm.showOverlay(cm.curOverlay-1);
}
}
config.macros.slideShow.endSlideShow=function(){
var cm = config.macros.slideShow;
if(cm.autoAdvance) {clearInterval(cm.autoAdvance);}
if(this.clock) clearInterval(this.slideClock);
story.closeAllTiddlers();
cm.toggleSlideStyles();
story.displayTiddlers(null,cm.openTiddlers,DEFAULT_VIEW_TEMPLATE);
$(document).unbind();
document.oncontextmenu = function(){};
}
// 'keys' code adapted from S5 which in turn was adapted from MozPoint (http://mozpoint.mozdev.org/)
config.macros.slideShow.keys = function(key) {
var cm = config.macros.slideShow;
switch(key.which) {
case 32: // spacebar
if(cm.auto>0 && cm.blocked==0){
if(cm.autoAdvance){
clearInterval(cm.autoAdvance);
cm.autoAdvance = null;
} else {
cm.autoAdvance=setInterval(cm.next, cm.auto*1000);
}
} else {
if(cm.blocked==0) cm.next();
}
break;
case 34: // page down
if(cm.blocked==0) cm.showSlide(cm.curSlide+1);
break;
case 39: // rightkey
if(cm.blocked==0) cm.next();
break;
case 40: // downkey
if(cm.blocked==0) cm.showOverlay(cm.numOverlays);
break;
case 33: // page up
if(cm.blocked==0) cm.showSlide(cm.curSlide-1);
break;
case 37: // leftkey
if(cm.blocked==0) cm.previous();
break;
case 38: // upkey
if(cm.blocked==0) cm.showOverlay(0);
break;
case 36: // home
if(cm.blocked==0) cm.firstSlide();
break;
case 35: // end
if(cm.blocked==0) cm.lastSlide();
break;
case 27: // escape
cm.endSlideShow();
break;
case 66: // B
$("#slideBlanker").toggle();
cm.blocked = (cm.blocked +1)%2;
break;
}
return false;
}
config.macros.slideShow.isParentOrSelf = function(element,curClass) {
if(element == null || element.nodeName=='BODY') return false;
else if($(element).hasClass(curClass)) return true;
else return this.isParentOrSelf(element.parentNode, curClass);
}
config.macros.slideShow.clicker = function(e) {
var cm = config.macros.slideShow;
if(cm.blocked==1 || e.target.getAttribute('href') != null || cm.isParentOrSelf(e.target,'noClicks')){
return true;
}
if((!e.which && e.button == 1) || e.which == 1) {
cm.next();
}
if((!e.which && e.button == 2) || e.which == 3) {
cm.previous();
}
return false;
}
config.macros.slideShow.setClock = function(){
var cm = config.macros.slideShow;
var actualTime = new Date();
var newTime = actualTime.getTime() - cm.clockStartTime;
newTime = cm.clockMultiplier*newTime+cm.clockInterval+cm.clockCorrection;
actualTime.setTime(newTime);
newTime = actualTime.formatString(cm.text.clockFormat);
$("#slideClock").text(newTime);
}
config.macros.slideShow.resetClock = function(){
var cm = config.macros.slideShow;
if(cm.clock == 0) return;
var time = new Date(0);
if(cm.clockStartTime>time){
var startTime = new Date();
cm.clockStartTime=startTime.getTime();
}
}
config.shadowTiddlers.SlideShowPageTemplate="<!--{{{-->\n<div id='displayArea'>\n<div id='slideBlanker'></div>\n<div id='slideHeader'></div>\n<div id='tiddlerDisplay'></div>\n<div id='slideFooter'></div>\n<div id='controlBar'></div>\n</div>\n<!--}}}-->";
config.shadowTiddlers.SlideShowViewTemplate="<!--{{{-->\n<div class='viewer' macro='view text wikified'></div>\n<!--}}}-->";
config.shadowTiddlers.SlideShowStyleSheet="/*{{{*/\n#slideBlanker{\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n z-index: 90; \n background-color: #000;\n opacity: 0.9;\n filter: alpha(opacity=90)\n}\n\n#backstageShow, #contentWrapper.slideShowMode .comment{\n display: none !important\n}\n\n#contentWrapper.slideShowMode .nextOverlay{\n visibility: hidden\n}\n\n#contentWrapper.slideShowMode .previousOverlay, #contentWrapper.slideShowMode .currentOverlay{\n visibility: visible\n}\n\n#contentWrapper.slideShowMode #displayArea{\n font-size: 250%;\n margin: 0 !important;\n padding: 0\n}\n\n#controlBar{\n position: fixed;\n bottom: 2px;\n right: 2px;\n width: 100%;\n text-align: right\n}\n\n#controlBar .button{\n margin: 0 0.25em;\n padding: 0 0.25em\n}\n\n#slideHeader{\n font-size: 200%;\n font-weight: bold\n}\n\n#slideFooter{\n position: absolute;\n bottom: 2px\n}\n\n.slideFooterOff #navigator{\n visibility: hidden\n}\n\n#slideClock{\n margin: 0 5px 0 5px\n}\n\n#slideCounter{\n cursor: pointer\n}\n\n#toc{\n display: none;\n position: absolute;\n font-size: .75em;\n bottom: 2em;\n right: 0;\n background: #fff;\n border: 1px solid #000;\n text-align: left\n}\n\n.tocJumpItem input{\n margin-left: 1em;\n width: 3em\n}\n\n.tocLevel1{\n font-size: .8em\n}\n\n.tocLevel2{\n margin-left: 1em;\n font-size: .75em\n}\n\n.tocLevel3{\n margin-left: 2em;\n font-size: .7em\n}\n\n.tocLevel4{\n margin-left: 3em;\n font-size: .65em\n}\n\n.tocLevel5{\n margin-left: 4em;\n font-size: .6em\n}\n\n.tocLevel6{\n margin-left: 5em;\n font-size: .55em\n}\n/*}}}*/";
config.shadowTiddlers.SlideShowPluginDoc="The documentation is available [[here|http://www.math.ist.utl.pt/~psoares/addons.html#SlideShowPluginDoc]].";
})(jQuery)
}
//}}}
//{{{
config.macros.slideShow.text = {
label: "Slides", tooltip: "Vis en præsentation",
quit: {label: "x", tooltip: "Stop præsentationen"},
firstSlide: {label: "<<", tooltip: "Første slide"},
previous: {label: "<", tooltip: "Foregående"},
next: {label: ">", tooltip: "Næste"},
lastSlide: {label: ">>", tooltip: "Sidste slide"},
goto: {label: "Gå til:"},
resetClock: {tooltip: "Genstart ur"},
clockFormat: "0hh:0mm:0ss",
overlay: "overlag"
}
//}}}
<<siteMap [[Skriv også titlen på dit nye hovedemne her]] . sliders>>
/***
|Name|SnapshotPlugin|
|Source|http://www.TiddlyTools.com/#SnapshotPlugin|
|Documentation|http://www.TiddlyTools.com/#SnapshotPluginInfo|
|Version|1.1.1|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides||
|Description|save or print HTML+CSS image of rendered document content|
|Status|ALPHA - DO NOT DISTRIBUTE|
This plugin provides a macro as well as tiddler toolbar commands to create a file or browser window containing the //rendered// CSS-and-HTML that is currently being displayed for selected elements of the current document.
!!!!!Documentation
>see [[SnapshotPluginInfo]]
!!!!!Configuration
<<<
<<option chkSnapshotHTMLOnly>> output HTML only (omit CSS)
<<<
!!!!!Revisions
<<<
2008.05.16 [1.1.1] added try..catch around addEvent/removeEvent calls to avoid error in Opera
2008.04.28 [1.1.0] removed 'viewerHTML' from 'ask' droplist and replaced with toggle for "output HTML only". Removed 'noCSS' parameter and replaced with config.options.chkSnapshotHTMLOnly global option. Added "select a tiddler..." to 'ask' droplist
2008.04.24 [1.0.1] in saveSnap(), convert output from Unicode to UTF before passing to saveFile(). Fixes "unknown name" error in IE's file.Write() function. Added viewerHTML to 'ask' droplist.
2008.04.21 [1.0.0] initial release - derived from [[NewDocumentPlugin]] with many improvements, including: "ask for ID" using droplist of available DOM elements, use "<base href=...>" for correctly resolving image references, wrap 'viewer only' output in class="tiddler viewer" for proper application of inherited CSS styles, snapshotSave and snapshotPrint tiddler toolbar command definitions, and more...
<<<
!!!!!Code
***/
//{{{
version.extensions.SnapshotPlugin= {major: 1, minor: 1, revision: 1, date: new Date(2008,5,16)};
if (config.options.chkSnapshotHTMLOnly===undefined) config.options.chkSnapshotHTMLOnly=false;
config.macros.snapshot = {
snapLabel: "save a snapshot",
printLabel: "print a snapshot",
snapPrompt: "save an HTML image of rendered content",
printPrompt: "print an HTML image of rendered content",
hereID: "here",
viewerID: "viewer",
storyID: "story",
allID: "all",
askID: "ask",
askTiddlerID: "askTiddler",
askDOMID: "askDOM",
askMsg: "select an element...",
hereItem: "tiddler: '%0'",
viewerItem: "tiddler: '%0' (content only)",
storyItem: "story column",
allItem: "entire document",
tiddlerItem: "select a tiddler...",
IDItem: "select a DOM element by ID...",
HTMLItem: "[%0] output HTML only (omit CSS)",
fileMsg: "select or enter a target path/filename",
defaultFilename: "snapshot.html",
okmsg: "snapshot written to %0",
failmsg: "An error occurred while creating %0",
handler: function(place,macroName,params,wikifier,paramString,tiddler) {
var printing=params[0]&¶ms[0]=="print"; if (printing) params.shift();
params = paramString.parseParams("anon",null,true,false,false);
var id=getParam(params,"id","here");
var label=getParam(params,"label",printing?this.printLabel:this.snapLabel);
var prompt=getParam(params,"prompt",printing?this.printPrompt:this.snapPrompt);
var btn=createTiddlyButton(place,label,prompt, function(ev){
this.setAttribute("snapID",this.getAttribute("startID"));
config.macros.snapshot.go(this,ev)
});
btn.setAttribute("startID",id);
btn.setAttribute("snapID",id);
btn.setAttribute("printing",printing?"true":"false");
btn.setAttribute("HTMLOnly",config.options.chkSnapshotHTMLOnly?"true":"false");
},
go: function(here,ev) {
var cms=config.macros.snapshot; // abbreviation
var id=here.getAttribute("snapID");
var printing=here.getAttribute("printing")=="true";
var HTMLOnly=here.getAttribute("HTMLOnly")=="true";
if (id==cms.askID||id==cms.askTiddlerID||id==cms.askDOMID) {
cms.askForID(here,ev);
} else {
// get element
if (id==cms.storyID) id="tiddlerDisplay";
if (id==cms.allID) id="contentWrapper";
var snapElem=document.getElementById(id);
if (id==cms.hereID || id==cms.viewerID)
var snapElem=story.findContainingTiddler(here);
if (snapElem && hasClass(snapElem,"tiddler") && (id==cms.viewerID || HTMLOnly)) {
// find viewer class element within tiddler element
var nodes=snapElem.getElementsByTagName("*");
for (var i=0; i<nodes.length; i++)
if (hasClass(nodes[i],"viewer")) { snapElem=nodes[i]; break; }
}
if (!snapElem) // not in a tiddler or no viewer element or unknown ID
{ e.cancelBubble=true; if(e.stopPropagation)e.stopPropagation(); return(false); }
// write or print snapshot
var out=cms.getsnap(snapElem,id,printing,HTMLOnly);
if (printing) cms.printsnap(out); else cms.savesnap(out);
}
return false;
},
askForID: function(here,ev) {
var ev = ev ? ev : window.event;
var cms=config.macros.snapshot; // abbreviation
var id=here.getAttribute("snapID");
var indent='\xa0\xa0\xa0\xa0';
var p=Popup.create(here); if (!p) return false; p.className+=' sticky smallform';
var s=createTiddlyElement(p,'select'); s.button=here;
if (id==cms.askID) {
s.options[s.length]=new Option(cms.askMsg,cms.askID);
var tid=story.findContainingTiddler(here);
if(tid) {
var title=tid.getAttribute("tiddler");
if (here.getAttribute("HTMLOnly")!="true")
s.options[s.length]=new Option(indent+cms.hereItem.format([title]),cms.hereID);
s.options[s.length]=new Option(indent+cms.viewerItem.format([title]),cms.viewerID);
}
s.options[s.length]=new Option(indent+cms.tiddlerItem,cms.askTiddlerID);
s.options[s.length]=new Option(indent+cms.IDItem,cms.askDOMID);
s.options[s.length]=new Option(indent+cms.storyItem,"tiddlerDisplay");
s.options[s.length]=new Option(indent+cms.allItem,"contentWrapper");
}
if (id==cms.askDOMID) {
s.options[s.length]=new Option(cms.IDItem,cms.askDOMID);
var elems=document.getElementsByTagName("*");
var ids=[];
for (var i=0;i<elems.length;i++)
if (elems[i].id.length && elems[i].className!="animationContainer")
ids.push(elems[i].id);
ids.sort();
for (var i=0;i<ids.length;i++) s.options[s.length]=new Option(indent+ids[i],ids[i]);
}
if (id==cms.askTiddlerID) {
s.options[s.length]=new Option(cms.tiddlerItem,cms.askTiddlerID);
var elems=document.getElementsByTagName("div");
var ids=[];
for (var i=0;i<elems.length;i++) { var id=elems[i].id;
if (id.length && id.substr(0,story.idPrefix.length)==story.idPrefix && id!="tiddlerDisplay")
ids.push(id);
}
ids.sort();
for (var i=0;i<ids.length;i++) s.options[s.length]=new Option(indent+ids[i].substr(story.idPrefix.length),ids[i]);
}
s.options[s.length]=new Option(cms.HTMLItem.format([here.getAttribute("HTMLOnly")=="true"?"\u221a":"_"]),cms.HTMLItem);
s.onchange=function(ev){
var ev = ev ? ev : window.event;
var cms=config.macros.snapshot; // abbreviation
var here=this.button;
if (this.value==cms.HTMLItem) {
config.options.chkSnapshotHTMLOnly=!config.options.chkSnapshotHTMLOnly;
here.setAttribute("HTMLOnly",config.options.chkSnapshotHTMLOnly?"true":"false");
config.macros.option.propagateOption("chkSnapshotHTMLOnly","checked",
config.options.chkSnapshotHTMLOnly,"input");
} else
here.setAttribute("snapID",this.value);
config.macros.snapshot.go(here,ev);
return false;
};
Popup.show(p,false);
ev.cancelBubble=true;
if(ev.stopPropagation)ev.stopPropagation();
return false;
},
getpath: function() {
// get current path
var path=getLocalPath(window.location.href);
var slashpos=path.lastIndexOf("/");
if (slashpos==-1) slashpos=path.lastIndexOf("\\");
if (slashpos!=-1) path=path.substr(0,slashpos+1); // trim filename
return path;
},
getsnap: function(snapElem,id,printing,HTMLOnly) {
var cms=config.macros.snapshot; // abbreviation
var out="";
out+="<html><head>\n";
if (printing)
out+='<base href="file:///'+cms.getpath().replace(/\\/g,'/')+'"></base>\n';
if (!HTMLOnly) {
var styles=document.getElementsByTagName("style");
for(var i=0; i < styles.length; i++) {
out+="<style>\n";
out+="/* stylesheet="+styles[i].getAttribute("id")+" */\n";
out+=styles[i].innerHTML+"\n\n";
out+="</style>\n";
}
}
out+="</head><body>\n\n<div"+(id==cms.viewerID?" class='tiddler viewer'>":">");
out+=snapElem.innerHTML;
out+="</div>\n\n</body>\n";
out+="</html>";
return out;
},
printsnap: function(out) {
var win=window.open("","_blank","");
win.document.open();
win.document.writeln(out);
win.document.close();
win.focus(); // bring to front
win.print(); // trigger print dialog
},
savesnap: function(out) {
var cms=config.macros.snapshot; // abbreviation
// make sure we are local
if (window.location.protocol!="file:")
{ alert(config.messages.notFileUrlError); return; }
var target=cms.askForFilename(cms.fileMsg,cms.getpath(),cms.defaultFilename);
if (!target) return; // cancelled by user
// if specified file does not include a path, assemble fully qualified path and filename
var slashpos=target.lastIndexOf("/");
if (slashpos==-1) slashpos=target.lastIndexOf("\\");
if (slashpos==-1) target=target+cms.defaultFilename;
var link="file:///"+target.replace(/\\/g,'/'); // link for message text
var ok=saveFile(target,convertUnicodeToUTF8(out));
var msg=ok?cms.okmsg.format([target]):cms.failmsg.format([target]);
clearMessage(); displayMessage(msg,link);
},
askForFilename: function(msg,path,file) {
if(window.Components) { // moz
try {
netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
var nsIFilePicker = window.Components.interfaces.nsIFilePicker;
var picker = Components.classes['@mozilla.org/filepicker;1'].createInstance(nsIFilePicker);
picker.init(window, msg, nsIFilePicker.modeSave);
var thispath = Components.classes['@mozilla.org/file/local;1'].createInstance(Components.interfaces.nsILocalFile);
thispath.initWithPath(path);
picker.displayDirectory=thispath;
picker.defaultExtension='html';
picker.defaultString=file;
picker.appendFilters(nsIFilePicker.filterAll|nsIFilePicker.filterText|nsIFilePicker.filterHTML);
if (picker.show()!=nsIFilePicker.returnCancel) var result=picker.file.persistentDescriptor;
}
catch(e) { alert('error during local file access: '+e.toString()) }
}
else { // IE
try { // XP/Vista only
var s = new ActiveXObject('UserAccounts.CommonDialog');
s.Filter='All files|*.*|Text files|*.txt|HTML files|*.htm;*.html|';
s.FilterIndex=3; // default to HTML files;
s.InitialDir=path;
s.FileName=file;
if (s.showOpen()) var result=s.FileName;
}
catch(e) { var result=prompt(msg,path+file); } // fallback for non-XP IE
}
return result;
}
};
//}}}
// // TOOLBAR DEFINITIONS
//{{{
config.commands.snapshotSave = {
text: "snap",
tooltip: config.macros.snapshot.snapPrompt,
handler: function(ev,src,title) {
src.setAttribute("snapID","ask");
src.setAttribute("printing","false");
src.setAttribute("HTMLOnly",config.options.chkSnapshotHTMLOnly?"true":"false");
config.macros.snapshot.go(src,ev);
return false;
}
};
config.commands.snapshotPrint = {
text: "print",
tooltip: config.macros.snapshot.printPrompt,
handler: function(ev,src,title) {
src.setAttribute("snapID","ask");
src.setAttribute("printing","true");
src.setAttribute("HTMLOnly",config.options.chkSnapshotHTMLOnly?"true":"false");
config.macros.snapshot.go(src,ev);
return false;
}
};
//}}}
// // COPIED FROM [[StickyPopupPlugin]] TO ELIMINATE PLUGIN DEPENDENCY
//{{{
if (config.options.chkStickyPopups==undefined) config.options.chkStickyPopups=false;
Popup.stickyPopup_onDocumentClick = function(ev)
{
// if click is in a sticky popup, ignore it so popup will remain visible
var e = ev ? ev : window.event; var target = resolveTarget(e);
var p=target; while (p) {
if (hasClass(p,"popup") && (hasClass(p,"sticky")||config.options.chkStickyPopups)) break;
else p=p.parentNode;
}
if (!p) // not in sticky popup (or sticky popups disabled)... use normal click handling
Popup.onDocumentClick(ev);
return true;
};
try{removeEvent(document,"click",Popup.onDocumentClick);}catch(e){};
try{addEvent(document,"click",Popup.stickyPopup_onDocumentClick);}catch(e){};
//}}}
/***
|Name|SnapshotPluginInfo|
|Source|http://www.TiddlyTools.com/#SnapshotPlugin|
|Documentation|http://www.TiddlyTools.com/#SnapshotPluginInfo|
|Version|1.1.1|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|documentation|
|Requires||
|Overrides||
|Description|Documentation for SnapshotPlugin|
This plugin provides a macro as well as tiddler toolbar commands that creates a file or opens a new browser window containing the //rendered// HTML and CSS style definitions that are being displayed for selected elements of the current document.
!!!!!Usage:
<<<
As a macro embedded in tiddler content:
{{{
<<snapshot print label:text prompt:text id:elementID|here|viewer|story|all|ask>
}}}
where:
*''print'' //(optional)//<br>when present, causes the snapshot output to be directed to a new browser tab/window instead of saving it to a file. In addition, the print dialog for that tab/window is automatically invoked.
*''label'' //(optional)//<br>is the text to be displayed for the command link generated by the macro
*''prompt'' //(optional)//<br>is the 'tool tip' message displayed when you mouseover the command link
*''id:...'' //(optional)//<br>specifies the document element to be captured, and can be one of:
**''elementID''<br>is a specific DOM element ID, such as "displayArea", "mainMenu", "contentWrapper", etc.
**''here''<br>the containing tiddler in which the macro (or toolbar command) occurs, including the tiddler title and subtitle (date/time/author) information.
**''viewer''<br>same as ''here'', but omits the tiddler title, subtitle and toolbar elements (i.e., it includes //only// the content of the tiddler)
**''story''<br>selects all currently displayed tiddlers (i.e., the 'story column')
**''all''<br>selects the entire document contents, including page header, main menu and sidebar displays
**''ask''<br>when the snapshot command link is clicked, a droplist is displayed so you can choose from several pre-defined elements: "current tiddler", "story column", or "entire document", or "DOM element ID..." When DOM element ID is chosen, the droplist is refreshed to show the individual ID's for all currently rendered DOM elements (at least, the ones that have ID's). For any given DOM element ID, only the portions of the document that are contained //within// the specified DOM element will be transcribed to the resulting snapshot or print output.
//''NOTE: when no parameters are specified, the macro creates a snapshot file using the containing tiddler as the default element.'' (e.g., equivalent to {{{<<snapshot id:here>>}}}//
The snapshot/print functions can also be embedded as tiddler toolbar commands in [[ViewTemplate]]:
{{{
<span class='toolbar' macro='toolbar snapshotSave'></span>
<span class='toolbar' macro='toolbar snapshotPrint'></span>
}}}
* when invoked via toolbar commands, the "id:ask" option is automatically applied, and a droplist of elements to choose from is displayed.
Please note that, although the snapshot/print that is created using the HTML+CSS of the displayed content, ''there is NO javascript code'' written into the snapshot. As a result, the snapshot only ''reproduces the //appearance// of the displayed content, allowing you to //view// or //print// the result'', but does not permit you to interact with it in other ways.
For example, even simple processing (such as mouseover highlighting) will not function from the snapshot. You can't click a TiddlyLink to open other tiddlers, because A) there is no code that handles the click and B) there is no underlying 'storeArea' (and core code) to retrieve and render anything! You also can't use ANY command links, since these also require javascript code (and the core) to operate.
<<<
!!!!!Examples:
<<<
{{{<<snapshot>>}}}: <<snapshot>>
{{{<<snapshot id:mainMenu>>}}}: <<snapshot id:mainMenu>>
{{{<<snapshot print id:story>>}}}: <<snapshot print id:story>>
{{{<<snapshot print id:ask>>}}}: <<snapshot print id:ask>>
{{{<<snapshot print noCSS id:viewer>>}}}: <<snapshot print noCSS id:viewer>>
<<<
!!!!!Configuration
<<<
<<option chkSnapshotHTMLOnly>> output HTML only (omit CSS)
<<<
!!!!!Revisions
<<<
2008.05.16 [1.1.1] added try..catch around addEvent/removeEvent calls to avoid error in Opera
2008.04.28 [1.1.0] removed 'viewerHTML' from 'ask' droplist and replaced with toggle for "output HTML only". Removed 'noCSS' parameter and replaced with config.options.chkSnapshotHTMLOnly global option. Added "select a tiddler..." to 'ask' droplist
2008.04.24 [1.0.1] in saveSnap(), convert output from Unicode to UTF before passing to saveFile(). Fixes "unknown name" error in IE's file.Write() function.
2008.04.21 [1.0.0] initial release - derived from [[NewDocumentPlugin]] with many improvements, including: "ask for ID" using droplist of available DOM elements, use "<base href=...>" for correctly resolving image references, wrap 'viewer only' output in class="tiddler viewer" for proper application of inherited CSS styles, snapshotSave and snapshotPrint tiddler toolbar command definitions, and more...
<<<
/***
''Inspired by [[TiddlyPom|http://www.warwick.ac.uk/~tuspam/tiddlypom.html]]''
|Name|SplashScreenPlugin|
|Created by|SaqImtiaz|
|Location|http://tw.lewcid.org/#SplashScreenPlugin|
|Version|0.21 |
|Requires|~TW2.08+|
!Description:
Provides a simple splash screen that is visible while the TW is loading.
!Installation
Copy the source text of this tiddler to your TW in a new tiddler, tag it with systemConfig and save and reload. The SplashScreen will now be installed and will be visible the next time you reload your TW.
!Customizing
Once the SplashScreen has been installed and you have reloaded your TW, the splash screen html will be present in the MarkupPreHead tiddler. You can edit it and customize to your needs.
!History
* 20-07-06 : version 0.21, modified to hide contentWrapper while SplashScreen is displayed.
* 26-06-06 : version 0.2, first release
!Code
***/
//{{{
var old_lewcid_splash_restart=restart;
restart = function()
{ if (document.getElementById("SplashScreen"))
document.getElementById("SplashScreen").style.display = "none";
if (document.getElementById("contentWrapper"))
document.getElementById("contentWrapper").style.display = "block";
old_lewcid_splash_restart();
if (splashScreenInstall)
{if(config.options.chkAutoSave)
{saveChanges();}
displayMessage("TW SplashScreen has been installed, please save and refresh your TW.");
}
}
var oldText = store.getTiddlerText("MarkupPreHead");
if (oldText.indexOf("SplashScreen")==-1)
{var siteTitle = store.getTiddlerText("SiteTitle");
var splasher='\n\n<style type="text/css">#contentWrapper {display:none;}</style><div id="SplashScreen" style="border: 3px solid #ccc; display: block; text-align: center; width: 320px; margin: 100px auto; padding: 50px; color:#000; font-size: 28px; font-family:Tahoma; background-color:#eee;"><b>'+siteTitle +'</b> is loading<blink> ...</blink><br><br><span style="font-size: 14px; color:red;">Requires Javascript.</span></div>';
if (! store.tiddlerExists("MarkupPreHead"))
{var myTiddler = store.createTiddler("MarkupPreHead");}
else
{var myTiddler = store.getTiddler("MarkupPreHead");}
myTiddler.set(myTiddler.title,oldText+splasher,config.options.txtUserName,null,null);
store.setDirty(true);
var splashScreenInstall = true;
}
//}}}
/%
|Name|SplitTiddler|
|Source|http://www.TiddlyTools.com/#SplitTiddler|
|Version|1.9.5|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|html|
|Description|split tiddler contents into separate tiddlers|
%/<html><nowiki><style>
#tiddlerSplitTiddler .tagged { display:none; }
#tiddlerSplitTiddler .label { font-size:90%;font-style:italic;white-space:nowrap; }
#tiddlerSplitTiddler table, #tiddlerSplitTiddler tr, #tiddlerSplitTiddler td
{ border:0; margin:0; padding:0; }
</style><table><tr><td><form>
<table style='width:100%'><tr><td style='width:20%'>
<div class='label'>source tiddler:</div>
<select name='src' value='' style='width:99%;padding:2px;margin:0'
title='select a tiddler containing source material'>
<option value=''>select a tiddler...</option>
</select>
</td><td style='width:20%'>
<div class='label'>target title format:</div>
<input name='titleformat' value='%0 - %1' style='width:99%'
title='format for target tiddler titles'>
</td><td style='width:20%'>
<div class='label'>output format:</div>
<input name='format' value='%4' style='width:99%'
title='format for target tiddler content'>
</td><td style='width:20%'>
<div class='label'>target field:</div>
<input name='fieldname' value='text' style='width:99%'
title='field to hold content in target tiddler'>
</td><td style='width:20%'>
<div class='label'>add tags:</div>
<input name='tags' value='' style='width:99%'
title='tags for target tiddlers'>
</td></tr></table>
<div style='font-size:80%;font-style:italic;text-align:center;color:gray'>
%0=source title, %1=first line of item, %2=first word of item, %3=item number, %4=item content
</div>
<div style='float:left;margin-right:1em'>
<div class='label'>split source content by:</div>
<div style='line-height:2.1em'>
<input type='radio' name='splitby' value='charcount'>every
<input name='charcount' value='1000' onfocus='this.select()' style='width:3em'
title='split content every N characters'> characters<br>
<input type='radio' name='splitby' value='linecount'>every
<input name='linecount' value='20' onfocus='this.select()' style='width:3em'
title='split content every N lines'> lines<br>
<input type='radio' name='splitby' value='match' CHECKED>match
<input name='sep' value='\n----\n' onfocus='this.select()' style='width:8em'
title='match character sequence to split content'><br>
<input type='checkbox' name='regexp' title='match using regular expressions (text patterns)'>use RegExp text pattern<br>
</div></div>
<div style='float:left;margin-right:1em'>
<div class='label'>options:</div>
<input type='checkbox' name='warn' checked>confirm overwrites<br>
<input type='checkbox' name='show'>show tiddlers when done<br>
<input type='checkbox' name='limit'>create only
<input name='maxtids' value='8' style='width:2em'> tiddlers<br>
<input type='checkbox' name='index' checked>create an index tiddler<br>
index item format:
<input name='indexformat' value='<<tiddler [[%0 - %1]]>>' style='width:10em'
title='%0=target tiddler title'>
</div>
<input type='button' style='float:right;height:5em;margin-top:2.5em' value='split tiddler' onclick="
var f=this.form;
if (!f.src.value.length)
{ alert('select a tiddler title'); f.src.focus(); return false; }
if (!f.titleformat.value.length)
{ alert('enter a target title format'); f.titleformat.focus(); return false; }
if (!f.src.value.length)
{ alert('enter an output item format'); f.format.focus(); return false; }
var start=new Date().getTime();
var src=store.getTiddlerText(f.src.value);
if (!src) { displayMessage('\x27'+f.src.value+'\x27 not found'); return false; }
var tags=f.tags.value;
var parts=[];
if (f.splitby[0].checked) { /* chars */
for (var i=0; i<src.length; i+=f.charcount.value)
parts.push(src.substr(i,f.charcount.value));
} else if (f.splitby[1].checked) { /* lines */
var lines=src.split('\n');
var t=''; var c=f.linecount.value;
while (lines.length) {
t+=lines.shift()+'\n'; c--;
if (!c) { parts.push(t); var c=f.linecount.value; t=''; }
}
} else { /* match text/regexp */
var sep=!f.regexp.checked?f.sep.value.unescapeLineBreaks():new RegExp(f.sep.value);
var pieces=src.split(sep);
for (var i=0; i<pieces.length; i++) if (pieces[i].length) parts.push(pieces[i]);
}
var msg='Found '+parts.length+' items in \x27'+f.src.value+'\x27. OK to proceed?';
if (!confirm(msg)) return false;
if (parts.length) store.suspendNotifications();
var pad=parts.length.toString().length;
var tids=[]; var out=[];
var srctitle=f.src.value;
var fmt=f.format.value.unescapeLineBreaks();
var titlefmt=f.titleformat.value.unescapeLineBreaks();
var fieldname=f.fieldname.value.toLowerCase();
var indexfmt=f.indexformat.value.unescapeLineBreaks();
var max=f.limit.checked?f.maxtids.value:parts.length;
var warn=f.warn.checked;
for (var p=0; p<max; p++) {
var lines=parts[p].split('\n');
var firstline=lines[0];
var firstword=firstline.split(' ')[0];
var itemnum=String.zeroPad(p+1,pad);
if (titlefmt.indexOf('%2')!=-1) /* remove firstword if used in title */
{ var words=lines[0].split(' '); words.shift(); lines[0]=words.join(' '); var discard=!words.length; }
if (titlefmt.indexOf('%1')!=-1 || discard) /* remove firstline if used in title */
lines.shift();
var content=lines.join('\n');
var args=[srctitle,firstline,firstword,itemnum,content];
var tid=titlefmt.format(args).replace(/[\[\]\|]/g,'_');
var txt=fmt.format(args);
var fields={}; if (fieldname!='text')
{ fields[fieldname]=txt; txt='<<view '+fieldname+' wikified>>'; }
var tags=tags.format(args);
if (warn && store.tiddlerExists(tid) && !confirm(config.messages.overwriteWarning.format([tid])))
continue;
store.saveTiddler(tid,tid,txt,config.options.txtUserName,new Date(),tags,fields);
if (f.index.checked) out.push(indexfmt.format(args));
tids.pushUnique(tid);
}
var elapsed=(new Date().getTime()-start)/1000;
if (parts.length) store.resumeNotifications();
if (tids.length) {
if (f.index.checked) {
var tid=f.src.value+'Index';
if (!warn||!store.tiddlerExists(tid)||confirm(config.messages.overwriteWarning.format([tid])))
store.saveTiddler(tid,tid,out.join('\n'),config.options.txtUserName,new Date(),[],{});
}
store.notifyAll();
if (f.show.checked) story.displayTiddlers(story.findContainingTiddler(this),tids);
displayMessage('created '+tids.length+' target tiddlers in '+elapsed+' seconds');
}
"><div style='clear:both'></div>
</form></td></tr></table></html><<tiddler {{
var list=place.lastChild.getElementsByTagName('form')[0].src;
store.forEachTiddler(function(title,tiddler){
list.options[list.length]=new Option(title,title);
});
'';}}>>
/*{{{*/
/*FONT STUFF*/
body {font-family: Verdana; font-size: 10pt;}
h1,h2,h3,h4,h5 { color: #8899ff; background: white; font-family: Verdana; border-bottom: none;}
.editor a {color:#dddddd;}
#editor a {color:#dddddd;}
.nowrap { white-space:nowrap;}
.bluey {font-weight: bold; color: #5566ff; font-size: 1.3em;}
.toolbar a {color:#5566ff;}
.selected .toolbar a {color:#5566ff;}
.selected .toolbar a:hover {color:#5566ff;}
/* SHORTENS THE HEIGHT OF THE HEADER */
.headerShadow {padding: 1em 0em .8em 1em;}
.headerForeground {padding: 1em 0em .8em 1em;}
.siteTitle {font-size:1.5em;}
.siteSubtitle {font-size:1em;}
/*MAINMENU*/
#mainMenu {width: 15.5em; text-align: left; font-size: .85em;}
#displayArea {margin: 0em 15em 0em 15.5em;}
.sliderPanel { margin-left: 1em; }
/*TABLE HEADER*/
.viewer th {color: #000; background-color: #eeeeee;}
/*TIDDLER TOPMARGIN AND BUTTON BORDER*/
a.button{border: 0;}
.viewer { margin-top: .5em; }
.viewer {line-height: 1.7em;}
/*TIDDLER TITLE COLOR MATCH BOTTOM OF HEADER*/
.title {color:[[ColorPalette::PrimaryMid]];}
/*UNORDERED and ORDERED LISTS TWEAK*/
.viewer li {padding-top: 0.5em; padding-bottom: 0.5em;}
/*LINELESS BLOCKQUOTES*/
.viewer blockquote {border-left: 0px; margin-top:0em; margin-bottom:0em; }
/*INVISIBLE TABLE*/
.viewer .invisiblecomm table {border-color: white;}
.viewer .invisiblecomm table td { font-size: 1em; font-family: Verdana; border-color: white; padding: 10px 20px 10px 0px; text-align: left; vertical-align: top; padding: 20px;}
.viewer .invisiblecomm table th { color: #005566; background-color: white; border-color: white; font-family: Verdana; font-size: 1.2em; font-weight: bold; padding: 10px 20px 10px 0px; text-align: left; vertical-align: top;}
.viewer .invisiblecomm table tr.leftColumn { background-color: #bbbbbb; }
/*TOPMENU*/
#topMenu {padding-left: 1em; background-color: #aabbff; color: #110077; font-family: Trebuchet MS, Verdana; font-size: 13pt; line-height: 1.6em;}
#topMenu table td {margin: 10px;}
#topMenu .purple a {color: #0055dd;}
/*ROUNDED CORNERS AND BORDERS*/
.tiddler {
border-top: 1px solid #ccc;
border-left: 1px solid #ccc;
border-bottom: 3px solid #ccc;
border-right: 3px solid #ccc;
margin: 0.5em;
background:#fff;
padding: 0.5em;
-moz-border-radius: 1em; }
#messageArea {
background-color: #eee;
border-color: #8ab;
border-width: 4px;
border-style: dotted;
font-size: 90%;
padding: 0.5em;
-moz-border-radius: 1em; }
/*TagglyTag styles*/
.tagglyTagged li.listTitle { display:none;}
.tagglyTagged li { display: inline; font-size:90%; }
.tagglyTagged ul { margin:0px; padding:0px; }
.tagglyTagging { padding-top:0.5em; }
.tagglyTagging li.listTitle { display:none;}
.tagglyTagging ul { margin-top:0px; padding-top:0.5em; padding-left:2em; margin-bottom:0px; padding-bottom:0px; }
/* .tagglyTagging .tghide { display:inline; } */
.tagglyTagging { vertical-align: top; margin:0px; padding:0px; }
.tagglyTagging table { margin:0px; padding:0px; }
.tagglyTagging .button { display:none; margin-left:3px; margin-right:3px; }
.tagglyTagging .button, .tagglyTagging .hidebutton { color:#aaa; font-size:90%; border:0px; padding-left:0.3em;padding-right:0.3em;}
.tagglyTagging .button:hover, .hidebutton:hover { background:#eee; color:#888; }
.selected .tagglyTagging .button { display:inline; }
.tagglyTagging .hidebutton { color:white; } /* has to be there so it takes up space. tweak if you're not using a white tiddler bg */
.selected .tagglyTagging .hidebutton { color:#aaa }
.tagglyLabel { color:#aaa; font-size:90%; }
.tagglyTagging ul {padding-top:0px; padding-bottom:0.5em; margin-left:1em; }
.tagglyTagging ul ul {list-style-type:disc; margin-left:-1em;}
.tagglyTagging ul ul li {margin-left:0.5em; }
.editLabel { font-size:90%; padding-top:0.5em; }
[[StyleSheetShortcuts]]
/* GIFFMEX TWEAKS TO STYLESHEETPRINT (so that nothing but tiddler title and text are printed) */
@media print {#mainMenu {display: none ! important;}}
@media print {#topMenu {display: none ! important;}}
@media print {#sidebar {display: none ! important;}}
@media print {#messageArea {display: none ! important;}}
@media print {#toolbar {display: none ! important;}}
@media print {.header {display: none ! important;}}
@media print {.tiddler .subtitle {display: none ! important;}}
@media print {.tiddler .toolbar {display; none ! important; }}
@media print {.tiddler .tagging {display; none ! important; }}
@media print {.tiddler .tagged {display; none ! important; }}
@media print {#displayArea {margin: 1em 1em 0em 1em;}}
@media print {.pageBreak {page-break-before: always;}}
/*}}}*/
/***
|Name|TwHelpSearchPlugin|
|Source|http://twhelp.tiddlyspot.com/#TwHelpSearchPlugin|
|Documentation|http://twhelp.tiddlyspot.com/#TWHelpSearchDoc|
|Version|1.0.6|
|Author|Morris Gray|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.0 - 2.4|
|Type|plugin|
|Requires|[[SearchOptionsPlugin|http://www.TiddlyTools.com/#SearchOptionsPlugin]] [[TableSortingPlugin|http://tw.lewcid.org/#TableSortingPlugin]] (only for sorting option)|
|Overrides|SearchOptionsPlugin's search results|
|Description|Extends the search results from SearchOptionsPlugin to a sortable table showing title, size and tags.|
''Demo search:''
|>|>|>|<<search>> |
|>|>| look for in |>|>|>|
| <<option chkSearchTitles>> | <<option chkSearchText>> | <<option chkSearchTags>> | <<option chkHoldSearches>> |
| titles | text | tags | hold |
''A Plugin Tweak for:'' SearchOptionsPlugin
!!!!!Description
<<<
This plugin defines an alternative format for the SearchResults tiddler that is generated by the SearchOptionsPlugin . It presents the search results in tabular form numbering the rows; and showing the tiddler title, the size in bytes, and the tags. It is ready to be used with the [[TableSortingPlugin|http://tw.lewcid.org/#TableSortingPlugin]] (check versions) so any column can be sorted; such as size in ascending or descending order.
<<<
!!!!!Installation
<<<
Import (or copy/paste) the following tiddlers into your ~TiddlyWiki:
* http://twhelp.tiddlyspot.com/#TwHelpSearchPlugin
*SearchOptionsPlugin from http://www.tiddlytools.com/#SearchOptionsPlugin
* Get more documentation here [[TWHelpSearchDoc]] or here:
* http://twhelp.tiddlyspot.com/#TwHelpSearchDoc
<<<
!!!!!Revision History
<<<
''2008.09.14 [1.0.6]''
Cosmetic - Add header.
''2007.09.12 [1.0.6]''
Added overflow scroll to TWHelp-SearchResults for long titles or tags.
''2006.02.03 [1.0.5]''
Added facility for holding the results of multiple searches with tick box on dashboard.
''2006.02.02 [1.0.4]''
Added several options, cleaned up design.Planning one version basic and one with added options this is the added options version.
''2006.01.27 [1.0.3''
Added a column for the size of the text in each tiddler, this does not include the size of the title or tags. Added overall TW statistics button requires TiddlerStatsPlugin.
''2006.01.23 [1.0.2 ]''
''a)''Changed function reportSearchResults(text,matches) to window.reportSearchResults=function(text,matches)
''b)''Added a line so that Incremental Search is automatically disabled config.options.chkSearchIncremental=false; turn off key-by-key searching
''c)''Removed space inside parens. bgcolor(#fe8 )" to "bgcolor(#fe8)". This
is what was causing IE to 'crap out' halfway through drawing the table
headings.
''d)''Added {{{config.options.chkSearchList=true;}}}
''2006.01.20 [1.0.1]''
ELS: reportSearchResults() definition moved to this Plugin Tweak tiddler and removed extranous code
''2006.01.19 [1.0.0]''
This is an adaptation of Eric Shulman's SearchOptionsPlugin. Adapted by MorrisGray to provide search results in table form. All the necessary controls for refining the search is provided within the table including slide-down access to AdvancedOptions.
<<<
!!!!!Code
***/
//{{{
if (config.options.chkSinglePageMode==undefined) config.options.chkSinglePageMode=false;
if (config.options.chkRegExpSearch==undefined) config.options.chkRegExpSearch=true;
if (config.options.chkSearchTitles==undefined) config.options.chkSearchTitles=false;
if (config.options.chkSearchText==undefined) config.options.chkSearchText=true;
if (config.options.chkSearchTags==undefined) config.options.chkSearchTags=false;
if (config.options.chkSearchTitlesFirst==undefined) config.options.chkSearchTitlesFirst=true;
if (config.options.chkSearchList==undefined) config.options.chkSearchList=true;
if (config.options.chkSearchIncremental==undefined) config.options.chkSearchIncremental=false;
if (config.options.chkToggleLinks==true) config.options.chkToggleLinks=false;
if (config.options.chkHoldSearches==undefined) config.options.chkHoldSearches=false;
if (config.options.chkSortTags==undefined) config.options.chkSortTags=false;
config.options.chkToggleLinks=false;
config.options.chkSinglePageMode=false;
config.options.chkHoldSearches=false;
config.options.chkSearchIncremental=false;
config.options.chkHttpReadOnly = false;
config.options.chkRegExpSearch=true;
config.options.chkSearchList=true;
config.options.chkToggleLinks=false;
config.shadowTiddlers.AdvancedOptions += "\n<<option chkHoldSearches>> Hold search results";
//}}}
//{{{
// Give the report a custom name
config.macros.search.reportTitle="TWHelp-SearchResults";
// Override default SearchOptionsPlugin formatting for SearchResults tiddler
window.reportSearchResults=function(text,matches)
{
var title=config.macros.search.reportTitle
config.macros.search.reportTitle;
var q = config.options.chkRegExpSearch ? "/" : "'";
if (!config.options.chkHoldSearches) body="";
body+="\n|>|bgcolor(#8af):@@color(#000080):''"+config.macros.search.successMsg.format([matches.length,q+"{{{"+text+"}}}"+q])+"''@@|bgcolor(#8af): @@color(#A00000): SearchHelp@@ "+"|"+"\n";
body+="|>|>|bgcolor(#E3FFE3):<<search>> <<option chkSearchTitles>> Titles <<option chkSearchText>> Text <<option chkSearchTags>>Tags <<option chkHoldSearches>> Hold |"+"\n";
body+="\n|bgcolor(#8af): |bgcolor(#8af): @@color(#000080):sort by: ''Titles''@@ |bgcolor(#8af): @@color(#000080): ''Size'' (bytes)@@ |bgcolor(#8af): @@color(#000080): ''Tags''@@ |h";
for(var t=0;t<matches.length;t++)
body+="\n"+"| "+(t+1)+"|[["+matches[t].title+"]]| "+matches[t].text.length+"|"+"@@"+matches[t].tags+"@@"+"|";
body+="\n|sortable|k";
body+="\n";
// create/update the tiddler
var tiddler=store.getTiddler(title); if (!tiddler) tiddler=new Tiddler();
tiddler.set(title,body,config.options.txtUserName,(new Date()),"excludeLists excludeSearch killbookmark");
store.addTiddler(tiddler); story.closeTiddler(title);
// render tiddler
var oldprompt=config.macros.search.label;
config.macros.search.label="search again"; // use alternate "search again" label
story.displayTiddler(null,title,1); // force refresh
config.macros.search.label=oldprompt; // restore standard search label
}
//}}}
{{{
<tabs mytabs>
<tab tab1>
This is my first tab
</tab>
<tab tab2>
This is my second tab
</tab>
<tab tab3>
This is my third tab
with more than one line
</tab>
<tab tab4>
</tab>
</tabs>
}}}
<tabs mytabs>
<tab tab1>
This is my first tab
</tab>
<tab tab2>
This is my second tab
</tab>
<tab tab3>
This is my third tab
with more than one line
</tab>
<tab tab4>
</tab>
</tabs>
Note: you can space out the tabs to make editing easier, the linebreaks between tabs will be ignored:
{{{
<tabs mytabs>
<tab tab1>
This is my first tab
</tab>
<tab tab2>
This is my second tab
</tab>
<tab tab3>
This is my third tab
with more than one line
</tab>
<tab tab4>
</tab>
</tabs>
}}}
/***
|''Name:''|TableSortingPlugin|
|''Description:''|Dynamically sort tables by clicking on column headers|
|''Author:''|Saq Imtiaz ( lewcid@gmail.com )|
|''Source:''|http://tw.lewcid.org/#TableSortingPlugin|
|''Code Repository:''|http://tw.lewcid.org/svn/plugins|
|''Version:''|2.02|
|''Date:''|25-01-2008|
|''License:''|[[Creative Commons Attribution-ShareAlike 3.0 License|http://creativecommons.org/licenses/by-sa/3.0/]]|
|''~CoreVersion:''|2.2.3|
!!Usage:
* Make sure your table has a header row
** {{{|Name|Phone Number|Address|h}}}<br> Note the /h/ that denote a header row
* Give the table a class of 'sortable'
** {{{
|sortable|k
|Name|Phone Number|Address|h
}}}<br>Note the /k/ that denotes a class name being assigned to the table.
* To disallow sorting by a column, place {{{<<nosort>>}}} in it's header
* To automatically sort a table by a column, place {{{<<autosort>>}}} in the header for that column
** Or to sort automatically but in reverse order, use {{{<<autosort reverse>>}}}
!!Example:
|sortable|k
|Name |Salary |Extension |Performance |File Size |Start date |h
|ZBloggs, Fred |$12000.00 |1353 |+1.2 |74.2Kb |Aug 19, 2003 21:34:00 |
|ABloggs, Fred |$12000.00 |1353 |1.2 |3350b |09/18/2003 |
|CBloggs, Fred |$12000 |1353 |1.200 |55.2Kb |August 18, 2003 |
|DBloggs, Fred |$12000.00 |1353 |1.2 |2100b |07/18/2003 |
|Bloggs, Fred |$12000.00 |1353 |01.20 |6.156Mb |08/17/2003 05:43 |
|Turvey, Kevin |$191200.00 |2342 |-33 |1b |02/05/1979 |
|Mbogo, Arnold |$32010.12 |2755 |-21.673 |1.2Gb |09/08/1998 |
|Shakespeare, Bill |£122000.00|3211 |6 |33.22Gb |12/11/1961 |
|Shakespeare, Hamlet |£9000 |9005 |-8 |3Gb |01/01/2002 |
|Fitz, Marvin |€3300.30 |5554 |+5 |4Kb |05/22/1995 |
***/
// /%
//!BEGIN-PLUGIN-CODE
config.tableSorting = {
darrow: "\u2193",
uarrow: "\u2191",
getText : function (o) {
var p = o.cells[SORT_INDEX];
return p.innerText || p.textContent || '';
},
sortTable : function (o,rev) {
SORT_INDEX = o.getAttribute("index");
var c = config.tableSorting;
var T = findRelated(o.parentNode,"TABLE");
if(T.tBodies[0].rows.length<=1)
return;
var itm = "";
var i = 0;
while (itm == "" && i < T.tBodies[0].rows.length) {
itm = c.getText(T.tBodies[0].rows[i]).trim();
i++;
}
if (itm == "")
return;
var r = [];
var S = o.getElementsByTagName("span")[0];
c.fn = c.sortAlpha;
if(!isNaN(Date.parse(itm)))
c.fn = c.sortDate;
else if(itm.match(/^[$|£|€|\+|\-]{0,1}\d*\.{0,1}\d+$/))
c.fn = c.sortNumber;
else if(itm.match(/^\d*\.{0,1}\d+[K|M|G]{0,1}b$/))
c.fn = c.sortFile;
for(i=0; i<T.tBodies[0].rows.length; i++) {
r[i]=T.tBodies[0].rows[i];
}
r.sort(c.reSort);
if(S.firstChild.nodeValue==c.darrow || rev) {
r.reverse();
S.firstChild.nodeValue=c.uarrow;
}
else
S.firstChild.nodeValue=c.darrow;
var thead = T.getElementsByTagName('thead')[0];
var headers = thead.rows[thead.rows.length-1].cells;
for(var k=0; k<headers.length; k++) {
if(!hasClass(headers[k],"nosort"))
addClass(headers[k].getElementsByTagName("span")[0],"hidden");
}
removeClass(S,"hidden");
for(i=0; i<r.length; i++) {
T.tBodies[0].appendChild(r[i]);
c.stripe(r[i],i);
for(var j=0; j<r[i].cells.length;j++){
removeClass(r[i].cells[j],"sortedCol");
}
addClass(r[i].cells[SORT_INDEX],"sortedCol");
}
},
stripe : function (e,i){
var cl = ["oddRow","evenRow"];
i&1? cl.reverse() : cl;
removeClass(e,cl[1]);
addClass(e,cl[0]);
},
sortNumber : function(v) {
var x = parseFloat(this.getText(v).replace(/[^0-9.-]/g,''));
return isNaN(x)? 0: x;
},
sortDate : function(v) {
return Date.parse(this.getText(v));
},
sortAlpha : function(v) {
return this.getText(v).toLowerCase();
},
sortFile : function(v) {
var j, q = config.messages.sizeTemplates, s = this.getText(v);
for (var i=0; i<q.length; i++) {
if ((j = s.toLowerCase().indexOf(q[i].template.replace("%0\u00a0","").toLowerCase())) != -1)
return q[i].unit * s.substr(0,j);
}
return parseFloat(s);
},
reSort : function(a,b){
var c = config.tableSorting;
var aa = c.fn(a);
var bb = c.fn(b);
return ((aa==bb)? 0 : ((aa<bb)? -1:1));
}
};
Story.prototype.tSort_refreshTiddler = Story.prototype.refreshTiddler;
Story.prototype.refreshTiddler = function(title,template,force,customFields,defaultText){
var elem = this.tSort_refreshTiddler.apply(this,arguments);
if(elem){
var tables = elem.getElementsByTagName("TABLE");
var c = config.tableSorting;
for(var i=0; i<tables.length; i++){
if(hasClass(tables[i],"sortable")){
var x = null, rev, table = tables[i], thead = table.getElementsByTagName('thead')[0], headers = thead.rows[thead.rows.length-1].cells;
for (var j=0; j<headers.length; j++){
var h = headers[j];
if (hasClass(h,"nosort"))
continue;
h.setAttribute("index",j);
h.onclick = function(){c.sortTable(this); return false;};
h.ondblclick = stopEvent;
if(h.getElementsByTagName("span").length == 0)
createTiddlyElement(h,"span",null,"hidden",c.uarrow);
if(!x && hasClass(h,"autosort")) {
x = j;
rev = hasClass(h,"reverse");
}
}
if(x)
c.sortTable(headers[x],rev);
}
}
}
return elem;
};
setStylesheet("table.sortable span.hidden {visibility:hidden;}\n"+
"table.sortable thead {cursor:pointer;}\n"+
"table.sortable .nosort {cursor:default;}\n"+
"table.sortable td.sortedCol {background:#ffc;}","TableSortingPluginStyles");
function stopEvent(e){
var ev = e? e : window.event;
ev.cancelBubble = true;
if (ev.stopPropagation) ev.stopPropagation();
return false;
}
config.macros.nosort={
handler : function(place){
addClass(place,"nosort");
}
};
config.macros.autosort={
handler : function(place,m,p,w,pS){
addClass(place,"autosort"+" "+pS);
}
};
//!END-PLUGIN-CODE
// %/
/***
| Name:|TagBasedTemplates|
| Source:|http://simonbaird.com/mptw/#TagBasedTemplates|
| Version:|1.0.1 (8-Mar-2006)|
| Usage:|See [[FlipMeOver!]] for an example|
!Notes
If there is more than one match the first one wins...
!History
* 1.0.1 (8-Mar-2006)
** added format string
* 1.0.0 (8-Mar-2006)
** simplified to just look for existence of "~TagNameViewTemplate" as suggested by tomo on TiddlyWikiDev
* Prototype (12-Jan-2006)
***/
//{{{
version.extensions.TagBasedTemplates = { major: 1, minor: 0, revision: 1, date: new Date(2006,3,8),
source: "http://simonbaird.com/mptw/#TagBasedTemplates"
};
config.TagBasedTemplates = { templateFormat: "%0ViewTemplate" }; // in case you want to tweak it
story.chooseTemplateForTiddler = function(title,template) {
if (!template) {
var tiddler = store.getTiddler(title);
if (tiddler)
for (var j=0; j<tiddler.tags.length; j++) {
var lookFor = config.TagBasedTemplates.templateFormat.format([tiddler.tags[j]]);
if (store.tiddlerExists(lookFor))
return lookFor;
}
return config.tiddlerTemplates[DEFAULT_VIEW_TEMPLATE];
}
return config.tiddlerTemplates[template];
};
//}}}
/***
|Name|TagCloudPlugin|
|Source|http://www.TiddlyTools.com/#TagCloudPlugin|
|Version|1.5.0|
|Author|Eric Shulman|
|Original Author|Clint Checketts|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides||
|Description|present a 'cloud' of tags (or links) using proportional font display|
!Usage
<<<
{{{
<<cloud type limit:... tag tag tag ...>>
<<cloud type limit:... +TiddlerName>>
<<cloud type limit:... =tagvalue>>
}}}
where:
* ''type'' is a keyword, one of:
** ''tags'' (default) - displays a cloud of tags, based on frequency of use
** ''links'' - displays a cloud of tiddlers, based on number of links //from// each tiddler
** ''references'' - displays a cloud of tiddlers, based on number of links //to// each tiddler
* ''tag tag tag...'' (or ''title title title'' if ''links''/''references'' is used)<br>shows all tags/links in the document //except// for those listed as macro parameters
* ''+TiddlerName''<br>shows tags/links read from a space-separated, bracketed list stored in a separate tiddler.
* ''=tagvalue'' (//only if ''tags'' is used//)<br>shows only tags that are themselves tagged with the indicated tag value (i.e., ~TagglyTagging usage)
* For all uses, you can specify an //optional// ''limit:N'' parameter (where 'N' is a number) to restrict the cloud display to only show the most popular tags/links.
//note: for backward-compatibility, you can also use the macro {{{<<tagCloud ...>>}}} in place of {{{<<cloud ...>>}}}//
<<<
!Examples
<<<
//all tags excluding<<tag systemConfig>>, <<tag excludeMissing>> and <<tag script>>//
{{{<<cloud systemConfig excludeMissing script>>}}}
{{groupbox{<<cloud systemConfig excludeMissing script>>}}}
//top 10 tags excluding<<tag systemConfig>>, <<tag excludeMissing>> and <<tag script>>//
{{{<<cloud limit:10 systemConfig excludeMissing script>>}}}
{{groupbox{<<cloud limit:10 systemConfig excludeMissing script>>}}}
//tags listed in// [[FavoriteTags]]
{{{<<cloud +FavoriteTags>>}}}
{{groupbox{<<cloud +FavoriteTags>>}}}
//tags tagged with 'package'//
{{{<<cloud =package>>}}}
{{groupbox{<<cloud =package>>}}}
//top 20 most referenced tiddlers//
{{{<<cloud references limit:20>>}}}
{{groupbox{<<cloud references limit:20>>}}}
//top 20 tiddlers that contain the most links//
{{{<<cloud links limit:20>>}}}
{{groupbox{<<cloud links limit:20>>}}}
<<<
!Revisions
<<<
2009.02.05 [1.5.0] added ability to show links or back-links (references) instead of tags and renamed macro to {{{<<cloud>>}}} to reflect more generalized usage.
2008.12.16 [1.4.2] corrected group calculation to prevent 'group=0' error
2008.12.16 [1.4.1] revised tag filtering so excluded tags don't affect calculations
2008.12.15 [1.4.0] added {{{limit:...}}} parameter to restrict the number of tags displayed to the top N most popular
2008.11.15 [1.3.0] added {{{+TiddlerName}}} parameter to include only tags that are listed in the indicated tiddler
2008.09.05 [1.2.0] added '=tagname' parameter to include only tags that are themselves tagged with the specified value (i.e., ~TagglyTagging usage)
2008.07.03 [1.1.0] added 'segments' property to macro object. Extensive code cleanup
<<<
!Code
***/
//{{{
version.extensions.TagCloudPlugin= {major: 1, minor: 5 , revision: 0, date: new Date(2009,2,5)};
//Originally created by Clint Checketts, contributions by Jonny Leroy and Eric Shulman
//Currently maintained and enhanced by Eric Shulman
//}}}
//{{{
config.macros.cloud = {
tagstip: "%1 tiddlers tagged with '%0'",
refslabel: " (%0 references)",
refstip: "%1 tiddlers have links to '%0'",
linkslabel: " (%0 links)",
linkstip: "'%0' has links to %1 other tiddlers",
groups: 9,
init: function() {
config.macros.tagCloud=config.macros.cloud; // for backward-compatibility
config.shadowTiddlers.TagCloud='<<cloud>>';
config.shadowTiddlers.StyleSheetTagCloud=
'/*{{{*/\n'
+'.tagCloud span {line-height: 3.5em; margin:3px;}\n'
+'.tagCloud1{font-size: 80%;}\n'
+'.tagCloud2{font-size: 100%;}\n'
+'.tagCloud3{font-size: 120%;}\n'
+'.tagCloud4{font-size: 140%;}\n'
+'.tagCloud5{font-size: 160%;}\n'
+'.tagCloud6{font-size: 180%;}\n'
+'.tagCloud7{font-size: 200%;}\n'
+'.tagCloud8{font-size: 220%;}\n'
+'.tagCloud9{font-size: 240%;}\n'
+'/*}}}*/\n';
setStylesheet(store.getTiddlerText('StyleSheetTagCloud'),'tagCloudsStyles');
},
getLinks: function(tiddler) { // get list of links to existing tiddlers and shadows
if (!tiddler.linksUpdated) tiddler.changed();
var list=[]; for (var i=0; i<tiddler.links.length; i++) {
var title=tiddler.links[i];
if (store.isShadowTiddler(title)||store.tiddlerExists(title))
list.push(title);
}
return list;
},
handler: function(place,macroName,params) {
// unpack params
var inc=[]; var ex=[]; var limit=0;
var links=(params[0]&¶ms[0].toLowerCase()=='links'); if (links) params.shift();
var refs=(params[0]&¶ms[0].toLowerCase()=='references'); if (refs) params.shift();
if (params[0]&¶ms[0].substr(0,6).toLowerCase()=='limit:')
limit=parseInt(params.shift().substr(6));
if (params.length) {
if (params[0].substr(0,1)=='+') { // get tag list from tiddler
var inc=store.getTiddlerText(params[0].substr(1),'').readBracketedList();
} else if (params[0].substr(0,1)=='=') { // get tag list using tagged tags
var tagged=store.getTaggedTiddlers(params[0].substr(1));
for (var t=0; t<tagged.length; t++) inc.push(tagged[t].title);
} else ex=params; // exclude params
}
// get all items, include/exclude specific items
var items=[];
var list=(links||refs)?store.getTiddlers('title','excludeLists'):store.getTags();
for (var t=0; t<list.length; t++) {
var title=(links||refs)?list[t].title:list[t][0];
if (links) var count=this.getLinks(list[t]).length;
else if (refs) var count=store.getReferringTiddlers(title).length;
else var count=list[t][1];
if ((!inc.length||inc.contains(title))&&(!ex.length||!ex.contains(title)))
items.push({ title:title, count:count });
}
if(!items.length) return;
// sort by decending count, limit results (optional)
items=items.sort(function(a,b){return(a.count==b.count)?0:(a.count>b.count?-1:1);});
while (limit && items.length>limit) items.pop();
// find min/max and group size
var most=items[0].count;
var least=items[items.length-1].count;
var groupSize=(most-least+1)/this.groups;
// sort by title and draw the cloud of items
items=items.sort(function(a,b){return(a.title==b.title)?0:(a.title>b.title?1:-1);});
var cloudWrapper = createTiddlyElement(place,'div',null,'tagCloud',null);
for (var t=0; t<items.length; t++) {
cloudWrapper.appendChild(document.createTextNode(' '));
var group=Math.ceil((items[t].count-least)/groupSize)||1;
var className='tagCloudtag tagCloud'+group;
var tip=refs?this.refstip:links?this.linkstip:this.tagstip;
tip=tip.format([items[t].title,items[t].count]);
if (links||refs) {
var btn=createTiddlyButton(cloudWrapper,items[t].title,tip,
function(ev) { var e=ev||window.event; var cmt=config.macros.cloud;
var popup = Popup.create(this);
var title = this.getAttribute('tiddler');
var count = this.getAttribute('count');
var refs = this.getAttribute('refs')=='T';
var links = this.getAttribute('links')=='T';
var label = (refs?cmt.refslabel:cmt.linkslabel).format([count]);
createTiddlyLink(popup,title,true);
createTiddlyText(popup,label);
createTiddlyElement(popup,'hr');
if (refs) {
popup.setAttribute('tiddler',title);
config.commands.references.handlePopup(popup,title);
}
if (links) {
var tiddler = store.fetchTiddler(title);
var links=config.macros.cloud.getLinks(tiddler);
for(var i=0;i<links.length;i++)
createTiddlyLink(createTiddlyElement(popup,'li'),
links[i],true);
}
Popup.show();
e.cancelBubble=true; if(e.stopPropagation) e.stopPropagation();
return false;
}, className);
btn.setAttribute('tiddler',items[t].title);
btn.setAttribute('count',items[t].count);
btn.setAttribute('refs',refs?'T':'F');
btn.setAttribute('links',links?'T':'F');
btn.title=tip;
} else {
var btn=createTiddlyButton(cloudWrapper,items[t].title,tip,onClickTag,className);
btn.setAttribute('tag',items[t].title);
}
}
}
};
//}}}
{{{
// Create a button for a tag with a popup listing all the tiddlers that it tags
//# title and tooltip arguments are optional
createTagButton = function(place,tag,excludeTiddler,title,tooltip)
{
if (tag == "Menu")
var onClick = onClickMenuTag;
else
var onClick = onClickTag;
var btn = createTiddlyButton(place,title||tag,(tooltip||config.views.wikified.tag.tooltip).format([tag]), onClick);
btn.setAttribute("tag",tag);
if(excludeTiddler)
btn.setAttribute("tiddler",excludeTiddler);
return btn;
}
// Event handler for clicking on a tiddler tag
function onClickMenuTag(ev)
{
var e = ev || window.event;
var popup = Popup.create(this);
var tag = this.getAttribute("tag");
var title = this.getAttribute("tiddler");
if(popup && tag) {
var tagged = store.getTaggedTiddlers(tag);
var titles = [];
var li,r;
for(r=0;r<tagged.length;r++) {
if(tagged[r].title != title)
titles.push(tagged[r].title);
}
var lingo = config.views.wikified.tag;
if(titles.length > 0) {
for(r=0; r<titles.length; r++) {
//function(place,title,params,label,prompt,accessKey,newFocus,isJournal)
if (titles[r] == "<<newTiddler>>")
config.macros.newTiddler.createNewTiddlerButton(createTiddlyElement(popup,"li"),"New Tiddler ","","New Tiddler", "create a new tiddler");
else
createTiddlyLink(createTiddlyElement(popup,"li"),titles[r],true);
}
} else {
createTiddlyText(createTiddlyElement(popup,"li",null,"disabled"),lingo.popupNone.format([tag]));
}
}
Popup.show();
e.cancelBubble = true;
if(e.stopPropagation) e.stopPropagation();
return false;
}
}}}
/***
|Name|TaggedTemplateTweak|
|Source|http://www.TiddlyTools.com/#TaggedTemplateTweak|
|Documentation|http://www.TiddlyTools.com/#TaggedTemplateTweakInfo|
|Version|1.5.1|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides|Story.prototype.chooseTemplateForTiddler()|
|Description|use alternative ViewTemplate/EditTemplate for tiddler's tagged with specific tag values|
This tweak extends story.chooseTemplateForTiddler() so that ''whenever a tiddler is marked with a specific tag value, it can be viewed and/or edited using alternatives to the standard tiddler templates.''
!!!!!Documentation
>see [[TaggedTemplateTweakInfo]]
!!!!!Revisions
<<<
2009.01.06 [1.5.1] reversed logic so that title-as-prefix takes precedence over tag-matched prefix
2008.12.18 [1.5.0] added handling for using tiddler //title// as prefix (e.g., {{{SomeTiddlerViewTemplate}}})
| please see [[TaggedTemplateTweakInfo]] for previous revision details |
2007.06.11 [1.0.0] initial release
<<<
!!!!!Code
***/
//{{{
version.extensions.TaggedTemplateTweak= {major: 1, minor: 5, revision: 1, date: new Date(2009,1,6)};
Story.prototype.taggedTemplate_chooseTemplateForTiddler = Story.prototype.chooseTemplateForTiddler
Story.prototype.chooseTemplateForTiddler = function(title,template)
{
// get default template from core
var coreTemplate=this.taggedTemplate_chooseTemplateForTiddler.apply(this,arguments);
// if the tiddler doesn't exist yet, return core result
var tiddler=store.getTiddler(title); if (!tiddler) return coreTemplate;
// split core template into theme prefix and template name
var theme="";
var template=coreTemplate;
var parts=template.split(config.textPrimitives.sectionSeparator);
if (parts[1]) { theme=parts[0]; template=parts[1]; }
else theme=config.options.txtTheme||""; // fallback if theme is not specified
theme+=config.textPrimitives.sectionSeparator;
// look for template whose prefix matches the *title* of this tiddler
if (!store.getTaggedTiddlers(title).length) { // if tiddler is not a tag
if (store.getTiddlerText(theme+title+template)) { return theme+title+template; } // theme##TitleTemplate
if (store.getTiddlerText(title+template)) { return title+template; } // TitleTemplate
}
// look for template whose prefix matches a *tag* on this tiddler (if any)
for (i=0; i<tiddler.tags.length; i++) {
var t=tiddler.tags[i]+template; // add tag prefix to template
var c=t.substr(0,1).toUpperCase()+t.substr(1); // capitalized for WikiWord title
if (store.getTiddlerText(theme+t)) { return theme+t; } // theme##tagTemplate
if (store.getTiddlerText(theme+c)) { return theme+c; } // theme##TagTemplate
if (store.getTiddlerText(t)) { return t; } // tagTemplate
if (store.getTiddlerText(c)) { return c; } // TagTemplate
}
// no matching tag OR title prefix... return core result
return coreTemplate;
}
//}}}
/***
|Name:|TagglyTaggingPlugin|
|Description:|tagglyTagging macro is a replacement for the builtin tagging macro in your ViewTemplate|
|Version:|3.3.1 ($Rev: 6100 $)|
|Date:|$Date: 2008-07-27 01:42:07 +1000 (Sun, 27 Jul 2008) $|
|Source:|http://mptw.tiddlyspot.com/#TagglyTaggingPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
!Notes
See http://mptw.tiddlyspot.com/#TagglyTagging
***/
//{{{
merge(String.prototype,{
parseTagExpr: function(debug) {
if (this.trim() == "")
return "(true)";
var anyLogicOp = /(!|&&|\|\||\(|\))/g;
var singleLogicOp = /^(!|&&|\|\||\(|\))$/;
var spaced = this.
// because square brackets in templates are no good
// this means you can use [(With Spaces)] instead of [[With Spaces]]
replace(/\[\(/g," [[").
replace(/\)\]/g,"]] ").
// space things out so we can use readBracketedList. tricky eh?
replace(anyLogicOp," $1 ");
var expr = "";
var tokens = spaced.readBracketedList(false); // false means don't uniq the list. nice one JR!
for (var i=0;i<tokens.length;i++)
if (tokens[i].match(singleLogicOp))
expr += tokens[i];
else
expr += "tiddler.tags.contains('%0')".format([tokens[i].replace(/'/,"\\'")]); // fix single quote bug. still have round bracket bug i think
if (debug)
alert(expr);
return '('+expr+')';
}
});
merge(TiddlyWiki.prototype,{
getTiddlersByTagExpr: function(tagExpr,sortField) {
var result = [];
var expr = tagExpr.parseTagExpr();
store.forEachTiddler(function(title,tiddler) {
if (eval(expr))
result.push(tiddler);
});
if(!sortField)
sortField = "title";
result.sort(function(a,b) {return a[sortField] < b[sortField] ? -1 : (a[sortField] == b[sortField] ? 0 : +1);});
return result;
}
});
config.taggly = {
// for translations
lingo: {
labels: {
asc: "\u2191", // down arrow
desc: "\u2193", // up arrow
title: "title",
modified: "modified",
created: "created",
show: "+",
hide: "-",
normal: "normal",
group: "group",
commas: "commas",
sitemap: "sitemap",
numCols: "cols\u00b1", // plus minus sign
label: "Tagged as '%0':",
exprLabel: "Matching tag expression '%0':",
excerpts: "excerpts",
descr: "descr",
slices: "slices",
contents: "contents",
sliders: "sliders",
noexcerpts: "title only",
noneFound: "(none)"
},
tooltips: {
title: "Click to sort by title",
modified: "Click to sort by modified date",
created: "Click to sort by created date",
show: "Click to show tagging list",
hide: "Click to hide tagging list",
normal: "Click to show a normal ungrouped list",
group: "Click to show list grouped by tag",
sitemap: "Click to show a sitemap style list",
commas: "Click to show a comma separated list",
numCols: "Click to change number of columns",
excerpts: "Click to show excerpts",
descr: "Click to show the description slice",
slices: "Click to show all slices",
contents: "Click to show entire tiddler contents",
sliders: "Click to show tiddler contents in sliders",
noexcerpts: "Click to show entire title only"
},
tooDeepMessage: "* //sitemap too deep...//"
},
config: {
showTaggingCounts: true,
listOpts: {
// the first one will be the default
sortBy: ["title","modified","created"],
sortOrder: ["asc","desc"],
hideState: ["show","hide"],
listMode: ["normal","group","sitemap","commas"],
numCols: ["1","2","3","4","5","6"],
excerpts: ["noexcerpts","excerpts","descr","slices","contents","sliders"]
},
valuePrefix: "taggly.",
excludeTags: ["excludeLists","excludeTagging"],
excerptSize: 50,
excerptMarker: "/%"+"%/",
siteMapDepthLimit: 25
},
getTagglyOpt: function(title,opt) {
var val = store.getValue(title,this.config.valuePrefix+opt);
return val ? val : this.config.listOpts[opt][0];
},
setTagglyOpt: function(title,opt,value) {
if (!store.tiddlerExists(title))
// create it silently
store.saveTiddler(title,title,config.views.editor.defaultText.format([title]),config.options.txtUserName,new Date(),"");
// if value is default then remove it to save space
return store.setValue(title,
this.config.valuePrefix+opt,
value == this.config.listOpts[opt][0] ? null : value);
},
getNextValue: function(title,opt) {
var current = this.getTagglyOpt(title,opt);
var pos = this.config.listOpts[opt].indexOf(current);
// a little usability enhancement. actually it doesn't work right for grouped or sitemap
var limit = (opt == "numCols" ? store.getTiddlersByTagExpr(title).length : this.config.listOpts[opt].length);
var newPos = (pos + 1) % limit;
return this.config.listOpts[opt][newPos];
},
toggleTagglyOpt: function(title,opt) {
var newVal = this.getNextValue(title,opt);
this.setTagglyOpt(title,opt,newVal);
},
createListControl: function(place,title,type) {
var lingo = config.taggly.lingo;
var label;
var tooltip;
var onclick;
if ((type == "title" || type == "modified" || type == "created")) {
// "special" controls. a little tricky. derived from sortOrder and sortBy
label = lingo.labels[type];
tooltip = lingo.tooltips[type];
if (this.getTagglyOpt(title,"sortBy") == type) {
label += lingo.labels[this.getTagglyOpt(title,"sortOrder")];
onclick = function() {
config.taggly.toggleTagglyOpt(title,"sortOrder");
return false;
}
}
else {
onclick = function() {
config.taggly.setTagglyOpt(title,"sortBy",type);
config.taggly.setTagglyOpt(title,"sortOrder",config.taggly.config.listOpts.sortOrder[0]);
return false;
}
}
}
else {
// "regular" controls, nice and simple
label = lingo.labels[type == "numCols" ? type : this.getNextValue(title,type)];
tooltip = lingo.tooltips[type == "numCols" ? type : this.getNextValue(title,type)];
onclick = function() {
config.taggly.toggleTagglyOpt(title,type);
return false;
}
}
// hide button because commas don't have columns
if (!(this.getTagglyOpt(title,"listMode") == "commas" && type == "numCols"))
createTiddlyButton(place,label,tooltip,onclick,type == "hideState" ? "hidebutton" : "button");
},
makeColumns: function(orig,numCols) {
var listSize = orig.length;
var colSize = listSize/numCols;
var remainder = listSize % numCols;
var upperColsize = colSize;
var lowerColsize = colSize;
if (colSize != Math.floor(colSize)) {
// it's not an exact fit so..
upperColsize = Math.floor(colSize) + 1;
lowerColsize = Math.floor(colSize);
}
var output = [];
var c = 0;
for (var j=0;j<numCols;j++) {
var singleCol = [];
var thisSize = j < remainder ? upperColsize : lowerColsize;
for (var i=0;i<thisSize;i++)
singleCol.push(orig[c++]);
output.push(singleCol);
}
return output;
},
drawTable: function(place,columns,theClass) {
var newTable = createTiddlyElement(place,"table",null,theClass);
var newTbody = createTiddlyElement(newTable,"tbody");
var newTr = createTiddlyElement(newTbody,"tr");
for (var j=0;j<columns.length;j++) {
var colOutput = "";
for (var i=0;i<columns[j].length;i++)
colOutput += columns[j][i];
var newTd = createTiddlyElement(newTr,"td",null,"tagglyTagging"); // todo should not need this class
wikify(colOutput,newTd);
}
return newTable;
},
createTagglyList: function(place,title,isTagExpr) {
switch(this.getTagglyOpt(title,"listMode")) {
case "group": return this.createTagglyListGrouped(place,title,isTagExpr); break;
case "normal": return this.createTagglyListNormal(place,title,false,isTagExpr); break;
case "commas": return this.createTagglyListNormal(place,title,true,isTagExpr); break;
case "sitemap":return this.createTagglyListSiteMap(place,title,isTagExpr); break;
}
},
getTaggingCount: function(title,isTagExpr) {
// thanks to Doug Edmunds
if (this.config.showTaggingCounts) {
var tagCount = config.taggly.getTiddlers(title,'title',isTagExpr).length;
if (tagCount > 0)
return " ("+tagCount+")";
}
return "";
},
getTiddlers: function(titleOrExpr,sortBy,isTagExpr) {
return isTagExpr ? store.getTiddlersByTagExpr(titleOrExpr,sortBy) : store.getTaggedTiddlers(titleOrExpr,sortBy);
},
getExcerpt: function(inTiddlerTitle,title,indent) {
if (!indent)
indent = 1;
var displayMode = this.getTagglyOpt(inTiddlerTitle,"excerpts");
var t = store.getTiddler(title);
if (t && displayMode == "excerpts") {
var text = t.text.replace(/\n/," ");
var marker = text.indexOf(this.config.excerptMarker);
if (marker != -1) {
return " {{excerpt{<nowiki>" + text.substr(0,marker) + "</nowiki>}}}";
}
else if (text.length < this.config.excerptSize) {
return " {{excerpt{<nowiki>" + t.text + "</nowiki>}}}";
}
else {
return " {{excerpt{<nowiki>" + t.text.substr(0,this.config.excerptSize) + "..." + "</nowiki>}}}";
}
}
else if (t && displayMode == "contents") {
return "\n{{contents indent"+indent+"{\n" + t.text + "\n}}}";
}
else if (t && displayMode == "sliders") {
return "<slider slide>\n{{contents{\n" + t.text + "\n}}}\n</slider>";
}
else if (t && displayMode == "descr") {
var descr = store.getTiddlerSlice(title,'Description');
return descr ? " {{excerpt{" + descr + "}}}" : "";
}
else if (t && displayMode == "slices") {
var result = "";
var slices = store.calcAllSlices(title);
for (var s in slices)
result += "|%0|<nowiki>%1</nowiki>|\n".format([s,slices[s]]);
return result ? "\n{{excerpt excerptIndent{\n" + result + "}}}" : "";
}
return "";
},
notHidden: function(t,inTiddler) {
if (typeof t == "string")
t = store.getTiddler(t);
return (!t || !t.tags.containsAny(this.config.excludeTags) ||
(inTiddler && this.config.excludeTags.contains(inTiddler)));
},
// this is for normal and commas mode
createTagglyListNormal: function(place,title,useCommas,isTagExpr) {
var list = config.taggly.getTiddlers(title,this.getTagglyOpt(title,"sortBy"),isTagExpr);
if (this.getTagglyOpt(title,"sortOrder") == "desc")
list = list.reverse();
var output = [];
var first = true;
for (var i=0;i<list.length;i++) {
if (this.notHidden(list[i],title)) {
var countString = this.getTaggingCount(list[i].title);
var excerpt = this.getExcerpt(title,list[i].title);
if (useCommas)
output.push((first ? "" : ", ") + "[[" + list[i].title + "]]" + countString + excerpt);
else
output.push("*[[" + list[i].title + "]]" + countString + excerpt + "\n");
first = false;
}
}
return this.drawTable(place,
this.makeColumns(output,useCommas ? 1 : parseInt(this.getTagglyOpt(title,"numCols"))),
useCommas ? "commas" : "normal");
},
// this is for the "grouped" mode
createTagglyListGrouped: function(place,title,isTagExpr) {
var sortBy = this.getTagglyOpt(title,"sortBy");
var sortOrder = this.getTagglyOpt(title,"sortOrder");
var list = config.taggly.getTiddlers(title,sortBy,isTagExpr);
if (sortOrder == "desc")
list = list.reverse();
var leftOvers = []
for (var i=0;i<list.length;i++)
leftOvers.push(list[i].title);
var allTagsHolder = {};
for (var i=0;i<list.length;i++) {
for (var j=0;j<list[i].tags.length;j++) {
if (list[i].tags[j] != title) { // not this tiddler
if (this.notHidden(list[i].tags[j],title)) {
if (!allTagsHolder[list[i].tags[j]])
allTagsHolder[list[i].tags[j]] = "";
if (this.notHidden(list[i],title)) {
allTagsHolder[list[i].tags[j]] += "**[["+list[i].title+"]]"
+ this.getTaggingCount(list[i].title) + this.getExcerpt(title,list[i].title) + "\n";
leftOvers.setItem(list[i].title,-1); // remove from leftovers. at the end it will contain the leftovers
}
}
}
}
}
var allTags = [];
for (var t in allTagsHolder)
allTags.push(t);
var sortHelper = function(a,b) {
if (a == b) return 0;
if (a < b) return -1;
return 1;
};
allTags.sort(function(a,b) {
var tidA = store.getTiddler(a);
var tidB = store.getTiddler(b);
if (sortBy == "title") return sortHelper(a,b);
else if (!tidA && !tidB) return 0;
else if (!tidA) return -1;
else if (!tidB) return +1;
else return sortHelper(tidA[sortBy],tidB[sortBy]);
});
var leftOverOutput = "";
for (var i=0;i<leftOvers.length;i++)
if (this.notHidden(leftOvers[i],title))
leftOverOutput += "*[["+leftOvers[i]+"]]" + this.getTaggingCount(leftOvers[i]) + this.getExcerpt(title,leftOvers[i]) + "\n";
var output = [];
if (sortOrder == "desc")
allTags.reverse();
else if (leftOverOutput != "")
// leftovers first...
output.push(leftOverOutput);
for (var i=0;i<allTags.length;i++)
if (allTagsHolder[allTags[i]] != "")
output.push("*[["+allTags[i]+"]]" + this.getTaggingCount(allTags[i]) + this.getExcerpt(title,allTags[i]) + "\n" + allTagsHolder[allTags[i]]);
if (sortOrder == "desc" && leftOverOutput != "")
// leftovers last...
output.push(leftOverOutput);
return this.drawTable(place,
this.makeColumns(output,parseInt(this.getTagglyOpt(title,"numCols"))),
"grouped");
},
// used to build site map
treeTraverse: function(title,depth,sortBy,sortOrder,isTagExpr) {
var list = config.taggly.getTiddlers(title,sortBy,isTagExpr);
if (sortOrder == "desc")
list.reverse();
var indent = "";
for (var j=0;j<depth;j++)
indent += "*"
var childOutput = "";
if (depth > this.config.siteMapDepthLimit)
childOutput += indent + this.lingo.tooDeepMessage;
else
for (var i=0;i<list.length;i++)
if (list[i].title != title)
if (this.notHidden(list[i].title,this.config.inTiddler))
childOutput += this.treeTraverse(list[i].title,depth+1,sortBy,sortOrder,false);
if (depth == 0)
return childOutput;
else
return indent + "[["+title+"]]" + this.getTaggingCount(title) + this.getExcerpt(this.config.inTiddler,title,depth) + "\n" + childOutput;
},
// this if for the site map mode
createTagglyListSiteMap: function(place,title,isTagExpr) {
this.config.inTiddler = title; // nasty. should pass it in to traverse probably
var output = this.treeTraverse(title,0,this.getTagglyOpt(title,"sortBy"),this.getTagglyOpt(title,"sortOrder"),isTagExpr);
return this.drawTable(place,
this.makeColumns(output.split(/(?=^\*\[)/m),parseInt(this.getTagglyOpt(title,"numCols"))), // regexp magic
"sitemap"
);
},
macros: {
tagglyTagging: {
handler: function (place,macroName,params,wikifier,paramString,tiddler) {
var parsedParams = paramString.parseParams("tag",null,true);
var refreshContainer = createTiddlyElement(place,"div");
// do some refresh magic to make it keep the list fresh - thanks Saq
refreshContainer.setAttribute("refresh","macro");
refreshContainer.setAttribute("macroName",macroName);
var tag = getParam(parsedParams,"tag");
var expr = getParam(parsedParams,"expr");
if (expr) {
refreshContainer.setAttribute("isTagExpr","true");
refreshContainer.setAttribute("title",expr);
refreshContainer.setAttribute("showEmpty","true");
}
else {
refreshContainer.setAttribute("isTagExpr","false");
if (tag) {
refreshContainer.setAttribute("title",tag);
refreshContainer.setAttribute("showEmpty","true");
}
else {
refreshContainer.setAttribute("title",tiddler.title);
refreshContainer.setAttribute("showEmpty","false");
}
}
this.refresh(refreshContainer);
},
refresh: function(place) {
var title = place.getAttribute("title");
var isTagExpr = place.getAttribute("isTagExpr") == "true";
var showEmpty = place.getAttribute("showEmpty") == "true";
removeChildren(place);
addClass(place,"tagglyTagging");
var countFound = config.taggly.getTiddlers(title,'title',isTagExpr).length
if (countFound > 0 || showEmpty) {
var lingo = config.taggly.lingo;
config.taggly.createListControl(place,title,"hideState");
if (config.taggly.getTagglyOpt(title,"hideState") == "show") {
createTiddlyElement(place,"span",null,"tagglyLabel",
isTagExpr ? lingo.labels.exprLabel.format([title]) : lingo.labels.label.format([title]));
config.taggly.createListControl(place,title,"title");
config.taggly.createListControl(place,title,"modified");
config.taggly.createListControl(place,title,"created");
config.taggly.createListControl(place,title,"listMode");
config.taggly.createListControl(place,title,"excerpts");
config.taggly.createListControl(place,title,"numCols");
config.taggly.createTagglyList(place,title,isTagExpr);
if (countFound == 0 && showEmpty)
createTiddlyElement(place,"div",null,"tagglyNoneFound",lingo.labels.noneFound);
}
}
}
}
},
// todo fix these up a bit
styles: [
"/*{{{*/",
"/* created by TagglyTaggingPlugin */",
".tagglyTagging { padding-top:0.5em; }",
".tagglyTagging li.listTitle { display:none; }",
".tagglyTagging ul {",
" margin-top:0px; padding-top:0.5em; padding-left:2em;",
" margin-bottom:0px; padding-bottom:0px;",
"}",
".tagglyTagging { vertical-align: top; margin:0px; padding:0px; }",
".tagglyTagging table { margin:0px; padding:0px; }",
".tagglyTagging .button { visibility:hidden; margin-left:3px; margin-right:3px; }",
".tagglyTagging .button, .tagglyTagging .hidebutton {",
" color:[[ColorPalette::TertiaryLight]]; font-size:90%;",
" border:0px; padding-left:0.3em;padding-right:0.3em;",
"}",
".tagglyTagging .button:hover, .hidebutton:hover, ",
".tagglyTagging .button:active, .hidebutton:active {",
" border:0px; background:[[ColorPalette::TertiaryPale]]; color:[[ColorPalette::TertiaryDark]];",
"}",
".selected .tagglyTagging .button { visibility:visible; }",
".tagglyTagging .hidebutton { color:[[ColorPalette::Background]]; }",
".selected .tagglyTagging .hidebutton { color:[[ColorPalette::TertiaryLight]] }",
".tagglyLabel { color:[[ColorPalette::TertiaryMid]]; font-size:90%; }",
".tagglyTagging ul {padding-top:0px; padding-bottom:0.5em; margin-left:1em; }",
".tagglyTagging ul ul {list-style-type:disc; margin-left:-1em;}",
".tagglyTagging ul ul li {margin-left:0.5em; }",
".editLabel { font-size:90%; padding-top:0.5em; }",
".tagglyTagging .commas { padding-left:1.8em; }",
"/* not technically tagglytagging but will put them here anyway */",
".tagglyTagged li.listTitle { display:none; }",
".tagglyTagged li { display: inline; font-size:90%; }",
".tagglyTagged ul { margin:0px; padding:0px; }",
".excerpt { color:[[ColorPalette::TertiaryDark]]; }",
".excerptIndent { margin-left:4em; }",
"div.tagglyTagging table,",
"div.tagglyTagging table tr,",
"td.tagglyTagging",
" {border-style:none!important; }",
".tagglyTagging .contents { border-bottom:2px solid [[ColorPalette::TertiaryPale]]; padding:0 1em 1em 0.5em;",
" margin-bottom:0.5em; }",
".tagglyTagging .indent1 { margin-left:3em; }",
".tagglyTagging .indent2 { margin-left:4em; }",
".tagglyTagging .indent3 { margin-left:5em; }",
".tagglyTagging .indent4 { margin-left:6em; }",
".tagglyTagging .indent5 { margin-left:7em; }",
".tagglyTagging .indent6 { margin-left:8em; }",
".tagglyTagging .indent7 { margin-left:9em; }",
".tagglyTagging .indent8 { margin-left:10em; }",
".tagglyTagging .indent9 { margin-left:11em; }",
".tagglyTagging .indent10 { margin-left:12em; }",
".tagglyNoneFound { margin-left:2em; color:[[ColorPalette::TertiaryMid]]; font-size:90%; font-style:italic; }",
"/*}}}*/",
""].join("\n"),
init: function() {
merge(config.macros,this.macros);
config.shadowTiddlers["TagglyTaggingStyles"] = this.styles;
store.addNotification("TagglyTaggingStyles",refreshStyles);
}
};
config.taggly.init();
//}}}
/***
InlineSlidersPlugin
By Saq Imtiaz
http://tw.lewcid.org/sandbox/#InlineSlidersPlugin
// syntax adjusted to not clash with NestedSlidersPlugin
// added + syntax to start open instead of closed
***/
//{{{
config.formatters.unshift( {
name: "inlinesliders",
// match: "\\+\\+\\+\\+|\\<slider",
match: "\\<slider",
// lookaheadRegExp: /(?:\+\+\+\+|<slider) (.*?)(?:>?)\n((?:.|\n)*?)\n(?:====|<\/slider>)/mg,
lookaheadRegExp: /(?:<slider)(\+?) (.*?)(?:>)\n((?:.|\n)*?)\n(?:<\/slider>)/mg,
handler: function(w) {
this.lookaheadRegExp.lastIndex = w.matchStart;
var lookaheadMatch = this.lookaheadRegExp.exec(w.source)
if(lookaheadMatch && lookaheadMatch.index == w.matchStart ) {
var btn = createTiddlyButton(w.output,lookaheadMatch[2] + " "+"\u00BB",lookaheadMatch[2],this.onClickSlider,"button sliderButton");
var panel = createTiddlyElement(w.output,"div",null,"sliderPanel");
panel.style.display = (lookaheadMatch[1] == '+' ? "block" : "none");
wikify(lookaheadMatch[3],panel);
w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;
}
},
onClickSlider : function(e) {
if(!e) var e = window.event;
var n = this.nextSibling;
n.style.display = (n.style.display=="none") ? "block" : "none";
return false;
}
});
//}}}
/***
|Name:|TagglyTaggingPlugin|
|Description:|tagglyTagging macro is a replacement for the builtin tagging macro in your ViewTemplate|
|Version:|3.3.1 ($Rev: 6100 $)|
|Date:|$Date: 2008-07-27 01:42:07 +1000 (Sun, 27 Jul 2008) $|
|Source:|http://mptw.tiddlyspot.com/#TagglyTaggingPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
!Notes
See http://mptw.tiddlyspot.com/#TagglyTagging
***/
//{{{
merge(String.prototype,{
parseTagExpr: function(debug) {
if (this.trim() == "")
return "(true)";
var anyLogicOp = /(!|&&|\|\||\(|\))/g;
var singleLogicOp = /^(!|&&|\|\||\(|\))$/;
var spaced = this.
// because square brackets in templates are no good
// this means you can use [(With Spaces)] instead of [[With Spaces]]
replace(/\[\(/g," [[").
replace(/\)\]/g,"]] ").
// space things out so we can use readBracketedList. tricky eh?
replace(anyLogicOp," $1 ");
var expr = "";
var tokens = spaced.readBracketedList(false); // false means don't uniq the list. nice one JR!
for (var i=0;i<tokens.length;i++)
if (tokens[i].match(singleLogicOp))
expr += tokens[i];
else
expr += "tiddler.tags.contains('%0')".format([tokens[i].replace(/'/,"\\'")]); // fix single quote bug. still have round bracket bug i think
if (debug)
alert(expr);
return '('+expr+')';
}
});
merge(TiddlyWiki.prototype,{
getTiddlersByTagExpr: function(tagExpr,sortField) {
var result = [];
var expr = tagExpr.parseTagExpr();
store.forEachTiddler(function(title,tiddler) {
if (eval(expr))
result.push(tiddler);
});
if(!sortField)
sortField = "title";
result.sort(function(a,b) {return a[sortField] < b[sortField] ? -1 : (a[sortField] == b[sortField] ? 0 : +1);});
return result;
}
});
config.taggly = {
// for translations
lingo: {
labels: {
asc: "\u2191", // down arrow
desc: "\u2193", // up arrow
title: "title",
modified: "modified",
created: "created",
show: "+",
hide: "-",
normal: "normal",
group: "group",
commas: "commas",
sitemap: "sitemap",
numCols: "cols\u00b1", // plus minus sign
label: "Tagged as '%0':",
exprLabel: "Matching tag expression '%0':",
excerpts: "excerpts",
descr: "descr",
slices: "slices",
contents: "contents",
sliders: "sliders",
noexcerpts: "title only",
noneFound: "(none)"
},
tooltips: {
title: "Click to sort by title",
modified: "Click to sort by modified date",
created: "Click to sort by created date",
show: "Click to show tagging list",
hide: "Click to hide tagging list",
normal: "Click to show a normal ungrouped list",
group: "Click to show list grouped by tag",
sitemap: "Click to show a sitemap style list",
commas: "Click to show a comma separated list",
numCols: "Click to change number of columns",
excerpts: "Click to show excerpts",
descr: "Click to show the description slice",
slices: "Click to show all slices",
contents: "Click to show entire tiddler contents",
sliders: "Click to show tiddler contents in sliders",
noexcerpts: "Click to show entire title only"
},
tooDeepMessage: "* //sitemap too deep...//"
},
config: {
showTaggingCounts: true,
listOpts: {
// the first one will be the default
sortBy: ["title","modified","created"],
sortOrder: ["asc","desc"],
hideState: ["show","hide"],
listMode: ["normal","group","sitemap","commas"],
numCols: ["1","2","3","4","5","6"],
excerpts: ["noexcerpts","excerpts","descr","slices","contents","sliders"]
},
valuePrefix: "taggly.",
excludeTags: ["excludeLists","excludeTagging"],
excerptSize: 50,
excerptMarker: "/%"+"%/",
siteMapDepthLimit: 25
},
getTagglyOpt: function(title,opt) {
var val = store.getValue(title,this.config.valuePrefix+opt);
return val ? val : this.config.listOpts[opt][0];
},
setTagglyOpt: function(title,opt,value) {
if (!store.tiddlerExists(title))
// create it silently
store.saveTiddler(title,title,config.views.editor.defaultText.format([title]),config.options.txtUserName,new Date(),"");
// if value is default then remove it to save space
return store.setValue(title,
this.config.valuePrefix+opt,
value == this.config.listOpts[opt][0] ? null : value);
},
getNextValue: function(title,opt) {
var current = this.getTagglyOpt(title,opt);
var pos = this.config.listOpts[opt].indexOf(current);
// a little usability enhancement. actually it doesn't work right for grouped or sitemap
var limit = (opt == "numCols" ? store.getTiddlersByTagExpr(title).length : this.config.listOpts[opt].length);
var newPos = (pos + 1) % limit;
return this.config.listOpts[opt][newPos];
},
toggleTagglyOpt: function(title,opt) {
var newVal = this.getNextValue(title,opt);
this.setTagglyOpt(title,opt,newVal);
},
createListControl: function(place,title,type) {
var lingo = config.taggly.lingo;
var label;
var tooltip;
var onclick;
if ((type == "title" || type == "modified" || type == "created")) {
// "special" controls. a little tricky. derived from sortOrder and sortBy
label = lingo.labels[type];
tooltip = lingo.tooltips[type];
if (this.getTagglyOpt(title,"sortBy") == type) {
label += lingo.labels[this.getTagglyOpt(title,"sortOrder")];
onclick = function() {
config.taggly.toggleTagglyOpt(title,"sortOrder");
return false;
}
}
else {
onclick = function() {
config.taggly.setTagglyOpt(title,"sortBy",type);
config.taggly.setTagglyOpt(title,"sortOrder",config.taggly.config.listOpts.sortOrder[0]);
return false;
}
}
}
else {
// "regular" controls, nice and simple
label = lingo.labels[type == "numCols" ? type : this.getNextValue(title,type)];
tooltip = lingo.tooltips[type == "numCols" ? type : this.getNextValue(title,type)];
onclick = function() {
config.taggly.toggleTagglyOpt(title,type);
return false;
}
}
// hide button because commas don't have columns
if (!(this.getTagglyOpt(title,"listMode") == "commas" && type == "numCols"))
createTiddlyButton(place,label,tooltip,onclick,type == "hideState" ? "hidebutton" : "button");
},
makeColumns: function(orig,numCols) {
var listSize = orig.length;
var colSize = listSize/numCols;
var remainder = listSize % numCols;
var upperColsize = colSize;
var lowerColsize = colSize;
if (colSize != Math.floor(colSize)) {
// it's not an exact fit so..
upperColsize = Math.floor(colSize) + 1;
lowerColsize = Math.floor(colSize);
}
var output = [];
var c = 0;
for (var j=0;j<numCols;j++) {
var singleCol = [];
var thisSize = j < remainder ? upperColsize : lowerColsize;
for (var i=0;i<thisSize;i++)
singleCol.push(orig[c++]);
output.push(singleCol);
}
return output;
},
drawTable: function(place,columns,theClass) {
var newTable = createTiddlyElement(place,"table",null,theClass);
var newTbody = createTiddlyElement(newTable,"tbody");
var newTr = createTiddlyElement(newTbody,"tr");
for (var j=0;j<columns.length;j++) {
var colOutput = "";
for (var i=0;i<columns[j].length;i++)
colOutput += columns[j][i];
var newTd = createTiddlyElement(newTr,"td",null,"tagglyTagging"); // todo should not need this class
wikify(colOutput,newTd);
}
return newTable;
},
createTagglyList: function(place,title,isTagExpr) {
switch(this.getTagglyOpt(title,"listMode")) {
case "group": return this.createTagglyListGrouped(place,title,isTagExpr); break;
case "normal": return this.createTagglyListNormal(place,title,false,isTagExpr); break;
case "commas": return this.createTagglyListNormal(place,title,true,isTagExpr); break;
case "sitemap":return this.createTagglyListSiteMap(place,title,isTagExpr); break;
}
},
getTaggingCount: function(title,isTagExpr) {
// thanks to Doug Edmunds
if (this.config.showTaggingCounts) {
var tagCount = config.taggly.getTiddlers(title,'title',isTagExpr).length;
if (tagCount > 0)
return " ("+tagCount+")";
}
return "";
},
getTiddlers: function(titleOrExpr,sortBy,isTagExpr) {
return isTagExpr ? store.getTiddlersByTagExpr(titleOrExpr,sortBy) : store.getTaggedTiddlers(titleOrExpr,sortBy);
},
getExcerpt: function(inTiddlerTitle,title,indent) {
if (!indent)
indent = 1;
var displayMode = this.getTagglyOpt(inTiddlerTitle,"excerpts");
var t = store.getTiddler(title);
if (t && displayMode == "excerpts") {
var text = t.text.replace(/\n/," ");
var marker = text.indexOf(this.config.excerptMarker);
if (marker != -1) {
return " {{excerpt{<nowiki>" + text.substr(0,marker) + "</nowiki>}}}";
}
else if (text.length < this.config.excerptSize) {
return " {{excerpt{<nowiki>" + t.text + "</nowiki>}}}";
}
else {
return " {{excerpt{<nowiki>" + t.text.substr(0,this.config.excerptSize) + "..." + "</nowiki>}}}";
}
}
else if (t && displayMode == "contents") {
return "\n{{contents indent"+indent+"{\n" + t.text + "\n}}}";
}
else if (t && displayMode == "sliders") {
return "<slider slide>\n{{contents{\n" + t.text + "\n}}}\n</slider>";
}
else if (t && displayMode == "descr") {
var descr = store.getTiddlerSlice(title,'Description');
return descr ? " {{excerpt{" + descr + "}}}" : "";
}
else if (t && displayMode == "slices") {
var result = "";
var slices = store.calcAllSlices(title);
for (var s in slices)
result += "|%0|<nowiki>%1</nowiki>|\n".format([s,slices[s]]);
return result ? "\n{{excerpt excerptIndent{\n" + result + "}}}" : "";
}
return "";
},
notHidden: function(t,inTiddler) {
if (typeof t == "string")
t = store.getTiddler(t);
return (!t || !t.tags.containsAny(this.config.excludeTags) ||
(inTiddler && this.config.excludeTags.contains(inTiddler)));
},
// this is for normal and commas mode
createTagglyListNormal: function(place,title,useCommas,isTagExpr) {
var list = config.taggly.getTiddlers(title,this.getTagglyOpt(title,"sortBy"),isTagExpr);
if (this.getTagglyOpt(title,"sortOrder") == "desc")
list = list.reverse();
var output = [];
var first = true;
for (var i=0;i<list.length;i++) {
if (this.notHidden(list[i],title)) {
var countString = this.getTaggingCount(list[i].title);
var excerpt = this.getExcerpt(title,list[i].title);
if (useCommas)
output.push((first ? "" : ", ") + "[[" + list[i].title + "]]" + countString + excerpt);
else
output.push("*[[" + list[i].title + "]]" + countString + excerpt + "\n");
first = false;
}
}
return this.drawTable(place,
this.makeColumns(output,useCommas ? 1 : parseInt(this.getTagglyOpt(title,"numCols"))),
useCommas ? "commas" : "normal");
},
// this is for the "grouped" mode
createTagglyListGrouped: function(place,title,isTagExpr) {
var sortBy = this.getTagglyOpt(title,"sortBy");
var sortOrder = this.getTagglyOpt(title,"sortOrder");
var list = config.taggly.getTiddlers(title,sortBy,isTagExpr);
if (sortOrder == "desc")
list = list.reverse();
var leftOvers = []
for (var i=0;i<list.length;i++)
leftOvers.push(list[i].title);
var allTagsHolder = {};
for (var i=0;i<list.length;i++) {
for (var j=0;j<list[i].tags.length;j++) {
if (list[i].tags[j] != title) { // not this tiddler
if (this.notHidden(list[i].tags[j],title)) {
if (!allTagsHolder[list[i].tags[j]])
allTagsHolder[list[i].tags[j]] = "";
if (this.notHidden(list[i],title)) {
allTagsHolder[list[i].tags[j]] += "**[["+list[i].title+"]]"
+ this.getTaggingCount(list[i].title) + this.getExcerpt(title,list[i].title) + "\n";
leftOvers.setItem(list[i].title,-1); // remove from leftovers. at the end it will contain the leftovers
}
}
}
}
}
var allTags = [];
for (var t in allTagsHolder)
allTags.push(t);
var sortHelper = function(a,b) {
if (a == b) return 0;
if (a < b) return -1;
return 1;
};
allTags.sort(function(a,b) {
var tidA = store.getTiddler(a);
var tidB = store.getTiddler(b);
if (sortBy == "title") return sortHelper(a,b);
else if (!tidA && !tidB) return 0;
else if (!tidA) return -1;
else if (!tidB) return +1;
else return sortHelper(tidA[sortBy],tidB[sortBy]);
});
var leftOverOutput = "";
for (var i=0;i<leftOvers.length;i++)
if (this.notHidden(leftOvers[i],title))
leftOverOutput += "*[["+leftOvers[i]+"]]" + this.getTaggingCount(leftOvers[i]) + this.getExcerpt(title,leftOvers[i]) + "\n";
var output = [];
if (sortOrder == "desc")
allTags.reverse();
else if (leftOverOutput != "")
// leftovers first...
output.push(leftOverOutput);
for (var i=0;i<allTags.length;i++)
if (allTagsHolder[allTags[i]] != "")
output.push("*[["+allTags[i]+"]]" + this.getTaggingCount(allTags[i]) + this.getExcerpt(title,allTags[i]) + "\n" + allTagsHolder[allTags[i]]);
if (sortOrder == "desc" && leftOverOutput != "")
// leftovers last...
output.push(leftOverOutput);
return this.drawTable(place,
this.makeColumns(output,parseInt(this.getTagglyOpt(title,"numCols"))),
"grouped");
},
// used to build site map
treeTraverse: function(title,depth,sortBy,sortOrder,isTagExpr) {
var list = config.taggly.getTiddlers(title,sortBy,isTagExpr);
if (sortOrder == "desc")
list.reverse();
var indent = "";
for (var j=0;j<depth;j++)
indent += "*"
var childOutput = "";
if (depth > this.config.siteMapDepthLimit)
childOutput += indent + this.lingo.tooDeepMessage;
else
for (var i=0;i<list.length;i++)
if (list[i].title != title)
if (this.notHidden(list[i].title,this.config.inTiddler))
childOutput += this.treeTraverse(list[i].title,depth+1,sortBy,sortOrder,false);
if (depth == 0)
return childOutput;
else
return indent + "[["+title+"]]" + this.getTaggingCount(title) + this.getExcerpt(this.config.inTiddler,title,depth) + "\n" + childOutput;
},
// this if for the site map mode
createTagglyListSiteMap: function(place,title,isTagExpr) {
this.config.inTiddler = title; // nasty. should pass it in to traverse probably
var output = this.treeTraverse(title,0,this.getTagglyOpt(title,"sortBy"),this.getTagglyOpt(title,"sortOrder"),isTagExpr);
return this.drawTable(place,
this.makeColumns(output.split(/(?=^\*\[)/m),parseInt(this.getTagglyOpt(title,"numCols"))), // regexp magic
"sitemap"
);
},
macros: {
tagglyTagging: {
handler: function (place,macroName,params,wikifier,paramString,tiddler) {
var parsedParams = paramString.parseParams("tag",null,true);
var refreshContainer = createTiddlyElement(place,"div");
// do some refresh magic to make it keep the list fresh - thanks Saq
refreshContainer.setAttribute("refresh","macro");
refreshContainer.setAttribute("macroName",macroName);
var tag = getParam(parsedParams,"tag");
var expr = getParam(parsedParams,"expr");
if (expr) {
refreshContainer.setAttribute("isTagExpr","true");
refreshContainer.setAttribute("title",expr);
refreshContainer.setAttribute("showEmpty","true");
}
else {
refreshContainer.setAttribute("isTagExpr","false");
if (tag) {
refreshContainer.setAttribute("title",tag);
refreshContainer.setAttribute("showEmpty","true");
}
else {
refreshContainer.setAttribute("title",tiddler.title);
refreshContainer.setAttribute("showEmpty","false");
}
}
this.refresh(refreshContainer);
},
refresh: function(place) {
var title = place.getAttribute("title");
var isTagExpr = place.getAttribute("isTagExpr") == "true";
var showEmpty = place.getAttribute("showEmpty") == "true";
removeChildren(place);
addClass(place,"tagglyTagging");
var countFound = config.taggly.getTiddlers(title,'title',isTagExpr).length
if (countFound > 0 || showEmpty) {
var lingo = config.taggly.lingo;
config.taggly.createListControl(place,title,"hideState");
if (config.taggly.getTagglyOpt(title,"hideState") == "show") {
createTiddlyElement(place,"span",null,"tagglyLabel",
isTagExpr ? lingo.labels.exprLabel.format([title]) : lingo.labels.label.format([title]));
config.taggly.createListControl(place,title,"title");
config.taggly.createListControl(place,title,"modified");
config.taggly.createListControl(place,title,"created");
config.taggly.createListControl(place,title,"listMode");
config.taggly.createListControl(place,title,"excerpts");
config.taggly.createListControl(place,title,"numCols");
config.taggly.createTagglyList(place,title,isTagExpr);
if (countFound == 0 && showEmpty)
createTiddlyElement(place,"div",null,"tagglyNoneFound",lingo.labels.noneFound);
}
}
}
}
},
// todo fix these up a bit
styles: [
"/*{{{*/",
"/* created by TagglyTaggingPlugin */",
".tagglyTagging { padding-top:0.5em; }",
".tagglyTagging li.listTitle { display:none; }",
".tagglyTagging ul {",
" margin-top:0px; padding-top:0.5em; padding-left:2em;",
" margin-bottom:0px; padding-bottom:0px;",
"}",
".tagglyTagging { vertical-align: top; margin:0px; padding:0px; }",
".tagglyTagging table { margin:0px; padding:0px; }",
".tagglyTagging .button { visibility:hidden; margin-left:3px; margin-right:3px; }",
".tagglyTagging .button, .tagglyTagging .hidebutton {",
" color:[[ColorPalette::TertiaryLight]]; font-size:90%;",
" border:0px; padding-left:0.3em;padding-right:0.3em;",
"}",
".tagglyTagging .button:hover, .hidebutton:hover, ",
".tagglyTagging .button:active, .hidebutton:active {",
" border:0px; background:[[ColorPalette::TertiaryPale]]; color:[[ColorPalette::TertiaryDark]];",
"}",
".selected .tagglyTagging .button { visibility:visible; }",
".tagglyTagging .hidebutton { color:[[ColorPalette::Background]]; }",
".selected .tagglyTagging .hidebutton { color:[[ColorPalette::TertiaryLight]] }",
".tagglyLabel { color:[[ColorPalette::TertiaryMid]]; font-size:90%; }",
".tagglyTagging ul {padding-top:0px; padding-bottom:0.5em; margin-left:1em; }",
".tagglyTagging ul ul {list-style-type:disc; margin-left:-1em;}",
".tagglyTagging ul ul li {margin-left:0.5em; }",
".editLabel { font-size:90%; padding-top:0.5em; }",
".tagglyTagging .commas { padding-left:1.8em; }",
"/* not technically tagglytagging but will put them here anyway */",
".tagglyTagged li.listTitle { display:none; }",
".tagglyTagged li { display: inline; font-size:90%; }",
".tagglyTagged ul { margin:0px; padding:0px; }",
".excerpt { color:[[ColorPalette::TertiaryDark]]; }",
".excerptIndent { margin-left:4em; }",
"div.tagglyTagging table,",
"div.tagglyTagging table tr,",
"td.tagglyTagging",
" {border-style:none!important; }",
".tagglyTagging .contents { border-bottom:2px solid [[ColorPalette::TertiaryPale]]; padding:0 1em 1em 0.5em;",
" margin-bottom:0.5em; }",
".tagglyTagging .indent1 { margin-left:3em; }",
".tagglyTagging .indent2 { margin-left:4em; }",
".tagglyTagging .indent3 { margin-left:5em; }",
".tagglyTagging .indent4 { margin-left:6em; }",
".tagglyTagging .indent5 { margin-left:7em; }",
".tagglyTagging .indent6 { margin-left:8em; }",
".tagglyTagging .indent7 { margin-left:9em; }",
".tagglyTagging .indent8 { margin-left:10em; }",
".tagglyTagging .indent9 { margin-left:11em; }",
".tagglyTagging .indent10 { margin-left:12em; }",
".tagglyNoneFound { margin-left:2em; color:[[ColorPalette::TertiaryMid]]; font-size:90%; font-style:italic; }",
"/*}}}*/",
""].join("\n"),
init: function() {
merge(config.macros,this.macros);
config.shadowTiddlers["TagglyTaggingStyles"] = this.styles;
store.addNotification("TagglyTaggingStyles",refreshStyles);
}
};
config.taggly.init();
//}}}
/***
InlineSlidersPlugin
By Saq Imtiaz
http://tw.lewcid.org/sandbox/#InlineSlidersPlugin
// syntax adjusted to not clash with NestedSlidersPlugin
// added + syntax to start open instead of closed
***/
//{{{
config.formatters.unshift( {
name: "inlinesliders",
// match: "\\+\\+\\+\\+|\\<slider",
match: "\\<slider",
// lookaheadRegExp: /(?:\+\+\+\+|<slider) (.*?)(?:>?)\n((?:.|\n)*?)\n(?:====|<\/slider>)/mg,
lookaheadRegExp: /(?:<slider)(\+?) (.*?)(?:>)\n((?:.|\n)*?)\n(?:<\/slider>)/mg,
handler: function(w) {
this.lookaheadRegExp.lastIndex = w.matchStart;
var lookaheadMatch = this.lookaheadRegExp.exec(w.source)
if(lookaheadMatch && lookaheadMatch.index == w.matchStart ) {
var btn = createTiddlyButton(w.output,lookaheadMatch[2] + " "+"\u00BB",lookaheadMatch[2],this.onClickSlider,"button sliderButton");
var panel = createTiddlyElement(w.output,"div",null,"sliderPanel");
panel.style.display = (lookaheadMatch[1] == '+' ? "block" : "none");
wikify(lookaheadMatch[3],panel);
w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;
}
},
onClickSlider : function(e) {
if(!e) var e = window.event;
var n = this.nextSibling;
n.style.display = (n.style.display=="none") ? "block" : "none";
return false;
}
});
//}}}
/*{{{*/
/* created by TagglyTaggingPlugin */
.tagglyTagging { padding-top:0.5em; }
.tagglyTagging li.listTitle { display:none; }
.tagglyTagging ul {
margin-top:0px; padding-top:0.5em; padding-left:2em;
margin-bottom:0px; padding-bottom:0px;
}
.tagglyTagging { vertical-align: top; margin:0px; padding:0px; }
.tagglyTagging table { margin:0px; padding:0px; }
.tagglyTagging .button { visibility:hidden; margin-left:3px; margin-right:3px; }
.tagglyTagging .button, .tagglyTagging .hidebutton {
color:[[ColorPalette::TertiaryLight]]; font-size:90%;
border:0px; padding-left:0.3em;padding-right:0.3em;
}
.tagglyTagging .button:hover, .hidebutton:hover,
.tagglyTagging .button:active, .hidebutton:active {
border:0px; background:[[ColorPalette::TertiaryPale]]; color:[[ColorPalette::TertiaryDark]];
}
.selected .tagglyTagging .button { visibility:visible; }
.tagglyTagging .hidebutton { color:[[ColorPalette::Background]]; }
.selected .tagglyTagging .hidebutton { color:[[ColorPalette::TertiaryLight]] }
.tagglyLabel { color:[[ColorPalette::TertiaryMid]]; font-size:90%; }
.tagglyTagging ul {padding-top:0px; padding-bottom:0.5em; margin-left:1em; }
.tagglyTagging ul ul {list-style-type:disc; margin-left:-1em;}
.tagglyTagging ul ul li {margin-left:0.5em; }
.editLabel { font-size:90%; padding-top:0.5em; }
.tagglyTagging .commas { padding-left:1.8em; }
/* not technically tagglytagging but will put them here anyway */
.tagglyTagged li.listTitle { display:none; }
.tagglyTagged li { display: inline; font-size:90%; }
.tagglyTagged ul { margin:0px; padding:0px; }
.excerpt { color:[[ColorPalette::TertiaryDark]]; }
.excerptIndent { margin-left:4em; }
div.tagglyTagging table,
div.tagglyTagging table tr,
td.tagglyTagging
{border-style:none!important; }
.tagglyTagging .contents { border-bottom:2px solid [[ColorPalette::TertiaryPale]]; padding:0 1em 1em 0.5em;
margin-bottom:0.5em; }
.tagglyTagging .indent1 { margin-left:3em; }
.tagglyTagging .indent2 { margin-left:4em; }
.tagglyTagging .indent3 { margin-left:5em; }
.tagglyTagging .indent4 { margin-left:6em; }
.tagglyTagging .indent5 { margin-left:7em; }
.tagglyTagging .indent6 { margin-left:8em; }
.tagglyTagging .indent7 { margin-left:9em; }
.tagglyTagging .indent8 { margin-left:10em; }
.tagglyTagging .indent9 { margin-left:11em; }
.tagglyTagging .indent10 { margin-left:12em; }
.tagglyNoneFound { margin-left:2em; color:[[ColorPalette::TertiaryMid]]; font-size:90%; font-style:italic; }
/*}}}*/
Det er et privilegie at kunne tilbyde denne ressource gratis. Dette er muligt pga. forskellige menneskers indsats:
Tak til..
*Jeremy Ruston, ~TiddlyWikis skaber. ^^ TiddlyWiki <<version>> © 2008 [[UnaMesa|http://www.unamesa.org/]]^^
*Dem der har lavet de forskellige plugins som bliver brugt i denne version af ~TiddlyWiki. Brug den følgende knap for at se en liste over de plugins der bliver brugt her. Hvert plugin indeholder information om dem der har lavet det. <<tag systemConfig>>
-----
^^<html><a rel="license" href="http://creativecommons.org/licenses/by/3.0/"><img alt="Creative Commons License" style="border-width:0" src="http://i.creativecommons.org/l/by/3.0/88x31.png" /></a><br />No-Brainer Notes is licensed by Dave Gifford under a <a rel="license" href="http://creativecommons.org/licenses/by/3.0/">Creative Commons Attribution 3.0 Unported License</a></html>^^
Måns Mårtensson har oversat og lavet modifikationer til ~No-Brainer Notes og valgt at kalde den Simple Noter d. 26/10 2008.
/***
|''Name:''|TiddlerNotesPlugin|
|''Description:''|Add notes to tiddlers without modifying the original content|
|''Author:''|Saq Imtiaz ( lewcid@gmail.com )|
|''Source:''|http://tw.lewcid.org/#TiddlerNotesPlugin|
|''Code Repository:''|http://tw.lewcid.org/svn/plugins|
|''Version:''|2.1|
|''Date:''|26/10/07|
|''License:''|[[Creative Commons Attribution-ShareAlike 3.0 License|http://creativecommons.org/licenses/by-sa/3.0/]]|
|''~CoreVersion:''|2.2.3|
!!Concept:
*The TiddlerNotesPlugin allows you to add notes to tiddlers, without needing to edit the original tiddler. This means that your original content will remain unaltered, and if you update it in the future, you won’t lose your notes. Notes are stored in separate tiddlers, but can be viewed and edited from within the original tiddler.
*For a tiddler titled "~MySlide", the notes are by default saved in a tiddler titled "~MySlide-Notes" and is given a tag of "Notes". The suffix and tags of the notes tiddlers are customizable. You can have one or multiple notes per tiddlers. So it is possible to have for example, teacher's notes and student's notes in the same file.
*Notes can be configured to start off blank, or pre-filled with the contents of the original tiddler.
!!Usage:
*{{{<<notes>>}}} is the simplest usage form.
* additional optional parameters include:
**{{{heading:}}} the heading to use for the notes box
**{{{tag:}}} the tag to be given to the notes tiddler
**{{{suffix:}}} the suffix to be used when naming the notes tiddler
* a full macro call could look like: {{{<<notes heading:"My Notes" tag:"NoteTiddlers" suffix:"Comments">>}}}
* To avoid adding {{{<<notes>>}}} to each tiddler you want notes for, you could add the macro call to the ViewTemplate
** below the line {{{<div class='viewer' macro='view text wikified'></div>}}} add the following line: <br> {{{<div class='viewer' macro='notes'></div>}}}
** Used in combination with the ~HideWhenPlugin or ~PublisherPlugin, you could have notes be shown only for tiddlers with specific tags. The ~PublisherPlugin would allow you for instance to only have the ~TeachersNotes visible to the teacher, and the ~StudentsNotes for the same tiddler visible to the Student.
!!Configuration
*<<option chkPrefillNotes>> Enable to pre-fill notes with the original tiddler's contents
!!Demo:
* [[MySlide]]
***/
// /%
//!BEGIN-PLUGIN-CODE
if (!config.options.chkPrefillNotes)
config.options.chkPrefillNotes = false;
function createTiddlyElement(theParent,theElement,theID,theClass,theText,attribs)
{
var e = document.createElement(theElement);
if(theClass != null)
e.className = theClass;
if(theID != null)
e.setAttribute("id",theID);
if(theText != null)
e.appendChild(document.createTextNode(theText));
if(attribs){
for(var n in attribs){
e.setAttribute(n,attribs[n]);
}
}
if(theParent != null)
theParent.appendChild(e);
return e;
}
function createTiddlyButton(theParent,theText,theTooltip,theAction,theClass,theId,theAccessKey,attribs)
{
var theButton = document.createElement("a");
if(theAction) {
theButton.onclick = theAction;
theButton.setAttribute("href","javascript:;");
}
if(theTooltip)
theButton.setAttribute("title",theTooltip);
if(theText)
theButton.appendChild(document.createTextNode(theText));
if(theClass)
theButton.className = theClass;
else
theButton.className = "button";
if(theId)
theButton.id = theId;
if(attribs){
for(var n in attribs){
e.setAttribute(n,attribs[n]);
}
}
if(theParent)
theParent.appendChild(theButton);
if(theAccessKey)
theButton.setAttribute("accessKey",theAccessKey);
return theButton;
}
config.macros.notes={
cancelWarning: "Er du sikker på at du vil undlade at gemme dine ændringer af kommentarer til '%0'?",
editLabel: "redigér kommentar",
editTitle: "dobbeltklik for at ændre",
saveLabel: "gem kommentar",
saveTitle: "Dobbeltklik for at gemme",
cancelLabel: "fortryd",
heading: "Kommentar",
suffix: "Kommentar",
tag: "Kommentar",
saveNotes: function(ev){
e = ev? ev : window.event;
var theTarget = resolveTarget(e);
if (theTarget.nodeName.toLowerCase() == "textarea")
return false;
var title = story.findContainingTiddler(theTarget).getAttribute("tiddler");
story.setDirty(title,false);
var box = document.getElementById("notesContainer"+title);
var textarea = document.getElementById("notesTextArea"+title);
if(textarea.getAttribute("oldText")!=textarea.value && !hasClass(theTarget,"cancelNotesButton")){
var suffix = box.getAttribute("suffix");
var t = store.getTiddler(title+"-"+suffix);
store.saveTiddler(title+"-"+suffix,title+"-"+suffix,textarea.value,config.options.txtUserName,new Date(),t?t.tags:box.getAttribute("tag"),t?t.fields:{});
}
story.refreshTiddler(title,1,true);
autoSaveChanges(true);
return false;
},
editNotes: function(box,tiddler){
removeChildren(box);
story.setDirty(tiddler,true);
box.title = this.saveTitle;
box.ondblclick = this.saveNotes;
createTiddlyButton(box,this.cancelLabel,this.cancelLabel,this.saveNotes,"cancelNotesButton");
createTiddlyButton(box,this.saveLabel,this.saveLabel,this.saveNotes,"saveNotesButton");
wikify("!!"+box.getAttribute("heading")+"\n",box);
addClass(box,"editor");
var wrapper1 = createTiddlyElement(null,"fieldset",null,"fieldsetFix");
var wrapper2 = createTiddlyElement(wrapper1,"div");
var e = createTiddlyElement(wrapper2,"textarea","notesTextArea"+tiddler);
var v = store.getValue(tiddler+"-"+box.getAttribute("suffix"),"text");
if(!v)
v = config.options.chkPrefillNotes? store.getValue(tiddler,"text"):'';
e.value = v;
e.setAttribute("oldText",v);
var rows = 10;
var lines = v.match(/\n/mg);
var maxLines = Math.max(parseInt(config.options.txtMaxEditRows),5);
if(lines != null && lines.length > rows)
rows = lines.length + 5;
rows = Math.min(rows,maxLines);
e.setAttribute("rows",rows);
box.appendChild(wrapper1);
},
editNotesButtonOnclick: function(e){
var title = story.findContainingTiddler(this).getAttribute("tiddler");
var box = document.getElementById("notesContainer"+title);
config.macros.notes.editNotes(box,title);
return false;
},
ondblclick : function(ev){
e = ev? ev : window.event;
var theTarget = resolveTarget(e);
var title = story.findContainingTiddler(theTarget).getAttribute("tiddler");
var box = document.getElementById("notesContainer"+title);
config.macros.notes.editNotes(box,title);
e.cancelBubble = true;
if(e.stopPropagation) e.stopPropagation();
return false;
},
handler : function(place,macroName,params,wikifier,paramString,tiddler){
params = paramString.parseParams("anon",null,true,false,false);
var heading = getParam(params,"heading",this.heading);
var tag = getParam(params,"tag",this.tag);
var suffix = getParam(params,"suffix",this.suffix);
var box = createTiddlyElement(place,"div","notesContainer"+tiddler.title,"TiddlerNotes",null,{"source":tiddler.title,params:paramString,heading:heading,tag:tag,suffix:suffix});
createTiddlyButton(box,this.editLabel,this.editLabel,this.editNotesButtonOnclick,"editNotesButton");
wikify("!!"+heading+"\n",box);
box.title=this.editTitle;
box.ondblclick = this.ondblclick;
wikify("<<tiddler [["+tiddler.title+"-"+suffix+"]]>>",box);
}
};
Story.prototype.old_notes_closeTiddler = Story.prototype.closeTiddler;
Story.prototype.closeTiddler = function(title,animate,unused){
if(story.isDirty(title)) {
if(!confirm(config.macros.notes.cancelWarning.format([title])))
return false;
}
return this.old_notes_closeTiddler.apply(this,arguments);
}
setStylesheet(".TiddlerNotes {\n"+ " background:#eee;\n"+ " border:1px solid #ccc;\n"+ " padding:10px;\n"+ " margin:15px;\n"+ "}\n"+ "\n"+ ".cancelNotesButton,.editNotesButton, .saveNotesButton {\n"+ " float:right;\n"+ " border:1px solid #ccc;\n"+ " padding:2px 5px;\n"+ "}\n"+ "\n"+ ".saveNotesButton{\n"+ " margin-right:0.5em;\n"+ "}\n"+ "\n"+ ".TiddlerNotes.editor textarea{\n"+ " border:1px solid #ccc;\n"+ "}","NotesPluginStyles");
//!END-PLUGIN-CODE
// %/
<script>
var out="<html><form style='display:inline;margin:0;padding:0;'><table style='border:0'><tr style='border:0'><td style='border:0;text-align:right'>";
// fill tiddler listbox
// on change, show current settings
out+="<select size=1 name=tiddlers onchange='if (!this.value.length) return; var cdate=store.getTiddler(this.value).created; var mdate=store.getTiddler(this.value).modified; this.form.cm.value=cdate.getMonth()+1; this.form.cd.value=cdate.getDate(); this.form.cy.value=cdate.getFullYear(); this.form.ch.value=cdate.getHours(); this.form.cn.value=cdate.getMinutes(); this.form.mm.value=mdate.getMonth()+1; this.form.md.value=mdate.getDate(); this.form.my.value=mdate.getFullYear(); this.form.mh.value=mdate.getHours(); this.form.mn.value=mdate.getMinutes(); this.form.author.value=store.getTiddler(this.value).modifier'>";
out+="<option value=''>please select a tiddler...</option>"
var tiddlers=store.getTiddlers("title");
for (var t=0; t<tiddlers.length; t++)
out+="<option value='"+tiddlers[t].title+"'>"+tiddlers[t].title+"</option> ";
out+="</select><br>"
// fields for settings
out+="created: ";
out+="<input type=text name=cm size=2 style='width:2em;padding:0' value='mm'>/";
out+="<input type=text name=cd size=2 style='width:2em;padding:0' value='dd'>/";
out+="<input type=text name=cy size=4 style='width:3em;padding:0' value='yyyy'>@";
out+="<input type=text name=ch size=2 style='width:2em;padding:0' value='hh'>";
out+="<input type=text name=cn size=2 style='width:2em;padding:0' value='mm'><br>";
out+="modified: ";
out+="<input type=text name=mm size=2 style='width:2em;padding:0' value='mm'>/";
out+="<input type=text name=md size=2 style='width:2em;padding:0' value='dd'>/";
out+="<input type=text name=my size=4 style='width:3em;padding:0' value='yyyy'>@";
out+="<input type=text name=mh size=2 style='width:2em;padding:0' value='hh'>";
out+="<input type=text name=mn size=2 style='width:2em;padding:0' value='mm'><br>";
out+="author: <input type=text name=author size=25 value='author'>";
out+="<input type=button value='set' onclick='var cdate=(new Date(this.form.cy.value,this.form.cm.value-1,this.form.cd.value,this.form.ch.value,this.form.cn.value)); var mdate=(new Date(this.form.my.value,this.form.mm.value-1,this.form.md.value,this.form.mh.value,this.form.mn.value)); store.getTiddler(this.form.tiddlers.value).assign(null,null,this.form.author.value,mdate,null,cdate)'>";
return out+"</td></tr></table></form></html>";
</script>
<<tiddler TiddlyHomeSidebar>>
/***
|''Name:''|TiddlyHomeSetupPlugin|
|''Description:''|Check and setup all components|
|''Version:''|1.1.0|
|''Date:''|Aug 04, 2007|
|''Source:''|http://tiddlywiki.bidix.info/#TiddlyHomeSetupPlugin|
|''Author:''|BidiX (BidiX (at) bidix (dot) info)|
|''License:''|[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D ]]|
|''~CoreVersion:''|2.2.0|
|''Requires:''|UploadToHomeMacro|
***/
//{{{
version.extensions.TiddlyHomeSetupPlugin = {
major: 1, minor: 1, revision: 0,
date: new Date("Aug 04, 2007"),
source: 'http://tiddlywiki.bidix.info/#TiddlyHomeSetupPlugin',
author: 'BidiX (BidiX (at) bidix (dot) info)',
coreVersion: '2.2.0'
};
if (!window.bidix) window.bidix = {}; // bidix namespace
bidix.checkPlugin = function(plugin, major, minor, revision) {
var ext = version.extensions[plugin];
if (!
(ext &&
((ext.major > major) ||
((ext.major == major) && (ext.minor > minor)) ||
((ext.major == major) && (ext.minor == minor) && (ext.revision >= revision))))) {
// write error in PluginManager
if (pluginInfo)
pluginInfo.log.push("Requires " + plugin + " " + major + "." + minor + "." + revision);
eval(plugin); // generate an error : "Error: ReferenceError: xxxx is not defined"
}
};
bidix.getParamsFromTiddler = function(tiddlerTitle, sliceNames) {
tiddlerTitle = (tiddlerTitle ? tiddlerTitle:this.messages.homeParamsTiddler);
if (!store.tiddlerExists(tiddlerTitle) && !store.isShadowTiddler(tiddlerTitle)) {
throw(config.macros.uploadToHome.messages.tiddlerNotFound.toString().format([tiddlerTitle]));
}
return sliceValues = store.getTiddlerSlices(tiddlerTitle,sliceNames);
};
bidix.initOption = function(name,value) {
if (!config.options[name])
config.options[name] = value;
};
bidix.checkPlugin('UploadPlugin',4,1,0);
config.macros.upload.authenticateUser = false; // authentication check by .htaccess
// default TiddlyHomeParameters in shadows
// user can overide this
merge(config.shadowTiddlers,{
'TiddlyHomeParameters':[
"|owner:|$owner$|",
"|site:|$site$|",
"|url:|$url$|",
"|rootUrl:|$rootUrl$|"
].join("\n")});
// get config from TiddlyHomeParameters
config.tiddlyHome = {};
merge(config.tiddlyHome, bidix.getParamsFromTiddler('TiddlyHomeParameters',['user','site','url','rootUrl']));
config.shadowTiddlers.TiddlyHomeParameters += [
"!Usefull url for your site",
"* " + config.tiddlyHome.url + "backup: List of backup files",
"* " + config.tiddlyHome.url + "download.php : to download thisTiddlyWiki",
"* " + config.tiddlyHome.url + "index.xml : your RSSFeed",
"* " + config.tiddlyHome.url + "news.php : to display your RSSFeed",
"!Access and change data",
"* " + config.tiddlyHome.rootUrl + "Site : Site properties",
"* " + config.tiddlyHome.rootUrl + "#User : User properties",
"!More Information on TiddlyHome",
"* " + config.tiddlyHome.rootUrl + " for your hosting service",
"*http://TiddlyHome.bidix.info/ for BidiX's TiddlyHome Package"
].join("\n");
// add TiddlyHomeSidebar in SideBarOptions
config.shadowTiddlers.SideBarOptions = config.shadowTiddlers.SideBarOptions.replace(/(<<saveChanges>>)/,
"$1<<tiddler TiddlyHomeSidebar>>");
merge(config.shadowTiddlers,{
// link to favicon.ico
'MarkupPreHead': [
"<!--{{{-->",
"<link rel='alternate' type='application/rss+xml' title='RSS' href='index.xml'/>",
"<link rel=\"shortcut icon\"href=\"" +
config.tiddlyHome.rootUrl +
"_th/images/favicon.ico\" type=\"image/vnd.microsoft.icon\" />",
"<link rel=\"icon\" href=\"" +
config.tiddlyHome.rootUrl +
"_th/images/favicon.ico\" type=\"image/vnd.microsoft.icon\" /> ",
"<!--}}}-->"
].join("\n"),
'SiteProxy': [
"proxy.php?url="
].join("\n"),
'SiteUrl': config.tiddlyHome.url,
// tweaks to UploadToHomeMacro parameters
'HomeParameters': [
"|UploadUserName:||",
"|UploadStoreUrl:|" + config.tiddlyHome.url + "store.php|",
"|UploadDir:|.|",
"|UploadFilename:|index.html|",
"|UploadBackupDir:|backup|"
].join("\n"),
'TiddlyHomeSidebar':[
"<<uploadToHome>><html><a href=" +
config.tiddlyHome.url + "download.php class='button'>download</a></html>"
].join("\n")
});
// Options tweaks
//config.options.txtUserName = config.tiddlyHome.user;
config.options.pasUploadPassword = '';
config.options.txtBackupFolder = "backup";
config.options.chkSaveBackups = true;
config.options.chkAutoSave = false;
config.options.chkRegExpSearch = false;
config.options.chkCaseSensitiveSearch = false;
config.options.chkAnimate = false;
config.options.chkGenerateAnRssFeed = true;
config.options.chkSaveEmptyTemplate = false;
//}}}
|URL:|http://TiddlyHome.bidix.info/systemServer/TiddlyHomeSystem.html|
|Description|Repository for TiddlyHome system ressources |
|Author:|BidiX|
The way to learn to use TiddlyWiki is to forget that you don't know how to use TiddlyWiki...
----
"Knock, Knock"... "Who's there?"... "Oh! I guess you know that one..."
----
In theory, there is no difference between theory and practice. But, in practice, there is.
----
Sometimes when reading Goethe I have the paralyzing suspicion that he is trying to be funny.
----
A witty saying proves nothing.
----
The problem with some people is that when they aren't drunk, they're sober.
----
The great thing about television is that if something important happens anywhere in the world, day or night, you can always
change the channel.
----
Don't be so humble - you are not that great.
----
The combination "ough" can be pronounced in nine different ways. The following sentence contains them all: "A rough-coated,
dough-faced, thoughtful ploughman strode through the streets of Scarborough; after falling into a slough, he coughed and
hiccoughed."
----
If you lived here, you'd be home by now...
----
I love my dust. It shows I had something better to do.
----
Time flies like an arrow... Fruit flies like a banana [Groucho Marx]
----
If you don't know where you're going, you'll probably end up somewhere else.
----
Weebles wobble... but they don't fall down!
----
It's all very simple... or else it's all very complex... or perhaps it's neither... or both.
----
Accepting reality is the first step to insanity
----
Oops! Sorry. My karma ran over your dogma.
----
If it looks like a duck, walks like a duck and sounds like a duck, it's probably something else.
----
Some times you feel like a nut, some times you bolt.
----
Santaclaustrophobia... The feeling that Christmas is closing in all around you.
----
Why is abbreviation such a long word?
----
Diplomacy is the art of saying 'Nice doggie!'... until you can find a rock.
----
Scientists working on cloning technology have done what the american educational system has been doing for years - producing
identical sheep.
----
Umm... What's another word for thesaurus?
----
Give me ambiguity or give me something else
----
Don't anthropomorphize your computer, it doesn't like it.
----
Ninth Law of Cartoon Physics: Everything falls faster than an anvil.
----
Oh yeah? Far out!
----
Boycott Shampoo - Demand the REAL poo!
----
Remember: Don't sweat the petty things... and don't pet the sweaty things.
----
Sign in lunch room: "Shoes are required to eat in the cafeteria..." (and hand-written below: "...socks can eat anywhere they
want.")
----
Don't be irreplaceable, if you can't be replaced, you can't be promoted.
----
5 out of 4 people have problems with fractions...
----
Osborne's Law of Mathematics: Variables won't; constants aren't.
----
Always remember you're unique, just like everyone else.
----
Something to ponder: What was the best thing *before* sliced bread? Hmmm...
----
Physics Joke #27: Two hydrogen atoms bump into each other while walking down the street: 'Are you alright?'... 'No, I lost
an electron!'... 'Are you sure?'... 'Yeah, I'm Positive!'
----
The one thing I can't stand is intolerant people!
----
Old programmers never die. . . they just can't C as well.
----
World Shortest 'Bar' joke: A guy walks into a bar... OUCH! he says...
----
Never judge a man 'til you have walked a mile in his shoes, because by then, he's a mile away, you've got his shoes, and you
can say whatever the hell you want to.
----
The problem with troubleshooting is that real trouble shoots back.
----
These are the roots of rhythm: boom, de boom, de-boom, ding-dong, ooh! [Leila ~Gallagher-Breen]
----
These are the roots of music: boom-chicky-chicky boom, meow, meow, baddom, baddom, ding-aling-a-long, chicky-boom! [Leila
~Gallagher-Breen]
----
Classified ad (in Physics Quarterly): Got Mole problems? Call Avagadro Exterminators: 602-1023
----
He who laughs last thinks slowest
----
Would a fly without wings be called a walk?
----
The winner of the World's Worst Analogy contest: 'The little boat glided across the water in exactly the way a bowling ball
wouldn't.'
----
From the 'say what?!?' files: We are ready for any unforeseen event that may or may not occur. [Dan Quayle 9/22/90]
----
I believe you should live each day as if it is your last, which is why I don't have any clean laundry because, come on, who
wants to wash clothes on the last day of their life? [Jack Handy]
----
PRINTER - A device consisting of three main parts: the case, the jammed paper tray, and the blinking red light.
----
Dilbert's Laws of Work: The more crap you put up with, the more crap you are going to get.
----
Q: Why'd the electron cross the road? A: 'Cause he was already on the other side...
----
When the going gets tough, remember STRESSED spelled backwards is DESSERTS.
----
Foobar... baz. Mumble: frotz, gronk, snork. Snerfle? Natter and gromish!
----
Pentiums melt in your PC, not in your hand.
----
everyone is cute... even me. But in purple... I'm STUNNING!! [Londo Mollari]
----
I always wanted to be somebody, but I should have been more specific. [Lily Tomlin]
----
It's OK to change horses in mid-stream, especially if the first horse can't swim! [Laura Shulman]
----
Work is the curse of the drinking classes. [Oscar Wilde]
----
We have only two things to worry about: That things will never get back to normal, and that they already have.
----
Intelligence is a funny thing: those who don't have it think they do, and those who do are smart enough to know better.
----
Life is hard, Love is strange. Nothing lasts, people change. Dream of a long and wonderful future, but live now.
----
'Can you prove any of the stuff you believe in?', my friend asked. When I said that's not how belief works, he nodded and
said that's what he thought but he was just checking to make sure he hadn't missed a key point.
----
Life ... It's a good place to be!
----
Do not follow where the path may lead. Go, instead, where there is no path, and leave a trail.
----
History is made at night... character is what you are in the dark. [Dr. Emilio Lizardo, aka Lord John Worfin]
----
You can't always get what you want... but if you try sometimes, you just may find, that you get what you need. [The Rolling
Stones]
----
The only man who behaved sensibly was my tailor; he took my measurement anew every time he saw me, while all the rest went
on with their old measurements and expected them to fit me. [George Bernard Shaw]
----
In matters of style, swim with the current: in matters of principle, stand like a rock. [Thomas Jefferson]
----
Great things are not done by impulse, but by a series of small things brought together. [Vincent van Gogh]
----
'I think there is a world market for maybe five computers.' [Thomas Watson, chairman of IBM, 1943]
----
We have to live today by what truth we can get today, and be ready tomorrow to call it falsehood. [William James]
----
There are two ways of spreading light: to be the candle or the mirror that reflects it. [Edith Wharton]
----
Talent develops in tranquility, character in the full current of human life. [Johann Wolfgang von Goethe (1749-1832)]
----
Our firmest convictions are apt to be the most suspect; they mark our limitations and our bounds. Life is a petty thing
unless it is moved by the indomitable urge to extend its boundaries. [Jose Ortega y Gasset]
----
It takes courage to grow up and turn out to be who you really are. [e e cummings (1894-1962)]
----
If we knew what it was we were doing, it would not be called research, would it? [Albert Einstein]
----
To invent, you need a good imagination and a pile of junk. [Thomas Edison]
----
Dare to be naive. [R. Buckminster Fuller]
----
Quiet minds cannot be perplexed or frightened, but go on in fortune or misfortune at their own private pace, like a clock
during a thunderstorm. [Robert Louis Stevenson]
----
In the struggle between yourself and the world, second the world. [Franz Kafka]
----
Every man's condition is a solution in hieroglyph to those inquiries he would put. He acts it as life before he apprehends
it as truth. [Ralph Waldo Emerson]
----
One can remain alive...if one is unafraid of change, insatiable in intellectual curiosity, interested in big things, and
happy in small ways. [Edith Wharton]
----
a rock is like space because it doesnt move; and space is like a rock because it is empty. words are buddhas. [Jack
Kerouac]
----
The whole problem with the world is that fools and fanatics are always so certain of themselves, and wiser people so full of
doubts. [Bertrand Russell]
----
Doubt is not a pleasant state of mind, but certainty is absurd. [Voltaire]
----
Education is not the filling of a pail, but the lighting of a fire. [William Butler Yeats]
----
If you take yourself too seriously, no one else will take you seriously enough... [Eric Shulman]
----
There are only four questions of value in life... What is sacred? Of what is the spirit made? What is worth living for, and
what is worth dying for? The answer to each is the same: only love. [Don Juan ~DeMarco]
----
If you are a dreamer, come in. If you are a dreamer, a wisher, a liar, a hope-er, a pray-er, a magic bean buyer... If
you're a pretender, come sit by my fire... For we have some flax-golden tales to spin. Come in! Come in! [Shel
Silverstein]
----
O money, money, money, I'm not necessarily one of those who think thee holy, But I often stop to wonder how thou canst go
out so fast when thou comest in so slowly. [Ogden Nash]
----
There is no progress without struggle. [Frederick Douglass]
----
Before you can do something, you must become something. [Goethe]
----
The man who follows the crowd will usually get no further than the crowd. The man who walks alone is likely to find himself
in places no one has ever been. [Alan ~Ashley-Pit]
----
Weep not for the dead for they are but empty cages from which the bird has flown. [Tibetan Book of The Dead]
----
I wish it would dawn upon engineers that, in order to be an engineer, it is not enough to be an engineer. [Jose Ortega y
Gasset]
----
Every exit is an entry somewhere. [Tom Stoppard]
----
Wherever we are, it is but a stage on the way to somewhere else, and whatever we do, however well we do it, it is only a
preparation to do something else that shall be different. [Robert Louis Stevenson]
----
We judge ourselves by what we feel capable of doing, while others judge us by what we have already done. [Henry Wadsworth
Longfellow]
----
All our words are but crumbs that fall down from the feast of the mind. [Kahlil Gibran, "Sand and Foam"]
----
It's a lot harder to find joy than it is to find bread. Feed your soul first, then go shopping. [Eric Shulman]
----
Why do you hasten to remove anything which hurts your eye, while if something affects your soul you postpone the cure until
next year? [Horace]
----
Not to know is bad. Not to want to know is worse. Not to hope is unthinkable. Not to care is unforgivable. [Nigerian
folk saying]
----
Only half of writing is saying what you mean. The other half is preventing people from reading what they expected you to
mean. [James Richardson, 'Ploughshares']
----
There are no shortcuts to anyplace worth going. [Beverly Sills]
----
Somewhere, something incredible is waiting to be known. [Carl Sagan]
----
Courage is the price that Life extracts for granting peace. [Amelia Earhart]
----
Great things are not done by impulse, but by a series of small things brought together. [Vincent van Gogh]
----
Choose a job you love, and you will never have to work a day in your life. [Confucius]
----
There is only one success - to be able to spend your life in your own way. [Christopher Morley]
----
We choose our joys and sorrows long before we experience them. [Kahlil Gibran]
----
It is all a frame of mind, this enjoyment of living. [Lin Yutang]
----
Work for something because it is good, not just because it stands a chance to succeed. [Vaclav Havel]
----
The easiest way to get what you want is to help others get what they want. [Deepak Chopra]
----
All generalizations are false, including this one. [Bucky Radfish]
----
In science, 'fact' can only mean 'confirmed to such a degree that it would be perverse to withhold provisional assent.' I
suppose that apples might start to rise tomorrow, but the possibility does not merit equal time in physics classrooms.
[Stephen Jay Gould (1941 - 2002)]
----
Twenty years from now, you will be more disappointed by the things you didn't do, than by the ones you did. So throw off the
bowlines. Sail away from the safe harbor. Catch the trade winds in your sails. Explore, dream... [Mark Twain]
----
To live only for some future goal is shallow. It's the sides of the mountain that sustain life, not the top. [Robert M.
Pirsig]
----
Nothing is so contagious as enthusiasm; it moves stones, it charms brutes. Enthusiasm is the genius of sincerity, and truth
accomplishes no victories without it. [Edward G. E. ~Bulwer-Lytton (1803 - 1873)]
----
The past is but the beginning of a beginning, and all that is and has been is but the twilight of the dawn. [Herbert George
Wells]
----
We grow great by dreams. All big men are dreamers. They see things in the soft haze of a spring day or in the red fire of a
long winter's evening. Some of us let these great dreams die, but others nourish and protect them; nurse them through bad
days till they bring them to the sunshine and light, which comes always to those who sincerely hope that their dreams will
come true. [Woodrow Wilson]
----
Be brave enough to live life creatively. The creative is the place where no one else has ever been. You have to leave the
city of your comfort and go into the wilderness of your intuition. You can't get there by bus, only by hard work and risk
and by not quite knowing what you're doing. What you'll discover will be wonderful. What you'll discover will be yourself.
[Alan Alda]
----
If we had no winter, the spring would not be so pleasant; if we did not sometimes taste of adversity, prosperity would not
be so welcome.
----
Solitude, if rightly used, becomes not only a privilege but a necessity. Only a superficial soul fears to fraternize with
itself.
----
One of the symptoms of an approaching nervous breakdown is the belief that one's work is terribly important.
----
Hope is like a road in the country: there was never a road, but when many people walk on it, the road comes into existence.
----
You can only find truth with logic if you have already found truth without it.
----
Love is always bestowed as a gift - freely, willingly and without expectation. We don't love to be loved; we love to love.
----
Always listen to experts. They'll tell you what can't be done, and why. Then do it.
----
Distance between two hearts is not an obstacle; rather a great reminder of just how strong true love can be.
----
Not everything that can be counted counts, and not everything that counts can be counted.
----
Life's challenges are not supposed to paralyze you, they're supposed to help you discover who you are.
----
Nothing splendid has ever been achieved except by those who dared believe that something inside them was superior to
circumstances.
----
Whether you think that you can, or that you can't, you are usually right.
----
The only time you run out of chances is when you stop taking them.
----
Knowledge speaks, but wisdom listens.
----
Too often we give our children answers to remember rather than problems to solve.
----
Books are the shoes with which we tread the footsteps of great minds. A book may lie dormant for fifty years or for two
thousand years in a forgotten corner of a library, only to reveal, upon being opened, the marvels or the abysses that it
contains, or the line that seems to have been written for me alone. In this respect the writer is not different from any
other human being: whatever we say or do can have far-reaching consequences.
----
A people that values its privileges above its principles soon loses both.
----
Treat everyone with politeness, even those who are rude to you. Not because they are nice, but because you are.
----
The ultimate measure of a man is not where he stands in moments of comfort and convenience, but where he stands in times of
challenge and controversy. What lies behind us and what lies before us, are only small matters compared to what lies within
us.
----
In your presence even my shadow acquires the sensation of touch.
----
Being in charge of your own reality is a little tougher; it takes a lot of thinking and brutal honesty. [Phil Glatz]
----
There are always going to be amazingly creative people doing wonderful things. [Phil Glatz]
----
The trick is to rise above the symptoms of being aware, and actually BE aware. [Phil Glatz]
----
A revolution is coming - a revolution which will be peaceful if we are wise enough; compassionate if we care enough;
successful if we are fortunate enough - but a revolution which is coming whether we will it or not. We can affect its
character, we cannot alter its inevitability. [John F. Kennedy]
----
On two occasions I have been asked (by members of Parliament!), 'Pray, Mr. Babbage, if you put into the machine wrong
figures, will the right answers come out?' I am not able rightly to apprehend the kind of confusion of ideas that could
provoke such a question. [Charles Babbage]
----
Those parts of the system that you can hit with a hammer (not advised) are called hardware; those program instructions that
you can only curse at are called software.
----
In the design of sophisticated digital systems, elegance is not a dispensable luxury but a matter of life and death, being a
major factor that decides between success and failure. [Edsger W. Dijkstra]
----
There are two ways of constructing a software design. One way is to make it so simple that there are obviously no
deficiencies, and the other way to make it so complicated that there are no obvious deficiencies. The first method is far
more difficult. [Charles A. R. Hoare]
Den måde at lærer at bruge TiddlyWiki på - er at glemme, at du ikke ved hvordan man bruger TiddlyWiki ...
----
"Bank, bank" ... "Hvem er der ?"... "Oh! Jeg gætter på at du ved, at en ..."
----
I teorien er der ingen forskel mellem teori og praksis. Men i praksis er der.
----
Nogle gange, når jeg læser Goethe har jeg en mistanke om, at han forsøger på at være morsom.
----
En bonmot beviser ingenting.
----
Problemet med nogle mennesker er, at når de ikke er berusede, så er de ædru.
----
Den store ting ved tv er, at hvis noget vigtigt sker overalt i verden, dag eller nat, kan du altid skifte kanal.
----
Vær ikke så ydmyg - så stor er du heller ikke.
----
Hvis du boede her, så ville du være hjemme nu ...
----
Jeg elsker mit støv. Det viser, at jeg havde noget bedre at gøre end at gøre rent.
----
Tiden flyver som en pil ... Frugt flyver gerne som en banan [Groucho Marx]
----
Hvis du ikke ved, hvor du går, vil du formentlig ende et andet sted.
----
Det er alt sammen meget simpelt ... ellers er det alt sammen meget kompliceret ... eller måske er det hverken ... eller begge dele.
----
At acceptere virkeligheden er det første skridt mod sindssyge
----
Ups! Ked af det. Min karma kørte dit dogme over.
----
Hvis det ligner en and, går som en and, og lyder som en and, så er det sikkert noget andet.
----
Nogle gange du har lyst til en møtrik, andre gange en bolt.
----
Julemandsfobi ... En følelse af, at julen er lukkede vinkler i alle omkring dig.
----
Hvorfor er forkortelse så langt et ord?
----
Diplomati er kunsten at sige "God hund!'... indtil du kan nå at finde en sten.
----
Forskere som arbejder på kloningsteknologi har gjort, hvad uddannelsessystemet har gjort i årevis - at producere identiske får.
----
Hmm ... Hvad er et andet ord for synonymordbog?
----
Giv mig en tvetydighed - eller noget andet
----
Du må ikke anthropomorficere din computer, den kan ikke lide det.
----
Niende lov af tegnefilmens fysik: Alt falder hurtigere end en armbolt.
----
Ok? Langt ude!
----
Boycott Shampoo - Demand the REAL poo!
----
Remember: Don't sweat the petty things... and don't pet the sweaty things.
----
Sign in lunch room: "Shoes are required to eat in the cafeteria..." (and hand-written below: "...socks can eat anywhere they
want.")
----
Vær ikke uerstattelig, hvis du ikke kan erstattes, kan du ikke blive forfremmet.
----
5 ud af 4 mennesker har problemer med fraktioner ...
----
Osborne's lov for Matematik: Variables vil ikke være det; konstanterne er det ikke.
----
Husk altid, du er unik, ligesom alle de andre.
----
Noget at tænke over: Hvad var det bedste, * før * der fandtes skåret brød? Hmmm ...
----
Fysik Joke # 27: To hydrogenatomer støder ind i hinanden, mens spadserer ned ad gaden: »Er du okay ?'... »Nej, jeg har mistet en elektron !'... 'Er du sikker ?'... "Yeah, I'm Positive! (en)"
----
Den eneste ting, jeg ikke kan udstå er intolerante mennesker!
----
Gamle programmører dø aldrig. . . de kan bare ikke C så godt.
----
Verdens korteste 'Bar' vittighed: En fyr går ind i en bar ... Avs! siger han ...
----
Døm aldrig en mand 'før du har gået en mil i hans sko, fordi når han er en sømil væk, så har du hans sko, og så kan du sige, hvad fanden du vil.
----
The problem with troubleshooting is that real trouble shoots back.
----
Disse er grundrytmerne: boom, de boom, de-boom, ding-dong, ooh! [Leila ~ Gallagher-Breen]
----
Disse er musikkens grund elementer: boom-chicky-chicky boom, meow, meow, baddom, baddom, ding-aling-en-lang, chicky-boom! [Leila ~ Gallagher-Breen]
----
Den, der ler sidst tænker langsomst
----
Kunne en flyver uden vinger kaldes en gåtur?
----
Vinderen af verdens værste analogi konkurrence: »Den lille båd gled over vandet på nøjagtig den måde en bowlingkugle ikke ville."
----
Fra 'Hva'ba?!? " filer: Vi er klar til enhver uforudset hændelse, som måske eller måske ikke kunne forekomme. [Dan Quayle 9/22/90]
----
Jeg tror, du skal leve hver dag som om det er din sidste, hvilket er grunden til, at jeg ikke har nogen rent vasketøj fordi, hvem ønsker at vaske tøj den sidste dag i deres liv? [Jack Handy]
----
PRINTEREN - En enhed bestående af tre dele: papirbakken, det fastklemte papir bakken, og det blinkende røde lys.
----
Dilbert's Love of Work: Jo mere møg du finder på, des mere møg får du tilbage.
----
Q: Hvorfor gik elektronen over vejen? A: Fordi han allerede var på den anden side ...
----
Når det bliver barskt, så husk at STRESSED (en) stavet baglæns er desserts.
----
Foobar ... baz. Mumle: frotz, gronk, snork. Snerfle? Ævle og gromish!
----
Pentiums smelter i din pc, ikke i din hånd.
----
alle er søde ... selv mig. Men i lilla ... er jeg fantastisk! [Londo Mollari]
----
Jeg har altid ønsket at blive til noget, men jeg burde have været mere specifik. [Lily Tomlin]
----
Det er OK at skifte heste på midt-vejen, især hvis den første hest ikke kan svømme! [Laura Shulman]
----
Arbejde er de drikkende klassers forbandelse. [Oscar Wilde]
----
Vi har kun to ting at bekymre sig om: at tingene aldrig vil komme tilbage til normale tilstande, og at de allerede er.
----
Intelligens er en sjov ting, Dem, der ikke har det tror de har det, og dem, der har det er kloge nok til at vide bedre.
----
Livet er hårdt, Kærlighed er mærkeligt. Intet varer, folk ændrer sig. Drømmen om en lang og vidunderlig fremtid, men lev nu.
----
»Kan du bevise nogen af de ting, du tror på? ', spurgte min ven. Da jeg sagde at det ikke, er sådan troen virker, nikkede han og sagde, at 'det mente han nok, men han ville blot sikre sig, at han ikke havde glemt en vigtig pointe.
----
Livet ... Det er et godt sted at være!
----
Følg ikke blot hvor stien går. Gå i stedet, hvor der ikke er nogen vej, og efterlad et spor.
----
Historien skabes om natten ... en karakter er, hvad du er i mørke. [Dr. Emilio Lizardo, alias Lord John Worfin]
----
Du kan ikke altid få, hvad du vil ... men hvis du forsøger sommetider, vil du måske finde ud af, at du får, lige hvad du har brug for. [The Rolling Stones]
----
Den eneste mand, der opførte sig fornuftigt var min skrædder, og han tog mit mål igen hver gang han så mig, mens alle de øvrige gik videre med deres gamle mål og forventede at de stadig passede mig. [George Bernard Shaw]
----
Mht. stil, svøm med strømmen: i principielle spørgsmål, stå som en klippe. [Thomas Jefferson]
----
Store ting er ikke gjort impulsivt, men af en række små ting der sættes sammen. [Vincent van Gogh]
----
»Jeg tror, der er et verdensmarked for måske fem computere." [Thomas Watson, formand for IBM, 1943]
----
Vi er nødt til at leve med den sandhed vi kan få i dag, og være klar til i morgen at kalde det løgn. [William James]
----
Der er to måder at sprede lys: at være lyset eller spejlet, der afspejler det. [Edith Wharton]
----
Talent udvikler sig i ro, karakter i fuld nuværende menneskeliv. [Johann Wolfgang von Goethe (1749-1832)]
----
Vores firmest domme er egnet til at være den mest mistænkte; de markere vores begrænsninger og grænser. Livet er en mindre ting, medmindre den er flyttet fra ukuelig trang
til at udvide sine grænser. [Jose Ortega y Gasset]
----
Det tager modet til at vokse op og vise sig at være, hvem du virkelig er. [e e Cummings (1894-1962)]
----
Hvis vi vidste, hvad det var vi gjorde, ville det ikke kaldes forskning, ville det? [Albert Einstein]
----
At opfinde, du skal have en god fantasi og en bunke junk. [Thomas Edison]
----
Vover at være naive. [R. Buckminster Fuller]
----
Stille sind ikke kan forvirret eller bange, men gå i lykke eller ulykke på deres eget private tempo, ligesom et ur under et tordenvejr. [Robert Louis Stevenson]
----
I kampen mellem dig selv og verden, anden verden. [Franz Kafka]
----
Hver mand's betingelse er en løsning i hieroglyph til de undersøgelser, han ville bringe. Han optræder det som liv, før han apprehends det som sandheden. [Ralph Waldo
Emerson]
----
Man kan forblive i live ... hvis man er unafraid forandringstakten, umættelige i intellektuel nysgerrighed, er interesseret i store ting, og glad i små måder. [Edith
Wharton]
----
en sten er ligesom rummet, fordi det gør ikke flytte, og rum er som en klippe, fordi den er tom. ord er buddhaerne. [Jack Kerouac]
----
Hele problemet med verden er, at fjolser og fanatikere altid er så nogle af dem selv, og klogere mennesker så fuld af tvivl. [Bertrand Russell]
----
Tvivl er ikke en behagelig tilstand i sindet, men sikkerhed er absurd. [Voltaire]
----
Uddannelse er ikke fyldning af en spand, men belysning af en brand. [William Butler Yeats]
----
Hvis du tager dig selv alt for alvorligt, ingen andre vil tage dig alvorligt nok ... [Eric Shulman]
----
Der er kun fire spørgsmål i værdi i livet ... Hvad er helligt? Af, hvad der er ånden gjort? Hvad der er værd at leve for, og hvad der er værd at dø for? Svaret på hver er
den samme: kun kærlighed. [Don Juan ~ DeMarco]
----
Hvis du er en drømmer, kommer i. Hvis du er en drømmer, en wisher, en løgner, et håb-er, en bede-er, en magisk bønne køber ... Hvis du er en pretender, kommer sidde ved mit
brand ... For vi har nogle hør-gyldne kontrollamper til spin. Kom ind! Kom ind! [Shel Silverstein]
----
O penge, penge, penge, jeg er ikke nødvendigvis en af dem, der tror dig hellig, men jeg ofte stopper for gad vide, hvordan du canst gå ud så hurtigt, når du comest i så
langsomt. [Ogden Nash]
----
Der er ingen fremskridt uden kamp. [Frederick Douglass]
----
Før du kan gøre noget, skal du være noget. [Goethe]
----
Den mand, der følger crowd vil normalt få noget videre end crowd. Den mand, der går alene kan forventes at befinde sig på steder, hvor ingen nogensinde har været. [Alan ~
Ashley-Pit]
----
Græder ikke for de døde, for de er, men tomme bure fra hvilken fugl har fløjet. [Tibetanske bog af den døde]
----
Jeg ville ønske det ville dawn efter ingeniører, at for at være en ingeniør, er det ikke nok til at blive ingeniør. [Jose Ortega y Gasset]
----
Hvert exit er en post eller andet sted. [Tom Stoppard]
----
Hvor vi er, det er, men en etape på vejen til et andet sted, og uanset hvad vi gør, dog godt vi gør det, er det kun et præparat til at gøre noget andet, der skal være
anderledes. [Robert Louis Stevenson]
----
Vi bedømme os selv ved, hvad vi føler os i stand til at gøre, mens andre dømme os ved, hvad vi allerede har gjort. [Henry Wadsworth Longfellow]
----
Alle vores ord men krummer, der falder ned fra den fest i tankerne. [Kahlil Gibran, "Sand og skum"]
----
Det er meget sværere at finde glæde, end det er at finde brød. Feed din sjæl først og derefter tage ud og shoppe. [Eric Shulman]
----
Hvorfor gør du skynde at fjerne noget, som rammer øjet, mens hvis noget påvirker din sjæl du udsætte kuren før til næste år? [Horace]
----
Ikke at vide, er dårlig. Ikke ønsker at vide er værre. Ikke til at håbe er utænkeligt. Ikke at pleje er utilgivelig. [Nigerianske folk siger]
----
Kun halvdelen af skriftligt siger, hvad du mener. Den anden halvdel er at forhindre folk i at læse, hvad de forventede du at betyde. [James Richardson, 'plovskær']
----
Der er ingen genveje til anyplace værd gang. [Beverly Sills]
----
Et sted, noget utroligt, der venter på at blive kendt. [Carl Sagan]
----
Courage er den pris, Life ekstrakter for tildeling fred. [Amelia Earhart]
----
Store ting er ikke gjort af impulser, men af en række små ting bringes sammen. [Vincent van Gogh]
----
Vælg et job, du elsker, og du vil aldrig få til at arbejde en dag i dit liv. [Confusius]
----
Der er kun en succes - at være i stand til at bruge dit liv på din egen måde. [Christopher Morley]
----
Vi vælger vores glæder og sorger, længe før vi oplever dem. [Kahlil Gibran]
----
Det er alle en ramme i sindet, den nydelse af levestandarden. [Lin Yutang]
----
Arbejde for noget, fordi den er god, ikke kun fordi det er en chance for at lykkes. [Vaclav Havel]
----
Den nemmeste måde at få, hvad du ønsker, er at hjælpe andre får, hvad de ønsker. [Deepak Chopra]
----
Alle generaliseringer er usande, herunder denne. [Bucky Radfish]
----
Inden for videnskab, »faktisk« kan kun betyde 'bekræftet i en sådan grad, at det ville være tåbeligt at tilbageholde midlertidig samstemmende. " Jeg formoder, at æbler kan
begynde at stige i morgen, men den mulighed ikke fortjener lige gang i fysik klasseværelser. [Stephen Jay Gould (1941 - 2002)]
----
Tyve år fra nu, vil du være mere skuffet over de ting du ikke gøre, end med dem, du gjorde. Så smider ud bowlines. Sail væk fra safe harbor. Fangst handelsordningerne vind
i dit sejl. Udforske, drømme ... [Mark Twain]
----
Til at leve kun for nogle fremtidige mål er overfladisk. Det er den side af bjerget, der opretholder livet, ikke i toppen. [Robert M. Pirsig]
----
Intet er så smitsom som begejstring, men det flytter sten, det charme brutes. Entusiasme er geni af oprigtighed og sandhed der sikrer opfyldelse ingen sejre uden. [Edward
G. E. ~ Bulwer-Lytton (1803 - 1873)]
----
Fortiden er kun begyndelsen af en begyndelse, og alle, der er og har været der, men de tusmørke af daggry. [Herbert George Wells]
----
Vi vokser meget af drømme. Alle de store mænd er drømmere. De ser ting i blød tåge af et forår dag eller i den røde ild på en lang vinter aften. Nogle af os lad disse store
drømme dør, men andre fodre og beskytte dem; sygeplejerske dem gennem dårlige dage, indtil de sætter dem til sol og lys, der kommer altid til dem, der håber, at deres
drømme vil gå i opfyldelse. [Woodrow Wilson]
----
Vær modig nok til at leve livet kreativt. De kreative er det sted, hvor ingen andre nogensinde har været. Du er nødt til at forlade byen for din komfort og gå ind i
vildnisset af din intuition. Du kan ikke komme dertil med bus, kun ved hårdt arbejde og risiko, og ved ikke helt at vide hvad du laver. Hvad vil du opdage, vil være
vidunderligt. Hvad vil du opdage, vil være dig selv. [Alan Alda]
----
Hvis vi ikke havde nogen vinteren, foråret ville ikke være så rart, hvis vi ikke undertiden smag modgang, velstand ville ikke være så velkomne.
----
Solitude, hvis rette anvendes, bliver ikke kun et privilegium, men en nødvendighed. Kun en overfladisk sjæl frygter at fraternisere med sig selv.
----
Et af symptomerne på en nærmer nervøse fordeling er den tro, at et arbejde er utrolig vigtigt.
----
Hope er ligesom en vej i landet: Der var aldrig en vej, men når mange mennesker gå på den vej kommer i eksistens.
----
Du kan kun finde sandheden med logikken, hvis du allerede har fundet sandheden uden.
----
Love er altid givet som en gave - frit, vilje og uden forventning. Vi har ikke elsker at blive elsket, og vi elsker at elske.
----
Altid lytte til eksperter. De vil fortælle dig, hvad der ikke kan gøres, og hvorfor. Så gør det.
----
Afstanden mellem to hjerter er ikke en hindring, men snarere en god påmindelse om, hvor stærk den ægte kærlighed kan være.
----
Ikke alt, der kan tælles, tæller, og ikke alt der tæller kan tælles.
----
Livets udfordringer er ikke meningen, at lamme dig, they're formodes at hjælpe dig med at opdage, hvem du er.
----
Intet glimrende nogensinde har opnået med undtagelse af dem, der turde tro, at noget inde i dem var overlegen i forhold til omstændighederne.
----
Uanset om du tror at du kan, eller at du ikke kan, har du som regel ret.
----
Den eneste gang, du løber tør for chancer er, når du holder op med at tage dem.
----
Viden taler, men visdom lytter.
----
Alt for ofte, vi giver vores børn at få svar på huske snarere end problemer at løse.
----
Bøger er de sko, som vi slidbane fodspor med store hoveder. En bog kan ligge i dvale i et halvt år eller for to tusind år i et glemt hjørne af et bibliotek, kun til at
afsløre, om at blive åbnet, de vidundere eller dybder, at den indeholder, eller den linje, som synes at have været skrevet til mig alene . I denne forbindelse forfatteren
er ikke anderledes end andre mennesker: uanset hvad vi siger eller gør kan det have vidtrækkende konsekvenser.
----
Et folk, der værdsætter sine privilegier over sine principper mister snart begge.
----
Behandel alle med høflighed, selv dem, der er uhøflige overfor dig. Ikke fordi de er det værd, men fordi du er.
----
Det ultimative mål for en mand er ikke hvor han står i øjeblikke af komfort og bekvemmelighed, men hvor han står i tider med udfordring og kontroverser. Hvad der ligger bag
os, og hvad der ligger foran os, er kun små spørgsmål i forhold til, hvad der ligger inden i os.
----
I Deres tilstedeværelse engang min skygge erhverver fornemmelse af berøring.
----
Med ansvar for din egen virkelighed er lidt hårdere, og det tager en masse tanker og brutal ærlighed. [Phil Glatz]
----
Der er altid vil være utrolig kreative mennesker der gør vidunderlige ting. [Phil Glatz]
----
Tricket er ikke kun at være bevidst, og faktisk BLIVE bevidst. [Phil Glatz]
----
En revolution er på vej - en revolution, som vil forløbe fredeligt, hvis vi er kloge nok, medfølende, hvis vi forsigtig nok, en succes, hvis vi er heldige - men en
revolution, som kommer, om vi vil det eller ej. Vi kan påvirke dets karakter, men ikke ændre dens uafvendelighed. [John F. Kennedy]
----
To gange jeg er blevet bedt om (som medlemmer af Parlamentet!), »Bed, Mr. Babbage, hvis du lægger ind i maskinen forkerte tal, vil de rigtige svar komme ud?" Jeg er ikke i
stand rette til at standse den form for sammenblanding af idéer, der kunne fremprovokere et sådant spørgsmål. [Charles Babbage]
----
De dele af systemet, som du kan slå på med en hammer (anbefales ikke) kaldes hardware; de dele, du kun kan bande over, kaldes software.
----
Ved konstruktion af avancerede digitale systemer, elegance er ikke en unødvendig luksus, men et spørgsmål om liv og død, er en væsentlig faktor, der afgør mellem succes og
fiasko. [Edsger W. Dijkstra]
----
Der er to måder at bygge et software design. En måde er at gøre det så enkelt, at der er selvfølgelig ingen fejl og mangler, og den anden måde at gøre det så kompliceret,
at der ikke er nogen indlysende mangler. Den første metode er langt mere vanskelig. [Charles A. R. Hoare]
/***
|Name|TiddlerTweakerPlugin|
|Source|http://www.TiddlyTools.com/#TiddlerTweakerPlugin|
|Version|2.3.0|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides||
|Description|select multiple tiddlers and modify author, created, modified and/or tag values|
~TiddlerTweaker is a tool for TiddlyWiki authors. It allows you to select multiple tiddlers from a listbox, either by direct interaction or automatically matching specific criteria. You can then modify the creator, author, created, modified and/or tag values of those tiddlers using a compact set of form fields. The values you enter into the fields simultantously overwrite the existing values in all tiddlers you have selected.
!!!!!Usage
<<<
{{{<<tiddlerTweaker>>}}}
{{smallform{<<tiddlerTweaker>>}}}
By default, any tags you enter into the TiddlerTweaker will //replace// the existing tags in all the tiddlers you have selected. However, you can also use TiddlerTweaker to quickly filter specified tags from the selected tiddlers, while leaving any other tags assigned to those tiddlers unchanged:
>Any tag preceded by a "+" (plus) or "-" (minus), will be added or removed from the existing tags //instead of replacing the entire tag definition// of each tiddler (e.g., enter "-excludeLists" to remove that tag from all selected tiddlers. When using this syntax, care should be taken to ensure that //every// tag is preceded by "+" or "-", to avoid inadvertently overwriting any other existing tags on the selected tiddlers. (note: the "+" or "-" prefix on each tag value is NOT part of the tag value, and is only used by TiddlerTweaker to control how that tag value is processed)
Important Notes:
* Inasmuch as TiddlerTweaker is a 'power user' tool that can perform 'batch' functions (operating on many tiddlers at once), you should always have a recent backup of your document (or "save changes" just *before* tweaking the tiddlers), just in case you "shoot yourself in the foot".
* By design, TiddlerTweaker does NOT update the 'modified' date of tiddlers simply by making changes to the tiddler's values. A tiddler's dates are ONLY updated when the corresponding 'created' and/or 'modified' checkboxes are selected and you enter new values for those dates. As a general rule, after using TiddlerTweaker, always ''//remember to save your document//'' when you are done, even though the tiddler timeline tab may not show any recently modified tiddlers.
* Because you may be changing the values on many tiddlers simultaneously, selecting and updating all tiddlers in a document operation may take a while and your browser might warn about an "unresponsive script"... you should give it a whole bunch of time to 'continue'... it should complete the processing... eventually.
<<<
!!!!!Revisions
<<<
2009.01.22 [2.3.0] added support for text pattern find/replace
2008.10.27 [2.2.3] in setTiddlers(), fixed Safari bug by replacing static Array.concat(...) with new Array().concat(...)
2008.09.07 [2.2.2] added removeCookie() function for compatibility with [[CookieManagerPlugin]]
2008.05.12 [2.2.1] replace built-in backstage "tweak" task with tiddler tweaker control panel (moved from BackstageTweaks)
2008.01.13 [2.2.0] added "auto-selection" links: all, changed, tags, title, text
2007.12.26 [2.1.0] added support for managing 'creator' custom field (see [[CoreTweaks]])
2007.11.01 [2.0.3] added config.options.txtTweakerSortBy for cookie-based persistence of list display order preference setting.
2007.09.28 [2.0.2] in settiddlers() and deltiddlers(), added suspend/resume notification handling (improves performance when operating on multiple tiddlers)
2007.08.03 [2.0.1] added shadow definition for [[TiddlerTweaker]] tiddler for use as parameter references with {{{<<tiddler>>, <<slider>> or <<tabs>>}}} macros.
2007.08.03 [2.0.0] converted from inline script
2006.01.01 [1.0.0] initial release
<<<
!!!!!Code
***/
//{{{
version.extensions.TiddlerTweakerPlugin= {major: 2, minor: 3, revision: 0, date: new Date(2009,1,22)};
// shadow tiddler
config.shadowTiddlers.TiddlerTweaker="<<tiddlerTweaker>>";
/// backstage task
if (config.tasks) { // for TW2.2b3 or above
config.tasks.tweak.tooltip="review/modify tiddler internals: dates, authors, tags, etc.";
config.tasks.tweak.content="{{smallform small groupbox{<<tiddlerTweaker>>}}}";
}
if (config.options.txtTweakerSortBy==undefined) config.options.txtTweakerSortBy="modified";
// if removeCookie() function is not defined by TW core, define it here.
if (window.removeCookie===undefined) {
window.removeCookie=function(name) {
document.cookie = name+'=; expires=Thu, 01-Jan-1970 00:00:01 UTC; path=/;';
}
}
config.macros.tiddlerTweaker = {
html: '<form style="display:inline"><!--\
--><table style="padding:0;margin:0;border:0;width:100%"><tr valign="top" style="padding:0;margin:0;border:0"><!--\
--><td style="text-align:center;white-space:nowrap;width:99%;padding:0;margin:0;border:0"><!--\
--><font size=-2><div style="text-align:left;"><span style="float:right"><!--\
--> <a href="javascript:;" \
title="select all tiddlers"\
onclick="\
var f=this; while (f&&f.nodeName.toLowerCase()!=\'form\')f=f.parentNode;\
for (var t=0; t<f.list.options.length; t++)\
if (f.list.options[t].value.length) f.list.options[t].selected=true;\
config.macros.tiddlerTweaker.selecttiddlers(f.list);\
return false">all</a><!--\
--> <a href="javascript:;" \
title="select tiddlers that are new/changed since the last file save"\
onclick="\
var lastmod=new Date(document.lastModified);\
var f=this; while (f&&f.nodeName.toLowerCase()!=\'form\')f=f.parentNode;\
for (var t=0; t<f.list.options.length; t++) {\
var tid=store.getTiddler(f.list.options[t].value);\
f.list.options[t].selected=tid&&tid.modified>lastmod;\
}\
config.macros.tiddlerTweaker.selecttiddlers(f.list);\
return false">changed</a><!--\
--> <a href="javascript:;" \
title="select tiddlers with at least one matching tag"\
onclick="\
var t=prompt(\'Enter space-separated tags (match ONE)\');\
if (!t||!t.length) return false;\
var tags=t.readBracketedList();\
var f=this; while (f&&f.nodeName.toLowerCase()!=\'form\')f=f.parentNode;\
for (var t=0; t<f.list.options.length; t++) {\
f.list.options[t].selected=false;\
var tid=store.getTiddler(f.list.options[t].value);\
if (tid&&tid.tags.containsAny(tags)) f.list.options[t].selected=true;\
}\
config.macros.tiddlerTweaker.selecttiddlers(f.list);\
return false">tags</a><!--\
--> <a href="javascript:;" \
title="select tiddlers whose titles include matching text"\
onclick="\
var txt=prompt(\'Enter a title (or portion of a title) to match\');\
if (!txt||!txt.length) return false;\
var f=this; while (f&&f.nodeName.toLowerCase()!=\'form\')f=f.parentNode;\
for (var t=0; t<f.list.options.length; t++) {\
f.list.options[t].selected=f.list.options[t].value.indexOf(txt)!=-1;\
}\
config.macros.tiddlerTweaker.selecttiddlers(f.list);\
return false">titles</a><!--\
--> <a href="javascript:;" \
title="select tiddlers containing matching text"\
onclick="\
var txt=prompt(\'Enter tiddler text (content) to match\');\
if (!txt||!txt.length) return false;\
var f=this; while (f&&f.nodeName.toLowerCase()!=\'form\')f=f.parentNode;\
for (var t=0; t<f.list.options.length; t++) {\
var tt=store.getTiddlerText(f.list.options[t].value,\'\');\
f.list.options[t].selected=(tt.indexOf(txt)!=-1);\
}\
config.macros.tiddlerTweaker.selecttiddlers(f.list);\
return false">text</a> <!--\
--></span><span>select tiddlers</span><!--\
--></div><!--\
--></font><select multiple name=list size="11" style="width:99.99%" \
title="use click, shift-click and/or ctrl-click to select multiple tiddler titles" \
onclick="config.macros.tiddlerTweaker.selecttiddlers(this)" \
onchange="config.macros.tiddlerTweaker.setfields(this)"><!--\
--></select><br><!--\
-->show<input type=text size=1 value="11" \
onchange="this.form.list.size=this.value; this.form.list.multiple=(this.value>1);"><!--\
-->by<!--\
--><select name=sortby size=1 \
onchange="config.macros.tiddlerTweaker.init(this.form,this.value)"><!--\
--><option value="title">title</option><!--\
--><option value="size">size</option><!--\
--><option value="modified">modified</option><!--\
--><option value="created">created</option><!--\
--></select><!--\
--><input type="button" value="refresh" \
onclick="config.macros.tiddlerTweaker.init(this.form,this.form.sortby.value)"<!--\
--> <input type="button" name="stats" disabled value="totals..." \
onclick="config.macros.tiddlerTweaker.stats(this)"><!--\
--></td><td style="white-space:nowrap;padding:0;margin:0;border:0;width:1%"><!--\
--><div style="text-align:left"><font size=-2> modify values</font></div><!--\
--><table border=0 style="width:100%;padding:0;margin:0;border:0;"><tr style="padding:0;border:0;"><!--\
--><td style="padding:1px;border:0;white-space:nowrap"><!--\
--><input type=checkbox name=settitle unchecked \
title="allow changes to tiddler title (rename tiddler)" \
onclick="this.form.title.disabled=!this.checked">title<!--\
--></td><td style="padding:1px;border:0;white-space:nowrap"><!--\
--><input type=text name=title size=35 style="width:98%" disabled><!--\
--></td></tr><tr style="padding:0;border:0;"><td style="padding:1px;border:0;white-space:nowrap"><!--\
--><input type=checkbox name=setcreator unchecked \
title="allow changes to tiddler creator" \
onclick="this.form.creator.disabled=!this.checked">created by<!--\
--></td><td style="padding:1px;border:0;white-space:nowrap"><!--\
--><input type=text name=creator size=35 style="width:98%" disabled><!--\
--></td></tr><tr style="padding:0;border:0;"><td style="padding:1px;border:0;white-space:nowrap"><!--\
--><input type=checkbox name=setwho unchecked \
title="allow changes to tiddler author" \
onclick="this.form.who.disabled=!this.checked">modified by<!--\
--></td><td style="padding:1px;border:0;white-space:nowrap"><!--\
--><input type=text name=who size=35 style="width:98%" disabled><!--\
--></td></tr><tr style="padding:0;border:0;"><td style="padding:1px;border:0;white-space:nowrap"><!--\
--><input type=checkbox name=setcdate unchecked \
title="allow changes to created date" \
onclick="var f=this.form; f.cm.disabled=f.cd.disabled=f.cy.disabled=f.ch.disabled=f.cn.disabled=!this.checked"><!--\
-->created on<!--\
--></td><td style="padding:1px;border:0;white-space:nowrap"><!--\
--><input type=text name=cm size=2 style="width:2em;padding:0;text-align:center" disabled><!--\
--> / <input type=text name=cd size=2 style="width:2em;padding:0;text-align:center" disabled><!--\
--> / <input type=text name=cy size=4 style="width:3em;padding:0;text-align:center" disabled><!--\
--> at <input type=text name=ch size=2 style="width:2em;padding:0;text-align:center" disabled><!--\
--> : <input type=text name=cn size=2 style="width:2em;padding:0;text-align:center" disabled><!--\
--></td></tr><tr style="padding:0;border:0;"><td style="padding:1px;border:0;white-space:nowrap"><!--\
--><input type=checkbox name=setmdate unchecked \
title="allow changes to modified date" \
onclick="var f=this.form; f.mm.disabled=f.md.disabled=f.my.disabled=f.mh.disabled=f.mn.disabled=!this.checked"><!--\
-->modified on<!--\
--></td><td style="padding:1px;border:0;white-space:nowrap"><!--\
--><input type=text name=mm size=2 style="width:2em;padding:0;text-align:center" disabled><!--\
--> / <input type=text name=md size=2 style="width:2em;padding:0;text-align:center" disabled><!--\
--> / <input type=text name=my size=4 style="width:3em;padding:0;text-align:center" disabled><!--\
--> at <input type=text name=mh size=2 style="width:2em;padding:0;text-align:center" disabled><!--\
--> : <input type=text name=mn size=2 style="width:2em;padding:0;text-align:center" disabled><!--\
--></td></tr><tr style="padding:0;border:0;"><td style="padding:1px;border:0;white-space:nowrap"><!--\
--><input type=checkbox name=replacetext unchecked\
title="find/replace matching text" \
onclick="this.form.pattern.disabled=this.form.replacement.disabled=!this.checked">replace text<!--\
--></td><td style="padding:1px;border:0;white-space:nowrap"><!--\
--><input type=text name=pattern size=15 value="" style="width:40%" disabled \
title="enter TEXT PATTERN (regular expression)"> with <!--\
--><input type=text name=replacement size=15 value="" style="width:40%" disabled \
title="enter REPLACEMENT TEXT"><!--\
--></td></tr><tr style="padding:0;border:0;"><td style="padding:1px;border:0;white-space:nowrap"><!--\
--><input type=checkbox name=settags checked \
title="allow changes to tiddler tags" \
onclick="this.form.tags.disabled=!this.checked">tags<!--\
--></td><td style="padding:1px;border:0;white-space:nowrap"><!--\
--><input type=text name=tags size=35 value="" style="width:98%" \
title="enter new tags or use \'+tag\' and \'-tag\' to add/remove tags from existing tags"><!--\
--></td></tr></table><!--\
--><div style="text-align:center"><!--\
--><nobr><input type=button name=display disabled style="width:32%" value="display tiddlers" \
onclick="config.macros.tiddlerTweaker.displaytiddlers(this)"><!--\
--> <input type=button name=del disabled style="width:32%" value="delete tiddlers" \
onclick="config.macros.tiddlerTweaker.deltiddlers(this)"><!--\
--> <input type=button name=set disabled style="width:32%" value="update tiddlers" \
onclick="config.macros.tiddlerTweaker.settiddlers(this)"></nobr><!--\
--></div><!--\
--></td></tr></table><!--\
--></form><span style="display:none"><!--content replaced by tiddler "stats"--></span>\
',
handler: function(place,macroName,params,wikifier,paramString,tiddler) {
var span=createTiddlyElement(place,"span");
span.innerHTML=this.html;
this.init(span.firstChild,config.options.txtTweakerSortBy);
},
init: function(f,sortby) { // initialize form controls
if (!f) return; // form might not be rendered yet...
while (f.list.options[0]) f.list.options[0]=null; // empty current list content
var tids=store.getTiddlers(sortby);
if (sortby=="size") // descending order (largest tiddlers listed first)
tids.sort(function(a,b) {return a.text.length > b.text.length ? -1 : (a.text.length == b.text.length ? 0 : +1);});
for (i=0; i<tids.length; i++) {
var label=tids[i].title; var value=tids[i].title;
if (sortby=="modified" || sortby=="created") {
label=tids[tids.length-i-1][sortby].formatString("YY.0MM.0DD 0hh:0mm ")+tids[tids.length-i-1].title;
value=tids[tids.length-i-1].title;
}
if (sortby=="size") label="["+tids[i].text.length+"] "+label;
f.list.options[f.list.length]=new Option(label,value,false,false);
}
f.title.value=f.who.value=f.creator.value=f.tags.value="";
f.cm.value=f.cd.value=f.cy.value=f.ch.value=f.cn.value="";
f.mm.value=f.md.value=f.my.value=f.mh.value=f.mn.value="";
f.stats.disabled=f.set.disabled=f.del.disabled=f.display.disabled=true;
f.settitle.disabled=false;
config.options.txtTweakerSortBy=sortby; // remember current setting
f.sortby.value=sortby; // sync droplist selection with current setting
if (sortby!="modified") // non-default preference... save cookie
saveOptionCookie("txtTweakerSortBy");
else removeCookie("txtTweakerSortBy"); // default preference... clear cookie
},
selecttiddlers: function(here) { // enable/disable tweaker fields based on number of items selected
// count how many tiddlers are selected
var f=here.form; var list=f.list;
var c=0; for (i=0;i<list.length;i++) if (list.options[i].selected) c++;
if (c>1) f.title.disabled=true;
if (c>1) f.settitle.checked=false;
f.set.disabled=(c==0);
f.del.disabled=(c==0);
f.display.disabled=(c==0);
f.settitle.disabled=(c>1);
f.stats.disabled=(c==0);
var msg=(c==0)?'select tiddlers':(c+' tiddler'+(c!=1?'s':'')+' selected');
here.previousSibling.firstChild.firstChild.nextSibling.innerHTML=msg;
if (c) clearMessage(); else displayMessage("no tiddlers selected");
},
setfields: function(here) { // set tweaker edit fields from first selected tiddler
var f=here.form;
if (!here.value.length) {
f.title.value=f.who.value=f.creator.value=f.tags.value="";
f.cm.value=f.cd.value=f.cy.value=f.ch.value=f.cn.value="";
f.mm.value=f.md.value=f.my.value=f.mh.value=f.mn.value="";
return;
}
var tid=store.getTiddler(here.value); if (!tid) return;
f.title.value=tid.title;
f.who.value=tid.modifier;
f.creator.value=tid.fields['creator']||''; // custom field - might not exist
f.tags.value=tid.tags.join(' ');
var c=tid.created; var m=tid.modified;
f.cm.value=c.getMonth()+1;
f.cd.value=c.getDate();
f.cy.value=c.getFullYear();
f.ch.value=c.getHours();
f.cn.value=c.getMinutes();
f.mm.value=m.getMonth()+1;
f.md.value=m.getDate();
f.my.value=m.getFullYear();
f.mh.value=m.getHours();
f.mn.value=m.getMinutes();
},
settiddlers: function(here) {
var f=here.form; var list=f.list;
var tids=[];
for (i=0;i<list.length;i++) if (list.options[i].selected) tids.push(list.options[i].value);
if (!tids.length) { alert("please select at least one tiddler"); return; }
var cdate=new Date(f.cy.value,f.cm.value-1,f.cd.value,f.ch.value,f.cn.value);
var mdate=new Date(f.my.value,f.mm.value-1,f.md.value,f.mh.value,f.mn.value);
if (tids.length>1 && !confirm("Are you sure you want to update these tiddlers:\n\n"+tids.join(', '))) return;
store.suspendNotifications();
for (t=0;t<tids.length;t++) {
var tid=store.getTiddler(tids[t]); if (!tid) continue;
var title=!f.settitle.checked?tid.title:f.title.value;
var who=!f.setwho.checked?tid.modifier:f.who.value;
var text=tid.text;
if (f.replacetext.checked) text=text.replace(new RegExp(f.pattern.value,'mg'),f.replacement.value);
var tags=tid.tags;
if (f.settags.checked) {
var intags=f.tags.value.readBracketedList();
var addtags=[]; var deltags=[]; var reptags=[];
for (i=0;i<intags.length;i++) {
if (intags[i].substr(0,1)=='+')
addtags.push(intags[i].substr(1));
else if (intags[i].substr(0,1)=='-')
deltags.push(intags[i].substr(1));
else
reptags.push(intags[i]);
}
if (reptags.length)
tags=reptags;
if (addtags.length)
tags=new Array().concat(tags,addtags);
if (deltags.length)
for (i=0;i<deltags.length;i++)
{ var pos=tags.indexOf(deltags[i]); if (pos!=-1) tags.splice(pos,1); }
}
if (!f.setcdate.checked) cdate=tid.created;
if (!f.setmdate.checked) mdate=tid.modified;
store.saveTiddler(tid.title,title,text,who,mdate,tags,tid.fields);
if (f.setcreator.checked) store.setValue(tid.title,'creator',f.creator.value); // set creator
if (f.setcdate.checked) tid.assign(null,null,null,null,null,cdate); // set create date
}
store.resumeNotifications();
this.init(f,f.sortby.value);
},
displaytiddlers: function(here) {
var f=here.form; var list=f.list;
var tids=[];
for (i=0; i<list.length;i++) if (list.options[i].selected) tids.push(list.options[i].value);
if (!tids.length) { alert("please select at least one tiddler"); return; }
story.displayTiddlers(story.findContainingTiddler(f),tids)
},
deltiddlers: function(here) {
var f=here.form; var list=f.list;
var tids=[];
for (i=0;i<list.length;i++) if (list.options[i].selected) tids.push(list.options[i].value);
if (!tids.length) { alert("please select at least one tiddler"); return; }
if (!confirm("Are you sure you want to delete these tiddlers:\n\n"+tids.join(', '))) return;
store.suspendNotifications();
for (t=0;t<tids.length;t++) {
var tid=store.getTiddler(tids[t]); if (!tid) continue;
if (tid.tags.contains("systemConfig"))
if (!confirm("'"+tid.title+"' is tagged with 'systemConfig'.\n\nRemoving this tiddler may cause unexpected results. Are you sure?"))
continue;
store.removeTiddler(tid.title);
story.closeTiddler(tid.title);
}
store.resumeNotifications();
this.init(f,f.sortby.value);
},
stats: function(here) {
var f=here.form; var list=f.list; var tids=[]; var out=''; var tot=0;
var target=f.nextSibling;
for (i=0;i<list.length;i++) if (list.options[i].selected) tids.push(list.options[i].value);
if (!tids.length) { alert("please select at least one tiddler"); return; }
for (t=0;t<tids.length;t++) {
var tid=store.getTiddler(tids[t]); if (!tid) continue;
out+='[['+tid.title+']] '+tid.text.length+'\n'; tot+=tid.text.length;
}
var avg=tot/tids.length;
out=tot+' bytes in '+tids.length+' selected tiddlers ('+avg+' bytes/tiddler)\n<<<\n'+out+'<<<\n';
removeChildren(target);
target.innerHTML="<hr><font size=-2><a href='javascript:;' style='float:right' "
+"onclick='this.parentNode.parentNode.style.display=\"none\"'>close</a></font>";
wikify(out,target);
target.style.display="block";
}
};
//}}}
<<tiddler TspotControls>>
I Internet Explorer følger udskiftningen alfabetet
I Firefox er det helt tilfældigt - Firefox anbefales!!
|<<tiddler SangBogenTilfældig>>|<<tiddler SangMappenTilfældig>>|
- eller KlikSelv
/%
|Name|ToggleRightSidebar|
|Source|http://www.TiddlyTools.com/#ToggleRightSidebar|
|Version|2.0.0|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|script|
|Requires|InlineJavascriptPlugin|
|Overrides||
|Description|show/hide right sidebar (MainMenu)|
Usage: <<tiddler ToggleRightSidebar with: "label">>
Config settings:
config.options.chkShowRightSidebar (false)
config.options.txtToggleRightSideBarLabelShow (►)
config.options.txtToggleRightSideBarLabelHide (◄)
%/<script label="$1" title="show/hide right sidebar content">
var co=config.options;
if (co.chkShowRightSidebar=='undefined') co.chkShowRightSidebar=true;
co.chkShowRightSidebar=!co.chkShowRightSidebar;
var sb=document.getElementById('sidebar'); if (!sb) return;
sb.style.display=co.chkShowRightSidebar?'block':'none';
document.getElementById('displayArea').style.marginRight=co.chkShowRightSidebar?'':'1em';
saveOptionCookie('chkShowRightSidebar');
var labelShow=co.txtToggleRightSideBarLabelShow||(config.browser.isSafari?'◀':'◄');
var labelHide=co.txtToggleRightSideBarLabelHide||'►';
if (typeof(place)!='undefined' && '$1'=='$'+'1') {
place.innerHTML=co.chkShowRightSidebar?labelHide:labelShow;
place.title=(co.chkShowRightSidebar?'hide':'show')+' right sidebar';
}
var sm=document.getElementById('storyMenu'); if (sm) config.refreshers.content(sm);
</script><script>
var co=config.options;
if (co.chkShowRightSidebar=='undefined') co.chkShowRightSidebar=true;
var sb=document.getElementById('sidebar'); if (!sb) return;
sb.style.display=co.chkShowRightSidebar?'block':'none';
document.getElementById('displayArea').style.marginRight=co.chkShowRightSidebar?'':'1em';
if ('$1'=='$'+'1') {
var labelShow=co.txtToggleRightSideBarLabelShow||(config.browser.isSafari?'◀':'◄');
var labelHide=co.txtToggleRightSideBarLabelHide||'►';
place.lastChild.innerHTML=co.chkShowRightSidebar?labelHide:labelShow;
place.lastChild.title=(co.chkShowRightSidebar?'hide':'show')+' right sidebar';
}
</script>
/***
Examples:
|Code|Description|Example|h
|{{{<<toggleTag>>}}}|Toggles the default tag (checked) in this tiddler|<<toggleTag>>|
|{{{<<toggleTag TagName>>}}}|Toggles the TagName tag in this tiddler|<<toggleTag TagName>>|
|{{{<<toggleTag TagName TiddlerName>>}}}|Toggles the TagName tag in the TiddlerName tiddler|<<toggleTag TagName TiddlerName>>|
|{{{<<toggleTag TagName TiddlerName nolabel>>Click me}}}|Same but hide the label|<<toggleTag TagName TiddlerName nolabel>>Click me|
(Note if TiddlerName does exist it will be silently created)
***/
//{{{
// This function contributed by Eric Shulman
function toggleTag(title,tag) {
var t=store.getTiddler(title); if (!t || !t.tags) return;
if (t.tags.find(tag)==null) t.tags.push(tag)
else t.tags.splice(t.tags.find(tag),1)
}
// This function contributed by Eric Shulman
function isTagged(title,tag) {
var t=store.getTiddler(title); if (!t) return false;
return (t.tags.find(tag)!=null);
}
config.macros.toggleTag = {};
config.views.wikified.toggleTag = {fulllabel: "[[%0]] [[%1]]", shortlabel: "[[%0]]", nolabel: "" };
config.macros.toggleTag.handler = function(place,macroName,params,wikifier,paramString,tiddler) {
if(tiddler instanceof Tiddler) {
var tag = (params[0] && params[0] != '.') ? params[0] : "checked";
var title = (params[1] && params[1] != '.') ? params[1] : tiddler.title;
var hidelabel = params[2]?true:false;
var onclick = function(e) {
if (!e) var e = window.event;
if (!store.getTiddler(title))
store.saveTiddler(title,title,"",config.options.txtUserName,new Date(),null);
toggleTag(title,tag);
store.setDirty(true); // so TW knows it has to save now
story.refreshTiddler(title,false,true); // force=true
story.refreshTiddler(tag,false,true); //
if (tiddler.title != title)
story.refreshTiddler(tiddler.title,false,true);
return false;
};
var lingo = config.views.wikified.toggleTag;
// this part also contributed by Eric Shulman
var c = document.createElement("input");
c.setAttribute("type","checkbox");
c.onclick=onclick;
place.appendChild(c);
c.checked=isTagged(title,tag);
if (!hidelabel) {
var label = (title!=tiddler.title)?lingo.fulllabel:lingo.shortlabel;
wikify(label.format([tag,title]),place);
}
}
}
//}}}
/***
Examples:
|Code|Description|Example|h
|{{{<<toggleTag>>}}}|Toggles the default tag (checked) in this tiddler|<<toggleTag>>|
|{{{<<toggleTag TagName>>}}}|Toggles the TagName tag in this tiddler|<<toggleTag TagName>>|
|{{{<<toggleTag TagName TiddlerName>>}}}|Toggles the TagName tag in the TiddlerName tiddler|<<toggleTag TagName TiddlerName>>|
|{{{<<toggleTag TagName TiddlerName nolabel>>Click me}}}|Same but hide the label|<<toggleTag TagName TiddlerName nolabel>>Click me|
(Note if TiddlerName does exist it will be silently created)
***/
//{{{
// This function contributed by Eric Shulman
function toggleTag(title,tag) {
var t=store.getTiddler(title); if (!t || !t.tags) return;
if (t.tags.find(tag)==null) t.tags.push(tag)
else t.tags.splice(t.tags.find(tag),1)
}
// This function contributed by Eric Shulman
function isTagged(title,tag) {
var t=store.getTiddler(title); if (!t) return false;
return (t.tags.find(tag)!=null);
}
config.macros.toggleTag = {};
config.views.wikified.toggleTag = {fulllabel: "[[%0]] [[%1]]", shortlabel: "[[%0]]", nolabel: "" };
config.macros.toggleTag.handler = function(place,macroName,params,wikifier,paramString,tiddler) {
if(tiddler instanceof Tiddler) {
var tag = (params[0] && params[0] != '.') ? params[0] : "checked";
var title = (params[1] && params[1] != '.') ? params[1] : tiddler.title;
var hidelabel = params[2]?true:false;
var onclick = function(e) {
if (!e) var e = window.event;
if (!store.getTiddler(title))
store.saveTiddler(title,title,"",config.options.txtUserName,new Date(),null);
toggleTag(title,tag);
store.setDirty(true); // so TW knows it has to save now
story.refreshTiddler(title,false,true); // force=true
story.refreshTiddler(tag,false,true); //
if (tiddler.title != title)
story.refreshTiddler(tiddler.title,false,true);
return false;
};
var lingo = config.views.wikified.toggleTag;
// this part also contributed by Eric Shulman
var c = document.createElement("input");
c.setAttribute("type","checkbox");
c.onclick=onclick;
place.appendChild(c);
c.checked=isTagged(title,tag);
if (!hidelabel) {
var label = (title!=tiddler.title)?lingo.fulllabel:lingo.shortlabel;
wikify(label.format([tag,title]),place);
}
}
}
//}}}
/***
|Name:|ToggleTagPlugin|
|Description:|Makes a checkbox which toggles a tag in a tiddler|
|Version:|3.1.0 ($Rev: 4907 $)|
|Date:|$Date: 2008-05-13 03:15:46 +1000 (Tue, 13 May 2008) $|
|Source:|http://mptw.tiddlyspot.com/#ToggleTagPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
!!Usage
{{{<<toggleTag }}}//{{{TagName TiddlerName LabelText}}}//{{{>>}}}
* TagName - the tag to be toggled, default value "checked"
* TiddlerName - the tiddler to toggle the tag in, default value the current tiddler
* LabelText - the text (gets wikified) to put next to the check box, default value is '{{{[[TagName]]}}}' or '{{{[[TagName]] [[TiddlerName]]}}}'
(If a parameter is '.' then the default will be used)
* TouchMod flag - if non empty then touch the tiddlers mod date. Note, can set config.toggleTagAlwaysTouchModDate to always touch mod date
!!Examples
|Code|Description|Example|h
|{{{<<toggleTag>>}}}|Toggles the default tag (checked) in this tiddler|<<toggleTag>>|
|{{{<<toggleTag TagName>>}}}|Toggles the TagName tag in this tiddler|<<toggleTag TagName>>|
|{{{<<toggleTag TagName TiddlerName>>}}}|Toggles the TagName tag in the TiddlerName tiddler|<<toggleTag TagName TiddlerName>>|
|{{{<<toggleTag TagName TiddlerName 'click me'>>}}}|Same but with custom label|<<toggleTag TagName TiddlerName 'click me'>>|
|{{{<<toggleTag . . 'click me'>>}}}|dot means use default value|<<toggleTag . . 'click me'>>|
!!Notes
* If TiddlerName doesn't exist it will be silently created
* Set label to '-' to specify no label
* See also http://mgtd-alpha.tiddlyspot.com/#ToggleTag2
!!Known issues
* Doesn't smoothly handle the case where you toggle a tag in a tiddler that is current open for editing
* Should convert to use named params
***/
//{{{
if (config.toggleTagAlwaysTouchModDate == undefined) config.toggleTagAlwaysTouchModDate = false;
merge(config.macros,{
toggleTag: {
createIfRequired: true,
shortLabel: "[[%0]]",
longLabel: "[[%0]] [[%1]]",
handler: function(place,macroName,params,wikifier,paramString,tiddler) {
var tiddlerTitle = tiddler ? tiddler.title : '';
var tag = (params[0] && params[0] != '.') ? params[0] : "checked";
var title = (params[1] && params[1] != '.') ? params[1] : tiddlerTitle;
var defaultLabel = (title == tiddlerTitle ? this.shortLabel : this.longLabel);
var label = (params[2] && params[2] != '.') ? params[2] : defaultLabel;
var touchMod = (params[3] && params[3] != '.') ? params[3] : "";
label = (label == '-' ? '' : label); // dash means no label
var theTiddler = (title == tiddlerTitle ? tiddler : store.getTiddler(title));
var cb = createTiddlyCheckbox(place, label.format([tag,title]), theTiddler && theTiddler.isTagged(tag), function(e) {
if (!store.tiddlerExists(title)) {
if (config.macros.toggleTag.createIfRequired) {
var content = store.getTiddlerText(title); // just in case it's a shadow
store.saveTiddler(title,title,content?content:"",config.options.txtUserName,new Date(),null);
}
else
return false;
}
if ((touchMod != "" || config.toggleTagAlwaysTouchModDate) && theTiddler)
theTiddler.modified = new Date();
store.setTiddlerTag(title,this.checked,tag);
return true;
});
}
}
});
//}}}
|~ViewToolbar|fullscreen newHere closeTiddler +editTiddler editHtml deleteTiddler > fields syncing permalink references jump|
|~EditToolbar|+saveTiddler saveCloseTiddler -cancelTiddler cancelCloseTiddler deleteTiddler|
|invisiblecomm|k
|{{purple{[[Hjælp]]}}}||@@padding-left: 20px;<<newTiddler title: 'Skriv titlen på dit nye hovedemne her' tag: 'Emner' label: 'Nyt hovedemne' text: {{store.getTiddlerText("SliderFrame")}} label: 'Nyt hovedemne'>>@@||@@padding-left: 20px;{{purple nowrap{<<search>><<option chkUseYourSearch>>}}}@@||@@padding-left: 20px;{{purple{<<back>>}}}@@||{{purple{<<history >>}}}||{{purple{<<forward>>}}}||@@padding-left: 20px;{{purple{<<tiddler ToggleRightSidebar with: "(Sidepanel)">>}}}@@|@@{{purple tiny nowrap{<<QOTD SangBogen2 6000>>}}}@@||@@{{purple tiny nowrap{<<QOTD SangMappen2 8000>>}}}@@|
<!--{{{-->
<a style="color: #5566ff">Det ser ud som om du er ved at lave eller ændre pået hieraki af emner oppefra og ned!<br>Tilføj navnet på emnet både i øverste tekstfelt, og i sitemap slideren herunder.<br>Klik 'færdig', klik derefter på 'ny her' knappen for at lave underemner og noter indenfor dette emne.<br>Hvis du vil tilføje tekst herunder, så gør det under linien med sitemap slideren.</a>
<!--}}}-->
Skemaperiode: 17-08-2008 - 27-06-2009
|sortable|k
|Mandag|Tirsdag|Onsdag|Torsdag|Fredag|h
| ||||
|07:45 - 08:00|07:45 - 08:00|07:45 - 08:00|07:45 - 08:00|07:45 - 08:00|
|Morgensamling|Morgensamling|Morgensamling|Morgensamling|Morgensamling|
| ||||
|08:05 - 09:25|08:05 - 09:25|08:05 - 09:25|08:05 - 09:25|08:05 - 09:25|
|DanB1 JA|engB1 BK|Badm JG|dans DO|digbil BK|
|DanB2 JD|engB2 JK|exDans LM|FysA1 HC|guit1 JD|
|DanB3 LM|engB3 SM|FysC3 KC KL BI|smyk1 JK|GymD3 JG|
|DanB4 ET|engB4 LS|kondi PA|TysA3 LM|GymP3 ET LM|
|FysA1 HC|MatA1 JG|sams1 JD|TysB3 PS|Progr BI|
|Ldans DO|MatA2 HC|tegnin MM|TysC3 HM|smyk2 TN|
|motor TN|MatA3 PA|TysC1 PS|volley SM|TysA1 PS|
|psyko BK|MatA4 DO||||
| ||||
|09:40 - 11:00|09:40 - 11:00|09:40 - 11:00|09:40 - 11:00|09:40 - 11:00|
|DanA1 JA|FysC1 PA|DanA1 JA|DanA1 JA|DanB1 JA|
|DanA2 SB|hånvær SM|DanA2 SB|DanA2 SB|DanB2 JD|
|DanA3 MM|pifod JA|DanA3 MM|DanA3 MM|DanB3 LM|
|DanA4 ET|TysA3 LM|DanA4 ET|DanA4 ET|DanB4 ET|
|FysB3 KC KL BI|TysB3 PS|edb JG|MatB1 NT|MatA1 JG|
|idræt DO|TysC3 HM|FysB3 KC KL BI|MatB2 HC|MatA2 HC|
|metalA TN|video JK|håndb LM|MatB3 SM|MatA3 PA|
|Skoleb BK||text PS|MatB4 DO|MatA4 DO|
|TysB1 HM|||||
| ||||
|11:05 - 12:00|11:05 - 12:00|11:05 - 12:00|11:05 - 12:00|11:05 - 12:00|
|Akt1 JK SB|Akt2 JK SB|Sang/Fortælling|Akt1 JK SB|Akt2 JK SB|
|Geo3 HM|Geo2 HM||Geo1 HM|Hist1 LS|
|Kris2 MM|Hist3 LS||Hist2 LS|Kris3 MM|
|kult2 TN BK|Kris1 MM||Samf3 PS|Samf2 PS|
|Samf1 PS|kult1 TN BK||||
| ||||
|12:05 - 12:20|12:05 - 12:20|12:05 - 12:20|12:05 - 12:20|12:05 - 12:20|
|Rengøring|Rengøring|Rengøring|Rengøring|Rengøring|
| ||||
|12:25 - 12:50|12:25 - 12:50|12:25 - 12:50|12:25 - 12:50|12:25 - 12:50|
|Middag|Middag|Middag|Middag|Middag|
| ||||
| ||13:10 - 14:10||
| 13:15 - 13:45||||
| ||Lærermøde||
| Elevmøder||||
| ||||
|13:30 - 14:50||13:30 - 14:50||13:30 - 14:50|
|Bask JA||DanB1 JA||engA1 BK|
|FysA3 KC KL BI||DanB2 JD||engA2 JK|
| ||||
|MatB1 NT|13:50 - 14:50|DanB3 LM||engA3 JD|
|MatB2 HC||DanB4 ET||engA4 TN|
| Medarbejdermøde||||
|MatB3 SM||floor HM||MatB1 NT|
| ||||
|MatB4 DO||Fransk LB||MatB2 HC|
| ||||
|rolle PA||FysA3 KC KL BI||MatB3 SM|
|TysA1 PS||keram LS||MatB4 DO|
| |spring JG|||
| ||14:30 - 15:50||
| ||||
| ||engB1 BK||
| ||engB2 JK||
| ||engB3 SM||
| ||engB4 LS||
| ||||
| ||Fransk LB|15:00 - 15:40|
| ||GymD2 JG|Sangtime|
| ||GymP2 ET LM||
|15:15 - 16:35|15:15 - 16:35|15:15 - 16:35|||
| ||||
|drfod JA|billed LS|detek BI|||
|FysC3 KC KL BI|engA1 BK|GymD1 JG|||
|hjem1 PA|engA2 JK|GymP1 ET LM|||
|samsp2 TN|engA3 JD|kor JD|||
|Teater LB|engA4 TN|makke SB|||
| ||||
|TysC1 PS|FysB1 HC|strik LS|||
| guitar MM|TysB1 HM|||
| ||16:00 - 16:50||
| styrke PA||||
| ||Dans/Fællesgymn||
| tøskre SM||||
/***
Description: Contains the stuff you need to use Tiddlyspot
Note, you also need UploadPlugin, PasswordOptionPlugin and LoadRemoteFileThroughProxy
from http://tiddlywiki.bidix.info for a complete working Tiddlyspot site.
***/
//{{{
// edit this if you are migrating sites or retrofitting an existing TW
config.tiddlyspotSiteId = 'sang';
// make it so you can by default see edit controls via http
config.options.chkHttpReadOnly = false;
window.readOnly = false; // make sure of it (for tw 2.2)
window.showBackstage = true; // show backstage too
// disable autosave in d3
if (window.location.protocol != "file:")
config.options.chkGTDLazyAutoSave = false;
// tweak shadow tiddlers to add upload button, password entry box etc
with (config.shadowTiddlers) {
SiteUrl = 'http://'+config.tiddlyspotSiteId+'.tiddlyspot.com';
SideBarOptions = SideBarOptions.replace(/(<<saveChanges>>)/,"$1<<tiddler TspotSidebar>>");
OptionsPanel = OptionsPanel.replace(/^/,"<<tiddler TspotOptions>>");
DefaultTiddlers = DefaultTiddlers.replace(/^/,"[[WelcomeToTiddlyspot]] ");
MainMenu = MainMenu.replace(/^/,"[[WelcomeToTiddlyspot]] ");
}
// create some shadow tiddler content
merge(config.shadowTiddlers,{
'WelcomeToTiddlyspot':[
"This document is a ~TiddlyWiki from tiddlyspot.com. A ~TiddlyWiki is an electronic notebook that is great for managing todo lists, personal information, and all sorts of things.",
"",
"@@font-weight:bold;font-size:1.3em;color:#444; //What now?// @@ Before you can save any changes, you need to enter your password in the form below. Then configure privacy and other site settings at your [[control panel|http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/controlpanel]] (your control panel username is //" + config.tiddlyspotSiteId + "//).",
"<<tiddler TspotControls>>",
"See also GettingStarted.",
"",
"@@font-weight:bold;font-size:1.3em;color:#444; //Working online// @@ You can edit this ~TiddlyWiki right now, and save your changes using the \"save to web\" button in the column on the right.",
"",
"@@font-weight:bold;font-size:1.3em;color:#444; //Working offline// @@ A fully functioning copy of this ~TiddlyWiki can be saved onto your hard drive or USB stick. You can make changes and save them locally without being connected to the Internet. When you're ready to sync up again, just click \"upload\" and your ~TiddlyWiki will be saved back to tiddlyspot.com.",
"",
"@@font-weight:bold;font-size:1.3em;color:#444; //Help!// @@ Find out more about ~TiddlyWiki at [[TiddlyWiki.com|http://tiddlywiki.com]]. Also visit [[TiddlyWiki.org|http://tiddlywiki.org]] for documentation on learning and using ~TiddlyWiki. New users are especially welcome on the [[TiddlyWiki mailing list|http://groups.google.com/group/TiddlyWiki]], which is an excellent place to ask questions and get help. If you have a tiddlyspot related problem email [[tiddlyspot support|mailto:support@tiddlyspot.com]].",
"",
"@@font-weight:bold;font-size:1.3em;color:#444; //Enjoy :)// @@ We hope you like using your tiddlyspot.com site. Please email [[feedback@tiddlyspot.com|mailto:feedback@tiddlyspot.com]] with any comments or suggestions."
].join("\n"),
'TspotControls':[
"| tiddlyspot password:|<<option pasUploadPassword>>|",
"| site management:|<<upload http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/store.cgi index.html . . " + config.tiddlyspotSiteId + ">>//(requires tiddlyspot password)//<br>[[control panel|http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/controlpanel]], [[download (go offline)|http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/download]]|",
"| links:|[[tiddlyspot.com|http://tiddlyspot.com/]], [[FAQs|http://faq.tiddlyspot.com/]], [[blog|http://tiddlyspot.blogspot.com/]], email [[support|mailto:support@tiddlyspot.com]] & [[feedback|mailto:feedback@tiddlyspot.com]], [[donate|http://tiddlyspot.com/?page=donate]]|"
].join("\n"),
'TspotSidebar':[
"<<upload http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/store.cgi index.html . . " + config.tiddlyspotSiteId + ">><html><a href='http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/download' class='button'>download</a></html>"
].join("\n"),
'TspotOptions':[
"tiddlyspot password:",
"<<option pasUploadPassword>>",
""
].join("\n")
});
//}}}
<<upload http://sang.tiddlyspot.com/store.cgi index.html . . sang >><html><a href='http://sang.tiddlyspot.com/download' class='button'>download</a></html>
<html><!-- START: PDF Online Script -->
<script type="text/javascript">
var authorId = "AB9CAD14-7AED-4591-8C53-5C553A994451";
var pageOrientation = "0";
var topMargin = "0.5";
var bottomMargin = "0.5";
var leftMargin = "0.5";
var rightMargin = "0.5";
</script>
<script type="text/javascript" src="http://web2.pdfonline.com/pdfonline/pdfonline.js">
</script>
<!-- END: PDF Online Script -->
</html>
| !date | !user | !location | !storeUrl | !uploadDir | !toFilename | !backupdir | !origin |
| 24/06/2011 21:08:24 | DitNavn | [[/|http://sang.tiddlyspot.com/]] | [[store.cgi|http://sang.tiddlyspot.com/store.cgi]] | . | [[index.html | http://sang.tiddlyspot.com/index.html]] | . |
| 24/06/2011 21:13:53 | DitNavn | [[/|http://sang.tiddlyspot.com/]] | [[store.cgi|http://sang.tiddlyspot.com/store.cgi]] | . | [[index.html | http://sang.tiddlyspot.com/index.html]] | . |
| 24/06/2011 21:14:14 | DitNavn | [[/|http://sang.tiddlyspot.com/]] | [[store.cgi|http://sang.tiddlyspot.com/store.cgi]] | . | [[index.html | http://sang.tiddlyspot.com/index.html]] | . |
| 16/09/2011 11:10:44 | DitNavn | [[/|http://sang.tiddlyspot.com/]] | [[store.cgi|http://sang.tiddlyspot.com/store.cgi]] | . | [[index.html | http://sang.tiddlyspot.com/index.html]] | . |
| 16/09/2011 11:11:10 | DitNavn | [[/|http://sang.tiddlyspot.com/]] | [[store.cgi|http://sang.tiddlyspot.com/store.cgi]] | . | [[index.html | http://sang.tiddlyspot.com/index.html]] | . |
| 24/10/2011 07:54:19 | DitNavn | [[/|http://sang.tiddlyspot.com/]] | [[store.cgi|http://sang.tiddlyspot.com/store.cgi]] | . | [[index.html | http://sang.tiddlyspot.com/index.html]] | . |
| 24/10/2011 07:54:36 | DitNavn | [[/|http://sang.tiddlyspot.com/]] | [[store.cgi|http://sang.tiddlyspot.com/store.cgi]] | . | [[index.html | http://sang.tiddlyspot.com/index.html]] | . |
| 24/10/2011 08:03:53 | DitNavn | [[/|http://sang.tiddlyspot.com/]] | [[store.cgi|http://sang.tiddlyspot.com/store.cgi]] | . | [[index.html | http://sang.tiddlyspot.com/index.html]] | . |
| 02/12/2011 10:09:42 | DitNavn | [[/|http://sang.tiddlyspot.com/]] | [[$url$store.php|http://sang.tiddlyspot.com/$url$store.php]] | . | [[index.html | http://sang.tiddlyspot.com/index.html]] | backup |
| 02/12/2011 10:10:15 | DitNavn | [[/|http://sang.tiddlyspot.com/]] | [[store.cgi|http://sang.tiddlyspot.com/store.cgi]] | . | [[index.html | http://sang.tiddlyspot.com/index.html]] | |
/***
|''Name:''|UploadPlugin|
|''Description:''|Save to web a TiddlyWiki|
|''Version:''|4.1.3|
|''Date:''|Feb 24, 2008|
|''Source:''|http://tiddlywiki.bidix.info/#UploadPlugin|
|''Documentation:''|http://tiddlywiki.bidix.info/#UploadPluginDoc|
|''Author:''|BidiX (BidiX (at) bidix (dot) info)|
|''License:''|[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D ]]|
|''~CoreVersion:''|2.2.0|
|''Requires:''|PasswordOptionPlugin|
***/
//{{{
version.extensions.UploadPlugin = {
major: 4, minor: 1, revision: 3,
date: new Date("Feb 24, 2008"),
source: 'http://tiddlywiki.bidix.info/#UploadPlugin',
author: 'BidiX (BidiX (at) bidix (dot) info',
coreVersion: '2.2.0'
};
//
// Environment
//
if (!window.bidix) window.bidix = {}; // bidix namespace
bidix.debugMode = false; // true to activate both in Plugin and UploadService
//
// Upload Macro
//
config.macros.upload = {
// default values
defaultBackupDir: '', //no backup
defaultStoreScript: "store.php",
defaultToFilename: "index.html",
defaultUploadDir: ".",
authenticateUser: true // UploadService Authenticate User
};
config.macros.upload.label = {
promptOption: "Save and Upload this TiddlyWiki with UploadOptions",
promptParamMacro: "Save and Upload this TiddlyWiki in %0",
saveLabel: "save to web",
saveToDisk: "save to disk",
uploadLabel: "upload"
};
config.macros.upload.messages = {
noStoreUrl: "No store URL in parmeters or options",
usernameOrPasswordMissing: "Username or password missing"
};
config.macros.upload.handler = function(place,macroName,params) {
if (readOnly)
return;
var label;
if (document.location.toString().substr(0,4) == "http")
label = this.label.saveLabel;
else
label = this.label.uploadLabel;
var prompt;
if (params[0]) {
prompt = this.label.promptParamMacro.toString().format([this.destFile(params[0],
(params[1] ? params[1]:bidix.basename(window.location.toString())), params[3])]);
} else {
prompt = this.label.promptOption;
}
createTiddlyButton(place, label, prompt, function() {config.macros.upload.action(params);}, null, null, this.accessKey);
};
config.macros.upload.action = function(params)
{
// for missing macro parameter set value from options
if (!params) params = {};
var storeUrl = params[0] ? params[0] : config.options.txtUploadStoreUrl;
var toFilename = params[1] ? params[1] : config.options.txtUploadFilename;
var backupDir = params[2] ? params[2] : config.options.txtUploadBackupDir;
var uploadDir = params[3] ? params[3] : config.options.txtUploadDir;
var username = params[4] ? params[4] : config.options.txtUploadUserName;
var password = config.options.pasUploadPassword; // for security reason no password as macro parameter
// for still missing parameter set default value
if ((!storeUrl) && (document.location.toString().substr(0,4) == "http"))
storeUrl = bidix.dirname(document.location.toString())+'/'+config.macros.upload.defaultStoreScript;
if (storeUrl.substr(0,4) != "http")
storeUrl = bidix.dirname(document.location.toString()) +'/'+ storeUrl;
if (!toFilename)
toFilename = bidix.basename(window.location.toString());
if (!toFilename)
toFilename = config.macros.upload.defaultToFilename;
if (!uploadDir)
uploadDir = config.macros.upload.defaultUploadDir;
if (!backupDir)
backupDir = config.macros.upload.defaultBackupDir;
// report error if still missing
if (!storeUrl) {
alert(config.macros.upload.messages.noStoreUrl);
clearMessage();
return false;
}
if (config.macros.upload.authenticateUser && (!username || !password)) {
alert(config.macros.upload.messages.usernameOrPasswordMissing);
clearMessage();
return false;
}
bidix.upload.uploadChanges(false,null,storeUrl, toFilename, uploadDir, backupDir, username, password);
return false;
};
config.macros.upload.destFile = function(storeUrl, toFilename, uploadDir)
{
if (!storeUrl)
return null;
var dest = bidix.dirname(storeUrl);
if (uploadDir && uploadDir != '.')
dest = dest + '/' + uploadDir;
dest = dest + '/' + toFilename;
return dest;
};
//
// uploadOptions Macro
//
config.macros.uploadOptions = {
handler: function(place,macroName,params) {
var wizard = new Wizard();
wizard.createWizard(place,this.wizardTitle);
wizard.addStep(this.step1Title,this.step1Html);
var markList = wizard.getElement("markList");
var listWrapper = document.createElement("div");
markList.parentNode.insertBefore(listWrapper,markList);
wizard.setValue("listWrapper",listWrapper);
this.refreshOptions(listWrapper,false);
var uploadCaption;
if (document.location.toString().substr(0,4) == "http")
uploadCaption = config.macros.upload.label.saveLabel;
else
uploadCaption = config.macros.upload.label.uploadLabel;
wizard.setButtons([
{caption: uploadCaption, tooltip: config.macros.upload.label.promptOption,
onClick: config.macros.upload.action},
{caption: this.cancelButton, tooltip: this.cancelButtonPrompt, onClick: this.onCancel}
]);
},
options: [
"txtUploadUserName",
"pasUploadPassword",
"txtUploadStoreUrl",
"txtUploadDir",
"txtUploadFilename",
"txtUploadBackupDir",
"chkUploadLog",
"txtUploadLogMaxLine"
],
refreshOptions: function(listWrapper) {
var opts = [];
for(i=0; i<this.options.length; i++) {
var opt = {};
opts.push();
opt.option = "";
n = this.options[i];
opt.name = n;
opt.lowlight = !config.optionsDesc[n];
opt.description = opt.lowlight ? this.unknownDescription : config.optionsDesc[n];
opts.push(opt);
}
var listview = ListView.create(listWrapper,opts,this.listViewTemplate);
for(n=0; n<opts.length; n++) {
var type = opts[n].name.substr(0,3);
var h = config.macros.option.types[type];
if (h && h.create) {
h.create(opts[n].colElements['option'],type,opts[n].name,opts[n].name,"no");
}
}
},
onCancel: function(e)
{
backstage.switchTab(null);
return false;
},
wizardTitle: "Upload with options",
step1Title: "These options are saved in cookies in your browser",
step1Html: "<input type='hidden' name='markList'></input><br>",
cancelButton: "Cancel",
cancelButtonPrompt: "Cancel prompt",
listViewTemplate: {
columns: [
{name: 'Description', field: 'description', title: "Description", type: 'WikiText'},
{name: 'Option', field: 'option', title: "Option", type: 'String'},
{name: 'Name', field: 'name', title: "Name", type: 'String'}
],
rowClasses: [
{className: 'lowlight', field: 'lowlight'}
]}
};
//
// upload functions
//
if (!bidix.upload) bidix.upload = {};
if (!bidix.upload.messages) bidix.upload.messages = {
//from saving
invalidFileError: "The original file '%0' does not appear to be a valid TiddlyWiki",
backupSaved: "Backup saved",
backupFailed: "Failed to upload backup file",
rssSaved: "RSS feed uploaded",
rssFailed: "Failed to upload RSS feed file",
emptySaved: "Empty template uploaded",
emptyFailed: "Failed to upload empty template file",
mainSaved: "Main TiddlyWiki file uploaded",
mainFailed: "Failed to upload main TiddlyWiki file. Your changes have not been saved",
//specific upload
loadOriginalHttpPostError: "Can't get original file",
aboutToSaveOnHttpPost: 'About to upload on %0 ...',
storePhpNotFound: "The store script '%0' was not found."
};
bidix.upload.uploadChanges = function(onlyIfDirty,tiddlers,storeUrl,toFilename,uploadDir,backupDir,username,password)
{
var callback = function(status,uploadParams,original,url,xhr) {
if (!status) {
displayMessage(bidix.upload.messages.loadOriginalHttpPostError);
return;
}
if (bidix.debugMode)
alert(original.substr(0,500)+"\n...");
// Locate the storeArea div's
var posDiv = locateStoreArea(original);
if((posDiv[0] == -1) || (posDiv[1] == -1)) {
alert(config.messages.invalidFileError.format([localPath]));
return;
}
bidix.upload.uploadRss(uploadParams,original,posDiv);
};
if(onlyIfDirty && !store.isDirty())
return;
clearMessage();
// save on localdisk ?
if (document.location.toString().substr(0,4) == "file") {
var path = document.location.toString();
var localPath = getLocalPath(path);
saveChanges();
}
// get original
var uploadParams = new Array(storeUrl,toFilename,uploadDir,backupDir,username,password);
var originalPath = document.location.toString();
// If url is a directory : add index.html
if (originalPath.charAt(originalPath.length-1) == "/")
originalPath = originalPath + "index.html";
var dest = config.macros.upload.destFile(storeUrl,toFilename,uploadDir);
var log = new bidix.UploadLog();
log.startUpload(storeUrl, dest, uploadDir, backupDir);
displayMessage(bidix.upload.messages.aboutToSaveOnHttpPost.format([dest]));
if (bidix.debugMode)
alert("about to execute Http - GET on "+originalPath);
var r = doHttp("GET",originalPath,null,null,username,password,callback,uploadParams,null);
if (typeof r == "string")
displayMessage(r);
return r;
};
bidix.upload.uploadRss = function(uploadParams,original,posDiv)
{
var callback = function(status,params,responseText,url,xhr) {
if(status) {
var destfile = responseText.substring(responseText.indexOf("destfile:")+9,responseText.indexOf("\n", responseText.indexOf("destfile:")));
displayMessage(bidix.upload.messages.rssSaved,bidix.dirname(url)+'/'+destfile);
bidix.upload.uploadMain(params[0],params[1],params[2]);
} else {
displayMessage(bidix.upload.messages.rssFailed);
}
};
// do uploadRss
if(config.options.chkGenerateAnRssFeed) {
var rssPath = uploadParams[1].substr(0,uploadParams[1].lastIndexOf(".")) + ".xml";
var rssUploadParams = new Array(uploadParams[0],rssPath,uploadParams[2],'',uploadParams[4],uploadParams[5]);
var rssString = generateRss();
// no UnicodeToUTF8 conversion needed when location is "file" !!!
if (document.location.toString().substr(0,4) != "file")
rssString = convertUnicodeToUTF8(rssString);
bidix.upload.httpUpload(rssUploadParams,rssString,callback,Array(uploadParams,original,posDiv));
} else {
bidix.upload.uploadMain(uploadParams,original,posDiv);
}
};
bidix.upload.uploadMain = function(uploadParams,original,posDiv)
{
var callback = function(status,params,responseText,url,xhr) {
var log = new bidix.UploadLog();
if(status) {
// if backupDir specified
if ((params[3]) && (responseText.indexOf("backupfile:") > -1)) {
var backupfile = responseText.substring(responseText.indexOf("backupfile:")+11,responseText.indexOf("\n", responseText.indexOf("backupfile:")));
displayMessage(bidix.upload.messages.backupSaved,bidix.dirname(url)+'/'+backupfile);
}
var destfile = responseText.substring(responseText.indexOf("destfile:")+9,responseText.indexOf("\n", responseText.indexOf("destfile:")));
displayMessage(bidix.upload.messages.mainSaved,bidix.dirname(url)+'/'+destfile);
store.setDirty(false);
log.endUpload("ok");
} else {
alert(bidix.upload.messages.mainFailed);
displayMessage(bidix.upload.messages.mainFailed);
log.endUpload("failed");
}
};
// do uploadMain
var revised = bidix.upload.updateOriginal(original,posDiv);
bidix.upload.httpUpload(uploadParams,revised,callback,uploadParams);
};
bidix.upload.httpUpload = function(uploadParams,data,callback,params)
{
var localCallback = function(status,params,responseText,url,xhr) {
url = (url.indexOf("nocache=") < 0 ? url : url.substring(0,url.indexOf("nocache=")-1));
if (xhr.status == 404)
alert(bidix.upload.messages.storePhpNotFound.format([url]));
if ((bidix.debugMode) || (responseText.indexOf("Debug mode") >= 0 )) {
alert(responseText);
if (responseText.indexOf("Debug mode") >= 0 )
responseText = responseText.substring(responseText.indexOf("\n\n")+2);
} else if (responseText.charAt(0) != '0')
alert(responseText);
if (responseText.charAt(0) != '0')
status = null;
callback(status,params,responseText,url,xhr);
};
// do httpUpload
var boundary = "---------------------------"+"AaB03x";
var uploadFormName = "UploadPlugin";
// compose headers data
var sheader = "";
sheader += "--" + boundary + "\r\nContent-disposition: form-data; name=\"";
sheader += uploadFormName +"\"\r\n\r\n";
sheader += "backupDir="+uploadParams[3] +
";user=" + uploadParams[4] +
";password=" + uploadParams[5] +
";uploaddir=" + uploadParams[2];
if (bidix.debugMode)
sheader += ";debug=1";
sheader += ";;\r\n";
sheader += "\r\n" + "--" + boundary + "\r\n";
sheader += "Content-disposition: form-data; name=\"userfile\"; filename=\""+uploadParams[1]+"\"\r\n";
sheader += "Content-Type: text/html;charset=UTF-8" + "\r\n";
sheader += "Content-Length: " + data.length + "\r\n\r\n";
// compose trailer data
var strailer = new String();
strailer = "\r\n--" + boundary + "--\r\n";
data = sheader + data + strailer;
if (bidix.debugMode) alert("about to execute Http - POST on "+uploadParams[0]+"\n with \n"+data.substr(0,500)+ " ... ");
var r = doHttp("POST",uploadParams[0],data,"multipart/form-data; ;charset=UTF-8; boundary="+boundary,uploadParams[4],uploadParams[5],localCallback,params,null);
if (typeof r == "string")
displayMessage(r);
return r;
};
// same as Saving's updateOriginal but without convertUnicodeToUTF8 calls
bidix.upload.updateOriginal = function(original, posDiv)
{
if (!posDiv)
posDiv = locateStoreArea(original);
if((posDiv[0] == -1) || (posDiv[1] == -1)) {
alert(config.messages.invalidFileError.format([localPath]));
return;
}
var revised = original.substr(0,posDiv[0] + startSaveArea.length) + "\n" +
store.allTiddlersAsHtml() + "\n" +
original.substr(posDiv[1]);
var newSiteTitle = getPageTitle().htmlEncode();
revised = revised.replaceChunk("<title"+">","</title"+">"," " + newSiteTitle + " ");
revised = updateMarkupBlock(revised,"PRE-HEAD","MarkupPreHead");
revised = updateMarkupBlock(revised,"POST-HEAD","MarkupPostHead");
revised = updateMarkupBlock(revised,"PRE-BODY","MarkupPreBody");
revised = updateMarkupBlock(revised,"POST-SCRIPT","MarkupPostBody");
return revised;
};
//
// UploadLog
//
// config.options.chkUploadLog :
// false : no logging
// true : logging
// config.options.txtUploadLogMaxLine :
// -1 : no limit
// 0 : no Log lines but UploadLog is still in place
// n : the last n lines are only kept
// NaN : no limit (-1)
bidix.UploadLog = function() {
if (!config.options.chkUploadLog)
return; // this.tiddler = null
this.tiddler = store.getTiddler("UploadLog");
if (!this.tiddler) {
this.tiddler = new Tiddler();
this.tiddler.title = "UploadLog";
this.tiddler.text = "| !date | !user | !location | !storeUrl | !uploadDir | !toFilename | !backupdir | !origin |";
this.tiddler.created = new Date();
this.tiddler.modifier = config.options.txtUserName;
this.tiddler.modified = new Date();
store.addTiddler(this.tiddler);
}
return this;
};
bidix.UploadLog.prototype.addText = function(text) {
if (!this.tiddler)
return;
// retrieve maxLine when we need it
var maxLine = parseInt(config.options.txtUploadLogMaxLine,10);
if (isNaN(maxLine))
maxLine = -1;
// add text
if (maxLine != 0)
this.tiddler.text = this.tiddler.text + text;
// Trunck to maxLine
if (maxLine >= 0) {
var textArray = this.tiddler.text.split('\n');
if (textArray.length > maxLine + 1)
textArray.splice(1,textArray.length-1-maxLine);
this.tiddler.text = textArray.join('\n');
}
// update tiddler fields
this.tiddler.modifier = config.options.txtUserName;
this.tiddler.modified = new Date();
store.addTiddler(this.tiddler);
// refresh and notifiy for immediate update
story.refreshTiddler(this.tiddler.title);
store.notify(this.tiddler.title, true);
};
bidix.UploadLog.prototype.startUpload = function(storeUrl, toFilename, uploadDir, backupDir) {
if (!this.tiddler)
return;
var now = new Date();
var text = "\n| ";
var filename = bidix.basename(document.location.toString());
if (!filename) filename = '/';
text += now.formatString("0DD/0MM/YYYY 0hh:0mm:0ss") +" | ";
text += config.options.txtUserName + " | ";
text += "[["+filename+"|"+location + "]] |";
text += " [[" + bidix.basename(storeUrl) + "|" + storeUrl + "]] | ";
text += uploadDir + " | ";
text += "[[" + bidix.basename(toFilename) + " | " +toFilename + "]] | ";
text += backupDir + " |";
this.addText(text);
};
bidix.UploadLog.prototype.endUpload = function(status) {
if (!this.tiddler)
return;
this.addText(" "+status+" |");
};
//
// Utilities
//
bidix.checkPlugin = function(plugin, major, minor, revision) {
var ext = version.extensions[plugin];
if (!
(ext &&
((ext.major > major) ||
((ext.major == major) && (ext.minor > minor)) ||
((ext.major == major) && (ext.minor == minor) && (ext.revision >= revision))))) {
// write error in PluginManager
if (pluginInfo)
pluginInfo.log.push("Requires " + plugin + " " + major + "." + minor + "." + revision);
eval(plugin); // generate an error : "Error: ReferenceError: xxxx is not defined"
}
};
bidix.dirname = function(filePath) {
if (!filePath)
return;
var lastpos;
if ((lastpos = filePath.lastIndexOf("/")) != -1) {
return filePath.substring(0, lastpos);
} else {
return filePath.substring(0, filePath.lastIndexOf("\\"));
}
};
bidix.basename = function(filePath) {
if (!filePath)
return;
var lastpos;
if ((lastpos = filePath.lastIndexOf("#")) != -1)
filePath = filePath.substring(0, lastpos);
if ((lastpos = filePath.lastIndexOf("/")) != -1) {
return filePath.substring(lastpos + 1);
} else
return filePath.substring(filePath.lastIndexOf("\\")+1);
};
bidix.initOption = function(name,value) {
if (!config.options[name])
config.options[name] = value;
};
//
// Initializations
//
// require PasswordOptionPlugin 1.0.1 or better
bidix.checkPlugin("PasswordOptionPlugin", 1, 0, 1);
// styleSheet
setStylesheet('.txtUploadStoreUrl, .txtUploadBackupDir, .txtUploadDir {width: 22em;}',"uploadPluginStyles");
//optionsDesc
merge(config.optionsDesc,{
txtUploadStoreUrl: "Url of the UploadService script (default: store.php)",
txtUploadFilename: "Filename of the uploaded file (default: in index.html)",
txtUploadDir: "Relative Directory where to store the file (default: . (downloadService directory))",
txtUploadBackupDir: "Relative Directory where to backup the file. If empty no backup. (default: ''(empty))",
txtUploadUserName: "Upload Username",
pasUploadPassword: "Upload Password",
chkUploadLog: "do Logging in UploadLog (default: true)",
txtUploadLogMaxLine: "Maximum of lines in UploadLog (default: 10)"
});
// Options Initializations
bidix.initOption('txtUploadStoreUrl','');
bidix.initOption('txtUploadFilename','');
bidix.initOption('txtUploadDir','');
bidix.initOption('txtUploadBackupDir','');
bidix.initOption('txtUploadUserName','');
bidix.initOption('pasUploadPassword','');
bidix.initOption('chkUploadLog',true);
bidix.initOption('txtUploadLogMaxLine','10');
// Backstage
merge(config.tasks,{
uploadOptions: {text: "upload", tooltip: "Change UploadOptions and Upload", content: '<<uploadOptions>>'}
});
config.backstageTasks.push("uploadOptions");
//}}}
/***
|''Name:''|UploadTiddlerPlugin|
|''Description:''|Upload a tiddler and Update a remote TiddlyWiki |
|''Version:''|1.2.1|
|''Date:''|2008-08-19|
|''Source:''|http://tiddlywiki.bidix.info/#UploadTiddlerPlugin|
|''Usage:''|Uses {{{uploadOptions>>}}}<br>with those UploadTiddler Options : <br>chkUploadTiddler: <<option chkUploadTiddler>><br>txtUploadTiddlerStoreUrl: <<option txtUploadTiddlerStoreUrl>>|
|''Author:''|BidiX (BidiX (at) bidix (dot) info)|
|''[[License]]:''|[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D ]]|
|''CoreVersion:''|2.3.0|
***/
//{{{
version.extensions.UploadTiddlerPlugin = {
major: 1, minor: 2, revision: 1,
date: new Date("2008-08-11"),
source: 'http://tiddlywiki.bidix.info/#UploadTiddlerPlugin',
author: 'BidiX (BidiX (at) bidix (dot) info',
coreVersion: '2.3.0'
};
if (!window.bidix) window.bidix = {}; // bidix namespace
bidix.debugMode = false;
bidix.uploadTiddler = {
messages: {
aboutToSaveTiddler: "About to update tiddler '%0'...",
storeTiddlerNotFound: "Script store tiddler '%0' not found",
tiddlerSaved: "Tiddler '%0' updated in '%1'"
},
upload: function(title,tiddler,oldTitle) {
var callback = function(status,params,responseText,url,xhr) {
if (xhr.status == 404) {
alert(bidix.uploadTiddler.messages.storeTiddlerNotFound.format([url]));
return;
}
if ((bidix.debugMode) || (responseText.indexOf("Debug mode") >= 0 )) {
alert(responseText);
if (responseText.indexOf("Debug mode") >= 0 )
responseText = responseText.substring(responseText.indexOf("\n\n")+2);
} else if (responseText.charAt(0) != '0')
alert(responseText);
else
displayMessage(bidix.uploadTiddler.messages.tiddlerSaved.format([params[0], params[1]]));
store.setDirty(false);
}
if ((config.options['chkUploadTiddler']) && (document.location.toString().substr(0,4) == "http")){
displayMessage(bidix.uploadTiddler.messages.aboutToSaveTiddler.format([title]));
var ExtTiddler = null;
var html = null;
if (tiddler) {
ExtTiddler = store.getSaver().externalizeTiddler(store,tiddler);
html = wikifyStatic(tiddler.text,null,tiddler).htmlEncode();
}
var form = "title="+encodeURIComponent(title);
form = form + "&tiddler="+(ExtTiddler?encodeURIComponent(ExtTiddler):'');
form = form + "&html="+(html?encodeURIComponent(html):'');
var filename = (config.options['txtUploadFilename']?config.options['txtUploadFilename']:'index.html');
form = form +"&oldTitle="+encodeURIComponent(oldTitle);
form = form +"&fileName="+encodeURIComponent(filename);
form = form +"&backupDir="+encodeURIComponent(config.options['txtUploadBackupDir']);
form = form +"&user="+encodeURIComponent(config.options['txtUploadUserName']);
form = form +"&password="+encodeURIComponent(config.options['pasUploadPassword']);
form = form +"&uploadir="+encodeURIComponent(config.options['txtUploadDir']);
form = form +"&debug="+encodeURIComponent(0);
var storeScript = (config.options.txtUploadTiddlerStoreUrl
? config.options.txtUploadTiddlerStoreUrl : 'storeTiddler.php');
var r = doHttp("POST",storeScript,form+"\n",'application/x-www-form-urlencoded',
config.options['txtUploadUserName'],config.options['pasUploadPassword'],callback,Array(title,filename),null);
}
}
}
TiddlyWiki.prototype.saveTiddler_bidix = TiddlyWiki.prototype.saveTiddler;
TiddlyWiki.prototype.saveTiddler = function(oldTitle,newTitle,newBody,modifier,modified,tags,fields,clearChangeCount,created) {
var tiddler = TiddlyWiki.prototype.saveTiddler_bidix.apply(this,arguments);
var title = (newTitle?newTitle:oldTitle);
if (oldTitle == title)
oldTitle = '';
bidix.uploadTiddler.upload(title, tiddler, oldTitle);
}
TiddlyWiki.prototype.removeTiddler_bidix =TiddlyWiki.prototype.removeTiddler;
TiddlyWiki.prototype.removeTiddler = function(title) {
TiddlyWiki.prototype.removeTiddler_bidix.apply(this,arguments);
bidix.uploadTiddler.upload(title, null);
}
//
// Initializations
//
bidix.initOption = function(name,value) {
if (!config.options[name])
config.options[name] = value;
};
// styleSheet
setStylesheet('.txtUploadTiddlerStoreUrl {width: 22em;}',"uploadTiddlerPluginStyles");
//optionsDesc
merge(config.optionsDesc,{
txtUploadTiddlerStoreUrl: "Url of the UploadTiddlerService script (default: storeTiddler.php)",
chkUploadTiddler: "Do per Tiddler upload using txtUploadTiddlerStoreUrl (default: false)"
});
// Options Initializations
bidix.initOption('txtUploadTiddlerStoreUrl','');
bidix.initOption('chkUploadTiddler','');
// add options in backstage UploadOptions
if (config.macros.uploadOptions) {
if (config.macros.uploadOptions.options) {
config.macros.uploadOptions.options.push("txtUploadTiddlerStoreUrl","chkUploadTiddler");
}
}
//}}}
/***
|''Name:''|UploadToHomeMacro|
|''Description:''|Save TiddlyWiki using HomeParameters tiddler|
|''Version:''|0.0.2|
|''Date:''|May 19, 2007|
|''Source:''|http://tiddlywiki.bidix.info/#UploadToHomeMacro|
|''Author:''|BidiX (BidiX (at) bidix (dot) info)|
|''License:''|[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D ]]|
|''~CoreVersion:''|2.2.0 (#2125)|
|''Requires:''|UploadPlugin|
|''Usage:''|{{{<<uploadToHome [HomeParameters]>>}}}<br>{{{HomeParameters:}}} optional - Tiddler with upload parameters in slices (see HomeParameters).|
***/
//{{{
version.extensions.UploadToHomeMacro = {
major: 0, minor: 0, revision: 2,
date: new Date("May 19, 2007"),
source: 'http://tiddlywiki.bidix.info/#UploadToHomeMacro',
author: 'BidiX (BidiX (at) bidix (dot) info',
coreVersion: '2.2.0 (#3125)'
};
//
// Environment
//
if (!window.bidix) window.bidix = {}; // bidix namespace
bidix.debugMode = false; // true to activate both in Plugin and UploadService
bidix.checkPlugin("UploadPlugin", 4, 1, 0);
//
// uploadUsing Macro
//
config.macros.uploadToHome = {
handler: function(place,macroName,params) {
if (readOnly)
return;
var label;
if (document.location.toString().substr(0,4) == "http")
label = config.macros.upload.label.saveLabel;
else
label = config.macros.upload.label.uploadLabel;
var prompt;
var homeParams = (params[0] ? params[0]:this.messages.homeParamsTiddler);
if (store.tiddlerExists(homeParams) || store.isShadowTiddler(homeParams)) {
prompt = this.messages.prompt.toString().format([homeParams]);
} else {
throw(this.messages.tiddlerNotFound.toString().format([homeParams]));
}
var prompt = this.messages.prompt.toString().format([homeParams]);
createTiddlyButton(place, label, prompt, function() {config.macros.uploadToHome.action(homeParams);}, null, null, this.accessKey);
},
action: function(homeParams) {
homeParams = (homeParams ? homeParams : config.macros.uploadToHome.messages.homeParamsTiddler);
if (!store.tiddlerExists(homeParams) && !store.isShadowTiddler(homeParams)) {
throw(config.macros.uploadToHome.messages.tiddlerNotFound.toString().format([homeParams]));
}
config.macros.upload.action(config.macros.uploadToHome.getParamsFromTiddler(homeParams));
},
getParamsFromTiddler: function(tiddlerTitle) {
tiddlerTitle = (tiddlerTitle ? tiddlerTitle:this.messages.homeParamsTiddler);
if (!store.tiddlerExists(tiddlerTitle) && !store.isShadowTiddler(tiddlerTitle)) {
throw(config.macros.uploadToHome.messages.tiddlerNotFound.toString().format([tiddlerTitle]));
}
var sliceNames = [
"UploadStoreUrl",
"UploadFilename",
"UploadBackupDir",
"UploadDir",
"UploadUserName"
//"UploadPassword", // no password in tiddlers
];
var sliceValues = store.getTiddlerSlices(tiddlerTitle,sliceNames);
var parameters = [];
for(var i=0; i<sliceNames.length; i++) {
parameters.push(sliceValues[sliceNames[i]]);
}
return parameters;
},
messages: {
homeParamsTiddler: "HomeParameters",
prompt: "Save and Upload this TiddlyWiki using parameters in '%0' tiddler",
tiddlerNotFound: "Tiddler %0 not found"
},
initAtLoad: function () {
// install Shadowed HomeParameters
var storeUrl;
if ((document.location.toString().substr(0,4) == "http"))
storeUrl = bidix.dirname(document.location.toString())+'/'+config.macros.upload.defaultStoreScript;
else
storeUrl = config.macros.upload.defaultStoreScript;
var shadowedHomeParameters = (config.shadowTiddlers['HomeParameters']?config.shadowTiddlers['HomeParameters']:'');
shadowedHomeParameters += [
"|UploadUserName:|"+config.options['txtUploadUserName']+"|",
"|UploadStoreUrl:|"+storeUrl+"|",
"|UploadDir:|.|",
"|UploadFilename:|index.html|",
"|UploadBackupDir:||"
].join("\n");
merge(config.shadowTiddlers,{'HomeParameters': shadowedHomeParameters});
// install Backstage uploadToHome
merge(config.tasks,{
uploadToHome: {text: "uploadToHome", tooltip: "Upload using '" + this.messages.homeParamsTiddler + "' tiddler", action: this.action}
});
config.backstageTasks.push("uploadToHome");
}
};
config.macros.uploadToHome.initAtLoad();
//}}}
<!--{{{-->
<div class='toolbar' macro='toolbar [[ToolbarCommands::ViewToolbar]]'>
</span> <span class='toolbar' macro='toolbar snapshotPrint'></span>
<span macro='newHere label:"ny her"'></span> </div>
<div class='title' macro='view title'></div>
<div class='tagged' macro='tags'></div>
<div class='viewer' macro='view text wikified'></div>
<div class='tagClear'></div>
<div class="tagglyTagging" macro="tagglyTagging"></div>
<!--}}}-->
<html><object width="480" height="360"><param name="movie" value="http://voicethread.com/book.swf?b=341518"></param><param name="wmode" value="transparent"></param><embed src="http://voicethread.com/book.swf?b=341518" type="application/x-shockwave-flash" wmode="transparent" width="480" height="360"></embed></object><img style="visibility:hidden;width:0px;height:0px;" border=0 width=0 height=0 src="http://counters.gigya.com/wildfire/IMP/CXNID=2000002.0NXC/bT*xJmx*PTEyMzQxMjY*MDY1MzEmcHQ9MTIzNDEyNjQxMzQwNiZwPTIwNjQyMSZkPWIzNDE1MTgmZz*yJnQ9Jm89ZTBhYWY3YjE4MzRmNGIyMmI1ZTg*M2M5OTZjYzRiYTg=.gif" /></html>
Lav VoiceThreads med en klasse og del brugernavn + kode ud til alle dine elever...
Brugernavn: mama@himmerlands-ungdomsskole.dk
Kode: havbro
Der er op til 10 GB plads og der kan laves så mange identiteter(navne/billeder) til den samme bruger som der er brug for!!
[[Voicethread|http://voicethread.com]] - åbnes her i siden.
<<siteMap [[Værktøj]] . sliders>>
Der findes mange måder at udvide ~TiddlyWikis funktionalitet.
En af dem er via <<tag systemConfig>>. En anden er ganske enkelt at man laver sit eget hierakiske system, med viden som er vigtig at kunne finde rundt i på en nem og overskuelig måde.
/***
|''Name:''|WikiBar|
|''Version:''|2.0.0 beta3|
|''Source:''|[[AiddlyWiki|http://aiddlywiki.sourceforge.net]]|
|''Author:''|[[Arphen Lin|mailto:arphenlin@gmail.com]]|
|''Type:''|toolbar macro command extension|
|''Required:''|TiddlyWiki 2.0.0 beta6|
!Description
WikiBar is a toolbar that gives access to most of TiddlyWiki's formatting features with a few clicks. It's a handy tool for people who are not familiar with TiddlyWiki syntax.
Besides, with WikiBar-addons, users can extend the power of WikiBar.
!Support browser
*Firefox 1.5
!Revision history
*v2.0.0 beta3 (2005/12/30)
** remove macros (replaced by TWMacro addon)
** add wikibar command in toolbar automatically
** rename DOIT to HANDLER
** rename TIP to TOOLTIP
*v2.0.0 beta2 (2005/12/21)
** re-design Wikibar addon framework
*v2.0.0 beta1 (2005/12/14)
** Note:
*** WikiBarPlugin is renamed to WikiBar
** New Features:
*** support TiddlyWiki 2.0.0 template mechanism
*** new wikibar data structure
*** new wikibar-addon framework for developers
**** support dynamic popup menu generator
*** support most new macros added in TiddlyWiki 2.0.0
*** multi-level popup menu
*** fix wikibar tab stop
*** remove paletteSelector
** Known Bugs:
*** popup-menu and color-picker can't be closed correctly
*** some macros can't be displayed correctly in previewer
*** text in previewer will be displayed italic
*v1.2.0 (2005/11/21)
**New Features:
***User defined color palettes supported
####Get color palettes from [[ColorZilla Palettes|http://www.iosart.com/firefox/colorzilla/palettes.html]].
####Save the palette file(*.gpl) as a new tiddler and tag it with 'ColorPalettes', then you can use it in WikiBar.
***WikiBar style sheet supported
***Click on document to close current colorPicker, paletteSelector or aboutWikibar
*v1.1.1 (2005/11/03)
**Bugs fixed:
***'Not enough parameters!' message is displayed when the parameter includes '%+number', ex: 'hello%20world!'
*v1.1.0 (2005/11/01)
**Bugs fixed:
***WikiBar overruns (reported by by GeoffS <gslocock@yahoo.co.uk>)
**New features:
***Insert a color code at the cursor. (Thanks to RunningUtes <RunningUtes@gmail.com>)
***Enable gradient macro. (Thanks to RunningUtes <RunningUtes@gmail.com>)
***Insert tiddler comment tags {{{/% ... %/}}}. (new feature supported by TiddlyWiki 1.2.37)
***Insert DateFormatString for {{{<<today>>}}} macro. (new feature supported by TiddlyWiki 1.2.37)
**Enhanced:
***Allow optional parameters in syntax.
**Bugs:
***'Not enough parameters!' message is displayed when the parameter includes '%+number', ex: 'hello%20world!'
*v1.0.0 (2005/10/30)
**Initial release
!Code
***/
//{{{
config.macros.wikibar = {major: 2, minor: 0, revision: 0, beta: 3, date: new Date(2005,12,30)};
config.macros.wikibar.handler = function(place,macroName,params,wikifier,paramString,tiddler){
if(!(tiddler instanceof Tiddler)) {return;}
story.setDirty(tiddler.title,true);
place.id = 'wikibar'+tiddler.title;
place.className = 'toolbar wikibar';
};
function wikibar_install(){
config.commands.wikibar = {
text: 'wikibar',
tooltip: 'wikibar on/off',
handler: function(e,src,title) {
if(!e){ e = window.event; }
var theButton = resolveTarget(e);
theButton.id = 'wikibarButton'+title;
wikibarPopup.remove();
wikibar_installAddons(theButton, title);
wikibar_createWikibar(title);
return(false);
}
};
config.shadowTiddlers['EditTemplate'] = wikibar_addWikibarCommand(config.shadowTiddlers['EditTemplate']);
var tiddler = store.getTiddler('EditTemplate');
if(tiddler){
tiddler.text = wikibar_addWikibarCommand(tiddler.text);
}
}
function wikibar_installAddons(theButton, title){
var tiddlers = store.getTaggedTiddlers('wikibarAddons');
if(!tiddlers) { return; }
theButton.addons=[];
for(var i=0; i<tiddlers.length; i++){
try{
eval(tiddlers[i].text);
try{
wikibar_addonInstall(title);
wikibar_addonInstall = null;
theButton.addons.push({ok:true, name:tiddlers[i].title});
}catch(ex){
theButton.addons.push({ok:false, name:tiddlers[i].title, error:ex});
}
}catch(ex){
theButton.addons.push({ok:false, name:tiddlers[i].title, error:ex});
}
}
}
function wikibar_addWikibarCommand(tiddlerText){
var div = document.createElement('div');
div.style.display = 'none';
div.innerHTML = tiddlerText;
for(var i=0; i<div.childNodes.length; i++){
var o=div.childNodes[i];
if(o.tagName==='DIV'){
if(o.className=='toolbar'){
var macroText = o.getAttribute('macro').trim();
if(macroText.search('wikibar')<=0){
macroText += ' wikibar';
o.setAttribute('macro', macroText);
}
break;
}
}
}
return div.innerHTML.replace(/\"/g, "\'");
}
function wikibar_processSyntaxParams(theSyntax, params){
try{
var pcr = 'AplWikibarPcr';
var rx=null;
var allParams=null;
if(params){
if(typeof(params)=='object'){
for(var i=0; i<params.length; i++){
if(params[i]){
params[i] = params[i].replace(new RegExp('%','g'), pcr).trim();
rx = '(\\[%'+(i+1)+'\\])' + '|' + '(%'+(i+1)+')';
theSyntax = theSyntax.replace(new RegExp(rx,'g'), params[i] );
}
}
allParams = params.join(' ').trim();
}else{
allParams = params.replace(new RegExp('%','g'), pcr).trim();
rx = /(\[%1{1}\])|(%1{1})/g;
theSyntax = theSyntax.replace(rx, allParams);
}
}
if(allParams){
theSyntax = theSyntax.replace(new RegExp('%N{1}','g'), allParams);
}
rx=/\[%(([1-9]{1,}[0-9]{0,})|(N{1}))\]/g;
theSyntax = theSyntax.replace(rx, '');
rx=/%(([1-9]{1,}[0-9]{0,})|(N{1}))/g;
if( theSyntax.match(rx) ){
throw 'Not enough parameters! ' + theSyntax;
}
theSyntax=theSyntax.replace(new RegExp(pcr,'g'), '%');
return theSyntax;
} catch(ex){
return null;
}
}
function wikibar_resolveEditItem(tiddlerWrapper, itemName){
if(tiddlerWrapper.hasChildNodes()){
var c=tiddlerWrapper.childNodes;
for(var i=0; i<c.length; i++){
var txt=wikibar_resolveEditItem(c[i], itemName);
if(!txt){
continue;
}else{
return txt;
}
}
}
return ((tiddlerWrapper.getAttribute && tiddlerWrapper.getAttribute('edit')==itemName)? tiddlerWrapper : null);
}
function wikibar_resolveEditItemValue(tiddlerWrapper, itemName){
var o = wikibar_resolveEditItem(tiddlerWrapper, itemName);
return (o? o.value.replace(/\r/mg,'') : null);
}
function wikibar_resolveTiddlerEditorWrapper(obj){
if(obj.id=='tiddlerDisplay'){return null;}
if((obj.getAttribute && obj.getAttribute('macro')=='edit text')){return obj;}
return wikibar_resolveTiddlerEditorWrapper(obj.parentNode);
}
function wikibar_resolveTiddlerEditor(obj){
if(obj.hasChildNodes()){
var c = obj.childNodes;
for(var i=0; i<c.length; i++){
var o=wikibar_resolveTiddlerEditor(c[i]);
if(o){ return o;}
}
}
return ((obj.getAttribute && obj.getAttribute('edit')=='text')? obj : null);
}
function wikibar_resolveTargetButton(obj){
if(obj.id && obj.id.substring(0,7)=='wikibar'){ return null; }
if(obj.tiddlerTitle){
return obj;
}else{
return wikibar_resolveTargetButton(obj.parentNode);
}
}
function wikibar_isValidMenuItem(tool){
if(!tool){ return false; }
if(tool.TYPE=='MENU' || tool.TYPE=='MAIN_MENU'){
for(var key in tool){
if(key.substring(0,8)=='DYNAITEM'){ return true; }
if(wikibar_isValidMenuItem(tool[key])){ return true; }
}
return false;
}else{
return (tool.HANDLER? true : false);
}
}
function wikibar_editFormat(param){
var editor = param.button.editor;
var params = param.params;
clearMessage();
if(!editor){ return; }
var repText = wikibar_processSyntaxParams(this.syntax, params);
if(repText===null){ return; }
var st = editor.scrollTop;
var ss = editor.selectionStart;
var se = editor.selectionEnd;
var frontText= '';
var endText = '';
var fullText = editor.value;
if(se>ss && ss>=0){
frontText = fullText.substring(0, ss);
endText = fullText.substring(se, fullText.length);
}
else if(ss===0 && (se===0 || se == fullText.length) ){
endText = fullText;
}
else if(se==ss && ss>0){
frontText = fullText.substring(0, ss);
endText = fullText.substring(se, fullText.length);
}
if(repText.indexOf('user_text')>=0 && this.hint){
repText = repText.replace('user_text', this.hint);
}
editor.value = frontText + repText + endText;
editor.selectionStart = ss;
editor.selectionEnd = ss + repText.length;
editor.scrollTop = st;
editor.focus();
}
function wikibar_editFormatByWord(param){
var editor = param.button.editor;
var params = param.params;
clearMessage();
if(!editor){return;}
var repText = wikibar_processSyntaxParams(this.syntax, params);
if(repText===null){ return; }
var st = editor.scrollTop;
var ss = editor.selectionStart;
var se = editor.selectionEnd;
var frontText= '';
var selText = '';
var endText = '';
var fullText = editor.value;
if(se>ss && ss>=0){
frontText = fullText.substring(0, ss);
selText = fullText.substring(ss,se);
endText = fullText.substring(se, fullText.length);
}
else if(ss===0 && (se===0 || se == fullText.length) ){
endText = fullText;
}
else if(se==ss && ss>0){
frontText = fullText.substring(0, ss);
endText = fullText.substring(se, fullText.length);
if(!( fullText.charAt(ss-1).match(/\W/gi) || fullText.charAt(ss).match(/\W/gi) )){
var m = frontText.match(/\W/gi);
if(m){
ss = frontText.lastIndexOf(m[m.length-1])+1;
}
else{
ss = 0;
}
m = endText.match(/\W/gi);
if(m){
se += endText.indexOf(m[0]);
}
else{
se = fullText.length;
}
frontText = fullText.substring(0, ss);
endText = fullText.substring(se, fullText.length);
selText = fullText.substring(ss,se);
}
}
if(selText.length>0){
repText = repText.replace('user_text', selText);
}
if(repText.indexOf('user_text')>=0 && this.hint){
repText = repText.replace('user_text', this.hint);
}
editor.value = frontText + repText + endText;
editor.selectionStart = ss;
editor.selectionEnd = ss + repText.length;
editor.scrollTop = st;
editor.focus();
}
function wikibar_editFormatByCursor(param){
var editor = param.button.editor;
var params = param.params;
clearMessage();
if(!editor){ return; }
var repText = wikibar_processSyntaxParams(this.syntax, params);
if(repText===null){ return; }
var st = editor.scrollTop;
var ss = editor.selectionStart;
var se = editor.selectionEnd;
var frontText= '';
var endText = '';
var fullText = editor.value;
if(se>ss && ss>=0){
frontText = fullText.substring(0, ss);
endText = fullText.substring(se, fullText.length);
}
else if(ss===0 && (se===0 || se == fullText.length) ){
endText = fullText;
}
else if(se==ss && ss>0){
frontText = fullText.substring(0, ss);
endText = fullText.substring(se, fullText.length);
}
if(repText.indexOf('user_text')>=0 && this.hint){
repText = repText.replace('user_text', this.hint);
}
editor.value = frontText + repText + endText;
editor.selectionStart = ss;
editor.selectionEnd = ss + repText.length;
editor.scrollTop = st;
editor.focus();
}
function wikibar_editFormatByLine(param){
var editor = param.button.editor;
var params = param.params;
clearMessage();
if(!editor){ return; }
var repText = wikibar_processSyntaxParams(this.syntax, params);
if(repText===null){ return; }
var st = editor.scrollTop;
var ss = editor.selectionStart;
var se = editor.selectionEnd;
var frontText= '';
var selText = '';
var endText = '';
var fullText = editor.value;
if(se>ss && ss>=0){
if(this.byBlock){
frontText = fullText.substring(0, ss);
selText = fullText.substring(ss,se);
endText = fullText.substring(se, fullText.length);
}
else{
se = ss;
}
}
if(ss===0 && (se===0 || se == fullText.length) ){
var m=fullText.match(/(\n|\r)/g);
if(m){
se = fullText.indexOf(m[0]);
}else{
se = fullText.length;
}
selText = fullText.substring(0, se);
endText = fullText.substring(se, fullText.length);
}
else if(se==ss && ss>0){
frontText = fullText.substring(0, ss);
endText = fullText.substring(se, fullText.length);
m = frontText.match(/(\n|\r)/g);
if(m){
ss = frontText.lastIndexOf(m[m.length-1])+1;
}
else{
ss = 0;
}
m = endText.match(/(\n|\r)/g);
if(m){
se += endText.indexOf(m[0]);
}
else{
se = fullText.length;
}
frontText = fullText.substring(0, ss);
selText = fullText.substring(ss,se);
endText = fullText.substring(se, fullText.length);
}
if(selText.length>0){
repText = repText.replace('user_text', selText);
}
if(repText.indexOf('user_text')>=0 && this.hint){
repText = repText.replace('user_text', this.hint);
}
if(this.byBlock){
if( (frontText.charAt(frontText.length-1)!='\n') && ss>0 ){
repText = '\n' + repText;
}
if( (endText.charAt(0)!='\n') || se==fullText.length){
repText += '\n';
}
}
editor.value = frontText + repText + endText;
editor.selectionStart = ss;
editor.selectionEnd = ss + repText.length;
editor.scrollTop = st;
editor.focus();
}
function wikibar_editFormatByTableCell(param){
var editor = param.button.editor;
var params = param.params;
clearMessage();
if(!editor){ return; }
var repText = wikibar_processSyntaxParams(this.syntax, params);
if(repText===null){ return; }
var st = editor.scrollTop;
var ss = editor.selectionStart;
var se = editor.selectionEnd;
var frontText= '';
var selText = '';
var endText = '';
var fullText = editor.value;
if(ss===0 || ss==fullText.length){
throw 'not valid cell!';
}
se=ss;
frontText = fullText.substring(0, ss);
endText = fullText.substring(se, fullText.length);
i=frontText.lastIndexOf('\n');
j=frontText.lastIndexOf('|');
if(i>j || j<0){
throw 'not valid cell!';
}
ss = j+1;
i=endText.indexOf('\n');
j=endText.indexOf('|');
if(i<j || j<0){
throw 'not valid cell!';
}
se += j;
frontText = fullText.substring(0, ss-1);
selText = fullText.substring(ss,se);
endText = fullText.substring(se+1, fullText.length);
if(this.key.substring(0,5)=='align'){
selText = selText.trim();
if( selText=='>' || selText=='~' || selText.substring(0,8)=='bgcolor(') {return; }
}
if(selText.length>0){
repText = repText.replace('user_text', selText);
}
if(repText.indexOf('user_text')>=0 && this.hint){
repText = repText.replace('user_text', this.hint);
}
editor.value = frontText + repText + endText;
editor.selectionStart = ss;
editor.selectionEnd = ss + repText.length - 2;
editor.scrollTop = st;
editor.focus();
}
function wikibar_editSelectAll(param){
var editor = param.button.editor;
editor.selectionStart = 0;
editor.selectionEnd = editor.value.length;
editor.scrollTop = 0;
editor.focus();
}
function wikibar_doPreview(param){
var theButton = param.button;
var editor = param.button.editor;
var wikibar = theButton.parentNode;
if(!wikibar) { return; }
title = theButton.tiddlerTitle;
var editorWrapper = wikibar_resolveTiddlerEditorWrapper(editor);
var tiddlerWrapper = editorWrapper.parentNode;
var previewer = document.getElementById('previewer'+title);
if(previewer){
previewer.parentNode.removeChild(previewer);
editorWrapper.style.display = 'block';
visible=true;
}else{
previewer = document.createElement('div');
previewer.id = 'previewer'+title;
previewer.className = 'viewer previewer';
previewer.style.height = (editor.offsetHeight) + 'px';
wikify(editor.value, previewer);
tiddlerWrapper.insertBefore(previewer, editorWrapper);
editorWrapper.style.display = 'none';
visible=false;
}
var pv=null;
for(var i=0; i<wikibar.childNodes.length; i++){
try{
var btn = wikibar.childNodes[i];
if(btn.toolItem.key == 'preview'){ pv=btn; }
if(btn.toolItem.key != 'preview'){
btn.style.display = visible ? '': 'none';
}
}catch(ex){}
}
if(!pv) { return; }
if(visible){
pv.innerHTML = '<font face=\"verdana\">∞</font>';
pv.title = 'preview current tiddler';
}
else{
pv.innerHTML = '<font face=\"verdana\">←</font>';
pv.title = 'back to editor';
}
}
function wikibar_doListAddons(param){
clearMessage();
var title = param.button.tiddlerTitle;
var wikibarButton = document.getElementById('wikibarButton'+title);
var ok=0, fail=0;
for(var i=0; i<wikibarButton.addons.length; i++){
var addon=wikibarButton.addons[i];
if(addon.ok){
displayMessage('[ o ] '+addon.name);
ok++;
}
else{
displayMessage('[ x ] '+addon.name + ': ' + addon.error);
fail++;
}
}
displayMessage('---------------------------------');
displayMessage(ok + ' ok ; ' + fail + ' failed');
}
function wikibar_getColorCode(param){
var cbOnPickColor = function(colorCode, param){
param.params = colorCode;
param.button.toolItem.doMore(param);
};
wikibarColorTool.openColorPicker(param.button, cbOnPickColor, param);
}
function wikibar_getLinkUrl(param){
var url= prompt('Please enter the link target', (this.param? this.param : ''));
if (url && url.trim().length>0){
param.params = url;
this.doMore(param);
}
}
function wikibar_getTableRowCol(param){
var rc= prompt('Please enter (rows x cols) of the table', '2 x 3');
if (!rc || (rc.trim()).length<=0){ return; }
var arr = rc.toUpperCase().split('X');
if(arr.length != 2) { return; }
for(var i=0; i<arr.length; i++){
if(isNaN(arr[i].trim())) { return; }
}
var rows = parseInt(arr[0].trim(), 10);
var cols = parseInt(arr[1].trim(), 10);
var txtTable='';
for(var r=0; r<rows; r++){
for(var c=0; c<=cols; c++){
if(c===0){
txtTable += '|';
}else{
txtTable += ' |';
}
}
txtTable += '\n';
}
if(txtTable.trim().length>0){
param.params = txtTable.trim();
this.doMore(param);
}
}
function wikibar_getMacroParam(param){
var p = prompt('Please enter the parameters of macro \"' + this.key + '\":' +
'\nSyntax: ' + this.syntax +
'\n\nNote: '+
'\n%1,%2,... - parameter needed'+
'\n[%1] - optional parameter'+
'\n%N - more than one parameter(1~n)'+
'\n[%N] - any number of parameters(0~n)'+
'\n\nPS:'+
'\n1. Parameters should be seperated with space character'+
'\n2. Use \" to wrap the parameter that includes space character, ex: \"hello world\"'+
'\n3. Input the word(null) for the optional parameter ignored',
(this.param? this.param : '') );
if(!p) { return; }
p=p.readMacroParams();
for(var i=0; i<p.length; i++){
var s=p[i].trim();
if(s.indexOf(' ')>0){ p[i]="'"+s+"'"; }
if(s.toLowerCase()=='null'){ p[i]=null; }
}
param.params = p;
this.doMore(param);
}
function wikibar_getMorePalette(unused){
clearMessage();
displayMessage('Get more color palettes(*.gpl) from ColorZilla Palettes site', 'http:\/\/www.iosart.com/firefox/colorzilla/palettes.html');
displayMessage('Save it as a new tiddler with \"ColorPalettes\" tag');
}
function wikibar_createWikibar(title){
var theWikibar = document.getElementById('wikibar' + title);
if(theWikibar){
if(theWikibar.hasChildNodes()){
theWikibar.style.display = (theWikibar.style.display=='block'? 'none':'block');
return;
}
}
var tiddlerWrapper = document.getElementById('tiddler'+title);
var theTextarea = wikibar_resolveTiddlerEditor(tiddlerWrapper);
if(!theTextarea){
clearMessage();
displayMessage('WikiBar only works in tiddler edit mode now');
return;
}else{
if(!theTextarea.id){ theTextarea.id = 'editor'+title; }
if(!theTextarea.parentNode.id){ theTextarea.parentNode.id='editorWrapper'+title; }
}
if(theWikibar){
theWikibar = document.getElementById('wikibar'+title);
}else{
var editorWrapper = wikibar_resolveTiddlerEditorWrapper(theTextarea);
theWikibar = createTiddlyElement(tiddlerWrapper, 'div', 'wikibar'+title, 'toolbar');
addClass(theWikibar, 'wikibar');
var previewer = document.getElementById('previewer'+title);
if(previewer){
tiddlerWrapper.insertBefore(theWikibar, previewer);
}else{
tiddlerWrapper.insertBefore(theWikibar, editorWrapper);
}
}
wikibar_createMenu(theWikibar,wikibarStore,title,theTextarea);
if(config.options['chkWikibarSetEditorHeight'] && config.options['txtWikibarEditorRows']){
theTextarea.rows = config.options['txtWikibarEditorRows'];
}
setStylesheet(
'.wikibar{text-align:left;visibility:visible;margin:2px;padding:1px;}.previewer{overflow:auto;display:block;border:1px solid;}#colorPicker{position:absolute;display:none;z-index:10;margin:0px;padding:0px;}#colorPicker table{margin:0px;padding:0px;border:2px solid #000;border-spacing:0px;border-collapse:collapse;}#colorPicker td{margin:0px;padding:0px;border:1px solid;font-size:11px;text-align:center;cursor:auto;}#colorPicker .header{background-color:#fff;}#colorPicker .button{background-color:#fff;cursor:pointer;cursor:hand;}#colorPicker .button:hover{padding-top:3px;padding-bottom:3px;color:#fff;background-color:#136;}#colorPicker .cell{padding:4px;font-size:7px;cursor:crosshair;}#colorPicker .cell:hover{padding:10px;}.wikibarPopup{position:absolute;z-index:10;border:1px solid #014;color:#014;background-color:#cef;}.wikibarPopup table{margin:0;padding:0;border:0;border-spacing:0;border-collapse:collapse;}.wikibarPopup .button:hover{color:#eee;background-color:#014;}.wikibarPopup .disabled{color:#888;}.wikibarPopup .disabled:hover{color:#888;background-color:#cef;}.wikibarPopup tr .seperator hr{margin:0;padding:0;background-color:#cef;width:100%;border:0;border-top:1px dashed #014;}.wikibarPopup tr .icon{font-family:verdana;font-weight:bolder;}.wikibarPopup tr .marker{font-family:verdana;font-weight:bolder;}.wikibarPopup td{font-size:0.9em;padding:2px;}.wikibarPopup input{border:0;border-bottom:1px solid #014;margin:0;padding:0;font-family:arial;font-size:100%;background-color:#fff;}',
'WikiBarStyleSheet');
}
function wikibar_createMenu(place,toolset,title,editor){
if(!wikibar_isValidMenuItem(toolset)){return;}
if(!(toolset.TYPE=='MAIN_MENU' || toolset.TYPE=='MENU')){ return; }
for(var key in toolset){
if(key.substring(0,9)=='SEPERATOR'){
wikibar_createMenuSeperator(place);
continue;
}
if(key.substring(0,8)=='DYNAITEM'){
var dynaTools = toolset[key](title,editor);
if(dynaTools.TYPE && dynaTools.TYPE=='MENU'){
wikibar_createMenuItem(place,dynaTools,null,editor,title);
}else{
dynaTools.TYPE = 'MENU';
wikibar_createMenu(place, dynaTools, title, editor);
}
continue;
}
if((toolset[key].TYPE!='MENU' && toolset[key].TYPE!='MAIN_MENU') && !toolset[key].HANDLER){continue;}
wikibar_createMenuItem(place,toolset,key,editor,title);
}
}
function wikibar_createMenuItem(place,toolset,key,editor,title){
if(!key){
var tool = toolset;
}else{
tool = toolset[key];
tool.key = key;
}
if(!wikibar_isValidMenuItem(tool)){return;}
var toolIsOnMainMenu = (toolset.TYPE=='MAIN_MENU');
var toolIsMenu = (tool.TYPE=='MENU');
var theButton;
if(toolIsOnMainMenu){
theButton = createTiddlyButton(
place,
'',
(tool.TOOLTIP? tool.TOOLTIP : ''),
(toolIsMenu? wikibar_onClickMenuItem : wikibar_onClickItem),
'button');
theButton.innerHTML = (tool.CAPTION? tool.CAPTION : key);
theButton.isOnMainMenu = true;
addClass(theButton, (toolIsMenu? 'menu' : 'item'));
place.appendChild( document.createTextNode('\n') );
if(!toolIsMenu){
if(config.options['chkWikibarPopmenuOnMouseOver']){
theButton.onmouseover = function(e){ wikibarPopup.remove(); };
}
}
}else{
theButton=createTiddlyElement(place, 'tr',key,'button');
theButton.title = (tool.TOOLTIP? tool.TOOLTIP : '');
theButton.onclick = (toolIsMenu? wikibar_onClickMenuItem : wikibar_onClickItem);
var tdL = createTiddlyElement(theButton, 'td','','marker');
var td = createTiddlyElement(theButton, 'td');
var tdR = createTiddlyElement(theButton, 'td','','marker');
td.innerHTML = (tool.CAPTION? tool.CAPTION : key);
if(toolIsMenu){
tdR.innerHTML=' ›';
}
if(tool.SELECTED){
tdL.innerHTML = '√ ';
addClass(theButton, 'selected');
}
if(tool.DISABLED){
addClass(theButton, 'disabled');
}
}
theButton.tiddlerTitle = title;
theButton.toolItem = tool;
theButton.editor = editor;
theButton.tabIndex = 999;
if(toolIsMenu){
if(config.options['chkWikibarPopmenuOnMouseOver']){
theButton.onmouseover = wikibar_onClickMenuItem;
}
}
}
function wikibar_createMenuSeperator(place){
if(place.id.substring(0,7)=='wikibar') { return; }
var onclickSeperator=function(e){
if(!e){ e = window.event; }
e.cancelBubble = true;
if (e.stopPropagation){ e.stopPropagation(); }
return(false);
};
var theButton=createTiddlyElement(place,'tr','','seperator');
var td = createTiddlyElement(theButton, 'td','','seperator');
td.colSpan=3;
theButton.onclick=onclickSeperator;
td.innerHTML = '<hr>';
}
function wikibar_genWikibarAbout(){
var toolset={};
toolset.version = {
CAPTION: '<center>WikiBar ' +
config.macros.wikibar.major + '.' +
config.macros.wikibar.minor + '.' +
config.macros.wikibar.revision +
(config.macros.wikibar.beta? ' beta '+config.macros.wikibar.beta : '') +
'</center>',
HANDLER: function(){}
};
toolset.SEPERATOR = {};
toolset.author = {
CAPTION: '<center>Arphen Lin<br>arphenlin@gmail.com</center>',
TOOLTIP: 'send mail to the author',
HANDLER: function(){ window.open('mailto:arphenlin@gmail.com'); }
};
toolset.website = {
CAPTION: '<center>aiddlywiki.sourceforge.net</center>',
TOOLTIP: 'go to the web site of WikiBar',
HANDLER: function(){ window.open('http:\/\/aiddlywiki.sourceforge.net/'); }
};
return toolset;
}
function wikibar_genWikibarOptions(title, editor){
var toolset={};
toolset.popOnMouseOver = {
CAPTION:'popup menu on mouse over',
SELECTED: config.options['chkWikibarPopmenuOnMouseOver'],
HANDLER: function(param){
config.options['chkWikibarPopmenuOnMouseOver'] = !config.options['chkWikibarPopmenuOnMouseOver'];
saveOptionCookie('chkWikibarPopmenuOnMouseOver');
var title = param.button.tiddlerTitle;
var wikibar = document.getElementById('wikibar'+title);
if(wikibar){ wikibar.parentNode.removeChild(wikibar); }
wikibar_createWikibar(title);
}
};
toolset.setEditorSize = {
CAPTION:'set editor height: <input id=\"txtWikibarEditorRows\" type=text size=1 MAXLENGTH=3 value=\"' +
(config.options['txtWikibarEditorRows']? config.options['txtWikibarEditorRows']:editor.rows) + '\"> ok',
HANDLER: function(param){
var input = document.getElementById('txtWikibarEditorRows');
if(input){
var rows = parseInt(input.value, 10);
if(!isNaN(rows)){
var editor = param.button.editor;
editor.rows = rows;
}else{
rows=config.maxEditRows;
}
config.options['txtWikibarEditorRows'] = rows;
saveOptionCookie('txtWikibarEditorRows');
config.maxEditRows = rows;
}
}
};
toolset.setEditorSizeOnLoadingWikibar = {
CAPTION:'set editor height on loading wikibar',
SELECTED: config.options['chkWikibarSetEditorHeight'],
HANDLER: function(param){
config.options['chkWikibarSetEditorHeight'] = !config.options['chkWikibarSetEditorHeight'];
saveOptionCookie('chkWikibarSetEditorHeight');
if(config.options['chkWikibarSetEditorHeight']){
var rows = config.options['txtWikibarEditorRows'];
if(!isNaN(rows)){ rows = 15; }
var editor = param.button.editor;
editor.rows = rows;
config.options['txtWikibarEditorRows'] = rows;
saveOptionCookie('txtWikibarEditorRows');
}
}
};
toolset.SEPERATOR = {};
toolset.update = {
CAPTION: 'check for updates',
DISABLED: true,
HANDLER: function(){}
};
return toolset;
}
function wikibar_genPaletteSelector(){
try{
var cpTiddlers = store.getTaggedTiddlers('ColorPalettes');
if(!cpTiddlers) { return; }
var palettes=[];
palettes.push(wikibarColorTool.defaultPaletteName);
for(var i=0; i<cpTiddlers.length; i++){
palettes.push(cpTiddlers[i].title.trim());
}
var toolset={};
for(i=0; i<palettes.length; i++){
toolset[palettes[i]] = {
TOOLTIP: palettes[i],
SELECTED: (palettes[i]==wikibarColorTool.paletteName),
HANDLER: wikibar_doSelectPalette
};
}
return toolset;
}catch(ex){ return null; }
}
function wikibar_onClickItem(e){
if(!e){ e = window.event; }
var theTarget = resolveTarget(e);
if(theTarget.tagName=='INPUT'){
e.cancelBubble = true;
if (e.stopPropagation){ e.stopPropagation(); }
return;
}
var theButton = wikibar_resolveTargetButton(theTarget);
if(!theButton){ return(false); }
var o = theButton.toolItem;
if(!o) { return; }
var param = {
event: e,
button: theButton
};
if(o.HANDLER){ o.HANDLER(param); }
if(o.DISABLED){
e.cancelBubble = true;
if (e.stopPropagation){ e.stopPropagation(); }
}
return(false);
}
function wikibar_onClickMenuItem(e){
if(!e){ e = window.event; }
var theButton = wikibar_resolveTargetButton(resolveTarget(e));
if(!theButton){ return(false); }
e.cancelBubble = true;
if (e.stopPropagation){ e.stopPropagation(); }
var title = theButton.tiddlerTitle;
var editor = theButton.editor;
var tool = theButton.toolItem;
if(!tool) { return; }
var popup = wikibarPopup.create(this);
if(popup){
wikibar_createMenu(popup,tool,title,editor);
if(!popup.hasChildNodes()){
wikibarPopup.remove();
}else{
wikibarPopup.show(popup, false);
}
}
return(false);
}
var wikibarColorTool = {
defaultPaletteName : 'default',
defaultColumns : 16,
defaultPalette : [
'#FFF','#DDD','#CCC','#BBB','#AAA','#999','#666','#333','#111','#000','#FC0','#F90','#F60','#F30','#C30','#C03',
'#9C0','#9D0','#9E0','#E90','#D90','#C90','#FC3','#FC6','#F96','#F63','#600','#900','#C00','#F00','#F36','#F03',
'#CF0','#CF3','#330','#660','#990','#CC0','#FF0','#C93','#C63','#300','#933','#C33','#F33','#C36','#F69','#F06',
'#9F0','#CF6','#9C3','#663','#993','#CC3','#FF3','#960','#930','#633','#C66','#F66','#903','#C39','#F6C','#F09',
'#6F0','#9F6','#6C3','#690','#996','#CC6','#FF6','#963','#630','#966','#F99','#F39','#C06','#906','#F3C','#F0C',
'#3F0','#6F3','#390','#6C0','#9F3','#CC9','#FF9','#C96','#C60','#C99','#F9C','#C69','#936','#603','#C09','#303',
'#0C0','#3C0','#360','#693','#9C6','#CF9','#FFC','#FC9','#F93','#FCC','#C9C','#969','#939','#909','#636','#606',
'#060','#3C3','#6C6','#0F0','#3F3','#6F6','#9F9','#CFC','#9CF','#FCF','#F9F','#F6F','#F3F','#F0F','#C6C','#C3C',
'#030','#363','#090','#393','#696','#9C9','#CFF','#39F','#69C','#CCF','#C9F','#96C','#639','#306','#90C','#C0C',
'#0F3','#0C3','#063','#396','#6C9','#9FC','#9CC','#06C','#369','#99F','#99C','#93F','#60C','#609','#C3F','#C0F',
'#0F6','#3F6','#093','#0C6','#3F9','#9FF','#699','#036','#039','#66F','#66C','#669','#309','#93C','#C6F','#90F',
'#0F9','#6F9','#3C6','#096','#6FF','#6CC','#366','#069','#36C','#33F','#33C','#339','#336','#63C','#96F','#60F',
'#0FC','#6FC','#3C9','#3FF','#3CC','#399','#033','#39C','#69F','#00F','#00C','#009','#006','#003','#63F','#30F',
'#0C9','#3FC','#0FF','#0CC','#099','#066','#3CF','#6CF','#09C','#36F','#0CF','#09F','#06F','#03F','#03C','#30C'
],
colorPicker : null,
pickColorHandler: null,
userData: null
};
wikibarColorTool.paletteName = wikibarColorTool.defaultPaletteName;
wikibarColorTool.columns = wikibarColorTool.defaultColumns;
wikibarColorTool.palette = wikibarColorTool.defaultPalette;
wikibarColorTool.onPickColor = function(e){
if (!e){ e = window.event; }
var theCell = resolveTarget(e);
if(!theCell){ return(false); }
color = theCell.bgColor.toLowerCase();
if(!color) { return; }
wikibarColorTool.displayColorPicker(false);
if(wikibarColorTool.pickColorHandler){
wikibarColorTool.pickColorHandler(color, wikibarColorTool.userData);
}
return(false);
};
wikibarColorTool.onMouseOver = function(e){
if (!e){ e = window.event; }
var theButton = resolveTarget(e);
if(!theButton){ return(false); }
if(!wikibarColorTool) { return; }
color = theButton.bgColor.toUpperCase();
if(!color) { return; }
td=document.getElementById('colorPickerInfo');
if(!td) { return; }
td.bgColor = color;
td.innerHTML = '<span style=\"color:#000;\">'+color+'</span> ' +
'<span style=\"color:#fff;\">'+color+'</span>';
e.cancelBubble = true;
if (e.stopPropagation){ e.stopPropagation(); }
return(false);
};
wikibarColorTool.openColorPicker = function(theTarget, pickColorHandler, userData){
wikibarColorTool.skipClickDocumentEvent = true;
wikibarColorTool.pickColorHandler = pickColorHandler;
wikibarColorTool.userData = userData;
wikibarColorTool.moveColorPicker(theTarget);
};
wikibarColorTool.convert3to6HexColor = function(c){
c=c.trim();
var rx=/^\#(\d|[a-f])(\d|[a-f])(\d|[a-f])$/gi;
return (rx.test(c)? c.replace(rx, '#$1$1$2$2$3$3') : c);
};
wikibarColorTool.numToHexColor = function (n){
if(typeof(n)=='number' && (n>=0 && n<=255)) {
s = n.toString(16).toLowerCase();
return ((s.length==1)? '0'+s : s);
}else{
return null;
}
};
wikibarColorTool.renderColorPalette = function(){
if(wikibarColorTool.paletteName==wikibarColorTool.defaultPaletteName){
wikibarColorTool.palette=wikibarColorTool.defaultPalette;
wikibarColorTool.columns=wikibarColorTool.defaultColumns;
return;
}
tiddlerText = (store.getTiddlerText(wikibarColorTool.paletteName, '')).trim();
if(tiddlerText.length<=0) { return; }
var cpContents = tiddlerText.split('\n');
var colors=[];
columns = wikibarColorTool.defaultColumns;
var tmpArray=null;
errCount=0;
for(var i=0; i<cpContents.length; i++){
cpLine=cpContents[i].trim();
if( (!cpLine) || (cpLine.length<=0) || (cpLine.charAt(0) == '#') ){ continue; }
if(cpLine.substring(0,8).toLowerCase()=='columns:'){
tmpArray = cpLine.split(':');
try{
columns = parseInt(tmpArray[1],10);
}catch(ex){
columns = wikibarColorTool.defaultColumns;
}
}else{
tmpArray = cpLine.replace('\t', ' ').split(/[ ]{1,}/);
try{
color='';
for(var j=0; j<3; j++){
c=parseInt(tmpArray[j].trim(), 10);
if(isNaN(c)){
break;
}else{
c=wikibarColorTool.numToHexColor(c);
if(!c) {break;}
color+=c;
}
}
if(color.length==6){
colors.push('#'+color);
} else {
throw 'error';
}
}catch(ex){
}
}
}
if(colors.length>0){
wikibarColorTool.palette = colors;
wikibarColorTool.columns = columns;
}else{
throw 'renderColorPalette(): No color defined in the palette.';
}
};
wikibarColorTool.displayColorPicker = function(visible){
if(wikibarColorTool.colorPicker){
wikibarColorTool.colorPicker.style.display = (visible? 'block' : 'none');
}
};
wikibarColorTool.moveColorPicker = function(theTarget){
if(!wikibarColorTool.colorPicker){
wikibarColorTool.createColorPicker();
}
var cp = wikibarColorTool.colorPicker;
var rootLeft = findPosX(theTarget);
var rootTop = findPosY(theTarget);
var popupLeft = rootLeft;
var popupTop = rootTop;
var popupWidth = cp.offsetWidth;
var winWidth = findWindowWidth();
if(popupLeft + popupWidth > winWidth){
popupLeft = winWidth - popupWidth;
}
cp.style.left = popupLeft + 'px';
cp.style.top = popupTop + 'px';
wikibarColorTool.displayColorPicker(true);
};
wikibarColorTool.createColorPicker = function(unused, palette){
if(palette){ wikibarColorTool.paletteName=palette; }
wikibarColorTool.renderColorPalette();
wikibarColorTool.colorPicker = document.createElement('div');
wikibarColorTool.colorPicker.id = 'colorPicker';
document.body.appendChild(wikibarColorTool.colorPicker);
var theTable = document.createElement('table');
wikibarColorTool.colorPicker.appendChild(theTable);
var theTR = document.createElement('tr');
theTable.appendChild(theTR);
var theTD = document.createElement('td');
theTD.className = 'header';
theTD.colSpan = wikibarColorTool.columns;
theTD.innerHTML = wikibarColorTool.paletteName;
theTR.appendChild(theTD);
for(var i=0; i<wikibarColorTool.palette.length; i++){
if((i%wikibarColorTool.columns)===0){
theTR = document.createElement('tr');
theTable.appendChild(theTR);
}
theTD = document.createElement('td');
theTD.className = 'cell';
theTD.bgColor = wikibarColorTool.convert3to6HexColor(wikibarColorTool.palette[i]);
theTD.onclick = wikibarColorTool.onPickColor;
theTD.onmouseover = wikibarColorTool.onMouseOver;
theTR.appendChild(theTD);
}
rest = wikibarColorTool.palette.length % wikibarColorTool.columns;
if(rest>0){
theTD = document.createElement('td');
theTD.colSpan = wikibarColorTool.columns-rest;
theTD.bgColor = '#000000';
theTR.appendChild(theTD);
}
theTR = document.createElement('tr');
theTable.appendChild(theTR);
theTD = document.createElement('td');
theTD.colSpan = wikibarColorTool.columns;
theTD.id = 'colorPickerInfo';
theTR.appendChild(theTD);
};
wikibarColorTool.onDocumentClick = function(e){
if (!e){ e = window.event; }
if(wikibarColorTool.skipClickDocumentEvent) {
wikibarColorTool.skipClickDocumentEvent = false;
return true;
}
if((!e.eventPhase) || e.eventPhase == Event.BUBBLING_PHASE || e.eventPhase == Event.AT_TARGET){
wikibarColorTool.displayColorPicker(false);
}
return true;
};
function wikibar_doSelectPalette(param){
clearMessage();
var theButton = param.button;
if(!theButton.toolItem.key) { return; }
var palette = theButton.toolItem.key;
var oldPaletteName = wikibarColorTool.paletteName;
if(oldPaletteName != palette){
try{
wikibarColorTool.createColorPicker(theButton, palette);
displayMessage('Palette \"'+palette+'\" ('+ wikibarColorTool.palette.length +' colors) is selected');
}catch(ex){
errMsg = ex;
if(errMsg.substring(0,18)=='renderColorPalette'){
displayMessage('Invalid palette \"' + palette + '\", please check it out!');
wikibarColorTool.createColorPicker(theButton, oldPaletteName);
}
}
}
}
var wikibarPopup = {
skipClickDocumentEvent: false,
stack: []
};
wikibarPopup.resolveRootPopup = function(o){
if(o.isOnMainMenu){ return null; }
if(o.className.substring(0,12)=='wikibarPopup'){ return o;}
return wikibarPopup.resolveRootPopup(o.parentNode);
};
wikibarPopup.create = function(root){
for(var i=0; i<wikibarPopup.stack.length; i++){
var p=wikibarPopup.stack[i];
if(p.root==root){
wikibarPopup.removeFrom(i+1);
return null;
}
}
var rootPopup = wikibarPopup.resolveRootPopup(root);
if(!rootPopup){
wikibarPopup.remove();
}else{
wikibarPopup.removeFromRootPopup(rootPopup);
}
var popup = createTiddlyElement(document.body,'div','wikibarPopup'+root.toolItem.key,'wikibarPopup');
var pop = createTiddlyElement(popup,'table','','');
wikibarPopup.stack.push({rootPopup: rootPopup, root: root, popup: popup});
return pop;
};
wikibarPopup.show = function(unused,slowly){
var curr = wikibarPopup.stack[wikibarPopup.stack.length-1];
var overlayWidth = 1;
var rootLeft, rootTop, rootWidth, rootHeight, popupLeft, popupTop, popupWidth;
if(curr.rootPopup){
rootLeft = findPosX(curr.rootPopup);
rootTop = findPosY(curr.root);
rootWidth = curr.rootPopup.offsetWidth;
popupLeft = rootLeft + rootWidth - overlayWidth;
popupTop = rootTop;
}else{
rootLeft = findPosX(curr.root);
rootTop = findPosY(curr.root);
rootHeight = curr.root.offsetHeight;
popupLeft = rootLeft;
popupTop = rootTop + rootHeight;
}
var winWidth = findWindowWidth();
popupWidth = curr.popup.offsetWidth;
if(popupLeft + popupWidth > winWidth){
popupLeft = rootLeft - popupWidth + overlayWidth;
}
curr.popup.style.left = popupLeft + 'px';
curr.popup.style.top = popupTop + 'px';
curr.popup.style.display = 'block';
addClass(curr.root, 'highlight');
if(config.options.chkAnimate){
anim.startAnimating(new Scroller(curr.popup,slowly));
}else{
window.scrollTo(0,ensureVisible(curr.popup));
}
};
wikibarPopup.remove = function(){
if(wikibarPopup.stack.length > 0){
wikibarPopup.removeFrom(0);
}
};
wikibarPopup.removeFrom = function(from){
for(var t=wikibarPopup.stack.length-1; t>=from; t--){
var p = wikibarPopup.stack[t];
removeClass(p.root,'highlight');
p.popup.parentNode.removeChild(p.popup);
}
wikibarPopup.stack = wikibarPopup.stack.slice(0,from);
};
wikibarPopup.removeFromRootPopup = function(from){
for(var t=0; t<wikibarPopup.stack.length; t++){
var p = wikibarPopup.stack[t];
if(p.rootPopup==from){
wikibarPopup.removeFrom(t);
break;
}
}
};
wikibarPopup.onDocumentClick = function(e){
if (!e){ e = window.event; }
if(wikibarPopup.skipClickDocumentEvent){
wikibarPopup.skipClickDocumentEvent=false;
return true;
}
if((!e.eventPhase) || e.eventPhase == Event.BUBBLING_PHASE || e.eventPhase == Event.AT_TARGET){
wikibarPopup.remove();
}
return true;
};
var wikibarStore = {
TYPE: 'MAIN_MENU',
help:{
TYPE:'MENU',
CAPTION: '<font face=\"verdana\">?</font>',
TOOLTIP: 'about WikiBar',
options:{
TYPE:'MENU',
DYNAITEM: wikibar_genWikibarOptions
},
about:{
TYPE:'MENU',
DYNAITEM: wikibar_genWikibarAbout
}
},
preview:{
TOOLTIP: 'preview this tiddler',
CAPTION: '<font face=\"verdana\">∞</font>',
HANDLER: wikibar_doPreview
},
line:{
TOOLTIP: 'horizontal line',
CAPTION: '<font face=\"verdana\">—</font>',
syntax: '\n----\n',
HANDLER: wikibar_editFormatByCursor
},
crlf:{
TOOLTIP: 'new line',
CAPTION: '<font face=\"verdana\">¶</font>',
syntax: '\n',
HANDLER: wikibar_editFormatByCursor
},
selectAll:{
TOOLTIP: 'select all',
CAPTION: '<font face=\"verdana\">§</font>',
HANDLER: wikibar_editSelectAll
},
deleteSelected:{
TOOLTIP: 'delete selected',
CAPTION: '<font face=\"verdana\">×</font>',
syntax: '',
HANDLER: wikibar_editFormat
},
textFormat:{
TYPE: 'MENU',
CAPTION: 'text',
TOOLTIP: 'text formatters',
ignore:{
TOOLTIP: 'ignore wiki word',
CAPTION: 'ignore wikiWord',
syntax: '~user_text',
hint: 'wiki_word',
HANDLER: wikibar_editFormatByWord
},
bolder:{
TOOLTIP: 'bolder text',
CAPTION: '<strong>bolder</strong>',
syntax: "''user_text''",
hint: 'bold_text',
HANDLER: wikibar_editFormatByWord
},
italic:{
TOOLTIP: 'italic text',
CAPTION: '<em>italic</em>',
syntax: '\/\/user_text\/\/',
hint: 'italic_text',
HANDLER: wikibar_editFormatByWord
},
underline:{
TOOLTIP: 'underline text',
CAPTION: '<u>underline</u>',
syntax: '__user_text__',
hint: 'underline_text',
HANDLER: wikibar_editFormatByWord
},
strikethrough:{
TOOLTIP: 'strikethrough text',
CAPTION: '<strike>strikethrough</strike>',
syntax: '==user_text==',
hint: 'strikethrough_text',
HANDLER: wikibar_editFormatByWord
},
superscript:{
TOOLTIP: 'superscript text',
CAPTION: 'X<sup>superscript</sup>',
syntax: '^^user_text^^',
hint: 'superscript_text',
HANDLER: wikibar_editFormatByWord
},
subscript:{
TOOLTIP: 'subscript text',
CAPTION: 'X<sub>subscript</sub>',
syntax: '~~user_text~~',
hint: 'subscript_text',
HANDLER: wikibar_editFormatByWord
},
comment:{
TOOLTIP: 'comment text',
CAPTION: 'comment text',
syntax: '/%user_text%/',
hint: 'comment_text',
HANDLER: wikibar_editFormatByWord
},
monospaced:{
TOOLTIP: 'monospaced text',
CAPTION: '<code>monospaced</code>',
syntax: '{{{user_text}}}',
hint: 'monospaced_text',
HANDLER: wikibar_editFormatByWord
}
},
paragraph:{
TYPE: 'MENU',
TOOLTIP: 'paragarph formatters',
list:{
TYPE: 'MENU',
TOOLTIP: 'list tools',
bullet:{
TOOLTIP: 'bullet point',
syntax: '*user_text',
hint: 'bullet_text',
HANDLER: wikibar_editFormatByLine
},
numbered:{
TOOLTIP: 'numbered list',
syntax: '#user_text',
hint: 'numbered_text',
HANDLER: wikibar_editFormatByLine
}
},
heading:{
TYPE: 'MENU',
heading1:{
CAPTION:'<h1>Heading 1</h1>',
TOOLTIP: 'Heading 1',
syntax: '!user_text',
hint: 'heading_1',
HANDLER: wikibar_editFormatByLine
},
heading2:{
CAPTION:'<h2>Heading 2<h2>',
TOOLTIP: 'Heading 2',
syntax: '!!user_text',
hint: 'heading_2',
HANDLER: wikibar_editFormatByLine
},
heading3:{
CAPTION:'<h3>Heading 3</h3>',
TOOLTIP: 'Heading 3',
syntax: '!!!user_text',
hint: 'heading_3',
HANDLER: wikibar_editFormatByLine
},
heading4:{
CAPTION:'<h4>Heading 4</h4>',
TOOLTIP: 'Heading 4',
syntax: '!!!!user_text',
hint: 'heading_4',
HANDLER: wikibar_editFormatByLine
},
heading5:{
CAPTION:'<h5>Heading 5</h5>',
TOOLTIP: 'Heading 5',
syntax: '!!!!!user_text',
hint: 'heading_5',
HANDLER: wikibar_editFormatByLine
}
},
comment:{
TYPE: 'MENU',
commentByLine:{
CAPTION:'comment by line',
TOOLTIP: 'line comment',
syntax: '/%user_text%/',
hint: 'comment_text',
HANDLER: wikibar_editFormatByLine
},
commentByBlock:{
CAPTION:'comment by block',
TOOLTIP: 'block comment',
syntax: '/%\nuser_text\n%/',
hint: 'comment_text',
byBlock: true,
HANDLER: wikibar_editFormatByLine
}
},
monospaced:{
TYPE: 'MENU',
monosByLine:{
CAPTION: 'monospaced by line',
TOOLTIP: 'line monospaced',
syntax: '{{{\nuser_text\n}}}',
hint: 'monospaced_text',
HANDLER: wikibar_editFormatByLine
},
monosByBlock:{
CAPTION: 'monospaced by block',
TOOLTIP: 'block monospaced',
syntax: '{{{\nuser_text\n}}}',
hint: 'monospaced_text',
byBlock: true,
HANDLER: wikibar_editFormatByLine
}
},
quote:{
TYPE: 'MENU',
quoteByLine:{
CAPTION: 'quote by line',
TOOLTIP: 'line quote',
syntax: '>user_text',
hint: 'quote_text',
HANDLER: wikibar_editFormatByLine
},
quoteByBlcok:{
CAPTION: 'quote by block',
TOOLTIP: 'block quote',
syntax: '<<<\nuser_text\n<<<',
hint: 'quote_text',
byBlock: true,
HANDLER: wikibar_editFormatByLine
}
},
plugin:{
TYPE: 'MENU',
code:{
CAPTION: 'code area',
TOOLTIP: 'block monospaced for plugin',
syntax: '\n\/\/{{{\nuser_text\n\/\/}}}\n',
hint: 'monospaced_plugin_code',
byBlock: true,
HANDLER: wikibar_editFormatByLine
},
commentByLine:{
CAPTION: 'comment by line',
TOOLTIP: 'line comment',
syntax: '\/\/user_text',
hint: 'plugin_comment',
HANDLER: wikibar_editFormatByLine
},
commentByBlock:{
CAPTION: 'comment by block',
TOOLTIP: 'block comment',
syntax: '\/\***\nuser_text\n***\/',
hint: 'plugin_comment',
byBlock: true,
HANDLER: wikibar_editFormatByLine
}
},
css:{
TYPE: 'MENU',
code:{
CAPTION: 'code area',
TOOLTIP: 'block monospaced for css',
syntax: '\n\nuser_text\n\n',
hint: 'monospaced_css_code',
byBlock: true,
HANDLER: wikibar_editFormatByLine
},
commentByLine:{
CAPTION: 'comment by line',
TOOLTIP: 'line comment',
syntax: '',
hint: 'css_comment',
HANDLER: wikibar_editFormatByLine
},
commentByBlock:{
CAPTION: 'comment by block',
TOOLTIP: 'block comment',
syntax: '',
hint: 'css_comment',
byBlock: true,
HANDLER: wikibar_editFormatByLine
}
}
},
color:{
TYPE: 'MENU',
TOOLTIP: 'color tools',
highlight:{
CAPTION:'highlight text',
TOOLTIP: 'highlight text',
syntax: '@@user_text@@',
hint: 'highlight_text',
HANDLER: wikibar_editFormatByWord
},
color:{
CAPTION:'text color',
TOOLTIP: 'text color',
hint: 'your_text',
syntax: '@@color(%1):user_text@@',
HANDLER: wikibar_getColorCode,
doMore: wikibar_editFormatByWord
},
bgcolor:{
CAPTION:'background color',
TOOLTIP: 'background color',
hint: 'your_text',
syntax: '@@bgcolor(%1):user_text@@',
HANDLER: wikibar_getColorCode,
doMore: wikibar_editFormatByWord
},
colorcode:{
CAPTION:'color code',
TOOLTIP: 'insert color code',
syntax: '%1',
HANDLER: wikibar_getColorCode,
doMore: wikibar_editFormatByCursor
},
'color palette':{
TYPE:'MENU',
DYNAITEM: wikibar_genPaletteSelector,
SEPERATOR:{},
morePalette:{
CAPTION:'more palettes',
TOOLTIP:'get more palettes',
HANDLER: wikibar_getMorePalette
}
}
},
link:{
TYPE: 'MENU',
TOOLTIP: 'insert link',
wiki:{
CAPTION:'wiki link',
TOOLTIP: 'wiki link',
syntax: '[[user_text]]',
hint: 'wiki_word',
HANDLER: wikibar_editFormatByWord
},
pretty:{
CAPTION: 'pretty link',
TOOLTIP: 'pretty link',
syntax: '[[user_text|%1]]',
hint: 'pretty_word',
param: 'PrettyLink Target',
HANDLER: wikibar_getLinkUrl,
doMore: wikibar_editFormatByWord
},
url:{
TOOLTIP: 'url link',
syntax: '[[user_text|%1]]',
hint: 'your_text',
param: 'http:\/\/...',
HANDLER: wikibar_getLinkUrl,
doMore: wikibar_editFormatByWord
},
image:{
TOOLTIP: 'image link',
syntax: '[img[user_text|%1]]',
hint: 'alt_text',
param: 'image/icon.jpg',
HANDLER: wikibar_getLinkUrl,
doMore: wikibar_editFormatByWord
}
},
macro:{},
more:{
TYPE: 'MENU',
TOOLTIP: 'more tools',
table:{
TYPE: 'MENU',
TOOLTIP: 'table',
table:{
CAPTION:'create table',
TOOLTIP: 'create a new table',
syntax: '\n%1\n',
HANDLER: wikibar_getTableRowCol,
doMore: wikibar_editFormatByWord
},
header:{
TOOLTIP: 'table header text',
syntax: '|user_text|c',
hint: 'table_header',
HANDLER: wikibar_editFormatByWord
},
cell:{
TOOLTIP: 'create a tabel cell',
syntax: '|user_text|',
hint: 'your_text',
HANDLER: wikibar_editFormatByWord
},
columnHeader:{
CAPTION:'column header',
TOOLTIP: 'create a column header cell',
syntax: '|!user_text|',
hint: 'column_header',
HANDLER: wikibar_editFormatByWord
},
cell:{
TYPE: 'MENU',
CAPTION: 'cell options',
bgcolor:{
CAPTION: 'background color',
TOOLTIP: 'cell bgcolor',
syntax: '|bgcolor(%1):user_text|',
hint: 'your_text',
HANDLER: wikibar_getColorCode,
doMore: wikibar_editFormatByTableCell
},
alignLeft:{
CAPTION: 'align left',
TOOLTIP: 'left align cell text',
syntax: '|user_text|',
hint: 'your_text',
HANDLER: wikibar_editFormatByTableCell
},
alignCenter:{
CAPTION: 'align center',
TOOLTIP: 'center align cell text',
syntax: '| user_text |',
hint: 'your_text',
HANDLER: wikibar_editFormatByTableCell
},
alignRight:{
CAPTION: 'align right',
TOOLTIP: 'right align cell text',
syntax: '| user_text|',
hint: 'your_text',
HANDLER: wikibar_editFormatByTableCell
}
}
},
html:{
TYPE: 'MENU',
html:{
CAPTION: '<html>',
TOOLTIP: 'html tag',
syntax: '<html>\nuser_text\n</html>',
hint: 'html_content',
byBlock: true,
HANDLER: wikibar_editFormatByLine
}
}
},
addon:{
TYPE: 'MENU',
TOOLTIP:'3rd party tools',
'about addons':{
TOOLTIP: 'list loaded addons',
HANDLER: wikibar_doListAddons
},
SEPERATOR:{}
}
};
addEvent(document, 'click', wikibarColorTool.onDocumentClick);
addEvent(document, 'click', wikibarPopup.onDocumentClick);
wikibar_install();
//}}}
<html><p><strong><span style="font-size: larger;"><span style="font-family: Comic Sans MS;">H</span></span></strong><span style="font-size: larger;"><span style="font-family: Comic Sans MS;">er får du en ekstra mulighed for at bruge en såkaldt "wysiwyg-editor". <em><span style="font-size: smaller;">What You See Is What You Get</span></em>. </span></span></p><p><span style="font-size: larger;"><span style="font-family: Comic Sans MS;">Det minder meget om et almindeligt skriveprogram og du kan gøre alt det du plejer at gøre - f.eks. indsætte billeder, ændre størrelser og fonttype mm. </span></span></p><p><em><span style="font-size: larger;"><span style="font-family: Comic Sans MS;">(Alt bliver automatisk oversat til html-kode - så <span style="color: rgb(255, 0, 0);">pas på </span>ikke at bruge det på tiddlere med nødvendig Wikikode. Man kan dog godt skrive wiki-kode ind i wysiwyg-editoren - Den kan godt skelne. Problemet er der kun når der er wiki-kode i forvejen - f.eks. i form af makroer "{{{<<et eller andet>>}}}") </span></span></em></p><p><span style="font-size: larger;"><span style="font-family: Comic Sans MS;"><span style="font-size: large;"><tt>Det virker kun så længe din wiki er online</tt></span> (ude på nettet). </span></span></p><p><span style="font-size: larger;"><span style="font-family: Comic Sans MS;">Vil du kunne bruge det offline, skal du downloade </span></span><a href="http://maans.newp.dk/fckeditor.zip"><span style="font-size: larger;"><span style="font-family: Comic Sans MS;">denne</span></span></a><span style="background-color: rgb(255, 0, 0);"><a href="http://maans.newp.dk/fckeditor.zip"><span style="font-size: larger;"><span style="font-family: Comic Sans MS;"> zipfil</span></span></a></span><span style="font-size: larger;"><span style="font-family: Comic Sans MS;"> <i>(Højreklik - gem som)</i> og </span></span><span style="font-size: larger;"><span style="font-family: Comic Sans MS;">udpakke</span></span><span style="font-size: larger;"><span style="font-family: Comic Sans MS;"> mappen samme sted som din wiki-fil.</span></span></p><h3 style="color: Red;"><span style="font-size: larger;"><span style="color: rgb(255, 0, 0);"><cite><span style="font-family: Comic Sans MS;">Advarsel: </span></cite></span><span style="color: rgb(153, 51, 0);"><cite><span style="font-family: Comic Sans MS;">Har du først skrevet i en tiddler med <span style="font-family: Arial;"><span style="font-size: smaller;">(Eller blot klikket <span style="color: rgb(0, 204, 255);">færdig</span> i</span></span><span style="font-size: smaller;"><span style="font-family: Arial;"> )</span></span> wysiwyg-editoren er AL tekst ændret til html-kode <span style="color: rgb(255, 0, 0);"><span style="font-size: smaller;">(Klik på redigér og se hvordan det ser ud)</span></span> og er derfor ret uoverskuelig at redigere i uden wysiwyg - bagefter... Det kan lade sig gøre - men er ikke tilrådeligt, med mindre man er skrap til html....</span></cite></span></span></h3><p> </p><p> MM</p></html>
/***
|''Name:''|YourSearchPlugin|
|''Version:''|2.1.0 (2006-10-12)|
|''Source:''|http://tiddlywiki.abego-software.de/#YourSearchPlugin ([[del.icio.us|http://del.icio.us/post?url=http://tiddlywiki.abego-software.de/index.html%23YourSearchPlugin]])|
|''Author:''|UdoBorkowski (ub [at] abego-software [dot] de)|
|''Licence:''|[[BSD open source license (abego Software)|http://www.abego-software.de/legal/apl-v10.html]]|
|''Copyright:''|© 2005-2006 [[abego Software|http://www.abego-software.de]]|
|''~CoreVersion:''|2.1.0|
|''Browser:''|Firefox 1.0.4+; Firefox 1.5; ~InternetExplorer 6.0|
!About YourSearch
YourSearch gives you a bunch of new features to simplify and speed up your daily searches in TiddlyWiki. It seamlessly integrates into the standard TiddlyWiki search: just start typing into the 'search' field and explore!
For more information see [[Help|YourSearch Help]].
!Compatibility
This plugin requires TiddlyWiki 2.1.
Check the [[archive|http://tiddlywiki.abego-software.de/archive]] for ~YourSearchPlugins supporting older versions of TiddlyWiki.
!Revision history
* v2.1.0 (2006-10-12)
** Release version with TiddlyWiki 2.1 support
*** Support (Extended) Field search
*** Support parenthesis in Boolean Search
*** Support direct regular expression input
*** Support JavaScript Expressions for filtering
*** "new tiddler" feature (create tiddler based on search text)
* v2.0.2 (2006-02-13)
** Bugfix for Firefox 1.5.0.1 related to the "Show prefix" checkbox. Thanks to Ted Pavlic for reporting and to BramChen for fixing.
** Internal
*** Make "JSLint" conform
* v2.0.1 (2006-02-05)
** Support "Exact Word Match" (use '=' to prefix word)
** Support default filter settings (when no filter flags are given in search term)
** Rework on the "less than 3 chars search text" feature (thanks to EricShulman)
** Better support SinglePageMode when doing "Open all tiddlers" (thanks to EricShulman)
** Support Firefox 1.5.0.1
** Bug: Fixed a hilite bug in "classic search mode" (thanks to EricShulman)
* v2.0.0 (2006-01-16)
** Add User Interface
* v1.0.1 (2006-01-06)
** Support TiddlyWiki 2.0
* v1.0.0 (2005-12-28)
** initial version
!Source Code
***/
//{{{
//============================================================================
//============================================================================
// YourSearchPlugin
//============================================================================
//============================================================================
// Ensure that the Plugin is only installed once.
//
if (!version.extensions.YourSearchPlugin) {
version.extensions.YourSearchPlugin = {
major: 2, minor: 1, revision: 0,
source: "http://tiddlywiki.abego-software.de/#YourSearchPlugin",
licence: "[[BSD open source license (abego Software)|http://www.abego-software.de/legal/apl-v10.html]]",
copyright: "Copyright (c) abego Software GmbH, 2005-2006 (www.abego-software.de)"
};
if (!window.abego) window.abego = {};
// define the Array forEach when not yet defined (e.g. by Mozilla)
if (!Array.forEach) {
Array.forEach = function(obj, callback, thisObj) {
for (var i = 0,len = obj.length; i < len; i++)
callback.call(thisObj, obj[i], i, obj);
};
Array.prototype.forEach = function(callback, thisObj) {
for (var i = 0,len = this.length; i < len; i++)
callback.call(thisObj, this[i], i, this);
};
}
abego.toInt = function(s, defaultValue) {
if (!s) return defaultValue;
var n = parseInt(s);
return (n == NaN) ? defaultValue : n;
};
abego.createEllipsis = function(place) {
var e = createTiddlyElement(place,"span");
e.innerHTML = "…";
};
//#concept Object
//
abego.shallowCopy = function(object) {
if (!object)
return object;
var result = {};
for (var n in object)
result[n] = object[n];
return result;
};
// Returns a shallow copy of the options, or a new, empty object if options is null/undefined.
//
// @param options [may be null/undefined]
//
//#concept Object, Options
//#import abego.shallowCopy
//
abego.copyOptions = function(options) {
return !options ? {} : abego.shallowCopy(options);
};
//#import abego.define-namespace
// returns the number of occurances of s in the text
abego.countStrings = function(text, s) {
if (!s)
return 0;
var len = s.length;
var n = 0;
var lastIndex = 0;
while (1) {
var i = text.indexOf(s, lastIndex);
if (i < 0)
return n;
n++;
lastIndex = i+len;
}
return n;
};// Returns the content of the first "braced" text {...}
// Also takes care of nested braces
//
// Returns undefined when no braced text is found or it is not properly nested
//
// @param [optional] when defined and a braced text is found lastIndexRef.lastIndex will contain the index of the char following the (final) closing brace on return.
//
abego.getBracedText = function(text, offset,lastIndexRef) {
if (!offset) offset = 0;
var re = /\{([^\}]*)\}/gm;
re.lastIndex = offset;
var m = re.exec(text);
if (m) {
// The matching stopped at the first closing brace.
// But if the matched text contains opening braces
// this is not the final closing brace.
// Handle this case specially, find the "corresponding" closing brace
var s = m[1];
var nExtraOpenBrace = abego.countStrings(s,"{");
if (!nExtraOpenBrace) {
if (lastIndexRef)
lastIndexRef.lastIndex = re.lastIndex;
// simple case: no nested braces
return s;
}
// special case: "nested braces"
var len = text.length;
for (var i = re.lastIndex; i < len && nExtraOpenBrace; i++) {
var c = text.charAt(i);
if (c == "{")
nExtraOpenBrace++;
else if (c == "}")
nExtraOpenBrace--;
}
if (!nExtraOpenBrace) {
// found the corresponding "}".
if (lastIndexRef)
lastIndexRef.lastIndex = i-1;
return text.substring(m.index+1, i-1);
}
}
// no return means: return undefined;
};
// Returns an array with those items from the array that pass the given test
//
// @param test an one-arg boolean function that returns true when the item should be added.
// @param testObj [optional] the receiver for the test function (global if undefined or null)
// @param result [optional] an array. When define the selected items are added to this array, otherwise a new array is used.
//
//#import Array.prototype.forEach
//
abego.select = function(array,test,testObj,result) {
if (!result) result = [];
array.forEach(function(t) {
if (test.call(testObj,t))
result.push(t);
});
return result;
};
// Class abego.TiddlerFilterTerm =================================================================
//
// Used to check if a tiddler contains a given text.
//
// A list of fields (standard and/or extended) may be specified to restrict the search to certain fields.
//
// When no explicit fields are given the fields defined by defaultFields are checked, plus all extended
// fields (when options.withExtendedFields is true).
//
// @param options [may be null/undefined]
// options.fields @seeParam abego.MultiFieldRegExpTester.fields
// options.withExtendedFields @seeParam abego.MultiFieldRegExpTester.withExtendedFields
// options.caseSensitive [Default: false]
// options.fullWordMatch [Default: false]
// options.textIsRegExp [Default: false] when true the given text is already a regExp
//
//#import abego.MultiFieldRegExpTester
//
abego.TiddlerFilterTerm = function(text,options) {
if (!options) options = {};
var reText = text;
if (!options.textIsRegExp) {
reText = text.escapeRegExp();
if (options.fullWordMatch)
reText = "\\b"+reText+"\\b";
}
var regExp = new RegExp(reText, "m"+(options.caseSensitive ? "" : "i"));
this.tester = new abego.MultiFieldRegExpTester(regExp, options.fields, options.withExtendedFields);
}
abego.TiddlerFilterTerm.prototype.test = function(tiddler) {
return this.tester.test(tiddler);
}
//#import abego.define-namespace
// Recognize a string like
// "Some Title. Some content text #Tag1 #Tag2 Tag3"
// with the tags and the text being optional.
// Also the period at the end of the title is optional when no content text is specified)
//
// Returns the result in an object with properties "title" and "params",
// with "params" following the parseParams format, containing the "tag" and "text" arguments.
//
abego.parseNewTiddlerCommandLine = function(s) {
var m = /(.*?)\.(?:\s+|$)([^#]*)(#.*)?/.exec(s);
if (!m)
m = /([^#]*)()(#.*)?/.exec(s);
if (m) {
var r;
if (m[3]) {
var s2 = m[3].replace(/#/g,"");
r = s2.parseParams("tag");
} else
r = [[]];
// add the text parameter
var text = m[2]?m[2].trim():"";
r.push({name: "text", value: text});
r[0].text = [text];
return {title: m[1].trim(), params: r};
} else
return {title: s.trim(),params: [[]]};
}
// options.defaultFields [@seeOptionDefault abego.TiddlerFilterTerm.fields] fields to check when no fields are explicitly specified in queryText.
// options.withExtendedFields [@seeOptionDefault abego.TiddlerFilterTerm.withExtendedFields] when true and no fields are explicitly specified in queryText also the extended fields are considered (in addition to the ones in defaultFields).
// @seeOptions abego.TiddlerFilterTerm (-fields -fullWordMatch -withExtendedFields)
//
//#import abego.getBracedText
//#import abego.copyOptions
//#import abego.TiddlerFilterTerm
//
abego.parseTiddlerFilterTerm = function(queryText,offset,options) {
// group 1: {...} (JavaScript expression)
// group 2: '=' (full word match (optional))
// group 3: [!%#] (field selection short cuts)
// group 4: fieldName ':'
// group 5: String literal "..."
// group 6: RegExp literal /.../
// group 7: scheme '://' nonSpaceChars
// group 8: word
var re = /\s*(?:(?:\{([^\}]*)\})|(?:(=)|([#%!])|(?:(\w+)\s*\:(?!\/\/))|(?:(?:("(?:(?:\\")|[^"])+")|(?:\/((?:(?:\\\/)|[^\/])+)\/)|(\w+\:\/\/[^\s]+)|([^\s\)\-\"]+)))))/mg;
var shortCuts = {'!':'title','%':'text','#':'tags'};
var fieldNames = {};
var fullWordMatch;
re.lastIndex = offset;
while (1) {
var i = re.lastIndex;
var m = re.exec(queryText);
if (!m || m.index != i)
throw "Word or String literal expected";
if (m[1]) {
var lastIndexRef = {};
var code = abego.getBracedText(queryText,0,lastIndexRef);
if (!code)
throw "Invalid {...} syntax";
var f = Function("tiddler","return ("+code+");");
return {func: f,
lastIndex:lastIndexRef.lastIndex,
markRE: null};
}
if (m[2])
fullWordMatch = true;
else if (m[3])
fieldNames[shortCuts[m[3]]] = 1;
else if (m[4])
fieldNames[m[4]] = 1;
else {
var textIsRegExp = m[6];
var text = m[5] ? window.eval(m[5]) : m[6] ? m[6] : m[7] ? m[7] : m[8];
var options = abego.copyOptions(options);
options.fullWordMatch = fullWordMatch;
options.textIsRegExp = textIsRegExp;
var fields = [];
for (var n in fieldNames)
fields.push(n);
if (fields.length == 0) {
options.fields = options.defaultFields;
} else {
options.fields = fields;
options.withExtendedFields = false;
}
var term = new abego.TiddlerFilterTerm(text,options);
var markREText = textIsRegExp ? text : text.escapeRegExp();
if (markREText && fullWordMatch)
markREText = "\\b"+markREText+"\\b";
return {func: function(tiddler) {return term.test(tiddler);},
lastIndex:re.lastIndex,
markRE: markREText ? "(?:"+markREText+")" : null};
}
}
};
// Class abego.BoolExp =================================================================
//
// Allows the execution/evaluation of a boolean expression, according to this syntax:
//
// boolExpression : unaryExpression (("AND"|"OR"|"&&"|"||")? unaryExpression)*
// ;
//
// unaryExpression : ("not"|"-")? primaryExpression
// ;
//
// primaryExpression : "(" boolExpression ")"
// | Term
// ;
//
// For flexibility the Term syntax is defined by a separate parse function.
//
// Notice that there is no precedence between "AND" and "OR" operators, i.e. they are evaluated from left to right.
//
// To evaluate the expression in a given context use code like this:
//
// var be = new abego.BoolExp(s, termParseFunc);
// var result = be.exec(context);
//
// @param s the text defining the expression
// @param parseTermFunc a Function(text,offset,options) that parses the text starting at offset for a "Term" and returns an object with properties {func: Function(context), lastIndex: ...}. func is the function to be used to evaluate the term in the given context.
// @param options [may be null/undefined] (is also passed to the parseTermFunc)
// options.defaultOperationIs_OR [Default: false] When true the concatenation of unaryExpressions (without an operator) is interpreted as an "OR", otherwise as an "AND".
// options.caseSensitive [default: false]
//
abego.BoolExp = function(s, parseTermFunc, options) {
this.s = s;
var defaultOperationIs_OR = options && options.defaultOperationIs_OR;
var reStart = /\s*(?:(\-|not)|(\())/gi; // group 1: NOT, group2 "("
var reCloseParenthesis = /\s*\)/g; // match )
var reAndOr = /\s*(?:(and|\&\&)|(or|\|\|))/gi; // group 1: AND, group 2: OR
var reNonWhiteSpace = /\s*[^\)\s]/g;
var reNot_Parenthesis = /\s*(\-|not)?(\s*\()?/gi;
var parseUnaryExpression = function(offset) {
reNot_Parenthesis.lastIndex = offset;
var m = reNot_Parenthesis.exec(s);
var negate;
var result;
if (m && m.index == offset) {
offset = reNot_Parenthesis.lastIndex;
negate = m[1];
if (m[2]) {
// case: (...)
var e = parseBoolExpression(offset);
reCloseParenthesis.lastIndex = e.lastIndex;
if (!reCloseParenthesis.exec(s))
throw "Missing ')'";
result = {func: e.func, lastIndex: reCloseParenthesis.lastIndex};
}
}
if (!result)
result = parseTermFunc(s,offset,options);
if (negate) {
result.func = (function(f){return function(context) {return !f(context);}})(result.func);
// don't mark patterns that are negated
// (This is essential since the marking may also be used to calculate "ranks". If we
// would also count the negated matches (i.e. that should not exist) the rank may get too high)
result.markRE = null;
}
return result;
};
var parseBoolExpression = function(offset) {
var result = parseUnaryExpression(offset);
while (1) {
var l = result.lastIndex;
reAndOr.lastIndex = l;
var m = reAndOr.exec(s);
var isOrCase;
var nextExp;
if (m && m.index == l) {
isOrCase = !m[1];
nextExp = parseUnaryExpression(reAndOr.lastIndex);
} else {
// no "AND" or "OR" found.
// Maybe it is a concatenations of parseUnaryExpression without operators
try {
nextExp = parseUnaryExpression(l);
} catch (e) {
// no unary expression follows. We are done
return result;
}
isOrCase = defaultOperationIs_OR;
}
result.func = (function(func1, func2, isOrCase) {
return isOrCase
? function(context) {return func1(context) || func2(context);}
: function(context) {return func1(context) && func2(context);};
})(result.func,nextExp.func,isOrCase);
result.lastIndex = nextExp.lastIndex;
if (!result.markRE)
result.markRE = nextExp.markRE;
else if (nextExp.markRE)
result.markRE = result.markRE + "|" + nextExp.markRE;
}
};
var expr = parseBoolExpression(0);
this.evalFunc = expr.func;
if (expr.markRE)
this.markRegExp = new RegExp(expr.markRE, options.caseSensitive ? "mg" : "img");
}
abego.BoolExp.prototype.exec = function() {
return this.evalFunc.apply(this,arguments);
};
abego.BoolExp.prototype.getMarkRegExp = function() {
return this.markRegExp;
};
abego.BoolExp.prototype.toString = function() {
return this.s;
};
// Class abego.MultiFieldRegExpTester ==================================================================
//
// @param fields [optional; Default: ["title","text","tags"]] array of names of fields to be considered
// @param withExtendedFields [optional; Default: false] when true also extended fields are considered (in addition to the ones given in 'fields')
//
abego.MultiFieldRegExpTester = function(re, fields, withExtendedFields) {
this.re = re;
this.fields = fields ? fields : ["title","text","tags"];
this.withExtendedFields = withExtendedFields;
}
// Returns the name of the first field found that value succeeds the given test,
// or null when no such field is found
//
abego.MultiFieldRegExpTester.prototype.test = function(tiddler) {
var re = this.re;
// Check the fields explicitly specified
for (var i = 0; i < this.fields.length; i++) {
var s = store.getValue(tiddler, this.fields[i]);
if (typeof s == "string" && re.test(s))
return this.fields[i];
}
// Check the extended fields (if required)
if (this.withExtendedFields)
return store.forEachField(
tiddler,
function(tiddler, fieldName, value) {
return typeof value == "string" && re.test(value)?fieldName:null;
}, true);
return null;
}
// Class abego.TiddlerQuery ==================================================================
//
//#import abego.select
//#import abego.MultiFieldRegExpTester
//
abego.TiddlerQuery = function(queryText,caseSensitive,useRegExp,defaultFields,withExtendedFields) {
if (useRegExp) {
this.regExp = new RegExp(queryText, caseSensitive ? "mg" : "img");
this.tester = new abego.MultiFieldRegExpTester(this.regExp, defaultFields, withExtendedFields);
} else {
this.expr = new abego.BoolExp(
queryText,
abego.parseTiddlerFilterTerm, {
defaultFields: defaultFields,
caseSensitive: caseSensitive,
withExtendedFields: withExtendedFields});
}
this.getQueryText = function() {
return queryText;
};
this.getUseRegExp = function() {
return useRegExp;
};
this.getCaseSensitive = function() {
return caseSensitive;
};
this.getDefaultFields = function() {
return defaultFields;
};
this.getWithExtendedFields = function() {
return withExtendedFields;
};
}
// Returns true iff the query includes the given tiddler
//
// @param tiddler [may be null/undefined]
//
abego.TiddlerQuery.prototype.test = function(tiddler) {
if (!tiddler) return false;
if (this.regExp) {
return this.tester.test(tiddler);
}
return this.expr.exec(tiddler);
};
// Returns an array with those tiddlers from the tiddlers array that match the query.
//
abego.TiddlerQuery.prototype.filter = function(tiddlers) {
return abego.select(tiddlers,this.test,this);
};
abego.TiddlerQuery.prototype.getMarkRegExp = function() {
if (this.regExp) {
// Only use the regExp for marking when it does not match the empty string.
return "".search(this.regExp) >= 0 ? null : this.regExp;
}
return this.expr.getMarkRegExp();
};
abego.TiddlerQuery.prototype.toString = function() {
return (this.regExp ? this.regExp : this.expr).toString();
};
// Class abego.PageWiseRenderer ================================================
//
// Subclass or instance must implement getItemsPerPage function;
// They should also implement onPageChanged and refresh the container of the
// PageWiseRenderer on that event.
//
//#import abego.toInt
//
abego.PageWiseRenderer = function() {
this.firstIndexOnPage = 0; // The index of the first item of the lastResults list displayed on the search result page
};
merge(abego.PageWiseRenderer.prototype, {
setItems: function(items) {
this.items = items;
this.setFirstIndexOnPage(0);
},
// Maximum number of pages listed in the navigation bar (before or after the current page)
//
getMaxPagesInNavigation: function() {
return 10;
},
getItemsCount: function(items) {
return this.items ? this.items.length : 0;
},
getCurrentPageIndex: function() {
return Math.floor(this.firstIndexOnPage / this.getItemsPerPage());
},
getLastPageIndex: function() {
return Math.floor((this.getItemsCount()-1) / this.getItemsPerPage())
},
setFirstIndexOnPage: function(index) {
this.firstIndexOnPage = Math.min(Math.max(0, index), this.getItemsCount()-1);
},
getFirstIndexOnPage: function() {
// Ensure that the firstIndexOnPage is really a page start.
// This may have become violated when getItemsPerPage has changed,
// (e.g. when switching between previewText and simple mode.)
this.firstIndexOnPage = Math.floor(this.firstIndexOnPage / this.getItemsPerPage()) * this.getItemsPerPage();
return this.firstIndexOnPage;
},
getLastIndexOnPage: function() {
return Math.min(this.getFirstIndexOnPage()+this.getItemsPerPage()-1, this.getItemsCount()-1);
},
onPageChanged: function(pageIndex,oldPageIndex) {
},
renderPage: function(itemRenderer) {
if (itemRenderer.beginRendering)
itemRenderer.beginRendering(this);
try {
// When there are items found add them to the result page (pagewise)
if (this.getItemsCount()) {
// Add the items of the current page
var lastIndex = this.getLastIndexOnPage();
var iInPage = -1;
for (var i=this.getFirstIndexOnPage(); i <= lastIndex; i++) {
iInPage++;
itemRenderer.render(this,this.items[i],i,iInPage);
}
}
} finally {
if (itemRenderer.endRendering)
itemRenderer.endRendering(this);
}
},
addPageNavigation: function(place) {
if (!this.getItemsCount()) return;
var self = this;
var onNaviButtonClick = function(e) {
if (!e) var e = window.event;
var pageIndex = abego.toInt(this.getAttribute("page"),0);
var oldPageIndex = self.getCurrentPageIndex();
if (pageIndex == oldPageIndex)
return;
var index = pageIndex * self.getItemsPerPage();
self.setFirstIndexOnPage(index);
self.onPageChanged(pageIndex,oldPageIndex);
};
var button;
var currentPageIndex = this.getCurrentPageIndex();
var lastPageIndex = this.getLastPageIndex();
if (currentPageIndex > 0) {
button = createTiddlyButton(place, "Previous", "Go to previous page (Shortcut: Alt-'<')", onNaviButtonClick, "prev");
button.setAttribute("page",(currentPageIndex-1).toString());
button.setAttribute("accessKey","<");
}
for (var i = -this.getMaxPagesInNavigation(); i < this.getMaxPagesInNavigation(); i++) {
var pageIndex = currentPageIndex+i;
if (pageIndex < 0) continue;
if (pageIndex > lastPageIndex) break;
var pageNo = (i+currentPageIndex+1).toString();
var buttonClass = pageIndex == currentPageIndex ? "currentPage" : "otherPage";
button = createTiddlyButton(place, pageNo, "Go to page %0".format([pageNo]), onNaviButtonClick, buttonClass);
button.setAttribute("page",(pageIndex).toString());
}
if (currentPageIndex < lastPageIndex) {
button = createTiddlyButton(place, "Next", "Go to next page (Shortcut: Alt-'>')", onNaviButtonClick, "next");
button.setAttribute("page",(currentPageIndex+1).toString());
button.setAttribute("accessKey",">");
}
}
});
// Class abego.LimitedTextRenderer ===========================================================
//
// Renders a given text, ensuring that a given limit of number of characters
// is not exceeded.
//
// A "markRegExp" may be specified. Substring matching this regular expression
// ("matched strings") are rendered with the class "marked".
//
// if the given text is longer than the limit the matched strings are preferred
// to be included in the rendered text (with some leading and trailing "context text").
//
// Example:
// var renderer = new abego.LimitedTextRenderer();
//
// var place = ... // a DOM element that should contain the rendered (limited) text
// var s = "This is another 'Hello World' example, as saying 'Hello' is always nice. So let's say it again: >Hello!<";
// var maxLen = 50;
// var markRE = /hello/gi;
// renderer.render(place,s,maxLen,markRE);
//
//#import abego.createEllipsis
//
abego.LimitedTextRenderer = function() {
var minMatchWithContextSize = 40;
var maxMovementForWordCorrection = 4; // When a "match" context starts or end on a word the context borders may be changed to at most this amount to include or exclude the word.
//----------------------------------------------------------------------------
//
// Ranges
//
// Objects with a "start" and "end" property (not a specific class).
//
// In a corresponding "Ranges array" these objects are sorted by their start
// and no Range object intersects/touches any other in the array.
//
//----------------------------------------------------------------------------
// Adds the Range [startIndex,endIndex[ to the ranges, ensuring that the Ranges
// in the array are sorted by their start and no Range object
// intersects/touches any other in the array (i.e. possibly the new Range is
// "merged" with existing ranges)
//
// @param ranges array of Range objects
//
var addRange = function(ranges, startIndex, endIndex) {
var n = ranges.length;
// When there are no ranges in ranges, just add it.
if (n == 0) {
ranges.push({start: startIndex, end: endIndex});
return;
}
var i = 0;
for (; i < n; i++) {
var range = ranges[i];
// find the first range that intersects or "touches" [startIndex, endIndex[
if (range.start <= endIndex && startIndex <= range.end) {
// Found.
var r;
// find the first range behind the new range that does not interfere
var rIndex = i+1;
for (; rIndex < n; rIndex++) {
r = ranges[rIndex];
if (r.start > endIndex || startIndex > range.end) {
break;
}
}
// Replace the ranges i to rIndex-1 with the union of the new range with these ranges.
var unionStart = startIndex;
var unionEnd = endIndex;
for (var j = i; j < rIndex; j++) {
r = ranges[j];
unionStart = Math.min(unionStart, r.start);
unionEnd = Math.max(unionEnd, r.end);
}
ranges.splice(i, rIndex-i, {start: unionStart, end: unionEnd});
return;
}
// if we found a range R that is right of the new range there is no
// intersection and we can insert the new range before R.
if (range.start > endIndex) {
break;
}
}
// When we are here the new range does not interfere with any range in ranges and
// i is the index of the first range right to it (or ranges.length, when the new range
// becomes the right most range).
ranges.splice(i, 0, {start: startIndex, end: endIndex});
};
// Returns the total size of all Ranges in ranges
//
var getTotalRangesSize = function(ranges) {
var totalRangeSize = 0;
for (var i=0; i < ranges.length; i++) {
var range = ranges[i];
totalRangeSize += range.end-range.start;
}
return totalRangeSize;
};
//----------------------------------------------------------------------------
var isWordChar = function(c) {
return (c >= "a" && c <= "z") || (c >= "A" && c <= "Z") || c == "_";
};
// Returns the bounds of the word in s around offset as a {start: , end:} object.
//
// Returns null when the char at offset is not a word char.
//
var getWordBounds = function(s, offset) {
// Handle the "offset is not in word" case
if (!isWordChar(s[offset])) return null;
for (var i = offset-1; i >= 0 && isWordChar(s[i]); i--)
{/*empty*/}
var startIndex = i+1;
var n = s.length;
for (i = offset+1; i < n && isWordChar(s[i]); i++)
{/*empty*/}
return {start: startIndex, end: i};
};
var moveToWordBorder = function(s, offset, isStartOffset) {
var wordBounds;
if (isStartOffset) {
wordBounds = getWordBounds(s, offset);
} else {
if (offset <= 0) return offset;
wordBounds = getWordBounds(s, offset-1);
}
if (!wordBounds) return offset;
if (isStartOffset) {
if (wordBounds.start >= offset-maxMovementForWordCorrection) return wordBounds.start;
if (wordBounds.end <= offset+maxMovementForWordCorrection) return wordBounds.end;
} else {
if (wordBounds.end <= offset+maxMovementForWordCorrection) return wordBounds.end;
if (wordBounds.start >= offset-maxMovementForWordCorrection) return wordBounds.start;
}
return offset;
};
// Splits s into a sequence of "matched" and "unmatched" substrings, using the
// matchRegExp to do the matching.
//
// Returns an array of objects with a "text" property containing the substring text.
// Substrings that are "matches" also contain a boolean "isMatch" property set to true.
//
// @param matchRegExp [may be null] when null no matching is performed and the returned
// array just contains one item with s as its text
//
var getTextAndMatchArray = function(s, matchRegExp) {
var result = [];
if (matchRegExp) {
var startIndex = 0;
var n = s.length;
var currentLen = 0;
do {
matchRegExp.lastIndex = startIndex;
var match = matchRegExp.exec(s);
if (match) {
if (startIndex < match.index) {
var t = s.substring(startIndex, match.index);
result.push({text:t});
}
result.push({text:match[0], isMatch:true});
startIndex = match.index + match[0].length;
} else {
result.push({text: s.substr(startIndex)});
break;
}
} while (true);
} else {
result.push({text: s});
}
return result;
};
var getMatchedTextCount = function(textAndMatches) {
var result = 0;
for (var i=0; i < textAndMatches.length; i++) {
if (textAndMatches[i].isMatch) {
result++;
}
}
return result;
};
var getContextRangeAround = function(s, startIndex, endIndex, matchCount, maxLen) {
// Partition the available space into equal sized areas for each match and one
// for the text start.
// But the size should not go below a certain limit
var size = Math.max(Math.floor(maxLen/(matchCount+1)), minMatchWithContextSize);
// Substract the size of the range to get the size of the context.
var contextSize = Math.max(size-(endIndex-startIndex), 0);
// Two thirds of the context should be before the match, one third after.
var contextEnd = Math.min(Math.floor(endIndex+contextSize/3), s.length);
var contextStart = Math.max(contextEnd - size, 0);
// If the contextStart/End is inside a word and the end of the word is
// close move the pointers accordingly to make the text more readable.
contextStart = moveToWordBorder(s, contextStart, true);
contextEnd = moveToWordBorder(s, contextEnd, false);
return {start: contextStart, end: contextEnd};
};
// Get all ranges around matched substrings with their contexts
//
var getMatchedTextWithContextRanges = function(textAndMatches, s, maxLen) {
var ranges = [];
var matchCount = getMatchedTextCount(textAndMatches);
var pos = 0;
for (var i=0; i < textAndMatches.length; i++) {
var t = textAndMatches[i];
var text = t.text;
if (t.isMatch) {
var range = getContextRangeAround(s, pos, pos+text.length, matchCount, maxLen);
addRange(ranges, range.start, range.end);
}
pos += text.length;
}
return ranges;
};
var fillUpRanges = function(s, ranges, maxLen) {
var remainingLen = maxLen - getTotalRangesSize(ranges);
while (remainingLen > 0) {
if (ranges.length == 0) {
// No matches added yet. Make one large range.
addRange(ranges, 0, moveToWordBorder(s, maxLen, false));
return;
} else {
var range = ranges[0];
var startIndex;
var maxEndIndex;
if (range.start == 0) {
// The first range already starts at the beginning of the string.
// When there is a second range fill to the next range start or to the maxLen.
startIndex = range.end;
if (ranges.length > 1) {
maxEndIndex = ranges[1].start;
} else {
// Only one range. Add a range after that with the complete remaining len
// (corrected to "beautify" the output)
addRange(ranges, startIndex, moveToWordBorder(s, startIndex+remainingLen, false));
return;
}
} else {
// There is unused space between the start of the text and the first range.
startIndex = 0;
maxEndIndex = range.start;
}
var endIndex = Math.min(maxEndIndex, startIndex+remainingLen);
addRange(ranges, startIndex, endIndex);
remainingLen -= (endIndex-startIndex);
}
}
};
// Write the given ranges of s, using textAndMatches for marking portions of the text.
//
var writeRanges = function(place, s, textAndMatches, ranges, maxLen) {
if (ranges.length == 0) return;
// Processes the text between startIndex and endIndex of the textAndMatches
// "writes" them (as DOM elements) at the given place, possibly as "marked" text.
//
// When endIndex is not the end of the full text an ellisis is appended.
//
var writeTextAndMatchRange = function(place, s, textAndMatches, startIndex, endIndex) {
var t;
var text;
// find the first text item to write
var pos = 0;
var i = 0;
var offset = 0;
for (;i < textAndMatches.length; i++) {
t = textAndMatches[i];
text = t.text;
if (startIndex < pos+text.length) {
offset = startIndex - pos;
break;
}
pos += text.length;
}
var remainingLen = endIndex - startIndex;
for (; i < textAndMatches.length && remainingLen > 0; i++) {
t = textAndMatches[i];
text = t.text.substr(offset);
offset = 0;
if (text.length > remainingLen) text = text.substr(0,remainingLen);
if (t.isMatch) {
createTiddlyElement(place,"span",null,"marked",text);
} else {
createTiddlyText(place, text);
}
remainingLen -= text.length;
}
if (endIndex < s.length) {
abego.createEllipsis(place);
}
};
// When the first range is not at the start of the text write an ellipsis("...")
// (Ellipses between ranges are written in the writeTextAndMatchRange method)
if (ranges[0].start > 0) abego.createEllipsis(place);
var remainingLen = maxLen;
for (var i = 0; i < ranges.length && remainingLen > 0; i++) {
var range = ranges[i];
var len = Math.min(range.end - range.start, remainingLen);
writeTextAndMatchRange(place, s, textAndMatches, range.start, range.start+len);
remainingLen -= len;
}
};
this.render = function(place,s,maxLen,markRegExp) {
if (s.length < maxLen) maxLen = s.length;
var textAndMatches = getTextAndMatchArray(s, markRegExp);
var ranges = getMatchedTextWithContextRanges(textAndMatches, s, maxLen);
// When the maxLen is not yet reached add more ranges
// starting from the beginning until either maxLen or
// the end of the string is reached.
fillUpRanges(s, ranges, maxLen);
writeRanges(place, s, textAndMatches, ranges, maxLen);
};
};
(function() {
function alertAndThrow(msg) {
alert(msg);
throw msg;
};
if (version.major < 2 || (version.major == 2 && version.minor < 1))
alertAndThrow("YourSearchPlugin requires TiddlyWiki 2.1 or newer.\n\nCheck the archive for YourSearch plugins\nsupporting older versions of TiddlyWiki.\n\nArchive: http://tiddlywiki.abego-software.de/archive");
abego.YourSearch = {};
//----------------------------------------------------------------------------
// The Search Core
//----------------------------------------------------------------------------
// Model Variables
var lastResults; // Array of tiddlers that matched the last search
var lastQuery; // The last Search query (TiddlerQuery)
var setLastResults = function(array) {
lastResults = array;
};
var getLastResults = function() {
return lastResults ? lastResults : [];
};
var getLastResultsCount = function() {
return lastResults ? lastResults.length : 0;
};
// Standard Ranking Weights
var matchInTitleWeight = 4;
var precisionInTitleWeight = 10;
var matchInTagsWeight = 2;
var getMatchCount = function(s, re) {
var m = s.match(re);
return m ? m.length : 0;
};
var standardRankFunction = function(tiddler, query) {
// Count the matches in the title and the tags
var markRE = query.getMarkRegExp();
if (!markRE) return 1;
var matchesInTitle = tiddler.title.match(markRE);
var nMatchesInTitle = matchesInTitle ? matchesInTitle.length : 0;
var nMatchesInTags = getMatchCount(tiddler.getTags(), markRE);
// Calculate the "precision" of the matches in the title as the ratio of
// the length of the matches to the total length of the title.
var lengthOfMatchesInTitle = matchesInTitle ? matchesInTitle.join("").length : 0;
var precisionInTitle = tiddler.title.length > 0 ? lengthOfMatchesInTitle/tiddler.title.length : 0;
// calculate a weighted score
var rank= nMatchesInTitle * matchInTitleWeight
+ nMatchesInTags * matchInTagsWeight
+ precisionInTitle * precisionInTitleWeight
+ 1;
return rank;
};
// @return Tiddler[]
//
var findMatches = function(store, searchText,caseSensitive,useRegExp,sortField,excludeTag) {
lastQuery = null;
var candidates = store.reverseLookup("tags",excludeTag,false);
try {
var defaultFields = [];
if (config.options.chkSearchInTitle) defaultFields.push("title");
if (config.options.chkSearchInText) defaultFields.push("text");
if (config.options.chkSearchInTags) defaultFields.push("tags");
lastQuery = new abego.TiddlerQuery(
searchText,caseSensitive, useRegExp,defaultFields,config.options.chkSearchExtendedFields);
} catch (e) {
// when an invalid query is given no tiddlers are matched
return [];
}
var results = lastQuery.filter(candidates);
// Rank the results
var rankFunction = abego.YourSearch.getRankFunction();
for (var i = 0; i < results.length; i++) {
var tiddler = results[i];
var rank = rankFunction(tiddler, lastQuery);
// Add the rank information to the tiddler.
// This is used during the sorting, but it may also
// be used in the result, e.g. to display some "relevance"
// information in the result
tiddler.searchRank = rank;
}
// sort the result, taking care of the rank and the sortField
if(!sortField) {
sortField = "title";
}
var sortFunction = function (a,b) {
var searchRankDiff = a.searchRank - b.searchRank;
if (searchRankDiff == 0) {
if (a[sortField] == b[sortField]) {
return(0);
} else {
return (a[sortField] < b[sortField]) ? -1 : +1;
}
} else {
return (searchRankDiff > 0) ? -1 : +1;
}
};
results.sort(sortFunction);
return results;
};
//----------------------------------------------------------------------------
// The Search UI (Result page)
//----------------------------------------------------------------------------
// Visual appearance of the result page
var maxCharsInTitle = 80;
var maxCharsInTags = 50;
var maxCharsInText = 250;
var maxCharsInField = 50;
var itemsPerPageDefault = 25; // Default maximum number of items on one search result page
var itemsPerPageWithPreviewDefault = 10; // Default maximum number of items on one search result page when PreviewText is on
// DOM IDs
var yourSearchResultID = "yourSearchResult";
var yourSearchResultItemsID = "yourSearchResultItems";
var lastSearchText; // The last search text, as passed to findMatches
var resultElement; // The (popup) DOM element containing the search result [may be null]
var searchInputField; // The "search" input field
var searchButton; // The "search" button
var lastNewTiddlerButton;
var initStylesheet = function() {
if (version.extensions.YourSearchPlugin.styleSheetInited)
return;
version.extensions.YourSearchPlugin.styleSheetInited = true;
setStylesheet(store.getTiddlerText("YourSearchStyleSheet"),"yourSearch");
}
var isResultOpen = function() {
return resultElement != null && resultElement.parentNode == document.body;
};
var closeResult = function() {
if (isResultOpen()) {
document.body.removeChild(resultElement);
}
};
// Closes the Search Result window and displays the tiddler
// defined by the "tiddlyLink" attribute of this element
//
var closeResultAndDisplayTiddler = function(e)
{
closeResult();
var title = this.getAttribute("tiddlyLink");
if(title) {
var withHilite = this.getAttribute("withHilite");
var oldHighlightHack = highlightHack;
if (withHilite && withHilite=="true" && lastQuery) {
highlightHack = lastQuery.getMarkRegExp();
}
story.displayTiddler(this,title);
highlightHack = oldHighlightHack;
}
return(false);
};
// Adjusts the resultElement's size and position, relative to the search input field.
//
var adjustResultPositionAndSize = function() {
if (!searchInputField) return;
var root = searchInputField;
// Position the result below the root and resize it if necessary.
var rootLeft = findPosX(root);
var rootTop = findPosY(root);
var rootHeight = root.offsetHeight;
var popupLeft = rootLeft;
var popupTop = rootTop + rootHeight;
// Make sure the result is not wider than the window
var winWidth = findWindowWidth();
if (winWidth < resultElement.offsetWidth) {
resultElement.style.width = (winWidth - 100)+"px";
winWidth = findWindowWidth();
}
// Ensure that the left and right of the result are not
// clipped by the window. Move it to the left or right, if necessary.
var popupWidth = resultElement.offsetWidth;
if(popupLeft + popupWidth > winWidth)
popupLeft = winWidth - popupWidth-30;
if (popupLeft < 0) popupLeft = 0;
// Do the actual moving
resultElement.style.left = popupLeft + "px";
resultElement.style.top = popupTop + "px";
resultElement.style.display = "block";
};
var scrollVisible = function() {
// Scroll the window to make the result page (and the search Input field) visible.
if (resultElement) window.scrollTo(0,ensureVisible(resultElement));
if (searchInputField) window.scrollTo(0,ensureVisible(searchInputField));
};
// Makes sure the result page has a good size and position and visible
// (may scroll the window)
//
var ensureResultIsDisplayedNicely = function() {
adjustResultPositionAndSize();
scrollVisible();
};
var indexInPage; // The index (in the current page) of the tiddler currently rendered.
var currentTiddler; // While rendering the page the tiddler that is currently rendered.
var pager = new abego.PageWiseRenderer();
var MyItemRenderer = function(parent) {
// Load the template how to display the items that represent a found tiddler
this.itemHtml = store.getTiddlerText("YourSearchItemTemplate");
if (!this.itemHtml) alertAndThrow("YourSearchItemTemplate not found");
// Locate the node that shall contain the list of found tiddlers
this.place = document.getElementById(yourSearchResultItemsID);
if(!this.place)
this.place = createTiddlyElement(parent,"div",yourSearchResultItemsID);
};
merge(MyItemRenderer.prototype,{
render: function(pager,object,index,indexOnPage) {
// Define global variables, referenced by macros during applyHtmlMacros
indexInPage = indexOnPage;
currentTiddler = object;
var item = createTiddlyElement(this.place,"div",null, "yourSearchItem");
item.innerHTML = this.itemHtml;
applyHtmlMacros(item,null);
refreshElements(item,null);
},
endRendering: function(pager) {
// The currentTiddler must only be defined while rendering the found tiddlers
currentTiddler = null;
}
});
// Refreshes the content of the result with the current search result
// of the selected page.
//
// Assumes that the result is already open.
//
var refreshResult = function() {
if (!resultElement || !searchInputField) return;
// Load the template for the YourSearchResult
var html = store.getTiddlerText("YourSearchResultTemplate");
if (!html) html = "<b>Tiddler YourSearchResultTemplate not found</b>";
resultElement.innerHTML = html;
// Expand the template macros etc.
applyHtmlMacros(resultElement,null);
refreshElements(resultElement,null);
var itemRenderer = new MyItemRenderer(resultElement);
pager.renderPage(itemRenderer);
ensureResultIsDisplayedNicely();
};
pager.getItemsPerPage = function() {
var n = (config.options.chkPreviewText)
? abego.toInt(config.options.txtItemsPerPageWithPreview, itemsPerPageWithPreviewDefault)
: abego.toInt(config.options.txtItemsPerPage, itemsPerPageDefault);
return (n > 0) ? n : 1;
};
pager.onPageChanged = function() {
refreshResult();
};
var showResult = function() {
if (!resultElement) {
resultElement = createTiddlyElement(document.body,"div",yourSearchResultID,"yourSearchResult");
} else if (resultElement.parentNode != document.body) {
document.body.appendChild(resultElement);
}
refreshResult();
};
var reopenResultIfApplicable = function() {
if (searchInputField == null || !config.options.chkUseYourSearch) return;
if ((searchInputField.value == lastSearchText) && lastSearchText && !isResultOpen()) {
// For speedup we check re-use the previously created resultElement, if possible.
if (resultElement && (resultElement.parentNode != document.body)) {
document.body.appendChild(resultElement);
ensureResultIsDisplayedNicely();
} else {
showResult();
}
}
};
var invalidateResult = function() {
closeResult();
resultElement = null;
lastSearchText = null;
};
//-------------------------------------------------------------------------
// Close the search result page when the user clicks on the document
// (and not into the searchInputField, on the search button or in the result)
// or presses the ESC key
// Returns true if e is either self or a descendant (child, grandchild,...) of self.
//
// @param self DOM:Element
// @param e DOM:Element or null
//
var isDescendantOrSelf = function(self, e) {
while (e != null) {
if (self == e) return true;
e = e.parentNode;
}
return false;
};
var onDocumentClick = function(e) {
if (e.target == searchInputField) return;
if (e.target == searchButton) return;
if (resultElement && isDescendantOrSelf(resultElement, e.target)) return;
closeResult();
};
var onDocumentKeyup = function(e) {
// Close the search result page when the user presses "ESC"
if (e.keyCode == 27) closeResult();
};
addEvent(document,"click",onDocumentClick);
addEvent(document,"keyup",onDocumentKeyup);
// Our Search Macro Hijack Function ==========================================
// Helper
var myStorySearch = function(text,useCaseSensitive,useRegExp)
{
lastSearchText = text;
setLastResults(findMatches(store, text,useCaseSensitive,useRegExp,"title","excludeSearch"));
highlightHack = lastQuery ? lastQuery.getMarkRegExp() : null;
pager.setItems(getLastResults());
showResult();
highlightHack = null;
};
var myMacroSearchHandler = function(place,macroName,params,wikifier,paramString,tiddler)
{
initStylesheet();
lastSearchText = "";
var searchTimeout = null;
var doSearch = function(txt)
{
if (config.options.chkUseYourSearch)
myStorySearch(txt.value,config.options.chkCaseSensitiveSearch,config.options.chkRegExpSearch);
else
story.search(txt.value,config.options.chkCaseSensitiveSearch,config.options.chkRegExpSearch);
lastSearchText = txt.value;
};
var clickHandler = function(e)
{
doSearch(searchInputField);
return false;
};
var keyHandler = function(e)
{
if (!e) var e = window.event;
searchInputField = this;
switch(e.keyCode)
{
case 13:
if (e.ctrlKey && lastNewTiddlerButton && isResultOpen())
lastNewTiddlerButton.onclick.apply(lastNewTiddlerButton,[e]);
else
doSearch(this);
break;
case 27:
// When the result is open, close it,
// otherwise clear the content of the input field
if (isResultOpen()) {
closeResult();
} else {
this.value = "";
clearMessage();
}
break;
}
if (String.fromCharCode(e.keyCode) == this.accessKey || e.altKey)
{
reopenResultIfApplicable();
}
if(this.value.length<3 && searchTimeout) clearTimeout(searchTimeout);
if(this.value.length > 2)
{
if (this.value != lastSearchText)
{
if (!config.options.chkUseYourSearch || config.options.chkSearchAsYouType)
{
if(searchTimeout)
clearTimeout(searchTimeout);
var txt = this;
searchTimeout = setTimeout(function() {doSearch(txt);},500);
}
}
else
{
if(searchTimeout)
clearTimeout(searchTimeout);
}
};
if (this.value.length == 0)
{
closeResult();
}
};
var focusHandler = function(e)
{
this.select();
clearMessage();
reopenResultIfApplicable();
};
var args = paramString.parseParams("list",null,true);
var buttonAtRight = getFlag(args, "buttonAtRight");
var sizeTextbox = getParam(args, "sizeTextbox", this.sizeTextbox);
var btn;
if (!buttonAtRight)
btn = createTiddlyButton(place,this.label,this.prompt,clickHandler);
var txt = createTiddlyElement(place,"input",null,null,null);
if(params[0])
txt.value = params[0];
txt.onkeyup = keyHandler;
txt.onfocus = focusHandler;
txt.setAttribute("size",sizeTextbox);
txt.setAttribute("accessKey",this.accessKey);
txt.setAttribute("autocomplete","off");
if(config.browser.isSafari)
{
txt.setAttribute("type","search");
txt.setAttribute("results","5");
}
else
txt.setAttribute("type","text");
if (buttonAtRight)
btn = createTiddlyButton(place,this.label,this.prompt,clickHandler);
searchInputField = txt;
searchButton = btn;
};
//----------------------------------------------------------------------------
// Support for Macros
//----------------------------------------------------------------------------
var openAllFoundTiddlers = function() {
closeResult();
var results = getLastResults();
var n = results.length;
if (n) {
var titles=[];
for(var i = 0; i<n; i++)
titles.push(results[i].title);
story.displayTiddlers(null,titles);
}
};
var createOptionWithRefresh = function(place, optionParams, wikifier,tiddler) {
invokeMacro(place,"option",optionParams,wikifier,tiddler);
// The option macro appended the component at the end of the place.
var elem = place.lastChild;
var oldOnClick = elem.onclick;
elem.onclick = function(e) {
var result = oldOnClick.apply(this, arguments);
refreshResult();
return result;
};
return elem;
};
var removeTextDecoration = function(s) {
var removeThis = ["''", "{{{", "}}}", "//", "<<<", "/***", "***/"];
var reText = "";
for (var i = 0; i < removeThis.length; i++) {
if (i != 0) reText += "|";
reText += "("+removeThis[i].escapeRegExp()+")";
}
return s.replace(new RegExp(reText, "mg"), "").trim();
};
// Returns the "shortcut number" of the currentTiddler.
// I.e. When the user presses Alt-n the given tiddler is opened/display.
//
// @return 0-9 or -1 when no number is defined
//
var getShortCutNumber = function() {
var i = indexInPage;
return (i >= 0 && i <= 9)
? (i < 9 ? (i+1) : 0)
: -1;
};
var limitedTextRenderer = new abego.LimitedTextRenderer();
var renderLimitedText = function(place, s, maxLen) {
limitedTextRenderer.render(place,s,maxLen,lastQuery.getMarkRegExp())
}
// When any tiddler are changed reset the result.
//
var oldTiddlyWikiSaveTiddler = TiddlyWiki.prototype.saveTiddler;
TiddlyWiki.prototype.saveTiddler = function(title,newTitle,newBody,modifier,modified,tags,fields) {
oldTiddlyWikiSaveTiddler.apply(this, arguments);
invalidateResult();
};
var oldTiddlyWikiRemoveTiddler = TiddlyWiki.prototype.removeTiddler;
TiddlyWiki.prototype.removeTiddler = function(title) {
oldTiddlyWikiRemoveTiddler.apply(this, arguments);
invalidateResult();
};
//----------------------------------------------------------------------------
// Macros
//----------------------------------------------------------------------------
// ====Macro yourSearch ================================================
config.macros.yourSearch = {
// Standard Properties
label: "yourSearch",
prompt: "Gives access to the current/last YourSearch result",
handler: function(place,macroName,params,wikifier,paramString,tiddler) {
if (params.length == 0) return;
var name = params[0];
var func = config.macros.yourSearch.funcs[name];
if (func) func(place,macroName,params,wikifier,paramString,tiddler);
},
tests: {
"true" : function() {return true;},
"false" : function() {return false;},
"found" : function() {return getLastResultsCount() > 0;},
"previewText" : function() {return config.options.chkPreviewText;}
},
funcs: {
itemRange: function(place) {
if (getLastResultsCount()) {
var lastIndex = pager.getLastIndexOnPage();
var s = "%0 - %1".format([pager.getFirstIndexOnPage()+1,lastIndex+1]);
createTiddlyText(place, s);
}
},
count: function(place) {
createTiddlyText(place, getLastResultsCount().toString());
},
query: function(place) {
if (lastQuery) {
createTiddlyText(place, lastQuery.toString());
}
},
version: function(place) {
var t = "YourSearch %0.%1.%2".format(
[version.extensions.YourSearchPlugin.major,
version.extensions.YourSearchPlugin.minor,
version.extensions.YourSearchPlugin.revision]);
var e = createTiddlyElement(place, "a");
e.setAttribute("href", "http://tiddlywiki.abego-software.de/#YourSearchPlugin");
e.innerHTML = '<font color="black" face="Arial, Helvetica, sans-serif">'+t+'<font>';
},
copyright: function(place) {
var e = createTiddlyElement(place, "a");
e.setAttribute("href", "http://www.abego-software.de");
e.innerHTML = '<font color="black" face="Arial, Helvetica, sans-serif">© 2005-2006 <b><font color="red">abego</font></b> Software<font>';
},
newTiddlerButton: function(place) {
if (lastQuery) {
var r = abego.parseNewTiddlerCommandLine(lastQuery.getQueryText());
var btn = config.macros.newTiddler.createNewTiddlerButton(place,r.title,r.params,"new tiddler","Create a new tiddler based on search text. (Shortcut: Ctrl-Enter; Separators: '.', '#')",null,"text");
// Close the result before the new tiddler is created.
var oldOnClick = btn.onclick;
btn.onclick = function() {
closeResult();
oldOnClick.apply(this,arguments);
}
lastNewTiddlerButton = btn;
}
},
linkButton: function(place,macroName,params,wikifier,paramString,tiddler) {
if (params < 2) return;
var tiddlyLink = params[1];
var text = params < 3 ? tiddlyLink : params[2];
var tooltip = params < 4 ? text : params[3];
var accessKey = params < 5 ? null : params[4];
var btn = createTiddlyButton(place,text,tooltip,closeResultAndDisplayTiddler,null,null, accessKey);
btn.setAttribute("tiddlyLink",tiddlyLink);
},
closeButton: function(place,macroName,params,wikifier,paramString,tiddler) {
var button = createTiddlyButton(place, "close", "Close the Search Results (Shortcut: ESC)", closeResult);
},
openAllButton: function(place,macroName,params,wikifier,paramString,tiddler) {
var n = getLastResultsCount();
if (n == 0) return;
var title = n == 1 ? "open tiddler" : "open all %0 tiddlers".format([n]);
var button = createTiddlyButton(place, title, "Open all found tiddlers (Shortcut: Alt-O)", openAllFoundTiddlers);
button.setAttribute("accessKey","O");
},
naviBar: function(place,macroName,params,wikifier,paramString,tiddler) {
pager.addPageNavigation(place);
},
"if": function(place,macroName,params,wikifier,paramString,tiddler) {
if (params.length < 2) return;
var testName = params[1];
var negate = (testName == "not");
if (negate) {
if (params.length < 3) return;
testName = params[2];
}
var test = config.macros.yourSearch.tests[testName];
var showIt = false;
try {
if (test) {
showIt = test(place,macroName,params,wikifier,paramString,tiddler) != negate;
} else {
// When no predefined test is specified try to evaluate it as a JavaScript expression.
showIt = (!eval(testName)) == negate;
}
} catch (ex) {
}
if (!showIt) {
place.style.display="none";
}
},
chkPreviewText: function(place,macroName,params,wikifier,paramString,tiddler) {
var optionParams = params.slice(1).join(" ");
var elem = createOptionWithRefresh(place, "chkPreviewText", wikifier,tiddler);
elem.setAttribute("accessKey", "P");
elem.title = "Show text preview of found tiddlers (Shortcut: Alt-P)";
return elem;
}
}
};
// ====Macro foundTiddler ================================================
config.macros.foundTiddler = {
// Standard Properties
label: "foundTiddler",
prompt: "Provides information on the tiddler currently processed on the YourSearch result page",
handler: function(place,macroName,params,wikifier,paramString,tiddler) {
var name = params[0];
var func = config.macros.foundTiddler.funcs[name];
if (func) func(place,macroName,params,wikifier,paramString,tiddler);
},
funcs: {
title: function(place,macroName,params,wikifier,paramString,tiddler) {
if (!currentTiddler) return;
var shortcutNumber = getShortCutNumber();
var tooltip = shortcutNumber >= 0
? "Open tiddler (Shortcut: Alt-%0)".format([shortcutNumber.toString()])
: "Open tiddler";
var btn = createTiddlyButton(place,null,tooltip,closeResultAndDisplayTiddler,null);
btn.setAttribute("tiddlyLink",currentTiddler.title);
btn.setAttribute("withHilite","true");
renderLimitedText(btn, currentTiddler.title, maxCharsInTitle);
if (shortcutNumber >= 0) {
btn.setAttribute("accessKey",shortcutNumber.toString());
}
},
tags: function(place,macroName,params,wikifier,paramString,tiddler) {
if (!currentTiddler) return;
renderLimitedText(place, currentTiddler.getTags(), maxCharsInTags);
},
text: function(place,macroName,params,wikifier,paramString,tiddler) {
if (!currentTiddler) return;
renderLimitedText(place, removeTextDecoration(currentTiddler.text), maxCharsInText);
},
field: function(place,macroName,params,wikifier,paramString,tiddler) {
if (!currentTiddler) return;
var name = params[1];
var len = params.length > 2 ? abego.toInt(params[2],maxCharsInField) : maxCharsInField;
var v = store.getValue(currentTiddler,name);
if (v)
renderLimitedText(place, removeTextDecoration(v), len);
},
// Renders the "shortcut number" of the current tiddler, to indicate to the user
// what number to "Alt-press" to open the tiddler.
//
number: function(place,macroName,params,wikifier,paramString,tiddler) {
var numberToDisplay = getShortCutNumber();
if (numberToDisplay >= 0) {
var text = "%0)".format([numberToDisplay.toString()]);
createTiddlyElement(place,"span",null,"shortcutNumber",text);
}
}
}
};
//----------------------------------------------------------------------------
// Configuration Stuff
//----------------------------------------------------------------------------
var opts = {chkUseYourSearch:true,
chkPreviewText:true,
chkSearchAsYouType:true,
chkSearchInTitle:true,
chkSearchInText:true,
chkSearchInTags:true,
chkSearchExtendedFields:true,
txtItemsPerPage:itemsPerPageDefault,
txtItemsPerPageWithPreview:itemsPerPageWithPreviewDefault};
for (var n in opts)
if (config.options[n] == undefined) config.options[n] = opts[n];
//----------------------------------------------------------------------------
// Shadow Tiddlers
//----------------------------------------------------------------------------
config.shadowTiddlers.AdvancedOptions += "\n<<option chkUseYourSearch>> Use 'Your Search' //([[more options|YourSearch Options]]) ([[help|YourSearch Help]])// ";
config.shadowTiddlers["YourSearch Help"] =
"!Field Search\nWith the Field Search you can restrict your search to certain fields of a tiddler, e.g"+
" only search the tags or only the titles. The general form is //fieldname//'':''//textToSearch// (e."+
"g. {{{title:intro}}}). In addition one-character shortcuts are also supported for the standard field"+
"s {{{title}}}, {{{text}}} and {{{tags}}}:\n|!What you want|!What you type|!Example|\n|Search ''titles "+
"only''|start word with ''!''|{{{!jonny}}} (shortcut for {{{title:jonny}}})|\n|Search ''contents/text "+
"only''|start word with ''%''|{{{%football}}} (shortcut for {{{text:football}}})|\n|Search ''tags only"+
"''|start word with ''#''|{{{#Plugin}}} (shortcut for {{{tags:Plugin}}})|\n\nUsing this feature you may"+
" also search the extended fields (\"Metadata\") introduced with TiddlyWiki 2.1, e.g. use {{{priority:1"+
"}}} to find all tiddlers with the priority field set to \"1\".\n\nYou may search a word in more than one"+
" field. E.g. {{{!#Plugin}}} (or {{{title:tags:Plugin}}} in the \"long form\") finds tiddlers containin"+
"g \"Plugin\" either in the title or in the tags (but does not look for \"Plugin\" in the text). \n\n!Boole"+
"an Search\nThe Boolean Search is useful when searching for multiple words.\n|!What you want|!What you "+
"type|!Example|\n|''All words'' must exist|List of words|{{{jonny jeremy}}} (or {{{jonny and jeremy}}}"+
")|\n|''At least one word'' must exist|Separate words by ''or''|{{{jonny or jeremy}}}|\n|A word ''must "+
"not exist''|Start word with ''-''|{{{-jonny}}} (or {{{not jonny}}})|\n\n''Note:'' When you specify two"+
" words, separated with a space, YourSearch finds all tiddlers that contain both words, but not neces"+
"sarily next to each other. If you want to find a sequence of word, e.g. '{{{John Brown}}}', you need"+
" to put the words into quotes. I.e. you type: {{{\"john brown\"}}}.\n\nUsing parenthesis you may change "+
"the default \"left to right\" evaluation of the boolean search. E.g. {{{not (jonny or jeremy)}}} finds"+
" all tiddlers that contain neither \"jonny\" nor \"jeremy. In contrast to this {{{not jonny or jeremy}}"+
"} (i.e. without parenthesis) finds all tiddlers that either don't contain \"jonny\" or that contain \"j"+
"eremy\".\n\n!'Exact Word' Search\nBy default a search result all matches that 'contain' the searched tex"+
"t. E.g. if you search for {{{Task}}} you will get all tiddlers containing 'Task', but also '~Complet"+
"edTask', '~TaskForce' etc.\n\nIf you only want to get the tiddlers that contain 'exactly the word' you"+
" need to prefix it with a '='. E.g. typing '=Task' will find the tiddlers that contain the word 'Tas"+
"k', ignoring words that just contain 'Task' as a substring.\n\n!~CaseSensitiveSearch and ~RegExpSearch"+
"\nThe standard search options ~CaseSensitiveSearch and ~RegExpSearch are fully supported by YourSearc"+
"h. However when ''~RegExpSearch'' is on Filtered and Boolean Search are disabled.\n\nIn addition you m"+
"ay do a \"regular expression\" search even with the ''~RegExpSearch'' set to false by directly enterin"+
"g the regular expression into the search field, framed with {{{/.../}}}. \n\nExample: {{{/m[ae][iy]er/"+
"}}} will find all tiddlers that contain either \"maier\", \"mayer\", \"meier\" or \"meyer\".\n\n!~JavaScript E"+
"xpression Filtering\nIf you are familiar with JavaScript programming and know some TiddlyWiki interna"+
"ls you may also use JavaScript expression for the search. Just enter a JavaScript boolean expression"+
" into the search field, framed with {{{ { ... } }}}. In the code refer to the variable tiddler and e"+
"valuate to {{{true}}} when the given tiddler should be included in the result. \n\nExample: {{{ { tidd"+
"ler.modified > new Date(\"Jul 4, 2005\")} }}} returns all tiddler modified after July 4th, 2005.\n\n!Com"+
"bined Search\nYou are free to combine the various search options. \n\n''Examples''\n|!What you type|!Res"+
"ult|\n|{{{!jonny !jeremy -%football}}}|all tiddlers with both {{{jonny}}} and {{{jeremy}}} in its tit"+
"les, but no {{{football}}} in content.|\n|{{{#=Task}}}|All tiddlers tagged with 'Task' (the exact wor"+
"d). Tags named '~CompletedTask', '~TaskForce' etc. are not considered.|\n\n!Access Keys\nYou are encour"+
"aged to use the access keys (also called \"shortcut\" keys) for the most frequently used operations. F"+
"or quick reference these shortcuts are also mentioned in the tooltip for the various buttons etc.\n\n|"+
"!Key|!Operation|\n|{{{Alt-F}}}|''The most important keystroke'': It moves the cursor to the search in"+
"put field so you can directly start typing your query. Pressing {{{Alt-F}}} will also display the pr"+
"evious search result. This way you can quickly display multiple tiddlers using \"Press {{{Alt-F}}}. S"+
"elect tiddler.\" sequences.|\n|{{{ESC}}}|Closes the [[YourSearch Result]]. When the [[YourSearch Resul"+
"t]] is already closed and the cursor is in the search input field the field's content is cleared so "+
"you start a new query.|\n|{{{Alt-1}}}, {{{Alt-2}}},... |Pressing these keys opens the first, second e"+
"tc. tiddler from the result list.|\n|{{{Alt-O}}}|Opens all found tiddlers.|\n|{{{Alt-P}}}|Toggles the "+
"'Preview Text' mode.|\n|{{{Alt-'<'}}}, {{{Alt-'>'}}}|Displays the previous or next page in the [[Your"+
"Search Result]].|\n|{{{Return}}}|When you have turned off the 'as you type' search mode pressing the "+
"{{{Return}}} key actually starts the search (as does pressing the 'search' button).|\n\n//If some of t"+
"hese shortcuts don't work for you check your browser if you have other extensions installed that alr"+
"eady \"use\" these shortcuts.//";
config.shadowTiddlers["YourSearch Options"] =
"|>|!YourSearch Options|\n|>|<<option chkUseYourSearch>> Use 'Your Search'|\n|!|<<option chkPreviewText"+
">> Show Text Preview|\n|!|<<option chkSearchAsYouType>> 'Search As You Type' Mode (No RETURN required"+
" to start search)|\n|!|Default Search Filter:<<option chkSearchInTitle>>Title ('!') <<option chk"+
"SearchInText>>Text ('%') <<option chkSearchInTags>>Tags ('#') <<option chkSearchExtendedFiel"+
"ds>>Extended Fields<html><br><font size=\"-2\">The fields of a tiddlers that are searched when you don"+
"'t explicitly specify a filter in the search text <br>(Explictly specify fields using one or more '!"+
"', '%', '#' or 'fieldname:' prefix before the word/text to find).</font></html>|\n|!|Number of items "+
"on search result page: <<option txtItemsPerPage>>|\n|!|Number of items on search result page with pre"+
"view text: <<option txtItemsPerPageWithPreview>>|\n";
config.shadowTiddlers["YourSearchStyleSheet"] =
"/***\n!~YourSearchResult Stylesheet\n***/\n/*{{{*/\n.yourSearchResult {\n\tposition: absolute;\n\twidth: 800"+
"px;\n\n\tpadding: 0.2em;\n\tlist-style: none;\n\tmargin: 0;\n\n\tbackground: #ffd;\n\tborder: 1px solid DarkGra"+
"y;\n}\n\n/*}}}*/\n/***\n!!Summary Section\n***/\n/*{{{*/\n.yourSearchResult .summary {\n\tborder-bottom-width:"+
" thin;\n\tborder-bottom-style: solid;\n\tborder-bottom-color: #999999;\n\tpadding-bottom: 4px;\n}\n\n.yourSea"+
"rchRange, .yourSearchCount, .yourSearchQuery {\n\tfont-weight: bold;\n}\n\n.yourSearchResult .summary ."+
"button {\n\tfont-size: 10px;\n\n\tpadding-left: 0.3em;\n\tpadding-right: 0.3em;\n}\n\n.yourSearchResult .summa"+
"ry .chkBoxLabel {\n\tfont-size: 10px;\n\n\tpadding-right: 0.3em;\n}\n\n/*}}}*/\n/***\n!!Items Area\n***/\n/*{{{*"+
"/\n.yourSearchResult .marked {\n\tbackground: none;\n\tfont-weight: bold;\n}\n\n.yourSearchItem {\n\tmargin-to"+
"p: 2px;\n}\n\n.yourSearchNumber {\n\tcolor: #808080;\n}\n\n\n.yourSearchTags {\n\tcolor: #008000;\n}\n\n.yourSearc"+
"hText {\n\tcolor: #808080;\n\tmargin-bottom: 6px;\n}\n\n/*}}}*/\n/***\n!!Footer\n***/\n/*{{{*/\n.yourSearchFoote"+
"r {\n\tmargin-top: 8px;\n\tborder-top-width: thin;\n\tborder-top-style: solid;\n\tborder-top-color: #999999;"+
"\n}\n\n.yourSearchFooter a:hover{\n\tbackground: none;\n\tcolor: none;\n}\n/*}}}*/\n/***\n!!Navigation Bar\n***/"+
"\n/*{{{*/\n.yourSearchNaviBar a {\n\tfont-size: 16px;\n\tmargin-left: 4px;\n\tmargin-right: 4px;\n\tcolor: bla"+
"ck;\n\ttext-decoration: underline;\n}\n\n.yourSearchNaviBar a:hover {\n\tbackground-color: none;\n}\n\n.yourSe"+
"archNaviBar .prev {\n\tfont-weight: bold;\n\tcolor: blue;\n}\n\n.yourSearchNaviBar .currentPage {\n\tcolor: #"+
"FF0000;\n\tfont-weight: bold;\n\ttext-decoration: none;\n}\n\n.yourSearchNaviBar .next {\n\tfont-weight: bold"+
";\n\tcolor: blue;\n}\n/*}}}*/\n";
config.shadowTiddlers["YourSearchResultTemplate"] =
"<!--\n{{{\n-->\n<span macro=\"yourSearch if found\">\n<!-- The Summary Header ============================"+
"================ -->\n<table class=\"summary\" border=\"0\" width=\"100%\" cellspacing=\"0\" cellpadding=\"0\">"+
"<tbody>\n <tr>\n\t<td align=\"left\">\n\t\tYourSearch Result <span class=\"yourSearchRange\" macro=\"yourSearc"+
"h itemRange\"></span>\n\t\t of <span class=\"yourSearchCount\" macro=\"yourSearch count\"></span>\n"+
"\t\tfor <span class=\"yourSearchQuery\" macro=\"yourSearch query\"></span>\n\t</td>\n\t<td class=\"yourSea"+
"rchButtons\" align=\"right\">\n\t\t<span macro=\"yourSearch chkPreviewText\"></span><span class=\"chkBoxLabel"+
"\">preview text</span>\n\t\t<span macro=\"yourSearch newTiddlerButton\"></span>\n\t\t<span macro=\"yourSearch openAllButton\"></span>\n\t\t<span macro=\"yourSearch lin"+
"kButton 'YourSearch Options' options 'Configure YourSearch'\"></span>\n\t\t<span macro=\"yourSearch linkB"+
"utton 'YourSearch Help' help 'Get help how to use YourSearch'\"></span>\n\t\t<span macro=\"yourSearch clo"+
"seButton\"></span>\n\t</td>\n </tr>\n</tbody></table>\n\n<!-- The List of Found Tiddlers ================="+
"=========================== -->\n<div id=\"yourSearchResultItems\" itemsPerPage=\"25\" itemsPerPageWithPr"+
"eview=\"10\"></div>\n\n<!-- The Footer (with the Navigation) ==========================================="+
"= -->\n<table class=\"yourSearchFooter\" border=\"0\" width=\"100%\" cellspacing=\"0\" cellpadding=\"0\"><tbody"+
">\n <tr>\n\t<td align=\"left\">\n\t\tResult page: <span class=\"yourSearchNaviBar\" macro=\"yourSearch naviBar"+
"\"></span>\n\t</td>\n\t<td align=\"right\"><span macro=\"yourSearch version\"></span>, <span macro=\"yourSearc"+
"h copyright\"></span>\n\t</td>\n </tr>\n</tbody></table>\n<!-- end of the 'tiddlers found' case ========="+
"================================== -->\n</span>\n\n\n<!-- The \"No tiddlers found\" case ================="+
"========================== -->\n<span macro=\"yourSearch if not found\">\n<table class=\"summary\" border="+
"\"0\" width=\"100%\" cellspacing=\"0\" cellpadding=\"0\"><tbody>\n <tr>\n\t<td align=\"left\">\n\t\tYourSearch Resu"+
"lt: No tiddlers found for <span class=\"yourSearchQuery\" macro=\"yourSearch query\"></span>.\n\t</td>\n\t<t"+
"d class=\"yourSearchButtons\" align=\"right\">\n\t\t<span macro=\"yourSearch newTiddlerButton\"></span>\n\t\t<span macro=\"yourSearch linkButton 'YourSearch Options'"+
" options 'Configure YourSearch'\"></span>\n\t\t<span macro=\"yourSearch linkButton 'YourSearch Help' help"+
" 'Get help how to use YourSearch'\"></span>\n\t\t<span macro=\"yourSearch closeButton\"></span>\n\t</td>\n <"+
"/tr>\n</tbody></table>\n</span>\n\n\n<!--\n}}}\n-->\n";
config.shadowTiddlers["YourSearchItemTemplate"] =
"<!--\n{{{\n-->\n<span class='yourSearchNumber' macro='foundTiddler number'></span>\n<span class='yourSea"+
"rchTitle' macro='foundTiddler title'/></span> - \n<span class='yourSearchTags' macro='found"+
"Tiddler field tags 50'/></span>\n<span macro=\"yourSearch if previewText\"><div class='yourSearchText' macro='fo"+
"undTiddler field text 250'/></div></span>\n<!--\n}}}\n-->";
config.shadowTiddlers["YourSearch"] = "<<tiddler [[YourSearch Help]]>>";
config.shadowTiddlers["YourSearch Result"] = "The popup-like window displaying the result of a YourSearch query.";
//----------------------------------------------------------------------------
// Install YourSearch
//----------------------------------------------------------------------------
// Overwrite the TiddlyWiki search handler and verify after a while
// that nobody else has overwritten it.
config.macros.search.handler = myMacroSearchHandler;
var checkForOtherHijacker = function() {
// Check that still our search handler is installed
if (config.macros.search.handler != myMacroSearchHandler) {
alert(
"Message from YourSearchPlugin:\n\n\nAnother plugin has disabled the 'Your Search' features.\n\n\nYou may "+
"disable the other plugin or change the load order of \nthe plugins (by changing the names of the tidd"+
"lers)\nto enable the 'Your Search' features.");
}
};
setTimeout(checkForOtherHijacker, 5000);
// === Public API =================================
abego.YourSearch.getStandardRankFunction = function() {
return standardRankFunction;
};
abego.YourSearch.getRankFunction = function() {
return abego.YourSearch.getStandardRankFunction();
};
abego.YourSearch.getCurrentTiddler = function() {
return currentTiddler;
};
abego.YourSearch.closeResult = function() {
closeResult();
}
})();
} // of "install only once"
// Used Globals (for JSLint) ==============
// ... JavaScript Core
/*global alert,clearTimeout,confirm */
// ... TiddlyWiki Core
/*global Tiddler, applyHtmlMacros, clearMessage, createTiddlyElement, createTiddlyButton, createTiddlyText, ensureVisible ,findPosX, highlightHack, findPosY,findWindowWidth, invokeMacro, saveChanges, refreshElements, story */
//}}}
/***
!Licence and Copyright
Copyright (c) abego Software ~GmbH, 2005-2006 ([[www.abego-software.de|http://www.abego-software.de]])
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
Redistributions in binary form must reproduce the above copyright notice, this
list of conditions and the following disclaimer in the documentation and/or other
materials provided with the distribution.
Neither the name of abego Software nor the names of its contributors may be
used to endorse or promote products derived from this software without specific
prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
DAMAGE.
***/
[img[http://www.zamzar.com/images/convert-it-btn.jpg][javascript:(function(){var%20scriptElem%20=%20document.createElement('SCRIPT');scriptElem.setAttribute('language',%20'JavaScript');scriptElem.setAttribute('src',%20'http://www.zamzar.com/tools/bookmarklets/converter.js');document.body.appendChild(scriptElem);})()]] Træk knappen til din værktøjslinie (Firefox) eller højreklik på den (Internet explorer) og føj til favoritter.
<html><div align="center"><iframe src="http://www.crapules.tv/chumby/ZenMaker.swf" frameborder="0" width="100%" height="480"></iframe></div></html>
|sortable|k
|nr|Titel|Kilde|nr/s|Pianist|ny|h
|1|One hand One heart |(b) | 299|
|2|I dag er landet vort |(b) | 87|
|3|That's what friends are for |(b) | 309|
|4|Jeg elsker den brogede verden |(b) | 98||
|5|Der går i nat et glædesbud |(b) | 42|
|6|Tears in heaven |(b) | 302|
|7|Love Is A Matter Of Difference|(m)| 52|
|8|Fly Me To The Moon|(m)| 44||
|9|Andreas sang|(m)| 21|
|10|Hvor længe vil du ydmyge dig?|(m)| 28|
|11|Dagen er din|(m)| 6|
|12|Noget i dig selv|(m)| 26|
19 Aftensang
23 Altid frejdig, når du går
153 Anemonesangen
158 April, april (A)
205 At kende sig selv
108 At lære er at ville (A)
264 At samles, skilles ad
114 Barndommens land
158 Bedstefar tag dine tænder på (A)
126 Bladet i bogen sig vender
148 Bliv! Råbte Herren i de tomme sale
35 Blomstre som en rosengård
83 Blæsten går frisk over Limfjordens vande
88 Bornholm, Bornholm, Bornholm
257 Cafe Måneskin
289 Crying in the rain
233 Dagen før
22 Dagen går med raske fjed
130 Danmark frit (A)
160 Danmark, nu blunder den lyse nat
235 Danmarks-kanon
44 De dybeste lag
195 De evige tre (A)
90 De levendes land (A)
209 De nære ting
115 De ord, jeg synger
109 De små børns smil
47 Decembernat
48 Decembersang
50 Dejlig er den himmel blå
52 Dejlig er jorden
198 Dejligst af alle glæder (A)
146 Den blå anemone
84 Den danske sang
134 Den grønne søde vår
66 Den himmelblå
135 Den kedsom vinter gik sin gang
157 Den lille lysegrønne sang
5 Den mørke nat forgangen er
258 Den røde tråd
1 Den signede dag med fryd vi ser
211 Den spillemand snapped fiolen fra væg
274 Der bor en kraft i sindet
85 Der dukker af disen (A)
67 Der er et yndigt land
234 Der er noget galt i Danmark
31 Der er noget i luften
42 Der går i nat et glædesbud
187 Der stode tre skalke
106 Der truer os i tiden (A)
104 Derfor kan vort øje glædes
229 Desertøren
246 Det bedste jeg ved
232 Det drømmende vand
45 Det er angstens sved, han sveder
156 Det er forår, alting klippes ned
180 Det er hvidt herude
136 Det er i dag et vejr
137 Det er lærkernes tid
131 Det er os, det er os
139 Det er så køhnt, det er så dejle
46 Det er så sandt
127 Det haver så nyligen regnet
53 Det kimer nu til julefest
172 Det lysner over agres felt
174 Det løvfald, som vi kom så alt for nær
48 Det' sørme det' sandt december
191 Det var en lørdag aften
116 Det øjeblik vi lever i
268 DGI blues
161 Du danske sommer
69 Du gamla, du fria, du fjållhoga Nord
263 Du ka' gør', hva' du vil
194 Du kom med alt det der var dig
119 Du skal plante et træ
26 Du, som har tændt millioner af stjerner
276 Duerne flyver
41 Dybt hælder året i sin gang
244 Efterårskanon
227 En enkel sang om frihed
267 En kæde af evige bånd
130 En lærke letted (A)
54 En rose så jeg skyde
265 En stjerne fødes (L'94)
216 En sømand har sin enegang
193 En yndig og frydefuld sommertid
110 Engang var frihed ordet (A)
91 Er lyset for de lærde blot (A)
55 Et barn er født i Betlehem
93 Et jævnt og muntert virksomt liv
145 Fire påskeliljer
94 Folkeligt skal alt nu være (A)
81 For en fremmed barskt og fattigt
65 For længe sid'n, i Betlehem
56 Forunderligt at sige
155 Forår
197 Forår ved Mariager fjord (A)
147 Forårsdag
148 Forårsskibet
21 Fred hviler over land og by (A)
107 Frihed er det bedste guld
111 Gi' dem himlen tilbage
199 Gi' mig en dag
33 Giv mig, Gud, en salmetunge
58 Glade jul, dejlige jul
198 Glæden, sorgen og lykken (A)
212 Go jawten, go jawten
27 Go' nu nat
82 Godmorgen, lille land
86 Grundlovssangen
207 Græshoppen og valmuen
105 Gå stille og tyst gennem verden
162 Han kommer med sommer
287 Happy Christmas (War is over)
200 Har du visor, min vän
226 Hele verden er vores
293 Hey Jude
36 Hil dig, frelser og forsoner
156 Hilsen til forårssolen
245 Himmel og hav
217 Hist, hvor vejen slår en bugt
123 Holger Danskes mærke
203 Hvad er det, min Marie! (A)
92 Hvad solskin er for det sorte muld (A)
220 Hvem sidder der bag skærmen
167 Hvergang en sommer
245 Hvide skyer falder ned
76 Hvor smiler fager den danske kyst
208 Hvorfor går min elskede
112 Hymnen til Afrika
60 Højt fra træets grønne top
39 I al sin glans nu stråler solen
123 I alle de riger og lande
87 I dag er landet vort
78 I Danmark er jeg født (A)
9 I det spæde morgengry
272 I hjerterne begynder
20 I skovens dybe, stille ro (A)
182 I sne står urt og busk i skjul
3 I østen stiger solen op
292 Imagine
262 Imellem Esbjerg og Fanø
206 Ind til dig igen
49 Ind under jul, hvor er det trist
70 Ja, vi elsker dette landet
97 Jeg bærer med smil min byrde
225 Jeg ejer både mark og eng
75 Jeg elsker de grønne lunde
98 Jeg elsker den brogede verden
247 Jeg fandt en sang på vejen
236 Jeg går i solen og traller
237 Jeg har fanget mig en myg
90 Jeg kender et land (A)
149 Jeg plukker fløjlsgræs
99 Jeg rutter med glædens
74 Jeg ser de bøgelyse øer
151 Jeg ved en lærkerede
73 Jeg ved, hvor der findes en have så skøn
228 Jeg vil male dagen blå
220 Jens vejmand
100 Jo, jo gøgleri er en nobel kunst
117 Jordens åndedrag
57 Julen har bragt velsignet bud
61 Juletræet med sin pynt
168 Juni
210 Jyden han æ stærk å sej
72 Jylland mellem tvende have
201 Kald det kærlighed
248 Kalendervender Tage
174 Kirsten og vejen fra Gurre
231 Kom, fred, og fyld den hele dag
218 Kom, glade overgivenhed
133 Kom, maj, du søde milde
251 Kom og dans
64 Kom, tro, og kom, glæde
124 Kommer hid, l piger små
283 Kong Kristjan stod ved højen mast
101 Kringsatt av fjender
285 Kumbaya
193 Kærlighedsrosen
263 Lad det leve
295 Leaving on a Jet-plane
113 Lermennesket
291 Let it be
296 Let it grow
63 Lille Messias
118 Livet er en morgengave (A)
120 Livstræet
297 Love is all around
34 Lovsynger Herren
150 Luk døren op og se
125 Lysfyldt morgen
17 Lær mig, nattens stjerne
89 Løft dit hoved, du raske gut
221 Mads Doss
169 Marken er mejet
288 Mary boy child
80 Med kåde smil den lyse sol
250 Med mor til fodbold
96 Menneskelivet er underligt
219 Mi nååbo, Pe Sme
164 Midsommervisen (A)
10 Morgengry
6 Morgenstund har guld i mund (A)
213 Musens sang
178 Mørk er november
273 Mørkets sang
261 Nanna
18 Natten er blid
16 Natten er så stille
154 Nattergalen, kender du den
259 Nattergalen på sin gren
24 Nocturne
118 Noget om helte (A)
163 Noget om skærsommernætter
140 Nu er dagen fuld af sang
173 Nu er det længe siden
25 Nu er jord og himmel stille (A)
175 Nu falmer skoven trindt om land (A)
62 Nu har vi altså jul igen
15 Nu hviler mark og enge
141 Nu lyser løv i lunde
163 Nu nejer blomsterne
2 Nu rinder solen op af østerlide (A)
95 Nu skal det åbenbares (A)
241 Nu skal vi ha' gilde
51 Nu tændes tusind julelys
166 Når egene knoppes
142 Når vinteren rinder i grøft og i grav
284 O come, all ye faithful
71 O, Færø, så fager
152 Og det blev vår
222 Ole sad på en knold og sang
271 Om lidt
299 One hand, One heart
32 Op, al den ting, som Gud har gjort
144 Opvåvni
256 Papirsklip
186 Per spelmann
150 Påske
38 Påskeblomst! Hvad vil du her
188 Ramund
228 Regnvejrsdag i november
260 Romeo
189 Roselil og hendes moder
202 Ræven er ude med halen så lang
249 Røverne fra Kardemommeby
129 Sang i det grønne
102 Sangen har lysning
286 Santa Claus is comin' to town
121 Sat her i forvirringstiden
159 Se, det summer af sol over engen (A)
11 Se, hvilken morgenstund
223 Se Norges blomsterdal
4 Se, nu stiger solen af havets skød (A)
242 Sensommerkanon
171 Sensommervise
170 Septembers himmel
12 Sig månen langsomt hæver
103 Sig nærmer tiden
270 Skal vi ikke være venner
132 Skipper Klements morgensang
177 Skoven er så underfuld
224 Skuld gammel venskab
30 Skyerne gråne
132 Skærm jeres huse med grav og planke
190 Skønjomfruen går i dansen
181 Sneflokke kommer vrimlende
183 Snemand Frost og frøken Tø (A)
179 Solhvervssang
243 Solkanon
176 Solsikke
128 Som dybest brønd
77 Som en rejselysten flåde
37 Som forårssolen morgenrød
167 Sommerens ø
40 Sommersalme
298 Soon and very soon
24 Sov på min arm
185 Spurven sidder stum bag kvist
275 Stenen slår smut på det danske vand
266 Stilfærdigt farvel
13 Stille, hjerte, sol går ned
253 Stjernefart
18 Stjerner dukker frem
162 Storken
306 Summer nights (Grease)
11 Svantes lykkelige dag
252 Svinehyrden
301 Swing low
214 Sæt grammofonen i stå
215 Søren Bramfris lærkesang
279 Så længe skuden kan gå
28 Så tænder vi et lys i kvæld
269 Tag del i det, der er din tid
304 Take it easy, boy, boy
302 Tears in heaven
309 That's what friends are for
305 The Rose
308 Those were the days
229 Til Dem, hr. præsident
1 8 Til himlene rækker din miskundhed, Gi
203 Til min Marie (A)
101 Til ungdommen
240 Till havs med solfyllda segel
303 To be or not to be
197 To gyldne sommerfugle (A)
282 Tusind stykker
14 Underlige aftenlufte
254 Valmuevejen
129 Velkommen i den grønne lund
59 Velkommen igen, Guds engle små (A;
143 Velkommen, lærkelil (A)
192 Vem kan segla forutan vind
47 Veninde, tag frakken og støvlerne på
238 Vennekredsen
277 Vennesang
196 Veronica
122 Vi, der valgte regnen
164 Vi elsker vort land (A)
230 Vi vil plante et træ
165 Vipper springe over klinge
204 Visen om de atten svaner
280 VLTJ
179 Vor sol er blevet kold (A)
79 Vort modersmål er dejligt
184 Vær lidt varsom
29 Vær velkommen, Herrens år (advent
43 Vær velkommen, Herrens år (nytår)
278 Være vind
239 Vågn nu op af dine drømme
7 Vågn op og slå på dine strenge
138 Våren er i luften
68 Vårt land, vårt land, vårt fosterland
255 Vårvise
287 War is over
300 What a wonderful world
307 Whiskey in the Jar
294 Wonderful tonight
290 Yesterday
171 Æbler lyser rødt på træernes grene
281 Åbent landskab
<<cloud limit:15 systemConfig excludeMissing script excludeLists TiddlyHomeSystem admin settings excludeList excludeSearch Plugins Emner iTW MultimedieSliders Multimedier Upload systemServer authorbook Bøger Dansk faq framedLinks includeNew macros pluginInfo Menu Note Ondskaben Resume plugins public WhatsNew systemConfigDisable systemTiddlers>>
//{{{
config.options.chkHttpReadOnly = false;
config.options.chkAutoSave = false;
config.options.chkSaveBackups = true;
config.options.chkAnimate = true;
config.options.chkShowRightSidebar= false;
config.options.chkSinglePageMode= true;
config.options.chkSinglePagePermalink= false;
if (window.location.protocol!="file:") showBackstage=false;
config.options.chkSearchTitles=true;
config.options.chkSearchText=true;
config.options.chkSearchTags=true;
config.options.chkSearchFields=true;
config.options.chkSearchTitlesFirst=false;
config.options.chkSearchList=true;
config.options.chkSearchByDate=false;
config.options.chkSearchIncremental=true;
config.options.chkSearchShadows=false;
config.options.chkShowQuickEdit=true;
//}}}
|>|>| April 2009 |>|>| Maj 2009 |>|>| Juni 2009 |h
|1|ons| Onsarr: Komponisten + praktisk møde|1|fre| Praktisk medarb.møde 18|1|man| 2. pinsedag 23|
|2|tor| |2|lør| Weekend-tema:|2|tir| Start mdt. Prøver|
|3|fre| |3|søn| ”Venne-weekend”|3|ons| Onsdagsarr:|
|4|lør| ”Hyggeligt friluftsliv”|4|man| Skr. Prøve matematik|4|tor| |
|5|søn| Bedsteforældredag|5|tir| Skr. Prøve dansk læ +ret|5|fre| Grundlovsdag|
|6|man| Faglige/kreative værksteder|6|ons| Skr. Prøve dansk skr.|6|lør| Weekend-tema:|
|7|tir| Gigantium/Ålborgstævne|7|tor| Skr. Prøve engelsk|7|søn| ”Fem kamp + skattejagt”|
|8|ons| Eksamensrettede værksteder|8|fre| St. Bededag|8|man|24|
|9|tor| Skærtorsdag|9|lør| |9|tir| |
|10|fre| Langfredag|10|søn| |10|ons| Onsdagsarr:|
|11|lør| |11|man| Skr. Prøve tysk + Best.mø|11|tor| |
|12|søn| Påskedag|12|tir| K|12|fre| |
|13|man| 2. påskedag Ankomst 18-22 16|13|ons| Skr. Prøve biologi|13|lør| Weekend-tema:|
|14|tir| G|14|tor| Skr. Prøve geografi+2xL|14|søn| ”Eventyr i Himmerland”|
|15|ons| sdagarr:|15|fre| |15|man|25|
|16|tor| Generalforsamling skolekreds 2xL|16|lør| ”Soft adventure race”|16|tir| Bestyrelsesmøde|
|17|fre| |17|søn| Galla|17|ons| Onsdagsarr:|
|18|lør| Weekend-tema:|18|man|21|18|tor| |
|19|søn| ”Team-spirit”|19|tir| G + 2xL|19|fre| Slut mdt. Prøver|
|20|man|17|20|ons| |20|lør| Weekend-tema:|
|21|tir| F + 2xL|21|tor| Kr. Himmelfartsdag|21|søn| ”Elevhygge”|
|22|ons| sdagsarr: Vest|22|fre| Skolefri|22|man| |
|23|tor| |23|lør| |23|tir| |
|24|fre| |24|søn| |24|ons| Sidste uge|
|25|lør| Jubilardag|25|man| 2xL 22|25|tor| |
|26|søn| ”Vi er ude”|26|tir| F|26|fre| |
|27|man| 2xL 18|27|ons| |27|lør|Afslutningsmøde|
|28|tir| Hobro Idrætsdag|28|tor| Aftryk-festival|28|søn| |
|29|ons| |29|fre| |29|man|27|
|30|tor| |30|lør| |30|tir| |
| ||31|søn| Pinsedag||||
||Juli 2009||August 2009||September 2009||Oktober 2009||November 2009||December 2009||Januar 2010||Februar 2010||Marts 2010||April 2010||Maj 2010||Juni 2010|h
|1|On 27|1|Lø|1|Ti 36|1|To 40|1|Sø|1|Ti 49|1|Fr Nytårsdag 53|1|Ma 5|1|Ma Gymnastik + 9|1|To Skærtorsdag 13|1|Lø 17|1|Ti 22|
|2|To|2|Sø|2|On |2|Fr Forlænget fri???|2|Ma 45|2|On|2|Lø|2|Ti|2|Ti Terminsprøve-uge|2|Fr Langfredag|2|Sø|2|On|
|3|Fr|3|Ma 32|3|To|3|Lø|3|Ti|3|To|3|Sø Retur mlm. 18-22|3|On Norge|3|On Gym.opvisning Aars|3|Lø|3|Ma 18|3|To |
|4|Lø|4|Ti|4|Fr|4|Sø|4|On |4|Fr Julefrokost|4|Ma 1|4|To|4|To|4|Sø Påskedag|4|Ti|4|Fr |
|5|Sø|5|On|5|Lø Elevmøde|5|Ma 41|5|To Fagdag Matematik|5|Lø|5|Ti NOTE 1* |5|Fr|5|Fr|5|Ma 2. påskedag 14|5|On Skriftlige prøver|5|Lø Grundlovsdag|
|6|Ma 28|6|To|6|Sø|6|Ti|6|Fr Fagdag Matematik|6|Sø|6|On|6|Lø|6|Lø Foreningens årsmøde|6|Ti|6|To|6|Sø|
|7|Ti|7|Fr|7|Ma 37|7|On Dramauge|7|Lø Volley-stævne|7|Ma 50|7|To|7|Sø|7|Sø Foreningens årsmøde|7|On|7|Fr|7|Ma 23|
|8|On|8|Lø|8|Ti|8|To|8|Sø|8|Ti NM i badminton|8|Fr|8|Ma Forlænget fri 6|8|Ma Forlænget weekend 10|8|To |8|Lø|8|Ti|
|9|To|9|Sø|9|On Kontaktgruppedag|9|Fr Forestilling 19.30|9|Ma 46|9|On|9|Lø|9|Ti|9|Ti Fagdag Engelsk|9|Fr Nye elevers aften|9|Sø Bedsteforældre-/skoledag|9|On Mundtlige prøver|
|10|Fr|10|Ma 33|10|To|10|Lø|10|Ti|10|To|10|Sø|10|On OSO fremlæg + Fagdag|10|On Fagdag Engelsk|10|Lø|10|Ma 19|10|To|
|11|Lø|11|Ti|11|Fr|11|Sø|11|On|11|Fr|11|Ma NOTE 1* 2|11|To|11|To NM Volley|11|Sø |11|Ti Skriftlige prøver|11|Fr|
|12|Sø|12|On Opstartsmøder|12|Lø|12|Ma 42|12|To|12|Lø|12|Ti NOTE 1*|12|Fr|12|Fr|12|Ma 15|12|On|12|Lø|
|13|Ma 29|13|To|13|Sø|13|Ti|13|Fr|13|Sø|13|On|13|Lø|13|Lø Forældremøde|13|Ti |13|To Kr. Himmelfartsdag|13|Sø|
|14|Ti|14|Fr|14|Ma Fagdage dansk 38|14|On Efterårsferie|14|Lø|14|Ma 51|14|To OSO + Fagdag|14|Sø|14|Sø |14|On|14|Fr Fri|14|Ma 24|
|15|On|15|Lø|15|Ti Fagdag Dansk|15|To|15|Sø |15|Ti NOTE 1*|15|Fr|15|Ma 7 |15|Ma 11|15|To|15|Lø|15|Ti|
|16|To|16|Sø Åbningsmøde|16|On|16|Fr|16|Ma Forlænget Weekend 47|16|On|16|Lø Søskendeweekend|16|Ti|16|Ti|16|Fr|16|Sø|16|On|
|17|Fr|17|Ma 34|17|To|17|Lø|17|Ti|17|To Juledage|17|Sø|17|On|17|On |17|Lø|17|Ma Skriftlig prøve 20|17|To|
|On |Lø|18|Ti|18|Fr|18|Sø Retur mlm. 18-22|18|On Info elever OsO & bro..|18|Fr Julemøde – kl. 19.00|18|Ma 3|18|To|18|To |18|Sø|18|Ti Dansk fagdag – synopse|18|Fr|
|19|Sø|19|On Introuge 1|19|Lø|19|Ma 43|19|To|19|Lø|19|Ti Brobygning 10. kl.|19|Fr|19|Fr Forlænget fri??|19|Ma 16|19|On |19|Lø|
|20|Ma 30|20|To|20|Sø |20|Ti|20|Fr Forlænget fri ??|20|Sø |20|On +|20|Lø|20|Lø|20|Ti |20|To|20|Sø|
|21|Ti|21|Fr|21|Ma Forlænget fri ??? 39|21|On|21|Lø Forældremøde|21|Ma 52|21|To Projektopgave 9. kl.|21|Sø|21|Sø |21|On |21|Fr|21|Ma 25|
|22|On|22|Lø|22|Ti|22|To|22|Sø|22|Ti |22|Fr|22|Ma 8|22|Ma 12|22|To|22|Lø|22|Ti|
|23|To|23|Sø|23|On|23|Fr|23|Ma 48|23|On|23|Lø|23|Ti |23|Ti|23|Fr|23|Sø Pinsedag|23|On Sidste uge|
|24|Fr|24|Ma 35|24|To|24|Lø|24|Ti Brobygning 10. kl. |24|To |24|Sø|24|On Vinterferie |24|On|24|Lø Jubilardag|24|Ma 2. pinsedag 21|24|To|
|25|Lø|25|Ti|25|Fr EfterskolewNMFodbold|25|Sø|25|On +|25|Fr Juledag|25|Ma OSO + Fagdag 4|25|To |25|To|25|Sø|25|Ti|25|Fr|
|26|Sø|26|On Introuge 2|26|Lø Forældredag/samtaler|26|Ma 44|26|To Fagdage 9. kl|26|Lø 2. juledag|26|Ti OSO + Fagdag|26|Fr|26|Fr Forårsfest|26|Ma 17|26|On|26|Lø Afslutningsmøde|
|27|Ma 31|27|To|27|Sø Efterskolernes Dag|27|Ti Rockgudstj. Aars kl. 17.00|27|Fr|27|Sø|27|On|27|Lø|27|Lø Hobro gymnastik|27|Ti|27|To|27|Sø|
|28|Ti|28|Fr|28|Ma 40|28|On|28|Lø|28|Ma 53|28|To|28|Sø Retur mlm. 18-22|28|Sø Palmesøndag|28|On|28|Fr|28|Ma 26|
|29|On|29|Lø|29|Ti|29|To|29|Sø |29|Ti|29|Fr|||29|Ma Eksamensværksteder 13|29|To|29|Lø|29|Ti Evalueringsmøder|
|30|To|30|Sø|30|On|30|Fr Forældreweekend|30|Ma 49|30|On|30|Lø|||30|Ti Gigantium-stævne|30|Fr St. Bededag|30|Sø|30|On|
|31|Fr|31|Ma 36|||31|Lø Forældreweekend|||31|To|31|Sø|||31|On|||31|Ma Mundtlige prøver – start 22|||