Welcome to TiddlyWiki created by Jeremy Ruston, Copyright © 2007 UnaMesa Association
Action [[links|Links]] har et script tilknyttet (fx [[KMS]] eller Javascript på [[WWW|World Wide Web]]).
"Asynchronous ~JavaScript and XML" (navngivet af [[Jesse James Garrett|http://blog.jjg.net/weblog/2005/02/ajax.html]]) er en samling af teknologier...
* [[XHTML|http://en.wikipedia.org/wiki/XHTML]] og [[CSS|http://en.wikipedia.org/wiki/CSS]]
* [[DOM|http://en.wikipedia.org/wiki/Document_Object_Model]] manipulation
* Evt. [[XML]] og [[XLST|http://en.wikipedia.org/wiki/XSLT]]
* [[XMLHttpRequest|http://en.wikipedia.org/wiki/XMLHttpRequest]], asynkron data-hentning
* [[JavaScript|http://en.wikipedia.org/wiki/JavaScript]]
... som ofte bruges til små "widgets", fx [[Google Suggest|http://www.google.com/webhp?complete=1&hl=en]], eller hele applikationer som [[Google Maps|http://maps.google.com/]] (i konkurrence med fx Flash).
Ordet ''blog'' er en forkortelse af [[weblog|http://en.wikipedia.org/wiki/Weblog]] som bruges om ofte opdaterede websites hvor de enkelte ''posts'' eller artikler optræder i omvendt kronologisk rækkefølge. I dag har også mange virksomheder blogs på nettet, men oprindeligt opstod blogs som meget personlige, ofte dagbogs-agtige websites. De første blogs opstod omkring 1994 og fem år senere, op til årtusindeskiftet, tog blogging fart, og i dag er der over 100 millioner blogs på nettet (ifølge [[Wikipedia|http://en.wikipedia.org/wiki/Weblog]]).
Da blogging er et [[WWW|World Wide Web]]-fænomen arver blogs alle de fordele og ulemper som er tilknyttet HTML og de øvrige ~WWW-teknologier. Hvilken funktionalitet den enkelte blog har varierer dog meget, lige fra et simpel håndkodet website til en fuldt udstyret [[Wordpress-|http://wordpress.org]] eller [[TextPattern|http://textpattern.com]]-installation.
[[Links]] på blogs er i langt de fleste tilfælde almindelige [[reference links|Reference links]] som er den type links der understøttes af {{{<a>}}}-elementet i HTML. Men i velskreven kildekode findes sommetider også eksempler på [[typede links|Typede links]] som fx på [[zeldman.com|http://zeldman.com]] hvor der bruges typede links til at henvise til forfatterens andre sites, fx {{{<link rev="alistapart" href="http://www.alistapart.com/" />}}}, og til at henvise til andre udgaver eller andre funktioner af den pågældende side, som fx {{{rel="pingback"}}} og {{{rel="alternate"}}} til hhv. ~XML-RPC interfacet og ~RSS-feedet, og {{{rel="tag"}}} til tagging af de enkelte posts.
Derudover er det mest bemærkelsesværdige med hensyn til links på blogs blot det faktum at de bliver brugt så meget som de gør. Blogging-verdenen er så omfattende et økosystem at den har fået sit eget navn, [[blogosfæren|http://en.wikipedia.org/wiki/Blogosphere]], som på sin vis kan betragtes som et distribueret og grundigt krydslinket [[hypermediesystem|Hypermedier]]. De enkelte posts på en blog er meget ofte inspirerede af posts på andre weblogs som de derfor linker til, foruden at en blog altid linker grundigt frem og tilbage indenfor sit eget lille hypermediesystem, både til næste og forrige kronologiske blogpost og evt. også til populære posts fra arkivet. Derudover blev det tidligt en trend blandt bloggere at oprette en [[blogroll|http://www.commoncraft.com/archives/000427.html]] med links til de weblogs som den pågældende blogger selv læste, hvilket yderligere forstærkede den indbyrdes krydslinkning.
Hvis man ser på den eksplosive vækst i oprettelsen af weblogs den energi og produktivitet som i hvert fald nogle bloggere lægger i deres arbejde skulle man mene at blogging som system yder god understøttelse af [[forfattervirksomhed|Forfattervirksomhed]]. Men systemet er langt fra optimalt hvis man måler på hvor lav barrieren er for at skrive eller tilrette en blogpost. Stort set alle blogsystemer separerer præsentation fra redigering, der som regel er gemt bag et login og foregår i et helt andet interface, hvilket gør det forholdsvis omstændigt at skrive eller redigere en blogpost -- i hvert fald i forhold til alternativer som [[KMS]] hvor brugeren altid havde direkte adgang til at redigere i den tekst han browsede, eller [[TiddlyWiki]], som denne wiki er bygget på, hvor man kan skifte til redigerings-mode ved blot at dobbeltklikke på teksten.
Blogging har som udgangspunkt heller ikke nogen særlig god understøttelse af [[samarbejdsstøtte|Samarbejdsstøtte]], ligesom de fleste andre [[WWW|World Wide Web]]-teknologier. Der findes flere blogging-systemer der understøtter weblogs forfattet af flere forskellige personer, og det er også muligt for flere personer at redigere i samme blogpost, men ingen af de kendte systemer understøtter nogen form for versionering eller [[concurrency control|http://en.wikipedia.org/wiki/Optimistic_concurrency_control]] som fx blev understøttet af [[KMS]].
Mange-til-mange relationer. Links har mange udgangspukter og mange destinationer.
[[Linkets|Links]] endepunkter afhænger af værdien af bestemte variabler, f.eks. om læseren kender et givent begreb.
/***
|''Name:''|CryptoFunctionsPlugin|
|''Description:''|Support for cryptographic functions|
***/
//{{{
if(!version.extensions.CryptoFunctionsPlugin) {
version.extensions.CryptoFunctionsPlugin = {installed:true};
//--
//-- Crypto functions and associated conversion routines
//--
// Crypto "namespace"
function Crypto() {}
// Convert a string to an array of big-endian 32-bit words
Crypto.strToBe32s = function(str)
{
var be = Array();
var len = Math.floor(str.length/4);
var i, j;
for(i=0, j=0; i<len; i++, j+=4) {
be[i] = ((str.charCodeAt(j)&0xff) << 24)|((str.charCodeAt(j+1)&0xff) << 16)|((str.charCodeAt(j+2)&0xff) << 8)|(str.charCodeAt(j+3)&0xff);
}
while (j<str.length) {
be[j>>2] |= (str.charCodeAt(j)&0xff)<<(24-(j*8)%32);
j++;
}
return be;
};
// Convert an array of big-endian 32-bit words to a string
Crypto.be32sToStr = function(be)
{
var str = "";
for(var i=0;i<be.length*32;i+=8)
str += String.fromCharCode((be[i>>5]>>>(24-i%32)) & 0xff);
return str;
};
// Convert an array of big-endian 32-bit words to a hex string
Crypto.be32sToHex = function(be)
{
var hex = "0123456789ABCDEF";
var str = "";
for(var i=0;i<be.length*4;i++)
str += hex.charAt((be[i>>2]>>((3-i%4)*8+4))&0xF) + hex.charAt((be[i>>2]>>((3-i%4)*8))&0xF);
return str;
};
// Return, in hex, the SHA-1 hash of a string
Crypto.hexSha1Str = function(str)
{
return Crypto.be32sToHex(Crypto.sha1Str(str));
};
// Return the SHA-1 hash of a string
Crypto.sha1Str = function(str)
{
return Crypto.sha1(Crypto.strToBe32s(str),str.length);
};
// Calculate the SHA-1 hash of an array of blen bytes of big-endian 32-bit words
Crypto.sha1 = function(x,blen)
{
// Add 32-bit integers, wrapping at 32 bits
add32 = function(a,b)
{
var lsw = (a&0xFFFF)+(b&0xFFFF);
var msw = (a>>16)+(b>>16)+(lsw>>16);
return (msw<<16)|(lsw&0xFFFF);
};
// Add five 32-bit integers, wrapping at 32 bits
add32x5 = function(a,b,c,d,e)
{
var lsw = (a&0xFFFF)+(b&0xFFFF)+(c&0xFFFF)+(d&0xFFFF)+(e&0xFFFF);
var msw = (a>>16)+(b>>16)+(c>>16)+(d>>16)+(e>>16)+(lsw>>16);
return (msw<<16)|(lsw&0xFFFF);
};
// Bitwise rotate left a 32-bit integer by 1 bit
rol32 = function(n)
{
return (n>>>31)|(n<<1);
};
var len = blen*8;
// Append padding so length in bits is 448 mod 512
x[len>>5] |= 0x80 << (24-len%32);
// Append length
x[((len+64>>9)<<4)+15] = len;
var w = Array(80);
var k1 = 0x5A827999;
var k2 = 0x6ED9EBA1;
var k3 = 0x8F1BBCDC;
var k4 = 0xCA62C1D6;
var h0 = 0x67452301;
var h1 = 0xEFCDAB89;
var h2 = 0x98BADCFE;
var h3 = 0x10325476;
var h4 = 0xC3D2E1F0;
for(var i=0;i<x.length;i+=16) {
var j,t;
var a = h0;
var b = h1;
var c = h2;
var d = h3;
var e = h4;
for(j = 0;j<16;j++) {
w[j] = x[i+j];
t = add32x5(e,(a>>>27)|(a<<5),d^(b&(c^d)),w[j],k1);
e=d; d=c; c=(b>>>2)|(b<<30); b=a; a = t;
}
for(j=16;j<20;j++) {
w[j] = rol32(w[j-3]^w[j-8]^w[j-14]^w[j-16]);
t = add32x5(e,(a>>>27)|(a<<5),d^(b&(c^d)),w[j],k1);
e=d; d=c; c=(b>>>2)|(b<<30); b=a; a = t;
}
for(j=20;j<40;j++) {
w[j] = rol32(w[j-3]^w[j-8]^w[j-14]^w[j-16]);
t = add32x5(e,(a>>>27)|(a<<5),b^c^d,w[j],k2);
e=d; d=c; c=(b>>>2)|(b<<30); b=a; a = t;
}
for(j=40;j<60;j++) {
w[j] = rol32(w[j-3]^w[j-8]^w[j-14]^w[j-16]);
t = add32x5(e,(a>>>27)|(a<<5),(b&c)|(d&(b|c)),w[j],k3);
e=d; d=c; c=(b>>>2)|(b<<30); b=a; a = t;
}
for(j=60;j<80;j++) {
w[j] = rol32(w[j-3]^w[j-8]^w[j-14]^w[j-16]);
t = add32x5(e,(a>>>27)|(a<<5),b^c^d,w[j],k4);
e=d; d=c; c=(b>>>2)|(b<<30); b=a; a = t;
}
h0 = add32(h0,a);
h1 = add32(h1,b);
h2 = add32(h2,c);
h3 = add32(h3,d);
h4 = add32(h4,e);
}
return Array(h0,h1,h2,h3,h4);
};
}
//}}}
/***
|''Name:''|DeprecatedFunctionsPlugin|
|''Description:''|Support for deprecated functions removed from core|
***/
//{{{
if(!version.extensions.DeprecatedFunctionsPlugin) {
version.extensions.DeprecatedFunctionsPlugin = {installed:true};
//--
//-- Deprecated code
//--
// @Deprecated: Use createElementAndWikify and this.termRegExp instead
config.formatterHelpers.charFormatHelper = function(w)
{
w.subWikify(createTiddlyElement(w.output,this.element),this.terminator);
};
// @Deprecated: Use enclosedTextHelper and this.lookaheadRegExp instead
config.formatterHelpers.monospacedByLineHelper = 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 text = lookaheadMatch[1];
if(config.browser.isIE)
text = text.replace(/\n/g,"\r");
createTiddlyElement(w.output,"pre",null,null,text);
w.nextMatch = lookaheadRegExp.lastIndex;
}
};
// @Deprecated: Use <br> or <br /> instead of <<br>>
config.macros.br = {};
config.macros.br.handler = function(place)
{
createTiddlyElement(place,"br");
};
// Find an entry in an array. Returns the array index or null
// @Deprecated: Use indexOf instead
Array.prototype.find = function(item)
{
var i = this.indexOf(item);
return i == -1 ? null : i;
};
// Load a tiddler from an HTML DIV. The caller should make sure to later call Tiddler.changed()
// @Deprecated: Use store.getLoader().internalizeTiddler instead
Tiddler.prototype.loadFromDiv = function(divRef,title)
{
return store.getLoader().internalizeTiddler(store,this,title,divRef);
};
// Format the text for storage in an HTML DIV
// @Deprecated Use store.getSaver().externalizeTiddler instead.
Tiddler.prototype.saveToDiv = function()
{
return store.getSaver().externalizeTiddler(store,this);
};
// @Deprecated: Use store.allTiddlersAsHtml() instead
function allTiddlersAsHtml()
{
return store.allTiddlersAsHtml();
}
// @Deprecated: Use refreshPageTemplate instead
function applyPageTemplate(title)
{
refreshPageTemplate(title);
}
// @Deprecated: Use story.displayTiddlers instead
function displayTiddlers(srcElement,titles,template,unused1,unused2,animate,unused3)
{
story.displayTiddlers(srcElement,titles,template,animate);
}
// @Deprecated: Use story.displayTiddler instead
function displayTiddler(srcElement,title,template,unused1,unused2,animate,unused3)
{
story.displayTiddler(srcElement,title,template,animate);
}
// @Deprecated: Use functions on right hand side directly instead
var createTiddlerPopup = Popup.create;
var scrollToTiddlerPopup = Popup.show;
var hideTiddlerPopup = Popup.remove;
// @Deprecated: Use right hand side directly instead
var regexpBackSlashEn = new RegExp("\\\\n","mg");
var regexpBackSlash = new RegExp("\\\\","mg");
var regexpBackSlashEss = new RegExp("\\\\s","mg");
var regexpNewLine = new RegExp("\n","mg");
var regexpCarriageReturn = new RegExp("\r","mg");
}
//}}}
Dexter Hypertext Reference Model var en indflydelsesrig, formel referencemodel for hypermedier udviklet 1988-1990 under "Dexter møderne", hvor deltagerne bl.a. var Doug Engelbart, Frank Halasz (som også udarbejdede de [[Seven Issues]]), Don ~McCracken, Randall Trigg, Bill Weiland og andre. Målet var at definere fælles forståelse og koncepter for hypermedier.
Dexter modellen lægger stor vægt på adskillelsen mellem storage og runtime lag og interaktionen mellem lagene. Den identificerer links som førsteklasses objekter og definerer et udvekslingsformat på tværs af systemer. Dexter modellen har tre lag:
# Run-time Layer (præsentation, interaktion, dynamik)
# Storage Layer (database med Components)
# ~Within-Component Layer (indholdet af dokumenter)
Components er en superklasse for andre Components...
* Atomic Components (container for indhold)
* Link Components (repræsenterer relationer)
* Composite Components (består af andre Components)
og Components har:
* Unikt ID (entydig identifikation)
* Anchor (ID og value) -- Bemærk at anchors i Dexter er eksterne objekter, modsat de indlejrede i fx HTML.
* ~PSpec (angiver visning)
* Attributter (key/value pairs, åben for brugerspecifikation)
* ~BaseComponent (selve indholdet)
* Specifier (2 pr link)
Dexter modellens betydning:
* Identificerede links som førsteklasses objekter
* Generaliserede link modellen
* Formaliserede composites
* Definerede pæn opdeling i tre lag
* God teoretisk model, men måtte tilpasses i praksis
Kritik af Dexter modellen:
* Dangling links (burde understøttes i Dexter)
* [[Link|Links]] directionality (mangler der flere muligheder?)
* Anchors (mangler flere ankertyper?)
* Components (modellere kun intern struktur)
* Multimedia and time
* [[Samarbejdsstøtte]] understøttes ikke
Forfattervirksomhed som parameter for sammenligning af ét <<tag hypermediesystem>> med et andet måler på hvor nemt det er for en forfatter at tilføje til systemet eller redigere i eksisterende [[nodes|Nodes]].
Se hvilke andre nodes henviser hertil ved at klikke ''more'' og ''references'' i menuen på denne [[tiddler|Tiddler]].
Hypermedier er en videreudvikling af [[hypertext|Hypertext]] hvor de linkende elementer kan være billeder, animationer, filmklip, lyde osv. Det første <<tag hypermediesystem>> blev opfundet i 70'erne og det mest kendte af slagsen er [[World Wide Web]] som vi kender det fra internettet i dag.
Hypermediesystemer kan f.eks. bruges til publicering af elektroniske dokumenter, [[samarbejde|Samarbejdsstøtte]] om komplekse opgaver, deling af fælles informationer, undervisning, underholdning eller [[hyperfiktion|http://en.wikipedia.org/wiki/Hyperfiction]]. Den kanoniske model for et hypermediesystem er [[Dexter Hypertext Reference Model]].
Navnet på denne wikis forfatter, som også blogger på [[hypermedister.tumblr.com|http://hypermedister.tumblr.com]].
Hypertekst handler om at udnytte computeres evne til at linke statiske, linære tekster på kryds og tværs og fremvise kun relevante dele af teksten. Det er et vigtigt element i et hypertext- eller <<tag hypermediesystem>> at brugeren kan oprette nye [[links|Links]] og [[nodes|Nodes]] og at strukturen kan ses gennem en browser af en art.
[[Bush|http://en.wikipedia.org/wiki/Vannevar_Bush]], [[Nelson|http://en.wikipedia.org/wiki/Ted_Nelson]] og [[Engelbart|http://en.wikipedia.org/wiki/Doug_Engelbart]] var pionerer indenfor hypertext feltet og så alle hypertekst som den ultimative form for [[HCI|http://en.wikipedia.org/wiki/Human-Computer_Interaction]].
[[Hypermedier]] er en videreudvikling af hypertext der indeholder andre medietyper end bare tekst.
Hvor [[KMS]] var udviklet som et effektivt dokumentationsværktøj var Intermedia nærmere udviklet som et godt framework til udforskning af hypermediet selv.
Systemet havde sin baggrund på [[Brown University|http://en.wikipedia.org/wiki/Brown_university]] og blev brugt med stor succes i undervisningssammenhængende. Samtidig var den fleksible arktitektur optimal til arbejdet med at integrere forskellige medietyper i systemet, og adskillige editorer blev bygget ovenpå [[MacApp|http://en.wikipedia.org/wiki/MacApp]] frameworket således at systemet kunne indeholde både tekst, grafik, lyd, animation osv.
I modsætning til [[KMS]] kunne dokumenter i Intermedia have en arbitrær størrelse og var derfor scrollbare som vi kender det fra [[WWW|World Wide Web]]-dokumenter i dag. I modsætning til WWW var [[links|Links]] dog to-vejs i Intermedia, og et link kunne henvise til en ‘block’ af indhold der beholdt referencen selv hvis dokumentet blev redigeret.
Dokumenter kunne kontekstualiseres i ‘webs’ og kunne på den måde indgå i flere forskellige kontekster, om end det var en designbegrænsning at en bruger kun kunne udforske et web ad gangen og ikke danne sig et overblik over et dokuments andre associationer.
Intermedia havde et meget struktureret rettighedssystem i forhold til [[samarbejdsstøtte|Samarbejdsstøtte]] idet brugerne af systemet enten havde rettigheder til at læse, skrive eller annotere hver enkelt [[node|Nodes]], ikke ulig rettighederne i et [[Unix|http://en.wikipedia.org/wiki/Unix]]-system.
Læs mere om [[Intermedia på Wikipedia|http://en.wikipedia.org/wiki/Intermedia_%28hypertext%29]].
Denne [[wiki|Wiki]] er oprettet som svar på den tredje opgave i Hypermedier & web kurset: en sammenligning af fortidige og nutidige [[hypermediesystemer|Hypermedier]] ud fra forskellige parametre, og et meta-eksperiment i at udarbejde en wiki.
Jeg har valgt at opbygge min wiki i [[TiddlyWiki]]-systemet, som jeg tidligere har eksperimenteret med i forskellige sammenhænge. Det er et ret unikt og interessant wiki-system af flere årsager, blandt andet fordi det opfordrer til at man skriver sine wiki-[[nodes|Nodes]] som [[microcontent|http://en.wikipedia.org/wiki/Microcontent]], dvs. små atomare stykker indhold, der linkes på kryds og tværs. Andre wiki-systemer ligger tættere på almindelige websider hvor man browser én side ad gangen og når man navigerer til en ny side loades den i browseren. I en TiddlyWiki er alt indhold, styling og dynamisk præsentations-kode indeholdt i én og samme ~HTML-fil og loades derfor ind i browseren én gang for alle. Man kan derfor åbne en ny node, eller [[tiddler|Tiddler]] som det kaldes i en ~TiddlyWiki, med det samme -- endda endnu hurtigere end [[KMS]]-målsætningen om 0.25 sekunder. Og man kan have adskillige nodes åbne samtidigt, navigere imellem dem ("more" > "jump" i menuen over hver tiddler) og lukke dem enkeltvist og uafhængigt af hinanden ("close" og "close others" i menuen).
Hvad brugen af TiddlyWiki har betydet for udarbejdelsen af denne wiki beskriver jeg lidt nærmere i [[konklusionen|Konklusion]].
De tre pionerende hypermediesystemer vi har gennemgået i undervisningen havde hver deres specifikke målsætninger og designfilosofier. KMS, som var det tidligste af dem, var som akronymet antyder et [[Knowledge Management System|http://en.wikipedia.org/wiki/Knowledge_management_system]] og var derfor specifikt designet til at være et effektivt opslagsværk.
Systemet var opbygget af frames hvis faste opløsning gjorde at de kunne vises på en computerskærm i deres helhed så brugeren undgik at scrolle. En sådan frame kunne ganske frit fyldes med billede- og tekstindhold (kaldet items), ikke ulig hvordan [[slideware|http://en.wikipedia.org/wiki/Presentation_program]] som ~PowerPoint og Keynote fungerer i dag.
KMS havde god understøttelse for [[forfattervirksomhed|Forfattervirksomhed]] idet brugerne havde direkte adgang til at redigere i de dokumenter han læste og med et enkelt museklik kunne oprette nye links mellem [[nodes|Nodes]] eller tilføje annotationer til en side. Der var ingen adskillelse mellem browsing og redigering, ikke ulig den oprindelige vision for [[World Wide Web]], som dog ikke er blevet realiseret -- om end [[wikis|Wiki]] er på vej derhen.
Fordi hver frame var forholdsvis lille og blev opbevaret i en separat fil var der i et stort system en ret lille risiko for at to brugere ville redigere i det samme dokument samtidig. Dette faktum, koblet med et simpelt [[concurrency control-system|http://en.wikipedia.org/wiki/Optimistic_concurrency_control]], gjorde KMS til et system med god [[samarbejdsstøtte|Samarbejdsstøtte]]. Flere brugere kunne på samme tid redigere i samme "hjørne" af træet, og endda i samme frame. I stedet for at låse en frame når en bruger redigerede i den oprettede systemet blot en kopi til den næste bruger, som så manuelt måtte flette rettelserne sammen.
Læs mere om [[KMS på Wikipedia|http://en.wikipedia.org/wiki/KMS_%28Hypertext%29]].
Implicitte [[links|Links]] som er søgninger efter nøgleord i tekstknuder (giver ofte mange destinationer). F.eks. at [[linke til en Google søgning|http://www.google.com/search?q=%22tiddlywiki+rocks%22]].
Som nævnt i [[introduktionen|Introduktion]] er denne wiki opbygget i [[TiddlyWiki]]-systemet, hvilket har haft en vis betydning for dens udformning.
Så vidt muligt har jeg arbejdet ud fra at en TiddlyWiki naturligt lægger op til at udarbejde wikiens indhold i atomar form, som [[microcontent|http://en.wikipedia.org/wiki/Microcontent]]. Derfor har wikien mange korte [[nodes|Nodes]] der kort beskriver ét enkelt koncept. Disse korte beskrivelser refereres så i de fem lidt længere [[tiddlere|Tiddler]] om de enkelte [[hypermediesystemer|Hypermedier]], som optræder i menuen til venstre. På grund af ~TiddlyWikis særegne konstruktion hvor man kan have flere tiddlere åbne på én gang er det nemt at følge et link til en kort, atomar forklaring af et begreb uden at miste sin stedsans og blive taget væk fra det man var i gang med at læse.
Denne struktur og opbygning har også haft en betydning for min egen skriveproces i udarbejdelsen af denne wiki. I modsætning til at skrive en konventionel opgave, hvor man mere eller mindre skriver det hele fra en ende af, har jeg her kunnet hoppe frem og tilbage mellem wikiens forskellige [[nodes|Nodes]] og tilføje her og der efterhånden som jeg kom i tanke om tilføjelser. Jeg kunne også løbende oprette links til nye nodes som jeg vidste skulle udfyldes senere, og så skrive dem når jeg fik tid. ~TiddlyWiki er nemlig så venlig at holde øje med hvilke tiddlere man har lovet at skrive men ikke er nået til endnu ("More" > "Missing" i den grå menu til højre).
Da en ~TiddlyWiki er fuldstændig "self-contained" i en enkelt ~HTML-fil er den meget transportabel og som sådan også nemt at publicere på nettet, men for at gøre arbejdet lidt nemmere oprettede jeg en konto på [[tiddlyspot.com|http://tiddlyspot.com/]] hvortil jeg kunne synkronisere min lokale kopi af denne wiki og hvor jeg til sidst kunne publicere den til offentlig fremstilling. Så tak til dem for den rare gratis hosting.
[[Strukturering|Struktureringsmekanismer]] via links er inspireret af gamle teknikker i bøger (referencer til afsnit, næste/forrige side, index osv.). Links har f.eks. de egenskaber at de kan forbinde kommentarer og annotationer til en tekst, repræsentere strukturel information, forbinde succesive tekstafsnit eller forbinde en figur med en beskrivelse. Der findes forskellige typer af links:
* [[Reference links]]
* [[Organisationelle links]]
* [[Keyword links]]
* [[Typede links]]
* [[Action links]]
* [[Conditional links]]
* [[Cluster links]]
* [[Transclusion links]]
Grundlæggende kan links enten være defineret i selve dokumentet som attributter (fx som i HTML) eller links og ankre (= et område i et dokument) kan defineres eksternt (fx i [[Intermedia]], åbne [[hypermediesystemer|Hypermedier]], [[XLink|http://en.wikipedia.org/wiki/Xlink]]).
/***
|''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);
}
//}}}
[[Introduktion]]
[[Blog]]
[[Wiki]]
[[Intermedia]]
[[NoteCards]]
[[KMS]]
[[Konklusion]]
En ''node'' i et [[hypermediesystem|Hypermedier]] er en "klump" indhold, der udgør en samlet enhed i systemets hierarki. Hvis man forestiller sig træstrukturen i et hypermediesystem er de enkelte nodes knudepunkter mellem foregreningerne, som er systemets [[hyperlinks|Links]]. I en [[TiddlyWiki]], som denne wiki er bygget i, kaldes de enkelte nodes for [[tiddlers|Tiddler]].
~NoteCards blev udviklet af forskere på [[Xerox PARC|http://en.wikipedia.org/wiki/Xerox_Parc]] som et generelt [[hypermediesystem|Hypermedier]] med mange anvendelsesmuligheder. Det blev især brugt i forskningsøjemed og som en understøttelse af menneskelig idégenerering og dokumentation.
Som navnet antyder var systemet opbygget på metaforet af ‘notecards’, som kunne samles i ‘fileboxes’, men modsat de fysiske notecards kunne dokumenter i ~NoteCards godt indgå i flere fileboxes på samme tid. Man kunne derudover nemt generere lineært output fra en filebox, hvorfor systemet var velegnet til udarbejdelse og strukturering af traditionelt skriftligt arbejde.
Systemet var bygget på [[Lisp|http://en.wikipedia.org/wiki/Lisp_%28programming_language%29]] hvilket havde den fordel at det nemt kunne udvides af Lisp-kyndige programmører, men omvendt var det bygget til at køre på dedikeret Lisp-hardware hvilket var skyld i systemets naturlige død i starten af 90erne.
En anden designmæssig begrænsning var at var at alle nodes i systemet blev opbevaret i én central ~NoteFile hvorved [[KMS]]-agtig [[samarbejdsstøtte|Samarbejdsstøtte]] blev umuliggjort -- et faktum som én af systemets udviklere, Frank Halasz, også påpegede da han fremlagde [[Seven Issues]] for videre udvikling af [[hypermediesystemer|Hypermedier]] i 1988.
Læs mere om [[NoteCards på Wikipedia|http://en.wikipedia.org/wiki/NoteCards]].
Organisationelle eller strukturelle [[links|Links]] består af et træ eller netværksstruktur med links der giver brugeren mulighed for at navigere op og ned i træet.
Sådanne links er mulige at lave i HTML ved hjælp af {{{<link rel="">}}} attributten i en sides header.
Reference [[links|Links]] er den nok mest almindelige linktype hvor et link peger fra sit udgangspunkt til en destination.
Samarbejdsstøtte som parameter for sammenligning af [[hypermediesystemer|Hypermedier]] måler på hvor godt systemet understøtter at flere brugere redigerer og tilføjer til systemet på samme tid, eventuelt til samme [[node|Nodes]].
De følgende problemer blev påpeget af Frank Halasz i 1988. Noget har vi fået rettet i mellemtiden, men andre problemer er stadig ikke løst.
# Search and Query
** Problemer med at navigere i store, ukendte og heterogene netværk.
** Linkfollowing er ikke optimalt når man ved hvad man leder efter.
** Behov for avanceret query maskine (hvilket vi efterhånden har i dag).
# Composites
** Behov for gruppevis håndtering af [[nodes|Nodes]] og [[links|Links]].
# Virtual structures
** Hypermediemodellen var (er?) for statisk.
** Netværket kan ikke opdatere sig selv når en del af indholdet ændres.
** Dette ville også løse problemet med "premature organization".
# Computation
** Hypermediemodellen er passiv.
** Ingen støtte for automatisk skabelse eller behandling af links.
** Beregning på tværs af hypermedier laves i dag fx gennem API'er.
# Versioning
** Behov for at følge historikken i netværkets udvikling.
** Der er lavet en del forskning i versionskontrol af hypermediesystemer.
# Collaboration
** Brug for bedre undersøttelse af [[samarbejdsstøtte|Samarbejdsstøtte]].
** Brug for annotering/kommentering, multiple views, asynkrone bidrag.
** Selv [[WWW|World Wide Web]] i dag har ikke indbygget samarbejdsstøtte (kun via fx Google Docs).
# Extensibility and Tailorability
** Behov for at tilpasse et generelt system til en specifik applikation.
** Nuværende løsning: API (giver dog kun adgang for programmører).
** Kan vi lave en slags direkte manipulation for at give andre adgang?
** (Yahoo Pipes?)
- en wiki til Hypermedier & web
/***
|''Name:''|SparklinePlugin|
|''Description:''|Sparklines macro|
***/
//{{{
if(!version.extensions.SparklinePlugin) {
version.extensions.SparklinePlugin = {installed:true};
//--
//-- Sparklines
//--
config.macros.sparkline = {};
config.macros.sparkline.handler = function(place,macroName,params)
{
var data = [];
var min = 0;
var max = 0;
var v;
for(var t=0; t<params.length; t++) {
v = parseInt(params[t]);
if(v < min)
min = v;
if(v > max)
max = v;
data.push(v);
}
if(data.length < 1)
return;
var box = createTiddlyElement(place,"span",null,"sparkline",String.fromCharCode(160));
box.title = data.join(",");
var w = box.offsetWidth;
var h = box.offsetHeight;
box.style.paddingRight = (data.length * 2 - w) + "px";
box.style.position = "relative";
for(var d=0; d<data.length; d++) {
var tick = document.createElement("img");
tick.border = 0;
tick.className = "sparktick";
tick.style.position = "absolute";
tick.src = "data:image/gif,GIF89a%01%00%01%00%91%FF%00%FF%FF%FF%00%00%00%C0%C0%C0%00%00%00!%F9%04%01%00%00%02%00%2C%00%00%00%00%01%00%01%00%40%02%02T%01%00%3B";
tick.style.left = d*2 + "px";
tick.style.width = "2px";
v = Math.floor(((data[d] - min)/(max-min)) * h);
tick.style.top = (h-v) + "px";
tick.style.height = v + "px";
box.appendChild(tick);
}
};
}
//}}}
* [[Links]]
* Kollektioner
* Guidede ture
* Oversigtskort
* Rumlige visualiseringer
* Taksonomier
* Tidsmæssig synkroniseringer
/*{{{*/
body {
font-family: Optima, Verdana, sans-serif;
font-size: 0.85em;}
.header {
text-shadow: 2px 2px 0px #333;}
.headerShadow {
padding: 1em 0em 1em 1em;
left: 0px;
top: 0px;}
.headerForeground {
padding: 1em 0em 1em 1em;}
.siteSubtitle {
font-size: 2em;}
.viewer, .editor {
line-height: 1.6em;
font-family: "Trebuchet MS";
font-size: 0.95em;}
.viewer ul li {
margin-top: 0.4em;}
.viewer ol li {
margin-top: 0.4em;}
.viewer pre {
font-size: 1.2em;}
/*}}}*/
En ''tiddler'' er navnet på den enkelte [[node|Nodes]] eller post i en [[TiddlyWiki]].
[[TiddlyWiki|http://www.tiddlywiki.com/]] er det [[wiki|Wiki]] system som nærværende wiki er bygget i. Systemet, som er udviklet af Jeremy Ruston og nu vedligeholdes som et open source projekt, er unikt idet hele wiki'en opbevares i én enkelt fil som indeholder al den HTML, CSS og ~JavaScript som kræves for at gemme, vise og interagere med wikien. På trods af at der ingen netværkskommunikation foregår i arbejdet med en ~TiddlyWiki demonstrerer den meget godt den moderne oplevelse af et rigt [[Ajax]]-interface, og systemet er da også baseret på mange af de samme teknologier.
Jeg har valgt ~TiddlyWiki fordi systemet er utrolig nemt at arbejde med, og det har interessante funktioner som fx oversigter over alle [[tiddlere|Tiddler]] og tags, en indbygget dynamisk søgefunktion og mulighed for at se hvilke tiddlere [[linker|Links]] til den aktuelle tiddler. Systemet holder også automatisk styr på hvilke tiddlere der er "forældreløse", dvs. som ikke linkes til fra andre steder. På den måde hjælpes man på vej til at sørge for at wikien er grundigt krydslinket, som den jo bør være. Det er derudover utrolig nemt at redigere en tiddler. Man dobbelt-klikker bare på teksten for at konvertere den til en tekstboks man kan redigere i, og ctrl-enter gemmer ændringerne.
Modsat andre wikier er designfilosofien bag ~TiddlyWiki at de enkelte tiddlere er meget korte, og man har som regel flere af dem åbne på en side på samme tid (og kan nemt navigere imellem dem og lukke dem enkeltvis). Det gør det til en interessant [[hypertekst|Hypertext]]-system at arbejde med, modsat andre wikier som nærmere er en samling traditionelle lange websider som er nemme at redigere, men som ikke er helt så nemme og dynamiske at arbejde med.
Data overføres løbende eller på opfordring mellem link og endepunkter. En slags 'live copy-og-paste'. Fx at trække en graf fra Excel til Word, og når man opdaterer data i Excel opdateres grafen automatisk i Word.
/***
Contains the stuff you need to use Tiddlyspot
Note you must also have UploadPlugin installed
***/
//{{{
// edit this if you are migrating sites or retrofitting an existing TW
config.tiddlyspotSiteId = 'hypermedister';
// 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)
// 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 Guides|http://tiddlywikiguides.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/]], [[announcements|http://announce.tiddlyspot.com/]], [[blog|http://tiddlyspot.com/blog/]], 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")
});
//}}}
Attributter på typede [[links|Links]] gør det muligt at skelne mellem semantiske forskelle i links (fx. [[NoteCards]]). I princippet understøttet på [[WWW|World Wide Web]], men kun sjældent brugt i praksis.
| !date | !user | !location | !storeUrl | !uploadDir | !toFilename | !backupdir | !origin |
| 10/03/2008 10:56:49 | Hypermedister | [[/|http://hypermedister.tiddlyspot.com/#Intermedia]] | [[store.cgi|http://hypermedister.tiddlyspot.com/store.cgi]] | . | [[index.html | http://hypermedister.tiddlyspot.com/index.html]] | . |
| 12/03/2008 10:28:32 | Hypermedister | [[/|http://hypermedister.tiddlyspot.com/]] | [[store.cgi|http://hypermedister.tiddlyspot.com/store.cgi]] | . | [[index.html | http://hypermedister.tiddlyspot.com/index.html]] | . |
| 12/03/2008 10:29:33 | Hypermedister | [[/|http://hypermedister.tiddlyspot.com/]] | [[store.cgi|http://hypermedister.tiddlyspot.com/store.cgi]] | . | [[index.html | http://hypermedister.tiddlyspot.com/index.html]] | . |
| 12/03/2008 10:31:36 | Hypermedister | [[/|http://hypermedister.tiddlyspot.com/]] | [[store.cgi|http://hypermedister.tiddlyspot.com/store.cgi]] | . | [[index.html | http://hypermedister.tiddlyspot.com/index.html]] | . |
| 12/03/2008 10:44:08 | Hypermedister | [[hypermedister.html|file:///Users/dan/Documents/TiddlyWiki/hypermedister.html]] | [[store.cgi|http://hypermedister.tiddlyspot.com/store.cgi]] | . | [[index.html | http://hypermedister.tiddlyspot.com/index.html]] | . | ok |
| 13/03/2008 17:46:09 | Hypermedister | [[hypermedister.html|file:///Users/dan/Documents/TiddlyWiki/hypermedister.html]] | [[store.cgi|http://hypermedister.tiddlyspot.com/store.cgi]] | . | [[index.html | http://hypermedister.tiddlyspot.com/index.html]] | . |
| 13/03/2008 18:04:29 | Hypermedister | [[/|http://hypermedister.tiddlyspot.com/]] | [[store.cgi|http://hypermedister.tiddlyspot.com/store.cgi]] | . | [[index.html | http://hypermedister.tiddlyspot.com/index.html]] | . |
| 13/03/2008 18:08:48 | Hypermedister | [[hypermedister.html|file:///Users/dan/Documents/TiddlyWiki/hypermedister.html]] | [[store.cgi|http://hypermedister.tiddlyspot.com/store.cgi]] | . | [[index.html | http://hypermedister.tiddlyspot.com/index.html]] | . | ok |
| 13/03/2008 18:09:47 | Hypermedister | [[hypermedister.html|file:///Users/dan/Documents/TiddlyWiki/hypermedister.html]] | [[store.cgi|http://hypermedister.tiddlyspot.com/store.cgi]] | . | [[index.html | http://hypermedister.tiddlyspot.com/index.html]] | . | ok |
| 13/03/2008 22:05:34 | Hypermedister | [[hypermedister.html|file:///Users/dan/Documents/TiddlyWiki/hypermedister.html]] | [[store.cgi|http://hypermedister.tiddlyspot.com/store.cgi]] | . | [[index.html | http://hypermedister.tiddlyspot.com/index.html]] | . |
/***
|''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:''|UploadPlugin|
|''Description:''|Save to web a TiddlyWiki|
|''Version:''|4.1.0|
|''Date:''|May 5, 2007|
|''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 (#3125)|
|''Requires:''|PasswordOptionPlugin|
***/
//{{{
version.extensions.UploadPlugin = {
major: 4, minor: 1, revision: 0,
date: new Date("May 5, 2007"),
source: 'http://tiddlywiki.bidix.info/#UploadPlugin',
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
//
// 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
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}
]);
},
refreshOptions: function(listWrapper) {
var uploadOpts = [
"txtUploadUserName",
"pasUploadPassword",
"txtUploadStoreUrl",
"txtUploadDir",
"txtUploadFilename",
"txtUploadBackupDir",
"chkUploadLog",
"txtUploadLogMaxLine",
]
var opts = [];
for(i=0; i<uploadOpts.length; i++) {
var opt = {};
opts.push()
opt.option = "";
n = uploadOpts[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 = 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,null,null,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 = Array(uploadParams[0],rssPath,uploadParams[2],'',uploadParams[4],uploadParams[5]);
bidix.upload.httpUpload(rssUploadParams,convertUnicodeToUTF8(generateRss()),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 == httpStatus.NotFound)
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; 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');
/* don't want this for tiddlyspot sites
// Backstage
merge(config.tasks,{
uploadOptions: {text: "upload", tooltip: "Change UploadOptions and Upload", content: '<<uploadOptions>>'}
});
config.backstageTasks.push("uploadOptions");
*/
//}}}
Ordet ''wiki'' stammer fra Hawaii og betyder "hurtig", og det var derfor det ord [[Ward Cunningham|http://en.wikipedia.org/wiki/Ward_Cunningham]] brugte da han [[opfandt wikien|http://en.wikipedia.org/wiki/Wiki#History]] i 1995. Ideen i wiki-systemet var nemlig at det skulle være hurtigt for brugere at redigere i indholdet på en webside. Wikier bruges netop også i dag som en typisk metode til kollaborativ udbygning af websites, hvoraf det bedst kendte eksempel naturligvis er [[Wikipedia|http://wikipedia.org]].
Wikier er kendetegnet ved at have et simpelt dokumentsprog som, selv om det bruges til at forfatte indhold til [[WWW|World Wide Web]], er anderledes og simplere end HTML. Derudover har de fleste wikier indbygget en form for versionering som gemmer tidligere udgaver af alle sider, hvilket gør dem gode for en enkelt bruger at benytte som vidensdatabase men som specifikt gør dem gode til [[samarbejdsstøtte|Samarbejdsstøtte]]. Hver enkelt bruger kan se alle andre brugeres tidligere udgaver af en side og dermed få et overblik over hvordan siden har udviklet sig, og man kan altid føre en side tilbage til en af dens tidligere udformninger hvilket gør det vanskeligt at vandalisere en wiki.
Hvor [[blogs|Blog]] på sin vis kan siges at udgøre et distribueret [[hypermediesystem|Hypermedier]] er tanken med en wiki at den skal udgøre et hypermediesystem i sig selv. Det udelukker ikke at den kan linke til eksterne resourcer, ligesom denne wiki har en del udgående links til [[Wikipedia|http://wikipedia.org]] og Wikipedia omvendt har en del links til eksterne websites. Men langt de fleste links både her og på Wikipedia peger til andre [[nodes|Nodes]] internt i wikien. Det understøttes af alment accepterede syntakser i de forskellige wiki-markup-sprog der gør det muligt automatisk at linke til en side hvis navn er skrevet i ~CamelCase ved blog at skrive sidens navn, fx {{{WikiLink}}}. Hvis ikke en side er navngivet i ~CamelCase kan man i det fleste markup-sprog linke til den ved at omfatte navnet på siden i firkantede klammer, fx {{{[[Wiki link]]}}}. Begge metoder kan bruges i [[TiddlyWiki]] og eksempler på sidstnævnte kan ses i kildekoden til de enkelte [[tiddlere|Tiddler]] på denne wiki ved at dobbelt-klikke på teksten og derved skifte til redigerings-mode.
Wikier har generelt god understøttelse af [[forfattervirksomhed|Forfattervirksomhed]], specielt i forhold til [[blogs|Blog]], idet barrieren for at redigere i et dokument er meget lav. Hvis man kigger på en artikel på Wikipedia er der øverst på siden et "edit this page" link og hvert enkelt afsnit har ydermere et "edit"-link der indbyder -- og nærmest frister -- brugeren til at redigere siden og dermed bidrage til wikien. På Wikipedia er redigeringsrettighederne ydermere åbne for alle brugere, så der er ikke engang nogen login-barriere og kan man med ganske få klik blive bidragsyder. Barrieren er om noget endnu laver i en [[TiddlyWiki]] hvor man foruden at klikke på edit-links på de enkelte [[tiddlere|Tiddler]] også kan nøjes med at dobbelt-klikke på teksten hvorved man straks skifter til redigeringsfunktionen.
''WWW'' er det mest udbredte [[hypermediesystem|Hypermedier]] i dag i kraft af den eksplosive udbredning det har fået siden det blev opfundet af [[Tim Berners-Lee|http://en.wikipedia.org/wiki/Tim_Berners-Lee]] i 1989.
XML (Extensible Markup Language) er et metasprog; en syntaks til at udtrykke andre sprog. HTML bruges til dokumenter, men er for ustruktureret/løst. [[SGML|http://en.wikipedia.org/wiki/Sgml]] (Standard Generalized Markup Language) som ligger til grund for HTML er også udgangspunktet for XML, som er "90% af SGML". Der stilles de følgendende krav til XML dokumenter:
* Korrekt header med XML deklaration
* Kun ét rodelement
* Alle elementer nested korrekt
* Skal overholde en evt. erklæret grammatik (fx en DTD)
* Hvis XML dokumentet indeholder fejl bliver det ikke parset
XML kan benytte [[namespaces|http://en.wikipedia.org/wiki/Namespace_%28computer_science%29]]:
* Bruges som en "ordbog" over tagnavne
* Muliggør at man genbruger definerede standarder og blander grammatikker
* Hindrer navnesammenfald