Welcome to TiddlyWiki created by Jeremy Ruston, Copyright © 2007 UnaMesa Association
|''Type:''|file|
|''URL:''|http://mptw.tiddlyspot.com|
|''Workspace:''|(default)|
This tiddler was automatically created to record the details of this server
|''Type:''|file|
|''URL:''|http://tiddlywiki.bidix.info|
|''Workspace:''|(default)|
This tiddler was automatically created to record the details of this server
|''Type:''|file|
|''URL:''|http://tw.lewcid.org|
|''Workspace:''|(default)|
This tiddler was automatically created to record the details of this server
|''Type:''|file|
|''URL:''|http://www.tiddlytools.com|
|''Workspace:''|(default)|
This tiddler was automatically created to record the details of this server
/***
|''Name:''|AnnotationsPlugin|
|''Description:''|Inline annotations for tiddler text.|
|''Author:''|Saq Imtiaz ( lewcid@gmail.com )|
|''Source:''|http://tw.lewcid.org/#AnnotationsPlugin|
|''Code Repository:''|http://tw.lewcid.org/svn/plugins|
|''Version:''|2.0|
|''Date:''||
|''License:''|[[Creative Commons Attribution-ShareAlike 3.0 License|http://creativecommons.org/licenses/by-sa/3.0/]]|
|''~CoreVersion:''|2.2.3|
!!Usage:
*{{{((text to annotate(annotation goes here)}}}
* To include the text being annotated, in the popup as a title, put {{{^}}} as the first letter of the annotation text.
** {{{((text to annotate(^annotation goes here)}}}
!!Examples:
Mouse over, the text below:
* ((banana(the best fruit in the world)))
* ((banana(^ the best fruit in the world)))
***/
// /%
config.formatters.unshift({name:"annotations",match:"\\(\\(",lookaheadRegExp:/\(\((.*?)\((\^?)((?:.|\n)*?)\)\)\)/g,handler:function(w){
this.lookaheadRegExp.lastIndex=w.matchStart;
var _2=this.lookaheadRegExp.exec(w.source);
if(_2&&_2.index==w.matchStart){
var _3=createTiddlyElement(w.output,"span",null,"annosub",_2[1]);
_3.anno=_2[3];
if(_2[2]){
_3.subject=_2[1];
}
_3.onmouseover=this.onmouseover;
_3.onmouseout=this.onmouseout;
_3.ondblclick=this.onmouseout;
w.nextMatch=_2.index+_2[0].length;
}
},onmouseover:function(e){
popup=createTiddlyElement(document.body,"div",null,"anno");
this.popup=popup;
if(this.subject){
wikify("!"+this.subject+"\n",popup);
}
wikify(this.anno,popup);
addClass(this,"annosubover");
Popup.place(this,popup,{x:25,y:7});
},onmouseout:function(e){
removeNode(this.popup);
this.popup=null;
removeClass(this,"annosubover");
}});
setStylesheet(".anno{position:absolute;border:2px solid #000;background-color:#DFDFFF; color:#000;padding:0.5em;max-width:15em;width:expression(document.body.clientWidth > (255/12) *parseInt(document.body.currentStyle.fontSize)?'15em':'auto' );}\n"+".anno h1, .anno h2{margin-top:0;color:#000;}\n"+".annosub{background:#ccc;}\n"+".annosubover{z-index:25; background-color:#DFDFFF;cursor:help;}\n","AnnotationStyles");
// %/
Questo ~TiddlyWiki si basa sull'adattamento sviluppato da [[giffmex|http://www.giffmex.org]] per realizzare un ~TiddlyWiki da utilizzare come un sito web. Come scritto nella versione originale, questo adattamento è stato sviluppato per soddisfare le esigenze personali dell'autore (a questo [[link|http://www.giffmex.org/webviewtwexample.html]] potete consultare un esempio d'uso dell'adattamento) e può essere adottato, come modello, da chi è interessato ad utilizzare TW per realizzare un sito che si presenti ai visitatori in modo usuale.
Le caratteristiche di questo adattamento sono:
*L'interfaccia è stata ridotta al minimo per evitare la confusione ed il senso di disorientamento che tipicamente provano i visitatori di un sito fatto con ~TiddlyWiki non abituati alle peculiarità di questo software. L'header è stato rimosso, la sidebar è nascosta e gli elementi Autore, Data di creazione e Tag dei Tiddler sono stati eliminati. Il menu principale presenta solo una Toolbox che può anch'essa essere eliminata nel momento in cui si è pronti per rilasciare il sito online. La Toolbox, che può essere visualizzata o menu cliccando sulla voce di menu, permette di visualizzare e di selezionare lo storico dei frammenti aperti, ingrandire o diminuire il font, visualizzare o nascondere la Sidebar a destra.
*E' stata attivata l'apertura di un solo Tiddler alla volta.
*E' stata predisposta una funzionalità che permette di creare una serie di Tiddler collegati tra loro in un sottomenu che è visualizzato sopra il titolo del Tiddler (i tre pulsanti visualizzati in testa a questo frammento sono un esempio d'uso di questa funzionalità). L'uso di questa funzionalità permette di realizzare dei sottomenu di navigazione adatti per la realizzazione di tutorials e presentazioni. L'idea è simile al plugin [[PresentationPlugin|http://lewcid.googlepages.com/presentation_empty_full.html#Documentation]], ma questa implementazione opera in modo diverso.
*Alcune opzioni sono opportunamente preselezionate per rendere più semplice l'uso di TW. In particolare sono disabilitate il salvataggio di backup e l'animazione dell'apertura dei Tiddler. La Sidebar è per default nascosta (per modificare permanentemente queste opzioni editate il Tiddler [[z_configOptions]]).
*Nel modo edit sono disponibili direttamente alcuni comandi di formattazione; per visualizzare le formattazioni disponibili aprite il frammento [[Formatting cheatsheet]]. Nella sidebar è possibile selezionare da un elenco diverse combinazioni di colori per il sito.
*Sono stati installati i plugin UploadPlugin e SplashScreenPlugin. Per istruzioni sull'uso di ~UploadPlugin, leggete le seguenti [[Istruzioni|Istruzioni per l'uso di UploadPlugin]].
L'autore di questo adattamento (Dave Gifford alias giffmex) esprime le proprie scuse ad Alan Hecht, il creatore del plugin ~WebViewPlugin, specificando che non esiste alcuna relazione tra il suo adattamento ed il plugin ~WebViewPlugin che non è installato in questo TW.
!!!Il mio intervento
Il mio intervento (Maurizio Pollio) è consistito sostanzialmente in un ulteriore adattamento di questa versione di TW alla lingua italiana. In particolare, oltre all'installazione del plugin con la traduzione in italiano di TW, ho provveduto a tradurre tutti i comandi, l'interfaccia di navigazione e le istruzioni per la personalizzazione del sito; inoltre, ho eliminato dalle funzioni di editing dei frammenti la formattazione per la lingua Greca ed Ebraica non ritenendo queste ultime di interesse generale. E' evidente che chi fosse interessato a ripristinare tali funzioni di formattazione del testo, potrà sempre fare riferimento alla versione originale di questo adattamento disponibile al seguente [[link|http://www.giffmex.org/webviewtw.html]]. Naturalmente all'autore vanno i miei ringraziamenti e riconoscimenti per questo utile adattamento.
@@bgcolor(#cccc99):A questo lavoro, oltre a tutti i copyright indicati nel menu, si applica la seguente licenza Creative Commons@@
<html>
<a rel="license" href="http://creativecommons.org/licenses/by-nc/2.5/it/">
<img alt="Creative Commons License" style="border-width:0" src="http://creativecommons.org/images/public/somerights20.png" />
</a>
<br />Questa opera è pubblicata sotto una
<a rel="license" href="http://creativecommons.org/licenses/by-nc/2.5/it/">Licenza Creative Commons</a>.
</html>
Background: #fff
Foreground: #000
PrimaryPale: #ccccff
PrimaryLight: #ccccff
PrimaryMid: #333366
PrimaryDark: #014
SecondaryPale: #bbbbff
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #333366
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #9999cc
Error: #f88
/***
|''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);
};
}
//}}}
[[Benvenuti in Webview TiddlyWiki]]
/***
|''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");
}
//}}}
/***
|!''Name:''|!''E''asily ''A''daptable ''S''ource ''E''ditor|
|''Description:''|this framework allows you to easily create commands that work on the current tiddler text selection in edit mode|
|''Version:''|0.1.0|
|''Date:''|13/01/2007|
|''Source:''|http://yann.perrin.googlepages.com/twkd.html#E.A.S.E|
|''Author:''|[[Yann Perrin|YannPerrin]]|
|''License:''|[[BSD open source license]]|
|''~CoreVersion:''|2.x|
|''Browser:''|Firefox 1.0.4+; Firefox 1.5; InternetExplorer 6.0|
***/
////Messages Definition
//{{{
config.messages.Ease = {
noselection:"nothing selected",
asktitle:"enter the new tiddler title",
exists:" already exists, please enter another title",
askForTagsLabel:"enter the new tiddler tags",
tiddlercreated:" tiddler created"
}
//}}}
////
//{{{
if (!window.TWkd) window.TWkd={context:{}};
if (!TWkd.Ease)
TWkd.Ease = function (text,tooltip){
this.text = text;
this.tooltip = tooltip;
this.modes = [];
this.addMode = function(modeDefinition) {this.modes.push(modeDefinition);};
this.handler = function(event,src,title) {
TWkd.context.command = this;
TWkd.context.selection=this.getSelection(title);
if (this.modes.length==1) {
this.modes[0].operation();
}
else {
var popup = Popup.create(src);
if(popup) {
for (var i=0; i<this.modes.length; i++) {
createTiddlyButton(createTiddlyElement(popup,"li"), this.modes[i].name, this.modes[i].tooltip, this.OperateFromButton, null, 'id'+i, null);
}
Popup.show(popup,false);
event.cancelBubble = true;
if (event.stopPropagation) event.stopPropagation();
return false;
}
}
};
};
TWkd.Ease.prototype.OperateFromButton = function(e){
var commandMode=this.getAttribute('Id').replace('id','');
TWkd.context.command.modes[commandMode].operation();
};
TWkd.Ease.prototype.getTiddlerEditField = function(title,field){
var tiddler = document.getElementById(story.idPrefix + title);
if(tiddler != null){
var children = tiddler.getElementsByTagName("*")
var e = null;
for (var t=0; t<children.length; t++){
var c = children[t];
if(c.tagName.toLowerCase() == "input" || c.tagName.toLowerCase() == "textarea"){
if(!e) {e = c;}
if(c.getAttribute("edit") == field){e = c;}
}
}
if(e){return e;}
}
} // closes getTiddlerEditField function definition
TWkd.Ease.prototype.getSelection = function(title,quiet) {
var tiddlerTextArea = this.getTiddlerEditField(title,"text");
var result = {};
if (document.selection != null && tiddlerTextArea.selectionStart == null) {
tiddlerTextArea.focus();
var range = document.selection.createRange();
var bookmark = range.getBookmark();
var contents = tiddlerTextArea.value;
var originalContents = contents;
var marker = "##SELECTION_MARKER_" + Math.random() + "##";
while(contents.indexOf(marker) != -1) {
marker = "##SELECTION_MARKER_" + Math.random() + "##";
}
var selection = range.text;
range.text = marker + range.text + marker;
contents = tiddlerTextArea.value;
result.start = contents.indexOf(marker);
contents = contents.replace(marker, "");
result.end = contents.indexOf(marker);
tiddlerTextArea.value = originalContents;
range.moveToBookmark(bookmark);
range.select();
}
else {
result.start=tiddlerTextArea.selectionStart;
result.end=tiddlerTextArea.selectionEnd;
}
result.content=tiddlerTextArea.value.substring(result.start,result.end);
result.source=title;
if (!result.content&&!quiet) displayMessage(config.messages.Ease.noselection);
return(result);
}//closes getSelection function definition
// replace selection or insert new content
TWkd.Ease.prototype.putInPlace=function(content,workplace) {
var tiddlerText = this.getTiddlerEditField(workplace.source,"text");
tiddlerText.value = tiddlerText.value.substring(0,workplace.start)+content+tiddlerText.value.substring(workplace.end);
}
// asking for title
TWkd.Ease.prototype.askForTitle = function(suggestion) {
if (!suggestion)
suggestion = "";
var newtitle;
while (!newtitle||store.tiddlerExists(newtitle))
{
if (store.tiddlerExists(newtitle))
displayMessage(newtitle+config.messages.Ease.exists);
newtitle = prompt(config.messages.Ease.asktitle,suggestion);
if (newtitle==null)
{
displayMessage(config.messages.Ease.titlecancel);
return(false);
}
}
return(newtitle);
}//closes askForTitle function definition
// creation of a new tiddler
TWkd.Ease.prototype.newTWkdLibTiddler = function(title,content,from,askForTags){
var tiddler = new Tiddler();
tiddler.title = title;
tiddler.modifier = config.options.txtUserName;
tiddler.text = content;
(from) ? tiddler.tags = [from] : tiddler.tags=[];
if (askForTags)
tiddler.tags = prompt(config.messages.Ease.askForTagsLabel,'[['+from+']]').readBracketedList();
store.addTiddler(tiddler);
//store.notifyAll();
displayMessage(title+config.messages.Ease.tiddlercreated);
}
if (!TWkd.Mode)
TWkd.Mode = function (name,tooltip,ask,operation) {
this.name = name;
this.tooltip = tooltip;
this.ask = ask;
this.operation = operation;
};
//}}}
<div class="toolbar" macro="toolbar +saveTiddler closeOthers -cancelTiddler deleteTiddler"></div>
<div class="title" macro="view title"></div>
<div class="editLabel">Title</div><div class="editor" macro="edit title"></div>
<div class="editLabel">Tags</div><div class="editor" macro="edit tags"></div>
<div class="editorFooter"><span macro="message views.editor.tagPrompt"></span><span macro="tagChooser"></span></div>
<div macro='hideWhen ((tiddler.tags.contains("Contacts"))||(tiddler.title=="New Contact"))'>[[EditToolbar]]<div class='editor' macro='edit text'></div></div>
<div macro='showWhen ((tiddler.tags.contains("Contacts"))||(tiddler.title=="New Contact"))'><div class='editor'>
<table width='100%'>
<tr><th>Name</th><td><span macro='edit ContactFirstName'></span><span macro='edit ContactLastName'></span></td><td rowspan='4' width='50%' macro='edit text'></td></tr>
<tr><th>Adress</th><td><span macro='edit ContactStreetNumber'></span><span macro='edit ContactStreetName'></span><span macro='edit ContactZipCode'></span><span macro='edit ContactCity'></span></td></tr>
<tr><th>Phone</th><td><span macro='edit ContactPhone'></span></td></tr>
<tr><th>Email</th><td><span macro='edit ContactMail'><span></td></tr>
</table>
</div></div>
<div macro='toolbar Format Indent Notes Color Highlighting Tables'></div>
/***
|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,"+","ingrandisci caratteri",this.incFont);
createTiddlyButton(sp,"=","reset caratteri",this.resetFont);
createTiddlyButton(sp,"–","diminuisci caratteri",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();
}
};
//}}}
^^''~WebviewTW'' © [[giffmex|http://www.giffmex.org]]^^
/***
|''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.
***/
!Menu Formatta
|''Grassetto''|@@Evidenzia@@|
|//Corsivo//|[[Hyperlink]]|
|__Sottolineato__||
!Menu Indenta
{{engindent{Testo 1x}}}
{{engindent{{{engindent{Testo 2x}}}}}}
{{engindent{{{engindent{{{engindent{Testo 3x}}}}}}}}}
{{engindent{{{engindent{{{engindent{{{engindent{Testo 4x}}}}}}}}}}}}
{{engindent{{{engindent{{{engindent{{{engindent{{{engindent{Testo 5x}}}}}}}}}}}}}}}
!Menu Note
((Sintassi(aggiungi nota qui))) • ((Traduzione(aggiungi nota qui))) • ((Testo(aggiungi nota qui))) • ((Gramm.(aggiungi nota qui))) ((Popup: il tuo testo qui(il tuo testo qui)))
!Menu Colora
{{red{Rosso}}} {{blue{Blu}}} {{green{Verde}}} {{gold{Oro}}} {{gray{Grigio}}} {{magenta{Magenta}}} {{purple{Viola}}} {{teal{Turchese}}} {{burgundy{Borgogna}}}
!Menu Evidenzia
@@bgcolor(#ff6666):Rosso@@ @@bgcolor(#ccccff):Blu@@ @@Giallo@@ @@bgcolor(#99ff99):Verde@@ @@bgcolor(#cc9966):Marrone@@ @@bgcolor(#cccc99):Grigio@@ @@bgcolor(#ff9933):Arancione@@
!Menu Tabelle
Tabella invisibile: {{invisiblecomm{
|!Invisible table header|!Invisible table header|!invisible table header|
|data|data|data|
|data|data|data|
|data|data|data|
}}}
Tabella ordinabile:
|sortable|k
|Header1|Header2|Header3|h
|Aa|B3|data7|
|Ab|B2|data2|
|Ac|B1|data8|
Tabella Standard:
|!Header|!Header|!Header|
|data|data|data|
|data|data|data|
|data|data|data|
Tabella con celle colorate:
|!Below is a light gray cell|!Below is a dark gray cell|!Below are regular cells|
|bgcolor(#eeeeee):text here|||
||bgcolor(#cccccc):text there||
|||text anywhere|
/***
|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, 'storico', 'storico', 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, '<<', 'indietro', 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, '>>', 'avanti', config.macros.forward.action, "ibutton");
}
//}}}
/***
|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();
}
//}}}
!Istruzioni di base
#Scaricate questo file sul vostro pc [[cliccando con il tasto destro del mouse e scegliendo Salva destinazione con nome...|TW_web.html]] con un nome file ed in una cartella di destinazione di vostra scelta. Chiudete questo TW e aprite con il browser il file appena scaricato.
#Sostituite il titolo del vostro ~TiddlyWiki mostrato nella zona in alto a sinistra editando il Tiddler MainMenu.
#Aggiungete ulteriori voci al menu editando MainMenu. Cliccate sulle voci inserite per creare i relativi contenuti; questi appariranno ai visitatori del vostro sito come singole pagine web.
#Modificate il DefaultTiddlers per includere il nome del frammento che desiderate venga visualizzato quando il vostro ~TiddlyWiki viene aperto.
#Se desiderate ulteriori combinazioni di colore oltre quelle selezionabili in questo modello, fate riferimento al seguente [[link|http://www.giffmex.org/webviewtwexample.html#MoreColorPalettes!]] dove l'autore si ripromette di renderne disponibili altre. Importate semplicemente i frammenti corrispondenti alle combinazioni di colore in questo TW. La selezione delle combinazioni di colori avviene nella Sidebar a destra che, se nascosta, potete visualizzare cliccando sul comando presente nella Toolbox.
#Se desiderate sospendere temporaneamente la funzionalità di apertura di un solo frammento alla volta, fate riferimento al seguente bookmarklet dal sito ~TiddlyTools [[link|http://www.tiddlytools.com/#InstantBookmarklets.]].
#Se desiderate nascondere nella Timeline i frammenti editati, etichettateli con il tag <<tag excludeLists>>.
#Personalizzate il messaggio visualizzato da ~SplashScreenPlugin all'apertura di ~TiddlyWiki editando il tiddler MarkupPreHead.
#Caricate il vostro ~TiddlyWiki su un server utilizzando UploadPlugin. Per l'uso di questo plugin leggete le seguenti [[Istruzioni|Istruzioni per l'uso di UploadPlugin]].
~UploadPlugin è un plugin che permette di salvare direttamente su un server web un file ~TiddlyWiki. Questo plugin per poter funzionare correttamente richiede che sul server sia installato, oltre al web server, anche l'interprete PHP.
Per utilizzare ~UploadPlugin nel vostro ~TiddlyWiki seguite queste istruzioni:
#''Importate il plugin ~UploadPlugin ed i componenti ad esso collegati'' (//Attenzione: in questo TW tutti i componenti sono già installati//). Aprite il vostro file ~TiddlyWiki in locale; selezionate dal menu ''Strumenti'' (o dal menu ''backstage'' se utilizzate la versione originale in inglese) il comando ''Importa'' (''import'') ed importate i seguenti tiddlers da http://tiddlywiki.bidix.info/
##~PasswordOptionPlugin
##~UploadPlugin
##store.php
#''Salvate le modifiche'' e ''ricaricate'' il file ~TiddlyWiki.
#''Create il vostro file store.php.'' Aprite il tiddler store.php, che avete appena copiato nel vostro ~TiddlyWiki, e copiate tutto il contenuto del frammento. Aprite Blocco note (Notepad) o il programma di editing che utilizzate normalmente ed incollate in un documento vuoto il contenuto del frammento store.php. Salvate il file appena creato con il nome di ''store.php''; assicuratevi che l'editor utilizzato non aggiunga una estensione diversa al file, come ad esempio .html oppure .txt, ecc.. L'estensione del file ''deve'' essere .php ed il file si deve chiamare ''store''.
#''Configurate il vostro username e la password.'' Aprite il file store.php che avete appena salvato e configurate il vostro (o i vostri) username e la vostra password. Per fare questo dovete semplicemente rintracciare la linea di codice {{{$USERS = array( '~UserName1'=>'Password1', etc) e sostituire ''~UserName1'' con il vostro username e ''Password1'' con la vostra password. Potete anche definire altri due username e relative password; naturalmente se non utilizzate altri account provvedete a cancellare le definizioni per ~UserName2 e ~UserName3. Assicuratevi, inoltre, di lasciare inalterata la restante parte di codice. Salvate il file store.php.
#''Caricate store.php sul vostro server.'' Con il vostro client FTP, ovvero con il programma che normalmente utilizzate per caricare files sul vostro sito web, trasferite il file store.php che avete personalizzato nella directory dove avete deciso di salvare il vostro ~TiddlyWiki. Se avete eseguito correttamente questo passo dovrebbe essere possibile aprire con il browser il file store.php (ad esempio "http://www.miosito.org/esperimenti/store.php") e visualizzare il messaggio di ~BidiX con la versione di store.php.
#''Aprite il pannello delle opzioni di Upload.'' Selezionate dal menu ''Strumenti'' (o dal menu ''backstage'' se utilizzate la versione originale in inglese) il comando ''Upload''.
#''Compilate le opzioni del pannello di Upload:''
##Scrivete negli appositi campi del pannello di configurazione del plugin lo username e la password che avete inserito nel file store.php;
##Specificate l'url completo del vostro file store.php (ad esempio http://www.miosito.org/esperimenti/store.php);
##Lasciate vuoto il campo che specifica la directory sul server; in questo modo sarà utilizzato il valore di default;
##Nel campo corrispondente al nome del file, scrivete il nome del file ~TiddlyWiki che state caricando sul server;
##Se avete creato sul server una directory specifica per conservare i backup, specificate ''solo'' il nome della directory (e non il path) nell'apposito campo;
##Decidete se generare o meno il frammento ~UploadLog con la registrazione degli eventi per ogni operazione di caricamento sul server;
##Decidete anche di quante linee deve essere il log del punto precedente (il default è 10).
#''Lanciate il caricamento del file sul server.'' Cliccando sul pulsante ''Upload'' avviate il caricamento del vostro file sul server. Normalmente l'operazione impiega un certo tempo per essere eseguita; al suo completamento viene visualizzato un messaggio sull'esito del comando.
#''Salvate il vostro ~TiddlyWiki quando lo desiderate.'' A questo punto, ogni volta che desiderate salvare le modifiche fatte in locale sul vostro ~TiddlyWiki nel file sul server, aprite la sezione ''Upload'' dell'area ''Strumenti'', assicuratevi che lo username e la password siano corrette e cliccate sul pulsante ''Upload''. Questo è tutto!
I sottomenu sono dei menu visualizzati in testa al frammento aperto, come questo che state leggendo, nel quale compaiono tre sottovoci : "Benvenuti", "Istruzioni", e "Istruzioni sottomenu". Potete realizzare sottovoci di menu distinte per ciascuna voce di menu presente nel menu principale di TW.
I passi da seguire per definire un sottomenu sono i seguenti (potete eseguire questi passi nell'ordine che preferite):
#''Create un frammento per ciascuna delle sottovoci della voce di menu principale.'' Etichettate tutti questi frammenti con un tag appropriato di vostra scelta pertinente all'argomento; in questo modo tutti i frammenti saranno collegati tra loro e compariranno nel menu di sottovoci.
#''Create un frammento con l'elenco delle voci del sottomenu.'' Questo sarà il frammento nel quale sono definite le voci del sottomenu visualizzate in testa al frammento. Per creare questo frammento indice, cliccate nella Sidebar sul comando ''Nuovo sottomenu''; sostituite il ''tagnameSubtopicmenu'' nel titolo del frammento con il nome del tag con il quale avete etichettato i frammenti nel passo precedente; inserite il titolo di ciascun frammento del sottomenu nella tabella predisposta nel corpo del frammento all'interno delle doppie parentesi quadre {{{[[ ]]}}} al posto di 'subtopic1', 'subtopic2', 'subtopic3'. Nel corpo del frammento la tabella è predisposta per tre celle, ossia per tre voci di sottomenu; cancellate o aggiungete altre celle alla tabella a seconda delle vostre esigenze.
#''Create un nuovo ~ViewTemplate per il vostro sottomenu.'' Questo ~ViewTemplate personalizzato farà in modo che per ciascun frammento etichettato con il tag scelto nel passo 1, verrà visualizzato in testa il sottomenu. Per creare questo frammento, cliccate nella Sidebar sul comando ''Nuovo viewtemplate''; sostituite ''tagname'' sia nel titolo del frammento che nelle due istanze presenti nel codice con il tag scelto nel passo 1. Il codice del frammento, prima della personalizzazione, è il seguente:
<!--{{{-->
<div class='tagnameMacro='tiddler tagnameSubtopicmenu'></div>
<!--}}}-->
Questo è tutto. Eseguiti i tre passi, per ciascun frammento che avete etichettato con lo stesso tag ed incluso nell'elenco delle voci di sottomenu, verrà visualizzato nel top del frammento il sottomenu.
!!!Esempio
Per realizzare il sottomenu che state visualizzando, i tre frammenti [[Benvenuti in Webview TiddlyWiki]], [[Istruzioni]] e [[Istruzioni sottomenu]] sono stati etichettati tutti e tre con il tag <<tag webview>>. E stato definito poi l'indice del sottomenu creando il frammento [[webviewindex]] ed il relativo ~ViewTemplate con il nome [[webviewViewTemplate]]. Aprite questi frammenti per vedere il codice che realizza il sottomenu.
/***
|''Name:''|LegacyStrikeThroughPlugin|
|''Description:''|Support for legacy (pre 2.1) strike through formatting|
|''Version:''|1.0.2|
|''Date:''|Jul 21, 2006|
|''Source:''|http://www.tiddlywiki.com/#LegacyStrikeThroughPlugin|
|''Author:''|MartinBudden (mjbudden (at) gmail (dot) com)|
|''License:''|[[BSD open source license]]|
|''CoreVersion:''|2.1.0|
***/
//{{{
// Ensure that the LegacyStrikeThrough Plugin is only installed once.
if(!version.extensions.LegacyStrikeThroughPlugin) {
version.extensions.LegacyStrikeThroughPlugin = {installed:true};
config.formatters.push(
{
name: "legacyStrikeByChar",
match: "==",
termRegExp: /(==)/mg,
element: "strike",
handler: config.formatterHelpers.createElementAndWikify
});
} //# end of "install only once"
//}}}
{{menubox2{Webview}}}{{menubox3{TW}}}
<<search>>
!Menu
[[Setup|Benvenuti in Webview TiddlyWiki]]
{{tuduSlider{<<slider chkToolbox Toolbox 'Toolbox »' 'mostra/nasconde la Toolbox'>>}}}
^^''~WebviewTW'' © [[giffmex|http://www.giffmex.org]]^^
^^''~TiddlyWiki'' © 2007 [[UnaMesa|http://www.unamesa.org]]^^
^^<<today "DDD DD MMM YYYY">>^^
^^~TiddlyWiki versione <<version>>^^
<!--{{{-->
<link rel='alternate' type='application/rss+xml' title='RSS' href='index.xml'/>
<!--}}}-->
<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>TiddlyWiki</b> un nuovo modo di pensare il web: <br><br><i>Sei pronto per questa esperienza?</i><blink> ...</blink><br><br><span style="font-size: 14px; color:red;">Richiede Javascript.</span></div>
//{{{
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;
//}}}
<!--{{{-->
<div id='mainMenu' refresh='content' tiddler='MainMenu'></div>
<div id='sidebar'>
<div id='sidebarOptions' refresh='content' 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 = "Salva la password su questo 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"
});
*/
//}}}
//{{{
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);
}
//}}}
<<<
# [[FontSizePlugin]]
# [[Istruzioni]]
# [[MainMenu]]
# [[PageTemplate]]
# [[SideBarTabs]]
# [[StyleSheet]]
# [[UploadPlugin]]
# [[italiano]]
<<<
/***
Quick and dirtly palette switcher for 2.1.x
<<selectPalette>>
WARNING this will overwrite your ColorPalette tiddler.
***/
//{{{
merge(config.macros,{
setPalette: {
handler: function(place,macroName,params,wikifier,paramString,tiddler) {
var paletteName = params[0] ? params[0] : tiddler.title;
createTiddlyButton(place,"apply","Apply this palette",function(e) {
config.macros.selectPalette.updatePalette(tiddler.title);
return false;
});
}
},
selectPalette: {
handler: function(place,macroName,params,wikifier,paramString,tiddler) {
createTiddlyDropDown(place,this.onPaletteChange,this.getPalettes());
},
getPalettes: function() {
var result = [
{caption:"-seleziona colori-", name:""},
{caption:"(Default)", name:"(default)"}
];
var tagged = store.getTaggedTiddlers("palette","title");
for(var t=0; t<tagged.length; t++)
result.push({caption:tagged[t].title, name:tagged[t].title});
return result;
},
onPaletteChange: function(e) {
config.macros.selectPalette.updatePalette(this.value);
return true;
},
updatePalette: function(title) {
if (title != "") {
store.deleteTiddler("ColorPalette");
if (title != "(default)")
store.saveTiddler("ColorPalette","ColorPalette",store.getTiddlerText(title),
config.options.txtUserName,undefined,"");
this.refreshPalette();
if(config.options.chkAutoSave)
saveChanges(true);
}
},
refreshPalette: function() {
config.macros.refreshDisplay.onClick();
}
}
});
//}}}
<<search>><<closeAll>><<permaview>><<newTiddler>><<newTiddler title:"tagnameSubtopicmenu" tag:"excludeLists" label:"Nuovo sottomenu" text:"{{tableindex{
|[[subtopic1]]|[[subtopic2]]|[[subtopic3]]|
}}}">><<newTiddler title:"tagnameViewTemplate" tag:"excludeLists" label:"Nuovo viewtemplate" text:"<!--{{{-->
<div class='toolbar' macro='toolbar closeTiddler closeOthers +editTiddler > fields syncing permalink references jump'></div>
<div class='tagnamemacro='tiddler tagnamesubtopicMenu'></div><div class='title' macro='view title'></div>
<div class='viewer' macro='view text wikified'></div><div class='tagClear'></div>
<!--}}}-->
">><<saveChanges>><<selectPalette>><<slider chkSliderOptionsPanel OptionsPanel "Opzioni »" "Modifica le opzioni avanzate di TiddlyWiki">>
<<tabs txtMainTab "Timeline" "Timeline" TabTimeline "All" "All tiddlers" TabAll "Tags" "All tags" TabTags "More" "More lists" TabMore>>
/***
|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;
}
//}}}
/***
''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;
}
//}}}
/*{{{*/
/*FONT ADJUSTMENTS*/
body {font-family: Trebuchet MS; font-size: 10pt;}
#mainMenu .tiddlyLinkExisting, #mainMenu .tiddlyLinkNonExisting {font-family: Trebuchet MS; font-size: 10pt;}
#mainMenu {font-family: Trebuchet MS; font-size: 10pt;}
#mainMenu h1 {font-size: 10pt;}
#mainMenu th {background-color:[[ColorPalette::SecondaryPale]]; color:[[ColorPalette::SecondaryDark]];}
#mainMenu table {border:none;}
#mainMenu tr {background-color:white;}
#mainMenu {background-color:[[ColorPalette::PrimaryLight]];}
.viewer {line-height: 1.7em;}
/*WIDEN MAINMENU*/
#mainMenu {width: 14.5em;}
#mainMenu {text-align: left;}
#displayArea {margin: 0em 17em 0em 17em;}
.teeny {font-size: 9pt; text-align: center;}
/*TABLE HEADER*/
.viewer th {color: #000; background-color: #eeeeee;}
/*TIDDLER TOPMARGIN AND BUTTON BORDER*/
a.button{border: 0;}
.viewer { margin-top: 1em; }
/*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; }
/*HEADLINE COLOR, etc*/
h1,h2,h3,h4,h5 { color: #000; background: none; font-family: Trebuchet MS;}
/*TuDuSlider*/
.tuduSlider .button{font-family: Trebuchet MS; font-weight: bold; font-size: 10pt; color: black;}
/* 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;}}
/*CSS FOR BIBLE FORMATTING*/
.engindent {margin-left: 2em; display:block;}
.gkindent {font-family: Gentium; font-size: 16pt; margin-left: 2em; display:block;}
.greek {font-family: Gentium; font-size: 16pt;}
.hebrewNoAlign{font-family: Gentium; font-size: 20pt;}
.hebrewRightAlign{text-align:right; font-family: Gentium; font-size: 20pt; display:block;}
.hebAlignAndIndent{text-align:right; font-family: Gentium; font-size: 20pt; margin-right: 2em; display:block;}
.red {color: #ff3300; font-weight: bold;}
.blue {color: #0000cc; font-weight: bold;}
.green {color: #22bb00; font-weight: bold;}
.gold {color: #bbaa55; font-weight: bold;}
.purple {color: #9922ff; font-weight: bold;}
.gray {color: #777777; font-weight: bold;}
.magenta{color: #cc0066; font-weight: bold;}
.teal {color: #008888; font-weight: bold;}
.burgundy {color: #990000; font-weight: bold;}
.orange {color: #ff8866; font-weight: bold;}
/*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-bottom: 20px;}
.viewer .invisiblecomm table th {color:[[ColorPalette::PrimaryMid]]; 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; }
/*OTHER TABLES*/
.menubox { display:block; padding:1em; -moz-border-radius:1em; border:1px solid; background:[[ColorPalette::TertiaryDark]]; color:#000; }
.menubox2 { display:block; padding: .25em; border:none; margin: 0; background:[[ColorPalette::TertiaryDark]]; [[ColorPalette::SecondaryDark]]; text-align: center; font-size: 1.6em;}
.menubox3 { display:block; padding:.25em; border:none; margin: 0; background:[[ColorPalette::TertiaryDark]]; [[ColorPalette::SecondaryDark]]; text-align: center; font-size: 2.5em;}
.viewer th {background-color:[[ColorPalette::SecondaryPale]]; [[ColorPalette::SecondaryDark]]}
.tableindex table, .tableindex td, .tableindex tr { font-size: 1em; border: solid white; background-color:[[ColorPalette::SecondaryPale]]; [[ColorPalette::SecondaryDark]]}
/*}}}*/
/***
|Name|TaggedTemplateTweak|
|Source|http://www.TiddlyTools.com/#TaggedTemplateTweak|
|Documentation|http://www.TiddlyTools.com/#TaggedTemplateTweakInfo|
|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|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
<<<
2008.01.22 [*.*.*] plugin size reduction - documentation moved to [[TaggedTemplateTweakInfo]]
2007.06.23 [1.1.0] re-written to use automatic 'tag prefix' search instead of hard coded check for each tag. Allows new custom tags to be used without requiring code changes to this plugin.
| please see [[TaggedTemplateTweakInfo]] for previous revision details |
2007.06.11 [1.0.0] initial release
<<<
!!!!!Code
***/
//{{{
version.extensions.taggedTemplate= {major: 1, minor: 1, revision: 0, date: new Date(2007,6,23)};
Story.prototype.taggedTemplate_chooseTemplateForTiddler = Story.prototype.chooseTemplateForTiddler
Story.prototype.chooseTemplateForTiddler = function(title,template)
{
// get default template from core
var template=this.taggedTemplate_chooseTemplateForTiddler.apply(this,arguments);
// if the tiddler to be rendered doesn't exist yet, just return core result
var tiddler=store.getTiddler(title); if (!tiddler) return template;
// look for template whose prefix matches a tag on this tiddler
for (t=0; t<tiddler.tags.length; t++) {
var tag=tiddler.tags[t];
if (store.tiddlerExists(tag+template)) { template=tag+template; break; }
// try capitalized tag (to match WikiWord template titles)
var cap=tag.substr(0,1).toUpperCase()+tag.substr(1);
if (store.tiddlerExists(cap+template)) { template=cap+template; break; }
}
return template;
}
//}}}
/%
|Name|ToggleRightSidebar|
|Source|http://www.TiddlyTools.com/#ToggleRightSidebar|
|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|show/hide right sidebar (SideBarOptions)|
Usage: <<tiddler ToggleRightSidebar>>
Config settings:
config.options.txtToggleRightSideBarLabelShow (◄)
config.options.txtToggleRightSideBarLabelHide (►)
config.options.txtToggleRightSideBarTipShow ("mostra sidebar a destra")
config.options.txtToggleRightSideBarTipHide ("nascondi sidebar a destra")
%/<script label="mostra/nascondi sidebar a destra">
var sb=document.getElementById('sidebar'); if (!sb) return;
var show=sb.style.display=='none';
if (!show) { sb.style.display='none'; var margin='1em'; }
else { sb.style.display='block'; var margin=config.options.txtDisplayAreaRightMargin||''; }
if (typeof(place)!='undefined') {
place.innerHTML=show?
config.options.txtToggleRightSideBarLabelHide:config.options.txtToggleRightSideBarLabelShow;
place.title=show?
config.options.txtToggleRightSideBarTipHide:config.options.txtToggleRightSideBarTipShow;
}
document.getElementById('displayArea').style.marginRight=margin;
config.options.chkShowRightSidebar=show;
saveOptionCookie('chkShowRightSidebar');
var sm=document.getElementById('storyMenu'); if (sm) config.refreshers.content(sm);
return false;
</script><script>
if (config.options.chkShowRightSidebar==undefined)
config.options.chkShowRightSidebar=true;
if (!config.options.txtDisplayAreaRightMargin||!config.options.txtDisplayAreaRightMargin.length)
config.options.txtDisplayAreaRightMargin="18em";
if (config.options.txtToggleRightSideBarLabelShow==undefined)
config.options.txtToggleRightSideBarLabelShow=config.browser.isSafari?"◀":"◄";
if (config.options.txtToggleRightSideBarLabelHide==undefined)
config.options.txtToggleRightSideBarLabelHide="►";
if (config.options.txtToggleRightSideBarTipShow==undefined)
config.options.txtToggleRightSideBarTipShow="mostra sidebar a destra";
if (config.options.txtToggleRightSideBarTipHide==undefined)
config.options.txtToggleRightSideBarTipHide="nascondi sidebar a destra";
var show=config.options.chkShowRightSidebar;
document.getElementById('sidebar').style.display=show?"block":"none";
document.getElementById('displayArea').style.marginRight=show?
config.options.txtDisplayAreaRightMargin:"1em";
place.lastChild.innerHTML=show?
config.options.txtToggleRightSideBarLabelHide:config.options.txtToggleRightSideBarLabelShow;
place.lastChild.title=show?
config.options.txtToggleRightSideBarTipHide:config.options.txtToggleRightSideBarTipShow;
place.lastChild.style.fontWeight="normal";
</script>
|!Cronologia:|!<<back>>|>|!<<history>>|>|!<<forward>>|
|!Caratteri:|>|>|>|>|! <<fontSize>>|
|!Sidebar:|>|>|>|>|!<<tiddler ToggleRightSidebar>>|
/***
|''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: "Salva e carica il file TiddlyWiki con opzioni specificate",
promptParamMacro: "Salva e Carica questo TiddlyWiki in %0",
saveLabel: "Salva su web",
saveToDisk: "Salva su disco",
uploadLabel: "Upload"
};
config.macros.upload.messages = {
noStoreUrl: "Nessun URL di memorizzazione definito nei parametri o nelle opzioni",
usernameOrPasswordMissing: "Nome Utente o password mancanti"
};
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: "Carica il file su un server specificando le opzioni",
step1Title: "Queste opzioni sono salvate nei cookies del tuo browser",
step1Html: "<input type='hidden' name='markList'></input><br>",
cancelButton: "Cancella",
cancelButtonPrompt: "Cancella l'upload",
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: "Il file originale '%0' non è un file valido TiddlyWiki",
backupSaved: "Backup salvato",
backupFailed: "Errore nel caricamento del file di backup",
rssSaved: "Feed RSS uploaded",
rssFailed: "Errore nel caricamento del feed RSS",
emptySaved: "Template vuoto caricato",
emptyFailed: "Errore nel caricamento del template vuoto",
mainSaved: "File principale TiddlyWiki caricato",
mainFailed: "Errore nel caricamento del file principale TiddlyWiki. Le tue modifiche non sono state salvate",
//specific upload
loadOriginalHttpPostError: "File originale non trovato",
aboutToSaveOnHttpPost: 'About to upload on %0 ...',
storePhpNotFound: "Lo script di memorizzazione non è stato trovato"
};
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 == 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; ;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 dello script dell'UploadService (default: store.php)",
txtUploadFilename: "Nome del file caricato (default: in index.html)",
txtUploadDir: "Directory dove memorizzare il file (default: . (downloadService directory))",
txtUploadBackupDir: "Directory dove eseguire il backup del file. Se empty nessun backup (default: ''(empty))",
txtUploadUserName: "Nome utente Upload",
pasUploadPassword: "Password Upload",
chkUploadLog: "Genera il log in UploadLog (default: true)",
txtUploadLogMaxLine: "Massimo numero di linee di log 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: "Carica il file su un server specificando le opzioni", content: '<<uploadOptions>>'}
});
config.backstageTasks.push("uploadOptions");
//}}}
<!--{{{-->
<div class='toolbar' macro='toolbar closeTiddler closeOthers +editTiddler > fields syncing permalink references jump'></div>
<div class='title' macro='view title'></div>
<div class='viewer' macro='view text wikified'></div>
<div class='tagClear'></div>
<!--}}}-->
Background: #fff
Foreground: #000
PrimaryPale: #ccccff
PrimaryLight: #ccccff
PrimaryMid: #333366
PrimaryDark: #014
SecondaryPale: #bbbbff
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #333366
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #9999cc
Error: #f88
Background: #fff
Foreground: #000
PrimaryPale: #ffccff
PrimaryLight: #ffccff
PrimaryMid: #ff0066
PrimaryDark: #014
SecondaryPale: #ffcccc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #ff0066
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #ff99cc
Error: #f88
/***An adaptation of [[easyFormat]]***/
//{{{
config.commands.Color = new TWkd.Ease('Colora','cambia il colore del testo selezionato');
config.commands.Color.addMode({
name:'Rosso',
tooltip:'colora la selezione in rosso',
operation:function(){
config.commands.Color.putInPlace("{{red{"+TWkd.context.selection.content+"}}}",TWkd.context.selection);
}
});
config.commands.Color.addMode({
name:'Blu',
tooltip:'colora la selezione in blu',
operation:function(){
config.commands.Color.putInPlace("{{blue{"+TWkd.context.selection.content+"}}}",TWkd.context.selection);
}
});
config.commands.Color.addMode({
name:'Verde',
tooltip:'colora la selezione in verde',
operation:function(){
config.commands.Color.putInPlace("{{green{"+TWkd.context.selection.content+"}}}",TWkd.context.selection);
}
});
config.commands.Color.addMode({
name:'Oro',
tooltip:'colora la selezione in oro',
operation:function(){
config.commands.Color.putInPlace("{{gold{"+TWkd.context.selection.content+"}}}",TWkd.context.selection);
}
});
config.commands.Color.addMode({
name:'Grigio',
tooltip:'colora la selezione in grigio',
operation:function(){
config.commands.Color.putInPlace("{{gray{"+TWkd.context.selection.content+"}}}",TWkd.context.selection);
}
});
config.commands.Color.addMode({
name:'Magenta',
tooltip:'colora la selezione in magenta',
operation:function(){
config.commands.Color.putInPlace("{{magenta{"+TWkd.context.selection.content+"}}}",TWkd.context.selection);
}
});
config.commands.Color.addMode({
name:'Viola',
tooltip:'colora la selezione in viola',
operation:function(){
config.commands.Color.putInPlace("{{purple{"+TWkd.context.selection.content+"}}}",TWkd.context.selection);
}
});
config.commands.Color.addMode({
name:'Turchese',
tooltip:'colora la selezione in turchese',
operation:function(){
config.commands.Color.putInPlace("{{teal{"+TWkd.context.selection.content+"}}}",TWkd.context.selection);
}
});
config.commands.Color.addMode({
name:'Borgogna',
tooltip:'colora la selezione in borgogna',
operation:function(){
config.commands.Color.putInPlace("{{burgundy{"+TWkd.context.selection.content+"}}}",TWkd.context.selection);
}
});
//}}}
/***
|!''Name:''|!easyFormat|
|''Description:''|the format command format selection according to your choice|
|''Version:''|0.1.0|
|''Date:''|13/01/2007|
|''Source:''|[[TWkd|http://yann.perrin.googlepages.com/twkd.html#easyFormat]]|
|''Author:''|[[Yann Perrin|YannPerrin]]|
|''License:''|[[BSD open source license]]|
|''~CoreVersion:''|2.x|
|''Browser:''|Firefox 1.0.4+; Firefox 1.5; InternetExplorer 6.0|
|''Requires:''|@@color:red;''E.A.S.E''@@|
***/
//{{{
config.commands.Format = new TWkd.Ease('Formatta','formatta la selezione con uno dei modi disponibili');
config.commands.Format.addMode({
name:'Grassetto',
tooltip:'formatta la selezione in grassetto',
operation:function(){
config.commands.Format.putInPlace("''"+TWkd.context.selection.content+"''",TWkd.context.selection);
}
});
config.commands.Format.addMode({
name:'Corsivo',
tooltip:'formatta la selezione in corsivo',
operation:function(){
config.commands.Format.putInPlace("//"+TWkd.context.selection.content+"//",TWkd.context.selection);
}
});
config.commands.Format.addMode({
name:'Sottolineato',
tooltip:'sottolinea la selezione',
operation:function(){
config.commands.Format.putInPlace("__"+TWkd.context.selection.content+"__",TWkd.context.selection);
}
});
config.commands.Format.addMode({
name:'Evidenzia',
tooltip:'evidenzia il testo selezionato',
operation:function(){
config.commands.Format.putInPlace("@@"+TWkd.context.selection.content+"@@",TWkd.context.selection);
}
});
config.commands.Format.addMode({
name:'Hyperlink',
tooltip:'trasforma la selezione in un link utilizzando le doppie parentesi quadre',
operation:function(){
config.commands.Format.putInPlace("[["+TWkd.context.selection.content+"]]",TWkd.context.selection);
}
});
//}}}
/***
This is an adaptation of:
|!''Name:''|!easyFormat|
|''Description:''|the format command format selection according to your choice|
|''Version:''|0.1.0|
|''Date:''|13/01/2007|
|''Source:''|[[TWkd|http://yann.perrin.googlepages.com/twkd.html#easyFormat]]|
|''Author:''|[[Yann Perrin|YannPerrin]]|
|''License:''|[[BSD open source license]]|
|''~CoreVersion:''|2.x|
|''Browser:''|Firefox 1.0.4+; Firefox 1.5; InternetExplorer 6.0|
|''Requires:''|@@color:red;''E.A.S.E''@@|
***/
//{{{
config.commands.Highlighting = new TWkd.Ease('Evidenzia','evidenzia il testo selezionato con un colore scelto dalla lista');
config.commands.Highlighting.addMode({
name:'Rosso',
tooltip:'evidenzia la selezione in rosso',
operation:function(){
config.commands.Highlighting.putInPlace("@@bgcolor(#ff6666):"+TWkd.context.selection.content+"@@",TWkd.context.selection);
}
});
config.commands.Highlighting.addMode({
name:'Blu',
tooltip:'evidenzia la selezione in blu',
operation:function(){
config.commands.Highlighting.putInPlace("@@bgcolor(#ccccff):"+TWkd.context.selection.content+"@@",TWkd.context.selection);
}
});
config.commands.Highlighting.addMode({
name:'Giallo',
tooltip:'evidenzia la selezione in giallo',
operation:function(){
config.commands.Highlighting.putInPlace("@@"+TWkd.context.selection.content+"@@",TWkd.context.selection);
}
});
config.commands.Highlighting.addMode({
name:'Verde',
tooltip:'evidenzia la selezione in verde',
operation:function(){
config.commands.Highlighting.putInPlace("@@bgcolor(#99ff99):"+TWkd.context.selection.content+"@@",TWkd.context.selection);
}
});
config.commands.Highlighting.addMode({
name:'Marrone',
tooltip:'evidenzia la selezione in marrone',
operation:function(){
config.commands.Highlighting.putInPlace("@@bgcolor(#cc9966):"+TWkd.context.selection.content+"@@",TWkd.context.selection);
}
});
config.commands.Highlighting.addMode({
name:'Grigio',
tooltip:'evidenzia la selezione in grigio',
operation:function(){
config.commands.Highlighting.putInPlace("@@bgcolor(#cccc99):"+TWkd.context.selection.content+"@@",TWkd.context.selection);
}
});
config.commands.Highlighting.addMode({
name:'Arancione',
tooltip:'evidenzia la selezione in arancione',
operation:function(){
config.commands.Highlighting.putInPlace("@@bgcolor(#ff9933):"+TWkd.context.selection.content+"@@",TWkd.context.selection);
}
});
//}}}
/***An adaptation of [[easyFormat]]***/
//{{{
config.commands.Indent = new TWkd.Ease('Indenta','indenta il testo selezionato');
config.commands.Indent.addMode({
name:'Indenta1x',
tooltip:'indenta 1x il testo selezionato',
operation:function(){
config.commands.Indent.putInPlace("{{engindent{"+TWkd.context.selection.content+"}}}",TWkd.context.selection);
}
});
config.commands.Indent.addMode({
name:'Indenta2x',
tooltip:'indenta 2x il testo selezionato',
operation:function(){
config.commands.Indent.putInPlace("{{engindent{{{engindent{"+TWkd.context.selection.content+"}}}}}}",TWkd.context.selection);
}
});
config.commands.Indent.addMode({
name:'Indenta3x',
tooltip:'indenta 3x il testo selezionato',
operation:function(){
config.commands.Indent.putInPlace("{{engindent{{{engindent{{{engindent{"+TWkd.context.selection.content+"}}}}}}}}}",TWkd.context.selection);
}
});
config.commands.Indent.addMode({
name:'Indenta4x',
tooltip:'indenta 4x il testo selezionato',
operation:function(){
config.commands.Indent.putInPlace("{{engindent{{{engindent{{{engindent{{{engindent{"+TWkd.context.selection.content+"}}}}}}}}}}}}",TWkd.context.selection);
}
});
config.commands.Indent.addMode({
name:'Indenta5x',
tooltip:'indenta 5x il testo selezionato',
operation:function(){
config.commands.Indent.putInPlace("{{engindent{{{engindent{{{engindent{{{engindent{{{engindent{"+TWkd.context.selection.content+"}}}}}}}}}}}}}}}",TWkd.context.selection);
}
});
//}}}
/***An adaptation of [[easyFormat]]***/
//{{{
config.commands.Notes = new TWkd.Ease('Note','aggiungi note e popups alla selezione');
config.commands.Notes.addMode({
name:'Sintassi',
tooltip:'aggiungi una nota di sintassi',
operation:function(){
config.commands.Notes.putInPlace("((sintassi(aggiungi la nota qui)))",TWkd.context.selection);
}
});
config.commands.Notes.addMode({
name:'Traduzione',
tooltip:'aggiungi una nota di traduzione',
operation:function(){
config.commands.Notes.putInPlace("• ((traduzione(aggiungi la nota qui)))",TWkd.context.selection);
}
});
config.commands.Notes.addMode({
name:'Testo',
tooltip:'aggiungi una nota di testo',
operation:function(){
config.commands.Notes.putInPlace("• ((testo(aggiungi la nota qui)))",TWkd.context.selection);
}
});
config.commands.Notes.addMode({
name:'Gramm.',
tooltip:'aggiungi una nota di grammatica',
operation:function(){
config.commands.Notes.putInPlace("• ((grammatica(aggiungi la nota qui)))",TWkd.context.selection);
}
});
config.commands.Notes.addMode({
name:'Popup',
tooltip:'aggiungi una nota popup al testo selezionato',
operation:function(){
config.commands.Notes.putInPlace("(("+TWkd.context.selection.content+"(aggiungi la nota qui)))",TWkd.context.selection);
}
});
//}}}
/***An adaptation of [[easyFormat]]***/
//{{{
config.commands.Tableheader = new TWkd.Ease('Tableheader','add the header row for a formatted table');
config.commands.Tableheader.addMode({
name:'Invisible',
tooltip:'adds the header row for a 3-column invisible table',
operation:function(){
config.commands.Tableheader.putInPlace("XXXXX",TWkd.context.selection);
}
});
config.commands.Tableheader.addMode({
name:'Sortable',
tooltip:'adds the header row for a 3-column sortable table',
operation:function(){
config.commands.Tableheader.putInPlace("|sortable|k||||h",TWkd.context.selection);
}
});
config.commands.Tableheader.addMode({
name:'Standard',
tooltip:'adds the header row for a 3-column standard table',
operation:function(){
config.commands.Tableheader.putInPlace("|!|!|!|",TWkd.context.selection);
}
});
//}}}
/***An adaptation of [[easyFormat]]***/
//{{{
config.commands.Tables = new TWkd.Ease('Tabelle','aggiungi una tabella vuota preformattata');
config.commands.Tables.addMode({
name:'Invisibile',
tooltip:'aggiungi una tabella senza bordi',
operation:function(){
config.commands.Tables.putInPlace("{{invisiblecomm{\n|!|!|!|\n||||\n||||\n||||\n}}}",TWkd.context.selection);
}
});
config.commands.Tables.addMode({
name:'Ordinabile',
tooltip:'aggiungi una tabella ordinabile',
operation:function(){
config.commands.Tables.putInPlace("|sortable|k\n||||h\n||||\n||||\n||||",TWkd.context.selection);
}
});
config.commands.Tables.addMode({
name:'Standard',
tooltip:'aggiungi una tabella standard',
operation:function(){
config.commands.Tables.putInPlace("|!|!|!|\n||||\n||||\n||||",TWkd.context.selection);
}
});
config.commands.Tables.addMode({
name:'Cella di colore grigio chiaro',
tooltip:'inserisci in una cella della tabella lo sfondo grigio chiaro',
operation:function(){
config.commands.Tables.putInPlace("bgcolor(#eeeeee):",TWkd.context.selection);
}
});
config.commands.Tables.addMode({
name:'Cella di colore grigio scuro',
tooltip:'inserisci in una cella della tabella lo sfondo grigio scuro',
operation:function(){
config.commands.Tables.putInPlace("bgcolor(#cccccc):",TWkd.context.selection);
}
});
//}}}
Background: #fff
Foreground: #000
PrimaryPale: #eeeeee
PrimaryLight: #eeeeee
PrimaryMid: #666666
PrimaryDark: #014
SecondaryPale: #cccccc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #666666
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #bbbbbb
Error: #f88
Background: #fff
Foreground: #000
PrimaryPale: #ddeeaa
PrimaryLight: #ddeeaa
PrimaryMid: #666633
PrimaryDark: #014
SecondaryPale: #bbdd88
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #666633
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #aacc88
Error: #f88
/***
|''Name:''|ItalianTranslationPlugin|
|''Description:''|Translation of TiddlyWiki into Italian|
|''Authors:''|Mathew Warburton - (mat01web (at) gmail (dot) com + Pollio Maurizio (pollio.maurizio (at) gmail (dot) com)|
|''Source:''|http://pollio.maurizio.googlepages.com/MiniGuidaTiddlyWiki.html|
|''CodeRepository:''|http://pollio.maurizio.googlepages.com/it_2_4_1.js|
|''Version:''|2.4.1|
|''Date:''|Dec 11, 2008|
|''License:''|[[Creative Commons Attribution-ShareAlike 3.0 License|http://creativecommons.org/licenses/by-sa/3.0/deed.it]] |
|''~CoreVersion:''|2.4|
***/
{{{
// --
// -- Translateable strings
// --
// Strings in "double quotes" should be translated; strings in 'single quotes' should be left alone
config.locale = "it"; // W3C language tag
if (config.options.txtUserName == 'YourName') // do not translate this line, but do translate the next line
merge(config.options,{txtUserName: "TuoNome"});
merge(config.tasks,{
save: {text: "Salva", tooltip: "Salva le modifiche in questo TiddlyWiki", action: saveChanges},
sync: {text: "Sincronizza", tooltip: "Sincronizza questo TiddlyWiki con altri file o server TiddlyWiki", content: '<<sync>>'},
importTask: {text: "Importa", tooltip: "Importa frammenti e plugin da altri file o server TiddlyWiki", content: '<<importTiddlers>>'},
tweak: {text: "Modifica", tooltip: "Modifica le opzioni di questo TiddlyWiki", content: '<<options>>'},
upgrade: {text: "Aggiorna", tooltip: "Aggiorna il codice base di TiddlyWiki", content: '<<upgrade>>'},
plugins: {text: "Plugin", tooltip: "Gestisce i plugin installati in questo TiddlyWiki", content: '<<plugins>>'}
});
// Options that can be set in the options panel and/or cookies
merge(config.optionsDesc,{
txtUserName: "Digita un nome utente per firmare le tue modifiche",
chkRegExpSearch: "Abilita nella ricerca l'uso delle espressioni regolari",
chkCaseSensitiveSearch: "Abilita la ricerca sensibile alle maiuscole e minuscole",
chkIncrementalSearch: "Abilita la ricerca incrementale key-by-key",
chkAnimate: "Abilita animazioni",
chkSaveBackups: "Genera una copia di backup quando si salvano le modifiche",
chkAutoSave: "Abilita il salvataggio automatico delle modifiche",
chkGenerateAnRssFeed: "Genera un feed RSS quando si salvano le modifiche",
chkSaveEmptyTemplate: "Genera un modello vuoto quando si salvano le modifiche",
chkOpenInNewWindow: "Apri i link esterni in una nuova finestra",
chkToggleLinks: "Cliccando su un collegamento ad un frammento già aperto lo chiude",
chkHttpReadOnly: "Non rendere editabile dal web",
chkForceMinorUpdate: "Tratta le modifiche come minori non aggiornando il nome utente e la data quando modifichi i frammenti",
chkConfirmDelete: "Chiedi conferma prima di eliminare il frammento",
chkInsertTabs: "Usa il tasto tab per inserire caratteri di tabulazione invece di saltare al prossimo campo",
txtBackupFolder: "Specifica il percorso della directory di backup",
txtMaxEditRows: "Specifica il massimo numero di righe nelle finestre di modifica dei frammenti",
txtFileSystemCharSet: "Set di caratteri di default per salvare le modifiche (solo Firefox/Mozilla)"});
merge(config.messages,{
customConfigError: "Si sono verificati dei problemi nel caricare i plugin. Vedi PluginManager per i dettagli",
pluginError: "Errore: %0",
pluginDisabled: "Plugin non eseguito perchè disabilitato mediante l'etichetta 'systemConfigDisable' ",
pluginForced: "Plugin eseguito perchè forzato mediante l'etichetta 'systemConfigForce' ",
pluginVersionError: "Plugin non eseguito perchè richiede una versione più aggiornata di TiddlyWiki",
nothingSelected: "Nessuna selezione. Devi selezionare prima uno o più elementi",
savedSnapshotError: "Sembra che questo TiddlyWiki sia stato salvato scorrettamente. Per informazioni vai a http://www.tiddlywiki.com/#DownloadSoftware per ulteriori dettagli",
subtitleUnknown: "(sconosciuto)",
undefinedTiddlerToolTip: "Il frammento '%0' non esiste",
shadowedTiddlerToolTip: "Il frammento '%0' non esiste, è un modello predefinito",
tiddlerLinkTooltip: "%0 - %1, %2",
externalLinkTooltip: "Collegamento a %0",
noTags: "Non ci sono frammenti del tipo",
notFileUrlError: "Devi esportare questo TiddlyWiki in un file prima di poterlo salvare",
cantSaveError: "Non si possono salvare le modifiche con questo browser. Possibili cause possono essere:\n- il tuo browser non supporta il salvataggio (Firefox, Internet Explorer, Safari e Opera, se opportunamente configurati, funzionano bene)\n- il path del tuo file TiddlyWiki contiene caratteri non consentiti\n- il file HTML di TiddlyWiki è stato spostato o rinominato",
invalidFileError: "Il file originale '%0' non sembra di tipo TiddlyWiki",
backupSaved: "Backup riuscito",
backupFailed: "Salvataggio file di backup non riuscito",
rssSaved: "RSS feed salvato come",
rssFailed: "Salvataggio file RSS feed non riuscito",
emptySaved: "Modello vuoto salvato",
emptyFailed: "Salvataggio file modello vuoto non riuscito",
mainSaved: "File TiddlyWiki primario salvato",
mainFailed: "File TiddlyWiki principale non salvato. Le tue modifiche non sono state salvate",
macroError: "Errore nella macro <<\%0>>",
macroErrorDetails: "Errore in esecuzione della macro <<\%0>>:\n%1",
missingMacro: "La macro non esiste",
overwriteWarning: "Il frammento '%0' esiste già. OK per sostituirlo",
unsavedChangesWarning: "ATTENZIONE! Non sono state ancora salvate le modifiche in TiddlyWiki\n\nOK per salvare\nANNULLA per annullarle",
confirmExit: "--------------------------------\n\nCi sono delle modifiche non salvate in TiddlyWiki. Se continui perderai le modifiche\n\n--------------------------------",
saveInstructions: "SaveChanges",
unsupportedTWFormat: "Formato TiddlyWiki non supportato '%0'",
tiddlerSaveError: "Errore nel salvataggio del frammento '%0'",
tiddlerLoadError: "Errore nel caricamento del frammento '%0'",
wrongSaveFormat: "Non è possibile salvare nel formato '%0'. Usa il formato standard per salvare",
invalidFieldName: "Nome di campo invalido %0",
fieldCannotBeChanged: "Campo '%0' non può essere modificato",
loadingMissingTiddler: "Attempting to retrieve the tiddler '%0' from the '%1' server at:\n\n'%2' in the workspace '%3'",
upgradeDone: "Aggiornamento alla versione %0 completato\n\nClicca 'OK' per ricaricare la versione aggiornata di TiddlyWiki"});
merge(config.messages.messageClose,{
text: "Chiudi",
tooltip: "Chiude l'area messaggi"});
config.messages.backstage = {
open: {text: "Strumenti", tooltip: "Apre l'area strumenti per eseguire azioni di authoring e editing"},
close: {text: "Chiudi", tooltip: "Chiude l'area strumenti"},
prompt: "Strumenti: ",
decal: {
edit: {text: "Modifica", tooltip: "Modifica il frammento '%0'"}
}
};
config.messages.listView = {
tiddlerTooltip: "Clicca per visualizzare il contenuto (full text) di questo frammento",
previewUnavailable: "(preview non disponibile)"
};
config.messages.dates.months = ["Gennaio", "Febbraio", "Marzo", "Aprile", "Maggio", "Giugno", "Luglio", "Agosto", "Settembre", "Ottobre", "Novembre","Dicembre"];
config.messages.dates.days = ["Domenica", "Lunedì", "Martedì", "Mercoledì", "Giovedì", "Venerdì", "Sabato"];
config.messages.dates.shortMonths = ["Gen", "Feb", "Mar", "Apr", "Mag", "Giu", "Lug", "Ago", "Set", "Ott", "Nov", "Dic"];
config.messages.dates.shortDays = ["Dom", "Lun", "Mar", "Mer", "Gio", "Ven", "Sab"];
// suffixes for dates, eg "1st","2nd","3rd"..."30th","31st"
config.messages.dates.daySuffixes = ["mo","do","zo","to","to","to","mo","vo","no","mo",
"mo","mo","mo","mo","mo","mo","mo","mo","mo","mo",
"mo","mo","mo","mo","mo","mo","mo","mo","mo","mo",
"mo"];
config.messages.dates.am = "am";
config.messages.dates.pm = "pm";
merge(config.messages.tiddlerPopup,{
});
merge(config.views.wikified.tag,{
labelNoTags: "Nessuna categoria",
labelTags: "Categorie: ",
openTag: "Apri la categoria '%0'",
tooltip: "Mostra frammenti del tipo '%0'",
openAllText: "Apri tutti i tiddler di questa categoria",
openAllTooltip: "Apri tutti",
popupNone: "Non ci sono altri frammenti del tipo '%0'"});
merge(config.views.wikified,{
defaultText: "Il frammento '%0' non esiste ancora. Doppio click per crearlo",
defaultModifier: "(mancante)",
shadowModifier: "(frammento nascosto incorporato)",
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: "creato"});
merge(config.views.editor,{
tagPrompt: "Aggiungi le categorie separandole con uno spazio, [[se il titolo della categoria è più lungo di una parola mettilo tra due parentesi quadre]] o scegli tra quelle esistenti",
defaultText: "Edita '%0'"});
merge(config.views.editor.tagChooser,{
text: "Esistenti",
tooltip: "Seleziona la categoria tra quelle già presenti",
popupNone: "Non è definita nessuna categoria",
tagTooltip: "Aggiungi la categoria '%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: "Trova",
prompt: "Cerca in questo TiddlyWiki",
accessKey: "F",
successMsg: "%0 Trovati frammenti contenenti %1",
failureMsg: "Nessun frammento contiene %0"});
merge(config.macros.tagging,{
label: "Crea Categorie: ",
labelNotTag: "Categoria:",
tooltip: "Frammenti di tipo '%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: "Mostra i frammenti del tipo '%0'",
noTags: "Non ci sono frammenti categorizzati"});
config.macros.list.all.prompt = "Elenca tutti i frammenti in ordine alfabetico";
config.macros.list.missing.prompt = "Elenca i frammenti collegati tra loro ma non ancora definiti";
config.macros.list.orphans.prompt = "Elenca i frammenti non collegati";
config.macros.list.shadowed.prompt = "Elenca i frammenti nascosti contenenti le impostazioni del programma";
config.macros.list.touched.prompt = "Elenca i frammenti che sono stati modificati localmente";
merge(config.macros.closeAll,{
label: "Chiudi tutti",
prompt: "Chiude tutti i frammenti aperti (esclusi quelli in modifica)"});
merge(config.macros.permaview,{
label: "Indirizzo di Pagina",
prompt: "Indica sulla barra l'indirizzo della pagina e dei frammenti aperti"});
merge(config.macros.saveChanges,{
label: "Salva modifiche",
prompt: "Salva tutti i frammenti per creare un nuovo TiddlyWiki",
accessKey: "S"});
merge(config.macros.newTiddler,{
label: "Nuovo",
prompt: "Crea un nuovo frammento",
title: "Nuovo",
accessKey: "N"});
merge(config.macros.newJournal,{
label: "Oggi",
prompt: "Crea un nuovo frammento con data e ora corrente",
accessKey: "J"});
merge(config.macros.options,{
wizardTitle: "Modifica le opzioni",
step1Title: "Queste opzioni sono salvate nei cookies del tuo browser",
step1Html: "<input type='hidden' name='markList'></input><br><input type='checkbox' checked='false' name='chkUnknown'>Mostra le opzioni sconosciute</input>",
unknownDescription: "//(sconosciuta)//",
listViewTemplate: {
columns: [
{name: 'Option', field: 'option', title: "Opzione", type: 'String'},
{name: 'Description', field: 'description', title: "Descrizione", type: 'WikiText'},
{name: 'Name', field: 'name', title: "Nome", type: 'String'}
],
rowClasses: [
{className: 'lowlight', field: 'lowlight'}
]}
});
merge(config.macros.plugins,{
wizardTitle: "Gestione plugin",
step1Title: "Plugin attualmente installati",
step1Html: "<input type='hidden' name='markList'></input>", // DO NOT TRANSLATE
skippedText: "(Questo plugin non è stato eseguito perchè è stato caricato dopo l'avvio di TiddlyWiki)",
noPluginText: "Non ci sono plugin installati",
confirmDeleteText: "Sei sicuro di voler cancellare questo/i plugin?:\n\n%0",
removeLabel: "Rimuovi l'etichetta systemConfig",
removePrompt: "Rimuovi l'etichetta systemConfig",
deleteLabel: "Cancella",
deletePrompt: "Cancella definitivamente questi frammenti",
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: "Altro",
morePrompt: "Mostra altri comandi"
});
merge(config.macros.refreshDisplay,{
label: "Rinnova",
prompt: "Rinnova l'intero display di TiddlyWiki"
});
merge(config.macros.importTiddlers,{
readOnlyWarning: "Non puoi importare frammenti in un TiddlyWiki aperto in sola lettura. Prova ad aprirlo da file:// URL",
wizardTitle: "Importa frammenti da altri file o server",
step1Title: "Passo 1: Individua il server o il file TiddlyWiki",
step1Html: "Specifica il tipo di server: <select name='selTypes'><option value=''>Scegli...</option></select><br>Digita l'URL o il percorso qui: <input type='text' size=50 name='txtPath'><br>...o esplora per un file: <input type='file' size=50 name='txtBrowse'><br><hr>...o seleziona un feed predefinito: <select name='selFeeds'><option value=''>Scegli...</option></select>",
openLabel: "Apri",
openPrompt: "Apri la connessione per questo file o server",
openError: "Si sono verificati problemi nel prelevare il file TiddlyWiki",
statusOpenHost: "Apro l'host",
statusGetWorkspaceList: "Ottengo la lista dei workspace disponibili",
step2Title: "Passo 2: Scegli il workspace",
step2Html: "Digita il nome di un workspace: <input type='text' size=50 name='txtWorkspace'><br>...o seleziona un workspace: <select name='selWorkspace'><option value=''>Scegli...</option></select>",
cancelLabel: "Cancella",
cancelPrompt: "Cancella l'importazione",
statusOpenWorkspace: "Apro il workspace",
statusGetTiddlerList: "Ottengo la lista dei frammenti disponibili",
errorGettingTiddlerList: "Errore nel prelevare la lista dei frammenti, clicca Cancel per provare ancora",
step3Title: "Passo 3: Scegli il/i frammento/i da importare",
step3Html: "<input type='hidden' name='markList'></input><br><input type='checkbox' checked='true' name='chkSync'>Mantieni questi frammenti collegati a questo server in modo da poterli sincronizzare per successive modifiche</input><br><input type='checkbox' name='chkSave'>Salva i dettagli di questo server in un frammento 'systemServer' con il nome:</input> <input type='text' size=25 name='txtSaveTiddler'>",
importLabel: "Importa",
importPrompt: "Importa questi frammenti",
confirmOverwriteText: "Sei sicuro di voler sovrascrivere questi frammenti:\n\n%0",
step4Title: "Passo 4: Importato/i %0 frammento/i",
step4Html: "<input type='hidden' name='markReport'></input>", // DO NOT TRANSLATE
doneLabel: "Fatto",
donePrompt: "Chiudi questo wizard",
statusDoingImport: "Importo i frammenti",
statusDoneImport: "Tutti i frammenti importati",
systemServerNamePattern: "%2 on %1",
systemServerNamePatternNoWorkspace: "%1",
confirmOverwriteSaveTiddler: "Il frammento '%0' già esiste. Clicca su 'OK' per sovrascriverlo o 'Cancel' per lasciarlo inalterato",
serverSaveTemplate: "|''Type:''|%0|\n|''URL:''|%1|\n|''Workspace:''|%2|\n\nQuesto frammento è stato creato automaticamente per memorizzare i dettagli di questo server",
serverSaveModifier: "(System)",
listViewTemplate: {
columns: [
{name: 'Selected', field: 'Selected', rowName: 'title', type: 'Selector'},
{name: 'Tiddler', field: 'tiddler', title: "Frammento", type: 'Tiddler'},
{name: 'Size', field: 'size', tiddlerLink: 'size', title: "Dimensioni", type: 'Size'},
{name: 'Tags', field: 'tags', title: "Categorie", type: 'Tags'}
],
rowClasses: [
]}
});
merge(config.macros.upgrade,{
wizardTitle: "Aggiorna il codice base di TiddlyWiki",
step1Title: "Aggiorna o ripara questo TiddlyWiki all'ultima versione",
step1Html: "Stai per aggiornare all'ultima versione del codice base di TiddlyWiki (da <a href='%0' class='externalLink' target='_blank'>%1</a>). Il contenuto del tuo TiddlyWiki viene preservato nel processo di aggiornamento.<br><br>Tieni presente che l'aggiornamento del codice base può interferire con vecchi plugins. Se si verificano problemi con il file aggiornato, consulta <a href='http://www.tiddlywiki.org/wiki/CoreUpgrades' class='externalLink' target='_blank'>http://www.tiddlywiki.org/wiki/CoreUpgrades</a>",
errorCantUpgrade: "Impossibile aggiornare questo TiddlyWiki. E' possibile aggiornare solo TiddlyWiki memorizzati in locale",
errorNotSaved: "Devi salvare le modifiche prima di realizzare l'aggiornamento",
step2Title: "Conferma i dettagli dell'aggiornamento",
step2Html_downgrade: "Stai per realizzare un downgrade di TiddlyWiki alla versione %0 dalla %1.<br><br>Non è consigliato il downgrade del codice base ad una vecchia versione",
step2Html_restore: "Questo TiddlyWiki utilizza già l'ultima versione del codice base (%0).<br><br>Puoi comunque continuare l'aggiornamento per assicurarti che il codice base non sia stato corrotto o danneggiato",
step2Html_upgrade: "Stai per aggiornare TiddlyWiki alla versione %0 dalla %1",
upgradeLabel: "Aggiorna",
upgradePrompt: "Preparazione del processo di aggiornamento",
statusPreparingBackup: "Preparazione backup",
statusSavingBackup: "Salvataggio del file di backup",
errorSavingBackup: "Si è verificato un problema nel salvataggio del file di backup",
statusLoadingCore: "Caricamento del codice base",
errorLoadingCore: "Errore nel caricamento del codice base",
errorCoreFormat: "Errore con il nuovo codice base",
statusSavingCore: "Salvataggio del nuovo codice base",
statusReloadingCore: "Ricarico il nuovo codice base",
startLabel: "Inizia",
startPrompt: "Inizia l'aggiornamento",
cancelLabel: "Cancella",
cancelPrompt: "Cancella l'aggiornamento",
step3Title: "Aggiornamento cancellato",
step3Html: "Hai cancellato il processo di aggiornamento"
});
merge(config.macros.sync,{
listViewTemplate: {
columns: [
{name: 'Selected', field: 'selected', rowName: 'title', type: 'Selector'},
{name: 'Tiddler', field: 'tiddler', title: "Frammento", type: 'Tiddler'},
{name: 'Server Type', field: 'serverType', title: "Tipo server", type: 'String'},
{name: 'Server Host', field: 'serverHost', title: "Host server", type: 'String'},
{name: 'Server Workspace', field: 'serverWorkspace', title: "Server workspace", type: 'String'},
{name: 'Status', field: 'status', title: "Stato sincronizzazione", type: 'String'},
{name: 'Server URL', field: 'serverUrl', title: "Server URL", text: "Visualizza", type: 'Link'}
],
rowClasses: [
],
buttons: [
{caption: "Sincronizza questi frammenti", name: 'sync'}
]},
wizardTitle: "Sincronizza con file o server esterni",
step1Title: "Scegli il frammento da sincronizzare",
step1Html: "<input type='hidden' name='markList'></input>", // DO NOT TRANSLATE
syncLabel: "Sincronizza",
syncPrompt: "Sincronizza questi frammenti",
hasChanged: "Modificato in locale",
hasNotChanged: "Non modificato in locale",
syncStatusList: {
none: {text: "...", color: "none"},
changedServer: {text: "Modificato sul server", color: '#80ff80'},
changedLocally: {text: "Modificato in locale", color: '#80ff80'},
changedBoth: {text: "Modificato in locale e sul server", color: '#ff8080'},
notFound: {text: "Non trovato sul server", color: '#ffff80'},
putToServer: {text: "Modifiche salvate sul server", color: '#ff80ff'},
gotFromServer: {text: "Recupero aggiornamenti dal server", color: '#80ffff'}
}
});
merge(config.commands.closeTiddler,{
text: "Chiudi",
tooltip: "Chiude questo frammento"});
merge(config.commands.closeOthers,{
text: "Chiude altri",
tooltip: "Chiude tutti gli altri frammenti"});
merge(config.commands.editTiddler,{
text: "Modifica",
tooltip: "Edita il frammento",
readOnlyText: "Visualizza",
readOnlyTooltip: "Visualizza il contenuto di questo frammento"});
merge(config.commands.saveTiddler,{
text: "Salva",
tooltip: "Salva le modifiche"});
merge(config.commands.cancelTiddler,{
text: "Annulla",
tooltip: "Annulla le modifiche",
warning: "Sei sicuro di voler annullare le modifiche a '%0'?",
readOnlyText: "Chiudi",
readOnlyTooltip: "Visualizza il frammento nel modo usuale"});
merge(config.commands.deleteTiddler,{
text: "Elimina",
tooltip: "Elimina questo frammento",
warning: "Sei sicuro di voler eliminare '%0'?"});
merge(config.commands.permalink,{
text: "Indirizzo",
tooltip: "Indica sulla barra l'indirizzo di questo frammento"});
merge(config.commands.references,{
text: "Collegati",
tooltip: "Elenca i frammenti che puntano qui",
popupNone: "Nessun frammento punta qui"});
merge(config.commands.jump,{
text: "Vai a",
tooltip: "Vai ad un altro frammento aperto"});
merge(config.commands.syncing,{
text: "Sincronizzazione",
tooltip: "Controlla la sincronizzazione di questo frammento con un file o un server esterno",
currentlySyncing: "<div>Attualmente sincronizzato attraverso <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: "Non sincronizzato",
captionUnSync: "Ferma la sincronizzazione di questo frammento",
chooseServer: "Sincronizza questo frammento con un altro server:",
currServerMarker: "\u25cf ",
notCurrServerMarker: " "});
merge(config.commands.fields,{
text: "Campi",
tooltip: "Mostra i campi estesi di questo frammento",
emptyText: "Non esistono campi estesi per questo frammento",
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 versione <<version>>\n© 2007 [[UnaMesa|http://www.unamesa.org/]]^^",
TranslatedGettingStarted: "Per iniziare ad usare questo documento vuoto, comincia ad editare i seguenti frammenti:\n* SiteTitle & SiteSubtitle: Il titolo ed il sottotitolo del sito (dopo il salvataggio saranno anche visibili nella barra del browser)\n* MainMenu: Il menu principale di ~TiddliWiki\n* DefaultTiddlers: Inserisci i frammenti che desideri compaiano all'apertura di questo ~TiddlyWiki\nInserisci anche un nome utente che ti permetterà di firmare le tue modifiche (usa un formato di parola Wiki es. ~MarioRossi): <<option txtUserName>>",
SiteTitle: "Il mio ~TiddlyWiki",
SiteSubtitle: "Un programma non lineare per scrivere web",
SiteUrl: "http://www.tiddlywiki.com/",
OptionsPanel: "Queste opzioni sono utilizzate per personalizzare il tuo ~TiddlyWiki e vengono salvate nel browser.\n\nDigita un nome utente per firmare le tue modifiche. Usa un formato di parola Wiki (es. ~MarioRossi)\n<<option txtUserName>>\n\n<<option chkSaveBackups>> Salva backups\n<<option chkAutoSave>> Salvataggio automatico\n<<option chkRegExpSearch>> Ricerca estesa\n<<option chkCaseSensitiveSearch>> Considera caratteri nella ricerca\n<<option chkAnimate>> Abilita animazioni\n\n----\nVedi anche [[Opzioni avanzate|AdvancedOptions]]",
SideBarOptions: '<<search>><<closeAll>><<permaview>><<newTiddler>><<newJournal "DD MMM YYYY">><<saveChanges>><<slider chkSliderOptionsPanel OptionsPanel "Opzioni »" "Modifica le opzioni di TiddlyWiki">>',
SideBarTabs: '<<tabs txtMainTab "Data" "Elenca i frammenti cronologicamente" TabTimeline "Tutti" "Tutti i frammenti in ordine alfabetico" TabAll "Categorie" "Elenca i frammenti per tipo" TabTags "Altro" "Altri elenchi" TabMore>>',
TabMore: '<<tabs txtMoreTab "Mancanti" "Frammenti non ancora editati" TabMoreMissing "Orfani" "Frammenti non collegati tra loro" TabMoreOrphans "Nascosti" "Frammenti nascosti" TabMoreShadowed>>'});
merge(config.annotations,{
AdvancedOptions: "Questo frammento nascosto permette l'accesso alle opzioni avanzate di TiddlyWiki",
ColorPalette: "I valori presenti in questo frammento nascosto determinano lo schema dei colori dell'interfaccia utente di TiddlyWiki",
DefaultTiddlers: "I frammenti elencati in questo frammento nascosto saranno automaticamente visualizzati quando viene avviato TiddlyWiki",
EditTemplate: "Il template HTML contenuto in questo frammento nascosto determina come vengono visualizzati i frammenti quando sono editati",
GettingStarted: "Questo frammento nascosto fornisce le istruzioni d'uso di base",
ImportTiddlers: "Questo frammento nascosto fornisce accesso alla funzione di importazione frammenti",
MainMenu: "Questo frammento nascosto definisce il contenuto del menu principale di TiddlyWiki visualizzato nella colonna di sinistra",
MarkupPreHead: "Questo frammento è inserito nel top della sezione <head> del file HTML di TiddlyWiki",
MarkupPostHead: "Questo frammento è inserito nel bottom della sezione <head> del file HTML di TiddlyWiki",
MarkupPreBody: "Questo frammento è inserito nel top della sezione <body> del file HTML di TiddlyWiki",
MarkupPostBody: "Questo frammento è inserito alla fine della sezione <body> del file HTML di TiddlyWiki immediatamente prima del blocco script",
OptionsPanel: "Questo frammento nascosto definisce il contenuto del pannello opzioni visualizzato nella sidebar",
PageTemplate: "Il template HTML contenuto in questo frammento nascosto determina il layout complessivo di TiddlyWiki",
PluginManager: "Questo frammento nascosto fornisce accesso al gestore plugin",
SideBarOptions: "Questo frammento nascosto definisce il contenuto della sidebar",
SideBarTabs: "Questo frammento nascosto è usato per i contenuti dei tabs della sidebar",
SiteSubtitle: "Questo frammento nascosto definisce la seconda parte del titolo della pagina",
SiteTitle: "Questo frammento nascosto definisce la prima parte del titolo della pagina",
SiteUrl: "Questo frammento nascosto dovrebbe essere personalizzato con l'URL completo utilizzato per pubblicare il sito",
StyleSheetColours: "Questo frammento nascosto contiene le definizioni CSS relative al colore degli elementi di pagina",
StyleSheet: "Questo frammento nascosto può contenere le definizioni CSS personalizzate",
StyleSheetLayout: "Questo frammento nascosto contiene le definizioni CSS relative al layout degli elementi di pagina",
StyleSheetLocale: "Questo frammento nascosto contiene le definizioni CSS relative alla traduzione locale",
StyleSheetPrint: "Questo frammento nascosto contiene le definizioni CSS per la stampa",
TabAll: "Questo frammento nascosto definisce i contenuti del tab 'Tutti' della sidebar",
TabMore: "Questo frammento nascosto definisce i contenuti del tab 'Altro' della sidebar",
TabMoreMissing: "Questo frammento nascosto definisce i contenuti del tab 'Mancanti' della sidebar",
TabMoreOrphans: "Questo frammento nascosto definisce i contenuti del tab 'Orfani' della sidebar",
TabMoreShadowed: "Questo frammento nascosto definisce i contenuti del tab 'Nascosti' della sidebar",
TabTags: "Questo frammento nascosto definisce i contenuti del tab 'Categorie' della sidebar",
TabTimeline: "Questo frammento nascosto definisce i contenuti del tab 'Data' della sidebar",
ToolbarCommands: "Questo frammento nascosto definisce quali comandi sono visualizzati nella tiddler toolbar",
ViewTemplate: "Il template HTML contenuto in questo frammento nascosto determina l'aspetto dei frammenti"
});
}}}
Background: #fff
Foreground: #000
PrimaryPale: #ddccff
PrimaryLight: #ddccff
PrimaryMid: #5500aa
PrimaryDark: #014
SecondaryPale: #ddbbff
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #5500aa
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #ccaaff
Error: #f88
<?php
/***
! User settings
Edit these lines according to your need
***/
//{{{
$AUTHENTICATE_USER = true; // true | false
$USERS = array(
'UserName1'=>'Password1',
'UserName2'=>'Password2',
'UserName3'=>'Password3'); // set usernames and strong passwords
$DEBUG = false; // true | false
$CLEAN_BACKUP = true; // during backuping a file, remove overmuch backups
$FOLD_JS = true; // if javascript files have been expanded during download the fold them
error_reporting(E_ERROR | E_WARNING | E_PARSE);
//}}}
/***
!Code
No change needed under
***/
//{{{
/***
* store.php - upload a file in this directory
* version :1.6.1 - 2007/08/01 - BidiX@BidiX.info
*
* see :
* http://tiddlywiki.bidi.info/#UploadPlugin for usage
* http://www.php.net/manual/en/features.file-upload.php
* for details on uploading files
* usage :
* POST
* UploadPlugin[backupDir=<backupdir>;user=<user>;password=<password>;uploadir=<uploaddir>;[debug=1];;]
* userfile <file>
* GET
*
* each external javascript file included by download.php is change by a reference (src=...)
*
* Revision history
* V1.6.1 - 2007/08/01
* Enhancement: Add javascript folding
* V1.6.0 - 2007/05/17
* Enhancement: Add backup management
* V1.5.2 - 2007/02/13
* Enhancement: Add optional debug option in client parameters
* V1.5.1 - 2007/02/01
* Enhancement: Check value of file_uploads in php.ini. Thanks to Didier Corbière
* V1.5.0 - 2007/01/15
* Correct: a bug in moving uploadFile in uploadDir thanks to DaniGutiérrez for reporting
* Refactoring
* V 1.4.3 - 2006/10/17
* Test if $filename.lock exists for GroupAuthoring compatibility
* return mtime, destfile and backupfile after the message line
* V 1.4.2 - 2006/10/12
* add error_reporting(E_PARSE);
* v 1.4.1 - 2006/03/15
* add chmo 0664 on the uploadedFile
* v 1.4 - 2006/02/23
* add uploaddir option : a path for the uploaded file relative to the current directory
* backupdir is a relative path
* make recusively directories if necessary for backupDir and uploadDir
* v 1.3 - 2006/02/17
* presence and value of user are checked with $USERS Array (thanks to PauloSoares)
* v 1.2 - 2006/02/12
* POST
* UploadPlugin[backupDir=<backupdir>;user=<user>;password=<password>;]
* userfile <file>
* if $AUTHENTICATE_USER
* presence and value of user and password are checked with
* $USER and $PASSWORD
* v 1.1 - 2005/12/23
* POST UploadPlugin[backupDir=<backupdir>] userfile <file>
* v 1.0 - 2005/12/12
* POST userfile <file>
*
* Copyright (c) BidiX@BidiX.info 2005-2007
***/
//}}}
//{{{
if ($_SERVER['REQUEST_METHOD'] == 'GET') {
/*
* GET Request
*/
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" >
<title>BidiX.info - TiddlyWiki UploadPlugin - Store script</title>
</head>
<body>
<p>
<p>store.php V 1.6.1
<p>BidiX@BidiX.info
<p> </p>
<p> </p>
<p> </p>
<p align="center">This page is designed to upload a <a href="http://www.tiddlywiki.com/">TiddlyWiki<a>.</p>
<p align="center">for details see : <a href="http://TiddlyWiki.bidix.info/#HowToUpload">TiddlyWiki.bidix.info/#HowToUpload<a>.</p>
</body>
</html>
<?php
exit;
}
/*
* POST Request
*/
// Recursive mkdir
function mkdirs($dir) {
if( is_null($dir) || $dir === "" ){
return false;
}
if( is_dir($dir) || $dir === "/" ){
return true;
}
if( mkdirs(dirname($dir)) ){
return mkdir($dir);
}
return false;
}
function toExit() {
global $DEBUG, $filename, $backupFilename, $options;
if ($DEBUG) {
echo ("\nHere is some debugging info : \n");
echo("\$filename : $filename \n");
echo("\$backupFilename : $backupFilename \n");
print ("\$_FILES : \n");
print_r($_FILES);
print ("\$options : \n");
print_r($options);
}
exit;
}
function ParseTWFileDate($s) {
// parse date element
preg_match ( '/^(\d\d\d\d)(\d\d)(\d\d)\.(\d\d)(\d\d)(\d\d)/', $s , $m );
// make a date object
$d = mktime($m[4], $m[5], $m[6], $m[2], $m[3], $m[1]);
// get the week number
$w = date("W",$d);
return array(
'year' => $m[1],
'mon' => $m[2],
'mday' => $m[3],
'hours' => $m[4],
'minutes' => $m[5],
'seconds' => $m[6],
'week' => $w);
}
function cleanFiles($dirname, $prefix) {
$now = getdate();
$now['week'] = date("W");
$hours = Array();
$mday = Array();
$year = Array();
$toDelete = Array();
// need files recent first
$files = Array();
($dir = opendir($dirname)) || die ("can't open dir '$dirname'");
while (false !== ($file = readdir($dir))) {
if (preg_match("/^$prefix/", $file))
array_push($files, $file);
}
$files = array_reverse($files);
// decides for each file
foreach ($files as $file) {
$fileTime = ParseTWFileDate(substr($file,strpos($file, '.')+1,strrpos($file,'.') - strpos($file, '.') -1));
if (($now['year'] == $fileTime['year']) &&
($now['mon'] == $fileTime['mon']) &&
($now['mday'] == $fileTime['mday']) &&
($now['hours'] == $fileTime['hours']))
continue;
elseif (($now['year'] == $fileTime['year']) &&
($now['mon'] == $fileTime['mon']) &&
($now['mday'] == $fileTime['mday'])) {
if (isset($hours[$fileTime['hours']]))
array_push($toDelete, $file);
else
$hours[$fileTime['hours']] = true;
}
elseif (($now['year'] == $fileTime['year']) &&
($now['mon'] == $fileTime['mon'])) {
if (isset($mday[$fileTime['mday']]))
array_push($toDelete, $file);
else
$mday[$fileTime['mday']] = true;
}
else {
if (isset($year[$fileTime['year']][$fileTime['mon']]))
array_push($toDelete, $file);
else
$year[$fileTime['year']][$fileTime['mon']] = true;
}
}
return $toDelete;
}
function replaceJSContentIn($content) {
if (preg_match ("/(.*?)<!--DOWNLOAD-INSERT-FILE:\"(.*?)\"--><script\s+type=\"text\/javascript\">(.*)/ms", $content,$matches)) {
$front = $matches[1];
$js = $matches[2];
$tail = $matches[3];
if (preg_match ("/<\/script>(.*)/ms", $tail,$matches2)) {
$tail = $matches2[1];
}
$jsContent = "<script type=\"text/javascript\" src=\"$js\"></script>";
$tail = replaceJSContentIn($tail);
return($front.$jsContent.$tail);
}
else
return $content;
}
// Check if file_uploads is active in php config
if (ini_get('file_uploads') != '1') {
echo "Error : File upload is not active in php.ini\n";
toExit();
}
// var definitions
$uploadDir = './';
$uploadDirError = false;
$backupError = false;
$optionStr = $_POST['UploadPlugin'];
$optionArr=explode(';',$optionStr);
$options = array();
$backupFilename = '';
$filename = $_FILES['userfile']['name'];
$destfile = $filename;
// get options
foreach($optionArr as $o) {
list($key, $value) = split('=', $o);
$options[$key] = $value;
}
// debug activated by client
if ($options['debug'] == 1) {
$DEBUG = true;
}
// authenticate User
if (($AUTHENTICATE_USER)
&& ((!$options['user']) || (!$options['password']) || ($USERS[$options['user']] != $options['password']))) {
echo "Error : UserName or Password do not match \n";
echo "UserName : [".$options['user']. "] Password : [". $options['password'] . "]\n";
toExit();
}
// make uploadDir
if ($options['uploaddir']) {
$uploadDir = $options['uploaddir'];
// path control for uploadDir
if (!(strpos($uploadDir, "../") === false)) {
echo "Error: directory to upload specifies a parent folder";
toExit();
}
if (! is_dir($uploadDir)) {
mkdirs($uploadDir);
}
if (! is_dir($uploadDir)) {
echo "UploadDirError : $uploadDirError - File NOT uploaded !\n";
toExit();
}
if ($uploadDir{strlen($uploadDir)-1} != '/') {
$uploadDir = $uploadDir . '/';
}
}
$destfile = $uploadDir . $filename;
// backup existing file
if (file_exists($destfile) && ($options['backupDir'])) {
if (! is_dir($options['backupDir'])) {
mkdirs($options['backupDir']);
if (! is_dir($options['backupDir'])) {
$backupError = "backup mkdir error";
}
}
$backupFilename = $options['backupDir'].'/'.substr($filename, 0, strrpos($filename, '.'))
.date('.Ymd.His').substr($filename,strrpos($filename,'.'));
rename($destfile, $backupFilename) or ($backupError = "rename error");
// remove overmuch backup
if ($CLEAN_BACKUP) {
$toDelete = cleanFiles($options['backupDir'], substr($filename, 0, strrpos($filename, '.')));
foreach ($toDelete as $file) {
$f = $options['backupDir'].'/'.$file;
if($DEBUG) {
echo "delete : ".$options['backupDir'].'/'.$file."\n";
}
unlink($options['backupDir'].'/'.$file);
}
}
}
// move uploaded file to uploadDir
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $destfile)) {
if ($FOLD_JS) {
// rewrite the file to replace JS content
$fileContent = file_get_contents ($destfile);
$fileContent = replaceJSContentIn($fileContent);
if (!$handle = fopen($destfile, 'w')) {
echo "Cannot open file ($destfile)";
exit;
}
if (fwrite($handle, $fileContent) === FALSE) {
echo "Cannot write to file ($destfile)";
exit;
}
fclose($handle);
}
chmod($destfile, 0644);
if($DEBUG) {
echo "Debug mode \n\n";
}
if (!$backupError) {
echo "0 - File successfully loaded in " .$destfile. "\n";
} else {
echo "BackupError : $backupError - File successfully loaded in " .$destfile. "\n";
}
echo("destfile:$destfile \n");
if (($backupFilename) && (!$backupError)) {
echo "backupfile:$backupFilename\n";
}
$mtime = filemtime($destfile);
echo("mtime:$mtime");
}
else {
echo "Error : " . $_FILES['error']." - File NOT uploaded !\n";
}
toExit();
//}}}
?>
<!--{{{-->
<div class='toolbar' macro='toolbar closeTiddler closeOthers +editTiddler > fields syncing permalink references jump'></div>
<div class='webview' macro='tiddler webviewindex'></div>
<div class='title' macro='view title'></div>
<div class='viewer' macro='view text wikified'></div>
<div class='tagClear'></div>
<!--}}}-->
{{tableindex{
|[[Benvenuti|Benvenuti in Webview TiddlyWiki]]|[[Istruzioni]]|[[Istruzioni sottomenu]]|
}}}
config.options.chkSaveBackups = false;
config.options.chkEnableAnimations = false;
config.options.chkShowRightSidebar= false;
config.options.chkSinglePageMode= true;
config.options.chkSinglePagePermalink= false;