<link rel='alternate' type='application/rss+xml' title='RSS' href='index.xml' />
Background: #fff
Foreground: #000
PrimaryPale: #8cf
PrimaryLight: #18f
PrimaryMid: #04b
PrimaryDark: #014
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
Error: #f88
body {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}

a {color:[[ColorPalette::PrimaryMid]];}
a:hover {background-color:[[ColorPalette::PrimaryMid]]; color:[[ColorPalette::Background]];}
a img {border:0;}

h1,h2,h3,h4,h5,h6 {color:[[ColorPalette::SecondaryDark]]; background:transparent;}
h1 {border-bottom:2px solid [[ColorPalette::TertiaryLight]];}
h2,h3 {border-bottom:1px solid [[ColorPalette::TertiaryLight]];}

.button {color:[[ColorPalette::PrimaryDark]]; border:1px solid [[ColorPalette::Background]];}
.button:hover {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::SecondaryLight]]; border-color:[[ColorPalette::SecondaryMid]];}
.button:active {color:[[ColorPalette::Background]]; background:[[ColorPalette::SecondaryMid]]; border:1px solid [[ColorPalette::SecondaryDark]];}

.header {background:[[ColorPalette::PrimaryMid]];}
.headerShadow {color:[[ColorPalette::Foreground]];}
.headerShadow a {font-weight:normal; color:[[ColorPalette::Foreground]];}
.headerForeground {color:[[ColorPalette::Background]];}
.headerForeground a {font-weight:normal; color:[[ColorPalette::PrimaryPale]];}

.tabSelected {color:[[ColorPalette::PrimaryDark]];
	border-left:1px solid [[ColorPalette::TertiaryLight]];
	border-top:1px solid [[ColorPalette::TertiaryLight]];
	border-right:1px solid [[ColorPalette::TertiaryLight]];
.tabUnselected {color:[[ColorPalette::Background]]; background:[[ColorPalette::TertiaryMid]];}
.tabContents {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::TertiaryPale]]; border:1px solid [[ColorPalette::TertiaryLight]];}
.tabContents .button {border:0;}

#sidebar {}
#sidebarOptions input {border:1px solid [[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel {background:[[ColorPalette::PrimaryPale]];}
#sidebarOptions .sliderPanel a {border:none;color:[[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel a:hover {color:[[ColorPalette::Background]]; background:[[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel a:active {color:[[ColorPalette::PrimaryMid]]; background:[[ColorPalette::Background]];}

.wizard {background:[[ColorPalette::PrimaryPale]]; border:1px solid [[ColorPalette::PrimaryMid]];}
.wizard h1 {color:[[ColorPalette::PrimaryDark]]; border:none;}
.wizard h2 {color:[[ColorPalette::Foreground]]; border:none;}
.wizardStep {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];
	border:1px solid [[ColorPalette::PrimaryMid]];}
.wizardStep.wizardStepDone {background:[[ColorPalette::TertiaryLight]];}
.wizardFooter {background:[[ColorPalette::PrimaryPale]];}
.wizardFooter .status {background:[[ColorPalette::PrimaryDark]]; color:[[ColorPalette::Background]];}
.wizard .button {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::SecondaryLight]]; border: 1px solid;
	border-color:[[ColorPalette::SecondaryPale]] [[ColorPalette::SecondaryDark]] [[ColorPalette::SecondaryDark]] [[ColorPalette::SecondaryPale]];}
.wizard .button:hover {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::Background]];}
.wizard .button:active {color:[[ColorPalette::Background]]; background:[[ColorPalette::Foreground]]; border: 1px solid;
	border-color:[[ColorPalette::PrimaryDark]] [[ColorPalette::PrimaryPale]] [[ColorPalette::PrimaryPale]] [[ColorPalette::PrimaryDark]];}

.wizard .notChanged {background:transparent;}
.wizard .changedLocally {background:#80ff80;}
.wizard .changedServer {background:#8080ff;}
.wizard .changedBoth {background:#ff8080;}
.wizard .notFound {background:#ffff80;}
.wizard .putToServer {background:#ff80ff;}
.wizard .gotFromServer {background:#80ffff;}

#messageArea {border:1px solid [[ColorPalette::SecondaryMid]]; background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]];}
#messageArea .button {color:[[ColorPalette::PrimaryMid]]; background:[[ColorPalette::SecondaryPale]]; border:none;}

.popupTiddler {background:[[ColorPalette::TertiaryPale]]; border:2px solid [[ColorPalette::TertiaryMid]];}

.popup {background:[[ColorPalette::TertiaryPale]]; color:[[ColorPalette::TertiaryDark]]; border-left:1px solid [[ColorPalette::TertiaryMid]]; border-top:1px solid [[ColorPalette::TertiaryMid]]; border-right:2px solid [[ColorPalette::TertiaryDark]]; border-bottom:2px solid [[ColorPalette::TertiaryDark]];}
.popup hr {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::PrimaryDark]]; border-bottom:1px;}
.popup li.disabled {color:[[ColorPalette::TertiaryMid]];}
.popup li a, .popup li a:visited {color:[[ColorPalette::Foreground]]; border: none;}
.popup li a:hover {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; border: none;}
.popup li a:active {background:[[ColorPalette::SecondaryPale]]; color:[[ColorPalette::Foreground]]; border: none;}
.popupHighlight {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}
.listBreak div {border-bottom:1px solid [[ColorPalette::TertiaryDark]];}

.tiddler .defaultCommand {font-weight:bold;}

.shadow .title {color:[[ColorPalette::TertiaryDark]];}

.title {color:[[ColorPalette::SecondaryDark]];}
.subtitle {color:[[ColorPalette::TertiaryDark]];}

.toolbar {color:[[ColorPalette::PrimaryMid]];}
.toolbar a {color:[[ColorPalette::TertiaryLight]];}
.selected .toolbar a {color:[[ColorPalette::TertiaryMid]];}
.selected .toolbar a:hover {color:[[ColorPalette::Foreground]];}

.tagging, .tagged {border:1px solid [[ColorPalette::TertiaryPale]]; background-color:[[ColorPalette::TertiaryPale]];}
.selected .tagging, .selected .tagged {background-color:[[ColorPalette::TertiaryLight]]; border:1px solid [[ColorPalette::TertiaryMid]];}
.tagging .listTitle, .tagged .listTitle {color:[[ColorPalette::PrimaryDark]];}
.tagging .button, .tagged .button {border:none;}

.footer {color:[[ColorPalette::TertiaryLight]];}
.selected .footer {color:[[ColorPalette::TertiaryMid]];}

.error, .errorButton {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::Error]];}
.warning {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::SecondaryPale]];}
.lowlight {background:[[ColorPalette::TertiaryLight]];}

.zoomer {background:none; color:[[ColorPalette::TertiaryMid]]; border:3px solid [[ColorPalette::TertiaryMid]];}

.imageLink, #displayArea .imageLink {background:transparent;}

.annotation {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; border:2px solid [[ColorPalette::SecondaryMid]];}

.viewer .listTitle {list-style-type:none; margin-left:-2em;}
.viewer .button {border:1px solid [[ColorPalette::SecondaryMid]];}
.viewer blockquote {border-left:3px solid [[ColorPalette::TertiaryDark]];}

.viewer table, table.twtable {border:2px solid [[ColorPalette::TertiaryDark]];}
.viewer th, .viewer thead td, .twtable th, .twtable thead td {background:[[ColorPalette::SecondaryMid]]; border:1px solid [[ColorPalette::TertiaryDark]]; color:[[ColorPalette::Background]];}
.viewer td, .viewer tr, .twtable td, .twtable tr {border:1px solid [[ColorPalette::TertiaryDark]];}

.viewer pre {border:1px solid [[ColorPalette::SecondaryLight]]; background:[[ColorPalette::SecondaryPale]];}
.viewer code {color:[[ColorPalette::SecondaryDark]];}
.viewer hr {border:0; border-top:dashed 1px [[ColorPalette::TertiaryDark]]; color:[[ColorPalette::TertiaryDark]];}

.highlight, .marked {background:[[ColorPalette::SecondaryLight]];}

.editor input {border:1px solid [[ColorPalette::PrimaryMid]];}
.editor textarea {border:1px solid [[ColorPalette::PrimaryMid]]; width:100%;}
.editorFooter {color:[[ColorPalette::TertiaryMid]];}
.readOnly {background:[[ColorPalette::TertiaryPale]];}

#backstageArea {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::TertiaryMid]];}
#backstageArea a {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::Background]]; border:none;}
#backstageArea a:hover {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; }
#backstageArea a.backstageSelTab {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}
#backstageButton a {background:none; color:[[ColorPalette::Background]]; border:none;}
#backstageButton a:hover {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::Background]]; border:none;}
#backstagePanel {background:[[ColorPalette::Background]]; border-color: [[ColorPalette::Background]] [[ColorPalette::TertiaryDark]] [[ColorPalette::TertiaryDark]] [[ColorPalette::TertiaryDark]];}
.backstagePanelFooter .button {border:none; color:[[ColorPalette::Background]];}
.backstagePanelFooter .button:hover {color:[[ColorPalette::Foreground]];}
#backstageCloak {background:[[ColorPalette::Foreground]]; opacity:0.6; filter:alpha(opacity=60);}
* html .tiddler {height:1%;}

body {font-size:.75em; font-family:arial,helvetica; margin:0; padding:0;}

h1,h2,h3,h4,h5,h6 {font-weight:bold; text-decoration:none;}
h1,h2,h3 {padding-bottom:1px; margin-top:1.2em;margin-bottom:0.3em;}
h4,h5,h6 {margin-top:1em;}
h1 {font-size:1.35em;}
h2 {font-size:1.25em;}
h3 {font-size:1.1em;}
h4 {font-size:1em;}
h5 {font-size:.9em;}

hr {height:1px;}

a {text-decoration:none;}

dt {font-weight:bold;}

ol {list-style-type:decimal;}
ol ol {list-style-type:lower-alpha;}
ol ol ol {list-style-type:lower-roman;}
ol ol ol ol {list-style-type:decimal;}
ol ol ol ol ol {list-style-type:lower-alpha;}
ol ol ol ol ol ol {list-style-type:lower-roman;}
ol ol ol ol ol ol ol {list-style-type:decimal;}

.txtOptionInput {width:11em;}

#contentWrapper .chkOptionInput {border:0;}

.externalLink {text-decoration:underline;}

.indent {margin-left:3em;}
.outdent {margin-left:3em; text-indent:-3em;}
code.escaped {white-space:nowrap;}

.tiddlyLinkExisting {font-weight:bold;}
.tiddlyLinkNonExisting {font-style:italic;}

/* the 'a' is required for IE, otherwise it renders the whole tiddler in bold */
a.tiddlyLinkNonExisting.shadow {font-weight:bold;}

#mainMenu .tiddlyLinkExisting,
	#mainMenu .tiddlyLinkNonExisting,
	#sidebarTabs .tiddlyLinkNonExisting {font-weight:normal; font-style:normal;}
#sidebarTabs .tiddlyLinkExisting {font-weight:bold; font-style:normal;}

.header {position:relative;}
.header a:hover {background:transparent;}
.headerShadow {position:relative; padding:4.5em 0 1em 1em; left:-1px; top:-1px;}
.headerForeground {position:absolute; padding:4.5em 0 1em 1em; left:0; top:0;}

.siteTitle {font-size:3em;}
.siteSubtitle {font-size:1.2em;}

#mainMenu {position:absolute; left:0; width:10em; text-align:right; line-height:1.6em; padding:1.5em 0.5em 0.5em 0.5em; font-size:1.1em;}

#sidebar {position:absolute; right:3px; width:16em; font-size:.9em;}
#sidebarOptions {padding-top:0.3em;}
#sidebarOptions a {margin:0 0.2em; padding:0.2em 0.3em; display:block;}
#sidebarOptions input {margin:0.4em 0.5em;}
#sidebarOptions .sliderPanel {margin-left:1em; padding:0.5em; font-size:.85em;}
#sidebarOptions .sliderPanel a {font-weight:bold; display:inline; padding:0;}
#sidebarOptions .sliderPanel input {margin:0 0 0.3em 0;}
#sidebarTabs .tabContents {width:15em; overflow:hidden;}

.wizard {padding:0.1em 1em 0 2em;}
.wizard h1 {font-size:2em; font-weight:bold; background:none; padding:0; margin:0.4em 0 0.2em;}
.wizard h2 {font-size:1.2em; font-weight:bold; background:none; padding:0; margin:0.4em 0 0.2em;}
.wizardStep {padding:1em 1em 1em 1em;}
.wizard .button {margin:0.5em 0 0; font-size:1.2em;}
.wizardFooter {padding:0.8em 0.4em 0.8em 0;}
.wizardFooter .status {padding:0 0.4em; margin-left:1em;}
.wizard .button {padding:0.1em 0.2em;}

#messageArea {position:fixed; top:2em; right:0; margin:0.5em; padding:0.5em; z-index:2000; _position:absolute;}
.messageToolbar {display:block; text-align:right; padding:0.2em;}
#messageArea a {text-decoration:underline;}

.tiddlerPopupButton {padding:0.2em;}
.popupTiddler {position: absolute; z-index:300; padding:1em; margin:0;}

.popup {position:absolute; z-index:300; font-size:.9em; padding:0; list-style:none; margin:0;}
.popup .popupMessage {padding:0.4em;}
.popup hr {display:block; height:1px; width:auto; padding:0; margin:0.2em 0;}
.popup li.disabled {padding:0.4em;}
.popup li a {display:block; padding:0.4em; font-weight:normal; cursor:pointer;}
.listBreak {font-size:1px; line-height:1px;}
.listBreak div {margin:2px 0;}

.tabset {padding:1em 0 0 0.5em;}
.tab {margin:0 0 0 0.25em; padding:2px;}
.tabContents {padding:0.5em;}
.tabContents ul, .tabContents ol {margin:0; padding:0;}
.txtMainTab .tabContents li {list-style:none;}
.tabContents li.listLink { margin-left:.75em;}

#contentWrapper {display:block;}
#splashScreen {display:none;}

#displayArea {margin:1em 17em 0 14em;}

.toolbar {text-align:right; font-size:.9em;}

.tiddler {padding:1em 1em 0;}

.missing .viewer,.missing .title {font-style:italic;}

.title {font-size:1.6em; font-weight:bold;}

.missing .subtitle {display:none;}
.subtitle {font-size:1.1em;}

.tiddler .button {padding:0.2em 0.4em;}

.tagging {margin:0.5em 0.5em 0.5em 0; float:left; display:none;}
.isTag .tagging {display:block;}
.tagged {margin:0.5em; float:right;}
.tagging, .tagged {font-size:0.9em; padding:0.25em;}
.tagging ul, .tagged ul {list-style:none; margin:0.25em; padding:0;}
.tagClear {clear:both;}

.footer {font-size:.9em;}
.footer li {display:inline;}

.annotation {padding:0.5em; margin:0.5em;}

* html .viewer pre {width:99%; padding:0 0 1em 0;}
.viewer {line-height:1.4em; padding-top:0.5em;}
.viewer .button {margin:0 0.25em; padding:0 0.25em;}
.viewer blockquote {line-height:1.5em; padding-left:0.8em;margin-left:2.5em;}
.viewer ul, .viewer ol {margin-left:0.5em; padding-left:1.5em;}

.viewer table, table.twtable {border-collapse:collapse; margin:0.8em 1.0em;}
.viewer th, .viewer td, .viewer tr,.viewer caption,.twtable th, .twtable td, .twtable tr,.twtable caption {padding:3px;}
table.listView {font-size:0.85em; margin:0.8em 1.0em;}
table.listView th, table.listView td, table.listView tr {padding:0 3px 0 3px;}

.viewer pre {padding:0.5em; margin-left:0.5em; font-size:1.2em; line-height:1.4em; overflow:auto;}
.viewer code {font-size:1.2em; line-height:1.4em;}

.editor {font-size:1.1em;}
.editor input, .editor textarea {display:block; width:100%; font:inherit;}
.editorFooter {padding:0.25em 0; font-size:.9em;}
.editorFooter .button {padding-top:0; padding-bottom:0;}

.fieldsetFix {border:0; padding:0; margin:1px 0px;}

.zoomer {font-size:1.1em; position:absolute; overflow:hidden;}
.zoomer div {padding:1em;}

* html #backstage {width:99%;}
* html #backstageArea {width:99%;}
#backstageArea {display:none; position:relative; overflow: hidden; z-index:150; padding:0.3em 0.5em;}
#backstageToolbar {position:relative;}
#backstageArea a {font-weight:bold; margin-left:0.5em; padding:0.3em 0.5em;}
#backstageButton {display:none; position:absolute; z-index:175; top:0; right:0;}
#backstageButton a {padding:0.1em 0.4em; margin:0.1em;}
#backstage {position:relative; width:100%; z-index:50;}
#backstagePanel {display:none; z-index:100; position:absolute; width:90%; margin-left:3em; padding:1em;}
.backstagePanelFooter {padding-top:0.2em; float:right;}
.backstagePanelFooter a {padding:0.2em 0.4em;}
#backstageCloak {display:none; z-index:20; position:absolute; width:100%; height:100px;}

.whenBackstage {display:none;}
.backstageVisible .whenBackstage {display:block;}
StyleSheet for use when a translation requires any css style changes.
This StyleSheet can be used directly by languages such as Chinese, Japanese and Korean which need larger font sizes.
body {font-size:0.8em;}
#sidebarOptions {font-size:1.05em;}
#sidebarOptions a {font-style:normal;}
#sidebarOptions .sliderPanel {font-size:0.95em;}
.subtitle {font-size:0.8em;}
.viewer table.listView {font-size:0.95em;}
@media print {
#mainMenu, #sidebar, #messageArea, .toolbar, #backstageButton, #backstageArea {display: none !important;}
#displayArea {margin: 1em 1em 0em;}
noscript {display:none;} /* Fixes a feature in Firefox where print preview displays the noscript content */
<div class='header' macro='gradient vert [[ColorPalette::PrimaryLight]] [[ColorPalette::PrimaryMid]]'>
<div class='headerShadow'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
<div class='headerForeground'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
<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 id='displayArea'>
<div id='messageArea'></div>
<div id='tiddlerDisplay'></div>
<div class='toolbar' macro='toolbar [[ToolbarCommands::ViewToolbar]]'></div>
<div class='title' macro='view title'></div>
<div class='subtitle'><span macro='view modifier link'></span>, <span macro='view modified date'></span> (<span macro='message views.wikified.createdPrompt'></span> <span macro='view created date'></span>)</div>
<div class='tagging' macro='tagging'></div>
<div class='tagged' macro='tags'></div>
<div class='viewer' macro='view text wikified'></div>
<div class='tagClear'></div>
<div class='toolbar' macro='toolbar [[ToolbarCommands::EditToolbar]]'></div>
<div class='title' macro='view title'></div>
<div class='editor' macro='edit title'></div>
<div macro='annotations'></div>
<div class='editor' macro='edit text'></div>
<div class='editor' macro='edit tags'></div><div class='editorFooter'><span macro='message views.editor.tagPrompt'></span><span macro='tagChooser excludeLists'></span></div>
To get started with this blank [[TiddlyWiki]], you'll need to modify the following tiddlers:
* [[SiteTitle]] & [[SiteSubtitle]]: The title and subtitle of the site, as shown above (after saving, they will also appear in the browser title bar)
* [[MainMenu]]: The menu (usually on the left)
* [[DefaultTiddlers]]: Contains the names of the tiddlers that you want to appear when the TiddlyWiki is opened
You'll also need to enter your username for signing your edits: <<option txtUserName>>
These [[InterfaceOptions]] for customising [[TiddlyWiki]] are saved in your browser

Your username for signing your edits. Write it as a [[WikiWord]] (eg [[JoeBloggs]])

<<option txtUserName>>
<<option chkSaveBackups>> [[SaveBackups]]
<<option chkAutoSave>> [[AutoSave]]
<<option chkRegExpSearch>> [[RegExpSearch]]
<<option chkCaseSensitiveSearch>> [[CaseSensitiveSearch]]
<<option chkAnimate>> [[EnableAnimations]]

Also see [[AdvancedOptions]]
|''Description:''|Inline annotations for tiddler text.|
|''Author:''|Saq Imtiaz ( lewcid@gmail.com )|
|''Code Repository:''|http://tw.lewcid.org/svn/plugins|
|''License:''|[[Creative Commons Attribution-ShareAlike 3.0 License|http://creativecommons.org/licenses/by-sa/3.0/]]|

*{{{((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)}}}

Mouse over, the text below:
* ((banana(the best fruit in the world)))
* ((banana(^ the best fruit in the world)))

// /%
var _2=this.lookaheadRegExp.exec(w.source);
var _3=createTiddlyElement(w.output,"span",null,"annosub",_2[1]);
setStylesheet(".anno{position:absolute;border:2px solid #000;background-color:#FFDAB9; color:#800000;padding:0.5em;max-width:35em;width:expression(document.body.clientWidth > (255/12) *parseInt(document.body.currentStyle.fontSize)?'35em':'auto' );}\n"+".anno h1, .anno h2{margin-top:0;color:#800000;}\n"+".annosub{font-weight: bold; color: #900;}\n"+".annosubover{z-index:25; background-color:#ffeebb;cursor:help;}\n","AnnotationStyles");

// %/
@@color:orange;''Sitúa el cursor encima de una palabra en rojo (sin hacer clic) para ver el significado.''@@

Paris, le 18 septembre 2000.
Bonjour, je m’appelle Guillaume Leclercq, j’ai quinze ans et demi. J’adore le ((ciné((fam) = le cinéma))), la lecture, mais ((surtout(sobre todo))) l’égyptologie. Pour la première fois de ma vie, j’écris un ((journal(un diario 
~~a veces también se dice ''un journal intime'';
''un journal'' también significa "un periódico"~~))). Je ne sais pas à qui ((raconter(contar/narrar))) cette ((étrange(extraño,a))) aventure. ((Voilà(he aquí))) toute l’histoire...

//-- Allô ! C’est toi, Paul ? 
-- Oui, qui est ((à l’appareil(al aparato [al teléfono]))) ?
-- C’est moi, Guillaume, tu viens avec moi au Louvre ? Il y a une nouvelle momie. On va la voir ?
-- Euh..., je ne sais pas. J’ai des ((devoirs(deberes, tareas)))... Je travaille à une ((expérience(experimento [de laboratorio]))) de ((chimie(química))).
-- ((Allez(¡venga! / ¡vamos!))), viens, aujourd’hui c’est gratuit.
-- Bon d’accord, ((je viens(~~a un español le extrañará esta frase, ya que dice "vengo" en lugar de "voy". Esto ocurre cuando alguien te invita a que lo acompañes~~))).
-- On ((se retrouve(se retrouver = verse /encontrarse [darse cita]))) devant le musée à quatre heures ?
-- Oui, ((à tout à l’heure(¡hasta ahora! ~~Nos vemos dentro de un momento~~))).//

Devant la pyramide du Louvre.

//-- Salut Paul !
-- Salut Guillaume, on entre ?
-- Oui, on va directement voir la momie ?
-- Oui, ((bien sûr(por supuesto))).
-- Regarde, Paul, ((la voilà(aquí está / aquí la tienes / mírala))). ((C’est chouette(~~(fam)~~ ¡qué guay!))), il n’y a pas ((beaucoup de monde(mucha gente))) ! On peut la voir tranquillement. ((Incroyable(increíble
~~deriva del verbo ''croire'':
je crois
tu crois
il croit
nous ''croy''ons
vous ''croy''ez
ils croient~~))), c’est absolument incroyable. Elle est ((aussi(aussi +adj + que... → tan +adj + como...))) vieille que la momie de Toutankhamon, c’est le général Thoukanis. On raconte qu’elle ((porte malheur(porter malheur = traer mala suerte)))...
-- ((Tiens(¡anda! ~~expresando sorpresa~~))) Guillaume, regarde, ((là(ahí))), sur le sarcophage !...
-- Quoi ? ((Je ne vois rien(no veo nada 
~~rien = nada~~))).
-- ((Mais si(sí, hombre ~~a una pregunta o afirmación negativa se suele replicar con "si" y no con "oui"~~))), là ! Ce ((hiéroglyphe(jeroglífico))) ! ((Je l’ai déjà vu(ya lo he visto ~~déjà = ya; 
''vu'' es el participio de //voir//; 
passé composé: j'ai vu = he visto~~))), je ((le reconnais(lo reconozco ~~v. reconnaître~~))), tu ((te souviens ?(¿te acuerdas? ~~v. "se souvenir" → acordarse/recordar~~))) Notre ((prof((fam) = professeur))) d’histoire nous ((a dit(ha dicho 
~~''dit'' es el participio de //dire//
passé composé: j'ai dit~~))) qu’il signifie...
-- Mais oui, ((tu as raison(tienes razón))), ce hiéroglyphe... ((cela(cela = ça  ce (c')~~//ça// es mucho más usado en la lengua hablada; //cela// se usa más en el escrito; significan //esto/eso/ello//, aunque a veces puede no traducirse: equivale al //it// del inglés; cuando esta partícula va seguida del verbo //être//, se usa //ce// (c'): c'est mon stylo; ce sont mes livres~~))) veut dire : « une malédiction pèse sur vous !».//

<<tiddler HideTiddlerToolbar>>
Guillaume se met à rire.

//-- Ah, ah, ah, une malédiction !
-- Oui, regarde Guillaume ! Une malédiction...
-- ((Oh là là(¡madre mía!))), tu es ((en train de(tu es en train de devenir pâle = te estás poniendo pálido
^^être en train de faire quelque chose = estar haciendo algo;
"être en train de + infinitivo" es una de las formas de construir el gerundio. 
Ejemplo: il est en train de manger = está comiendo. 
¡Cuidado! el gerundio español no siempre se corresponderá con esta forma.^^))) devenir ((tout(completamente 
~~OBSERVACION: el significado normal de tout es "todo", pero aquí es un adverbio que va seguido de un adjetivo. 
En esos casos significa "completamente": tout pâle = completamente pálido~~))) pâle ! Eh... Paul, tu ne vas pas ((croire à(creer en 
^^Como veis, en francés se usa la preposición //à// y no //en//^^))) ces histoires ? ((Ce que(~~Lo más probable es que cuando veáis //ce que// signifique "lo que". 
Menos frecuente es este caso: veis que se trata de una exclamación.
En frases similares a esta, //ce que...// se puede traducir por "mira...". 
Ejemplo: ce que tu es naïf ! ¡mira que eres ingenuo!~~))) tu peux être ((bête(être bête = ser tonto))) !
-- Je veux rentrer à la maison, je ne ((me sens(se sentir = sentirse))) pas bien.//

Sur le chemin du ((retour(regreso))), une longue limousine noire ((apparaît(apparaître = aparecer))) au ((coin(le coin = la esquina))) d’une rue. Arrivée à la ((hauteur(altura))) des deux ((camarades(compañeros))), elle ralentit... La ((vitre(cristal))) du conducteur ((s’abaisse(s'abaisser = bajarse)))..., une forme blanche est au volant.

//-- Guillaume attention ! La voiture !
-- Quoi ? Quelle voiture ?//

((Tout à coup(de repente))) la limousine accélère, Guillaume qui se trouve trop ((près(cerca))) de ((la chaussée(la calzada))) tombe.

//-- « Tu ((t’es fait mal(te has hecho daño ~~se faire mal = hacerse daño
se conjuga con être porque es pronominal: SE faire mal
//fait// es el participio de //faire//~~))) ?», demande Paul, ((inquiet(~~La mayoría de las veces me parece que queda mejor traducirlo por "preocupado"~~))).//

Guillaume ((se relève(se relever = levantarse
~~Lo normal es que para levantarse / ponerse de pie se use //se lever//. 
Aquí se añade el prefijo -re porque subyace la idea de volver a la posición normal que tenía antes de caerse, es decir que "se vuelve a poner de pie"~~))) et ((se touche(se toucher = tocarse))) la tête.

//-- Non, je crois que ((ça va(estoy bien))).
-- Tu sais, Guillaume, je commence à ((avoir peur(tener miedo))). La malédiction, c’est ((peut-être(quizás))) vrai.
-- ((Arrête de(arrêter de = dejar de))) penser ((à ça(en eso ~~el francés dice //pensar a// donde el español dice //pensar en//~~))) ! Tu deviens ((ennuyeux(molesto ~~también significa "aburrido", pero depende del contexto))).
-- Tu as peut-être raison...//

Les deux amis ((reprennent(reprendre = retomar ~~prendre =coger, tomar; reprendre =retomar~~))) leur promenade et ((bavardent(bavarder=charlar))) tranquillement. ((Soudain(de repente))), un vent très violent se lève. Paul et Guillaume se mettent à courir pour aller ((s’abriter(resguardarse))) sous un porche.

//-- « Eh bien, tu parles d’une tempête ! », dit Guillaume.
-- C’est vraiment étrange. J’ai du ((sable(arena))) dans les cheveux !//

Un ((bruit(ruido) terrible les fait ((sursauter(sobresaltarse))) : un ((pot(tiesto, maceta))) de fleurs ((vient de(acaba de))) tomber d’un balcon, il ((s’écrase(s'écraser = estrellarse, espachurrarse))) aux pieds de Paul.

//-- Ouf ! dit Paul, ((heureusement que(menos mal que ~~heureusement (sin que) significa "afortunadamente", "por suerte"))) le pot ne nous est pas tombé sur la tête.//

Instinctivement il lève la tête.

//-- Guillaume, regarde sur le balcon, le ((chat(gato))) !
-- « Le chat ? C’est ((sûrement(seguramente))) la ((déesse(diosa))) Bastet ! », dit ironiquement Guillaume.
-- Tu vois, j’((en(~~ese "en" es un pronombre que en ese contexto significa "de ello": 
j'en suis sûr = estoy seguro de ello~~))) suis ((sûr(seguro))) maintenant, la voiture, le sable, le pot de fleurs, le chat, c’est trop ! C’est la malédiction de Thoukanis... Qu’est-ce qui va nous ((arriver(ocurrir, pasar ~~algo "arrive" a alguien = algo le ocurre/pasa a alguien))) ((encore(todavía ~~aquí: "qué más nos va a pasar"))) ?//

<<tiddler HideTiddlerToolbar>>
Guillaume est seul dans sa chambre. ((Tout à coup(de repente ~~tout à coup = soudain~~))) un bruit... BADABOUMMM ! 

//-- « Eh ! ((Qu’est-ce qu’il y a ?(¿qué pasa?))) Il y a ((quelqu’un(alguien))) ? », demande-t-il.//

Mais le ((couloir(pasillo))) est ((vide(vacío))). ((Pourtant(sin embargo ~~¡cuidado con esta palabra, porque parece lo que no es~~))), le bruit continue. Puis du fond de ((l’armoire(armario ~~en francés es femenino: une armoire~~))), on entend une ((sorte(especie))) de ((plainte(quejido, lamento))) : aaah...

//-- Qu’est-ce que c’est ?//

Guillaume commence à s’inquiéter et à avoir peur... Il ferme les yeux... Il sent un vent chaud sur son visage...
Puis tout à coup :

//-- ((Mon Dieu(¡dios mío!))), la momie !
-- Pourquoi as-tu ((dérangé(trastocar, interrumpir ~~normalmente significa "molestar"~~))) mon ((sommeil(sueño))) ?
-- Je... je n’ai rien dérangé... je... euh...
-- Si, tu ((as lu(has leído ~~//lu// es el participio de //lire//~~))) le hiéroglyphe, la malédiction va te ((frapper(golpear, afectar))) !
-- Mais, je... ((je n’ai rien fait(no he hecho nada))) !
-- Tu m’as réveillé et tu seras ((puni(punir = castigar ~~el participio es //puni// = castigado~~))).
-- Non... ((Je vous en prie(se lo ruego, se lo suplico))) !
-- Rien à faire !
-- Général, je ferai tout ce que vous voulez, mais ne me ((tuez(tuer=matar))) pas...
-- Tout, vraiment tout ?...//

Dans la rue... Guillaume marche très ((vite(rápidamente))) dans ((le noir(la oscuridad))).

//-- « Qu’est-ce que je vais faire maintenant ? », se dit-il.//

Il arrive chez Paul et frappe à sa fenêtre, il l’appelle :

//- Paul ! Eh Paul ! Réveille-toi !//

Paul apparaît à la fenêtre :

//-- Tu es ((fou(loco))), tu vas réveiller tout le monde, qu’est-ce que tu veux ?
-- Viens avec moi, c’est une question de vie ou de mort...//

Quelques minutes plus tard, Guillaume et Paul marchent dans la rue, ((il fait nuit(es de noche ~~il fait jour = es de día~~))). On entend leurs ((pas(pasos ~~es invariable: un pas, deux pas~~))) résonner dans le silence. Ils arrivent devant la pyramide du Louvre.

//-- Bon Guillaume, comment tu veux entrer dans le musée ?
-- Je ne sais pas. On peut ((casser(romper))) un ((carreau(cristal ~~cada una de las placas de una ventana~~))) ?
-- Avec quoi ?
-- Avec ça !//

Guillaume a une barre de ((fer(hierro))) à la main.

//-- (On y va ?(¿vamos?)))
-- Tu es fou, l’alarme va sonner.
-- ((Tant pis(¡qué le vamos a hacer!))), on n’a pas le temps. Le Général a été très ((clair(claro))), dans une heure, il sera trop tard.//

<<tiddler HideTiddlerToolbar>>
La police arrive.

//-- Ah, je les ((tiens(tenir = tener, sujetar))), ((chef(jefe))) ! ((crie(crier = gritar))) un policier. Ces ((petits voyous(granujillas))) !//

Au ((commissariat(comisaría))) :

//-- « Pourquoi vous avez fait cela ? », demande le commissaire.
-- « On ne peut pas répondre mais c’est une question de vie ou de mort, on doit entrer dans le Louvre », répond Guillaume ((un peu(un poco))) nerveux.
-- C’est grave ce que vous avez fait ! Je suis obligé d’appeler vos parents.//

Un peu plus tard, les parents arrivent.

//-- ((Nous sommes désolés(lo sentimos))), commissaire.
-- ((Heureusement(por suerte, afortunadamente))), la pyramide est solide. Mais, c’est très grave ce qu’ils ont fait, ((ils seront appelés(serán llamados [aquí: convocados]))) au tribunal. ((Entre-temps(mientras tanto))), ((surveillez-les(vigílelos ~~surveiller = vigilar~~))).
-- Maintenant il est trop tard, dit Guillaume désespéré ((en regardant(mirando))) sa montre. Les ((pires(peores))) ((malheurs(un malheur = una desgracia))) vont nous ((arriver(~~como he comentado anteriormente, además de "llegar" el verbo //arriver// puede significar "pasar", "ocurrir"~~))).//

Chez Paul...

//-- Mais pourquoi tu as fait ça ? demande le père de Paul. Tu as entendu, on va nous convoquer au tribunal, mon Dieu, c’est une catastrophe ! 
-- « Non, la catastrophe, c’est pour bientôt », dit Paul.//

Ses parents, fatigués, vont se coucher, mais lui, il reste dans le salon, ((pensif(pensativo))).
Peu après, on entend une sirène de ((pompiers(bomberos))) ~PIN-PON, ~PIN-PON, ~PIN-PON. Dans la rue, il y a des gens ((affolés(~~//affolé// viene de //fou// = loco
aquí podemos traducirlo por asustados [como locos de miedo]~~)))

//-- « ((Qu’est-ce qui s’est passé ? »(¿que ha pasado/ocurrido?))), demande un monsieur.
-- « Une explosion... c’est terrible ! », ((s’écrie(s'écrier = exclamar))) une vieille dame.//

La voiture des pompiers s’arrête. On voit Paul et ses parents ((assis(sentados))) sur le trottoir. Ils sont en pyjama.

//-- « Vous êtes ((blessés(blessé = herido))) ? », demande un pompier.
-- non, nous n’avons rien et heureusement l’explosion n’a pas été trop violente. ((Il n’y a que(il n'y a que... = solo/solamente))) la chambre de notre fils qui est ((endommagée(dañada))).
-- Vous savez ce qui a provoqué l’explosion ?
-- « Non, je ne comprends pas », dit le père de Paul.//

Dans la chambre, les pompiers ((retrouvent(retrouver = encontrar))) ((un bec Bunsen(No conocía este aparato. Copiado de Wikipedia:
~~Un mechero o quemador Bunsen es un instrumento utilizado en laboratorios científicos para calentar o esterilizar muestras o reactivos químicos~~))) et une ((éprouvette(probeta ~~recipiente en forma de tubo para hacer experimentos~~))).

<<tiddler HideTiddlerToolbar>>
Background: #fff
Foreground: #000
PrimaryPale: #8cf
PrimaryLight: #18f
PrimaryMid: #04b
PrimaryDark: #014
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #FFEBCD
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #900
Error: #f88
|Author|Eric Shulman|
|Description|hide a tiddler's toolbar (menu commands)|
<<tiddler HideTiddlerToolbar>>
<<tiddler HideTiddlerToolbar with: TiddlerTitle>>

<<tiddler {{
	var title="$1";
	if (title=='$'+'1')
	var t=story.getTiddler(title); if (t) {
		var e=t.getElementsByTagName('*');
		for (var i=0; i<e.length; i++)
			if (hasClass(e[i],'toolbar')) e[i].style.display='none';
%/<<tiddler {{
	var src='HideTiddlerToolbar';
}} with [[$1]]>>
|Author|Eric Shulman|
|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.
>see [[InlineJavascriptPluginInfo]]
2010.12.15 1.9.6 allow (but ignore) type="..." syntax
|please see [[InlineJavascriptPluginInfo]] for additional revision details|
2005.11.08 1.0.0 initial release
version.extensions.InlineJavascriptPlugin= {major: 1, minor: 9, revision: 6, date: new Date(2010,12,15)};

config.formatters.push( {
	name: "inlineJavascript",
	match: "\\<script",
	lookahead: "\\<script(?: type=\\\"[^\\\"]*\\\")?(?: src=\\\"([^\\\"]*)\\\")?(?: label=\\\"([^\\\"]*)\\\")?(?: title=\\\"([^\\\"]*)\\\")?(?: key=\\\"([^\\\"]*)\\\")?( 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) { // external script library
				var script = document.createElement("script"); script.src = src;
				document.body.appendChild(script); document.body.removeChild(script);
			if (code) { // inline code
				if (show) // display source in tiddler
				if (label) { // create 'onclick' command link
					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,tiddler){"+fixup+"\n};_out(this,this.tiddler);"
						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((typeof(r)==="string")&&r.length) {
								return false;
							} else return r!==undefined?r:false;
						} catch(e){alert(e.description||e.toString());return false;}
					var URIcode='javascript:void(eval(decodeURIComponent(%22(function(){try{';
					URIcode+=encodeURIComponent(encodeURIComponent(code.replace(/\n/g,' ')));
					if (key) link.accessKey=key.substr(0,1); // single character only
				else { // run script immediately
					var fixup=code.replace(/document.write\s*\(/gi,'place.innerHTML+=(');
					var c="function _out(place,tiddler){"+fixup+"\n};_out(w.output,w.tiddler);";
					try	 { var out=eval(c); }
					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();

// // GLOBAL FUNCTION: $(...) -- 'shorthand' convenience syntax for document.getElementById()
if (typeof($)=='undefined') { function $(id) { return document.getElementById(id.replace(/^#/,'')); } }
|Author|Eric Shulman|
|Description|Documentation for InlineJavascriptPlugin|
''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.
This plugin adds wiki syntax for surrounding tiddler content with {{{<script>}}} and {{{</script>}}} markers, so that it can be recognized as embedded javascript code.  When a tiddler is rendered, the plugin automatically invokes any embedded scripts, which can be used to construct and return dynamically-generated output that is inserted into the tiddler content.
<script type="..." src="..." label="..." title="..." key="..." show>
	/* javascript code goes here... */
All parameters are //optional//.    When the ''show'' keyword is used, the plugin will also include the script source code in the output that it displays in the tiddler.  This is helpful when creating examples for documentation purposes (such as used in this tiddler!)

__''Deferred execution from an 'onClick' link''__
<script label="click here" title="mouseover tooltip text" key="X" show>
	/* javascript code goes here... */
	alert('you clicked on the link!');
By including a {{{label="..."}}} parameter in the initial {{{<script>}}} marker, the plugin will create a link to an 'onclick' script that will only be executed when that specific link is clicked, rather than running the script each time the tiddler is rendered.  You may also include a {{{title="..."}}} parameter to specify the 'tooltip' text that will appear whenever the mouse is moved over the onClick link text, and a {{{key="X"}}} parameter to specify an //access key// (which must be a //single// letter or numeric digit only).

__''Loading scripts from external source files''__
<script src="URL" show>
	/* optional javascript code goes here... */
</script>You can also load javascript directly from an external source URL, by including a src="..." parameter in the initial {{{<script>}}} marker (e.g., {{{<script src="demo.js"></script>}}}).  This is particularly useful when incorporating third-party javascript libraries for use in custom extensions and plugins.  The 'foreign' javascript code remains isolated in a separate file that can be easily replaced whenever an updated library file becomes available.

In addition to loading the javascript from the external file, you can also use this feature to invoke javascript code contained within the {{{<script>...</script>}}} markers.  This code is invoked //after// the external script file has been processed, and can make immediate use of the functions and/or global variables defined by the external script file.
>Note: To ensure that your javascript functions are always available when needed, you should load the libraries from a tiddler that is rendered as soon as your TiddlyWiki document is opened, such as MainMenu.  For example: put your {{{<script src="..."></script>}}} syntax into a separate 'library' tiddler (e.g., LoadScripts), and then add {{{<<tiddler LoadScripts>>}}} to MainMenu so that the library is loaded before any other tiddlers that rely upon the functions it defines. 
>Normally, loading external javascript in this way does not produce any direct output, and should not have any impact on the appearance of your MainMenu.  However, if your LoadScripts tiddler contains notes or other visible content, you can suppress this output by using 'inline CSS' in the MainMenu, like this: {{{@@display:none;<<tiddler LoadScripts>>@@}}}
!!!!!Creating dynamic tiddler content and accessing the ~TiddlyWiki DOM
An important difference between TiddlyWiki inline scripting and conventional embedded javascript techniques for web pages is the method used to produce output that is dynamically inserted into the document: in a typical web document, you use the {{{document.write()}}} (or {{{document.writeln()}}}) function to output text sequences (often containing HTML tags) that are then rendered when the entire document is first loaded into the browser window.

However, in a ~TiddlyWiki document, tiddlers (and other DOM elements) are created, deleted, and rendered "on-the-fly", so writing directly to the global 'document' object does not produce the results you want (i.e., replacing the embedded script within the tiddler content), and instead will //completely replace the entire ~TiddlyWiki document in your browser window (which is clearly not a good thing!)//.  In order to allow scripts to use {{{document.write()}}}, the plugin automatically converts and buffers all HTML output so it can be safely inserted into your tiddler content, immediately following the script.

''Note that {{{document.write()}}} can only be used to output "pure HTML" syntax.  To produce //wiki-formatted// output, your script should instead return a text value containing the desired wiki-syntax content'', which will then be automatically rendered immediately following the script.  If returning a text value is not sufficient for your needs, the plugin also provides an automatically-defined variable, 'place', that gives the script code ''direct access to the //containing DOM element//'' into which the tiddler output is being rendered.  You can use this variable to ''perform direct DOM manipulations'' that can, for example:
* generate wiki-formatted output using {{{wikify("...content...",place)}}}
* vary the script's actions based upon the DOM element in which it is embedded
* access 'tiddler-relative' DOM information using {{{story.findContainingTiddler(place)}}}
''When using an 'onclick' script, the 'place' element actually refers to the onclick //link text// itself, instead of the containing DOM element.''  This permits you to directly reference or modify the link text to reflect any 'stateful' conditions that might set by the script.  To refer to the containing DOM element from within an 'onclick' script, you can use "place.parentNode" instead.
!!!!!Instant "bookmarklets"
You can also use an 'onclick' link to define a "bookmarklet": a small piece of javascript that can be ''invoked directly from the browser without having to be defined within the current document.''  This allows you to create 'stand-alone' commands that can be applied to virtually ANY TiddlyWiki document... even remotely-hosted documents that have been written by others!!  To create a bookmarklet, simply define an 'onclick' script and then grab the resulting link text and drag-and-drop it onto your browser's toolbar (or right-click and use the 'bookmark this link' command to add it to the browser's menu).

*When writing scripts intended for use as bookmarklets, due to the ~URI-encoding required by the browser, ''you cannot not use ANY double-quotes (") within the bookmarklet script code.''
*All comments embedded in the bookmarklet script must ''use the fully-delimited {{{/* ... */}}} comment syntax,'' rather than the shorter {{{//}}} comment syntax.
*Most importantly, because bookmarklets are invoked directly from the browser interface and are not embedded within the TiddlyWiki document, there is NO containing 'place' DOM element surrounding the script.  As a result, ''you cannot use a bookmarklet to generate dynamic output in your document,''  and using {{{document.write()}}} or returning wiki-syntax text or making reference to the 'place' DOM element will halt the script and report a "Reference Error" when that bookmarklet is invoked.  
Please see [[InstantBookmarklets]] for many examples of 'onclick' scripts that can also be used as bookmarklets.
!!!!!Special reserved function name
The plugin 'wraps' all inline javascript code inside a function, {{{_out()}}}, so that any return value you provide can be correctly handled by the plugin and inserted into the tiddler.  To avoid unpredictable results (and possibly fatal execution errors), this function should never be redefined or called from ''within'' your script code.
!!!!!$(...) 'shorthand' function
As described by Dustin Diaz [[here|http://www.dustindiaz.com/top-ten-javascript/]], the plugin defines a 'shorthand' function that allows you to write:
in place of the normal standard javascript syntax:
This function is provided merely as a convenience for javascript coders that may be familiar with this abbreviation, in order to allow them to save a few bytes when writing their own inline script code.
simple dynamic output:
><script show>
	document.write("The current date/time is: "+(new Date())+"<br>");
	return "link to current user: [["+config.options.txtUserName+"]]\n";
dynamic output using 'place' to get size information for current tiddler:
><script show>
	if (!window.story) window.story=window;
	var title=story.findContainingTiddler(place).getAttribute("tiddler");
	var size=store.getTiddlerText(title).length;
	return title+" is using "+size+" bytes";
dynamic output from an 'onclick' script, using {{{document.write()}}} and/or {{{return "..."}}}
><script label="click here" show>
	document.write("<br>The current date/time is: "+(new Date())+"<br>");
	return "link to current user: [["+config.options.txtUserName+"]]\n";
creating an 'onclick' button/link that accesses the link text AND the containing tiddler:
><script label="click here" title="clicking this link will show an 'alert' box" key="H" show>
	if (!window.story) window.story=window;
	var txt=place.firstChild.data;
	var tid=story.findContainingTiddler(place).getAttribute('tiddler');
	alert('Hello World!\nlinktext='+txt+'\ntiddler='+tid);
dynamically setting onclick link text based on stateful information:
<script label="click here">
	/* toggle "txtSomething" value */
	var on=(config.txtSomething=="ON");
	return "\nThe current value is: "+config.txtSomething;
	/* initialize onclick link text based on current "txtSomething" value */
	var on=(config.txtSomething=="ON");
<script label="click here">
	/* toggle "txtSomething" value */
	var on=(config.txtSomething=="ON");
	return "\nThe current value is: "+config.txtSomething;
	/* initialize onclick link text based on current "txtSomething" value */
	var on=(config.txtSomething=="ON");
loading a script from a source url:
>http://www.TiddlyTools.com/demo.js contains:
>>{{{function inlineJavascriptDemo() { alert('Hello from demo.js!!') } }}}
>>{{{displayMessage('InlineJavascriptPlugin: demo.js has been loaded');}}}
>note: When using this example on your local system, you will need to download the external script file from the above URL and install it into the same directory as your document.
><script src="demo.js" show>
	return "inlineJavascriptDemo() function has been defined"
><script label="click to invoke inlineJavascriptDemo()" key="D" show>
2010.12.15 1.9.6 allow (but ignore) type="..." syntax
2009.04.11 1.9.5 pass current tiddler object into wrapper code so it can be referenced from within 'onclick' scripts
2009.02.26 1.9.4 in $(), handle leading '#' on ID for compatibility with JQuery syntax
2008.06.11 1.9.3 added $(...) function as 'shorthand' for document.getElementById()
2008.03.03 1.9.2 corrected fallback declaration of wikifyPlainText() (fixes Safari "parse error")
2008.02.23 1.9.1 in onclick function, use string instead of array for 'bufferedHTML' (fixes IE errors)
2008.02.21 1.9.0 output from 'onclick' scripts (return value or document.write() calls) are now buffered and rendered into into a span following the script.  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.
2008.02.14 1.8.1 added backward-compatibility for use of wikifyPlainText() in TW2.1.3 and earlier
2008.01.08 [*.*.*] plugin size reduction: documentation moved to ...Info tiddler
2007.12.28 1.8.0 added support for key="X" syntax to specify custom access key definitions
2007.12.15 1.7.0 autogenerate URI encoded HREF on links for onclick scripts.  Drag links to browser toolbar to create bookmarklets.  IMPORTANT NOTE: place is NOT defined when scripts are used as bookmarklets.  In addition, double-quotes will cause syntax errors.  Thanks to PaulReiber for debugging and brainstorming.
2007.11.26 1.6.2 when converting "document.write()" function calls in inline code, allow whitespace between "write" and "(" so that "document.write ( foobar )" is properly converted.
2007.11.16 1.6.1 when rendering "onclick scripts", pass label text through wikifyPlainText() to parse any embedded wiki-syntax to enable use of HTML entities or even TW macros to generate dynamic label text.
2007.02.19 1.6.0 added support for title="..." to specify mouseover tooltip when using an onclick (label="...") script
2006.10.16 1.5.2 add newline before closing '}' in 'function out_' wrapper.  Fixes error caused when last line of script is a comment.
2006.06.01 1.5.1 when calling wikify() on script return value, pass hightlightRegExp and tiddler params so macros that rely on these values can render properly
2006.04.19 1.5.0 added 'show' parameter to force display of javascript source code in tiddler output
2006.01.05 1.4.0 added support 'onclick' scripts.  When label="..." param is present, a button/link is created using the indicated label text, and the script is only executed when the button/link is clicked.  'place' value is set to match the clicked button/link element.
2005.12.13 1.3.1 when catching eval error in IE, e.description contains the error text, instead of e.toString().  Fixed error reporting so IE shows the correct response text.  Based on a suggestion by UdoBorkowski
2005.11.09 1.3.0 for 'inline' scripts (i.e., not scripts loaded with src="..."), automatically replace calls to 'document.write()' with 'place.innerHTML+=' so script output is directed into tiddler content.  Based on a suggestion by BradleyMeck
2005.11.08 1.2.0 handle loading of javascript from an external URL via src="..." syntax
2005.11.08 1.1.0 pass 'place' param into scripts to provide direct DOM access 
2005.11.08 1.0.0 initial release
!!Sí, habéis dado con ese libro que estáis buscando.

Pero antes de nada, leed lo siguiente:

* Navegadores recomendados:
** Desde un ordenador : Google Chrome o Firefox (en este último puede salir un mensaje de error, pero se quita haciendo clic en aceptar).
** @@color:red;Desde un teléfono móvil : Firefox@@ (a pesar de un error al abrir cada página, que se resuelve haciendo clic en aceptar. En cambio en Google Chrome hay un problema:  la traducción de las palabras se ve muy chiquita, algo que no sucede con Firefox, donde las traducciones se ven del mismo tamaño que el resto del texto.
* En el menú de la izquierda se pueden escoger los diferentes capítulos del libro.
* Si se trabaja desde un ordenador, se puede situar el cursor sobre las palabras en rojo SIN HACER CLIC, para ver su significado. En un móvil, en cambio, habrá que tocar la palabra para ver la traducción.
* @@color:red;''No hagáis doble clic sobre ninguna página''@@, porque entonces entraríais en el modo "edición". Si esto ocurriera, hacéis clic en la palabra "cancelar", que aparecerá en gris en la parte superior derecha. Si accidentalmente hubierais modificado el contenido de alguna página, no os preocupéis. Refrescáis o reiniciáis la página y ya está.


Sin tener que recurrir al menú de vuestro navegador y "guardar página web", creo que lo más sencillo es hacer "control + S".  Se os abrirá una ventana donde os preguntan dónde queréis guardar la página. 

<<tiddler HideTiddlerToolbar>>
Chez Guillaume.

//-- Maman, maman, viens vite !
-- Qu’est-ce qu’il y a, Guillaume ? Qu’est-ce que tu as ?
-- Je suis ((malade(enfermo))), j’ai mal au ventre, j’ai mal à la tête.//

Elle touche son ((front(frente))) :

//-- En effet, tu es ((tout(~~normalmente //tout// significa "todo"
pero seguido de un adjetivo, es un adverbio que significa "completamente"~~))) ((brûlant(brûler = arder ~~tu es tout brûlant = estás ardiendo/hirviendo~~))). Tu as mal où exactement ?
-- Ici, dit Guillaume en se touchant le côté droit.
-- Jacques, réveille-toi, il faut ((emmener(llevar))) Guillaume à l’hôpital, je pense qu’il a une crise d’appendicite.
-- ((C’est le comble !(¡es el colmo!))) Après le commissariat, maintenant l’hôpital ! Qu’est-ce qui va nous arriver encore ?//

À l’hôpital.
Un ((chirurgien(cirujano))) est ((en train d’(~~//en train de// se correponde con un gerundio en español [-ando, -iendo], aquí: "está examinando"~~)))examiner Guillaume.

//-- « C’est grave, docteur ? », demande la mère de Guillaume.
-- C’est bien une appendicite. Il faut opérer ((tout de suite(inmediatamente))).//

Deux heures plus tard.

//-- « Alors docteur, comment va-t-il ? », demande sa mère.
-- Tout s’est bien passé.
-- Mais pourquoi cette crise ?
-- « Il a peut-être mangé trop de chocolat ? ... ah ah ah ! », dit le chirurgien ((en riant(riendo))).
-- On peut le voir ?
-- Non, ((pas encore(todavía no))), il est en ((salle de réveil(sala de despertar ~~tras una operación quirúrgica, el paciente pasará un tiempo en esta sala, antes de volver a su habitación~~))).//

Dans la salle de réveil.
Guillaume est en train de se réveiller. L’anesthésiste est à côté de lui, il ((porte(porter = llevar [ropa, maquillaje, peluca, máscara]))) un ((masque(máscara))).

//-- Ah ! La momie ! Elle va me tuer !
-- Arrêtez, vous allez vous faire mal !
-- Au secours, la momie...
-- Il délire complètement... je vais appeler l’infirmier. L’infirmier arrive.
-- ((Au secours(¡socorro!))), maintenant, il y a deux momies !//

Guillaume veut se lever. L’infirmier ((lui fait une piqûre(le pone una inyección))), il se calme.

<<tiddler HideTiddlerToolbar>>
À l’hôpital.

//-- Oh Paul ! ((c’est gentil de venir me voir(gentil = amable ~~aquí: "muy amable por tu parte venir a verme"~~))). ((Il y a eu(ha habido 
~~//eu// es el participio de //avoir//
aquí es el passé composé de //il y a//~~))) une explosion chez toi. C’est terrible ! Et tu ((as vu ce qui m’est arrivé ?(¿has visto lo que me ha pasado/ocurrido?))) Je suis sûr que c’est la momie !//

La mère de Guillaume entre dans la chambre.

//-- Qu’est-ce que c’est, cette histoire de momie ?
-- Rien, maman...
-- Mais si, j’ai bien entendu, tu as dit : « je suis sûr que c’est la momie ».
-- Non, ce n’est rien...
-- Écoute, Guillaume, tu peux bien me le dire !
-- ((Eh bien voilà(~~difícil de traducir, pero aquí //voilá// indica que se va a dar una explicación~~))), ((il y a(hace))) deux jours, nous sommes allés, Paul et moi, au Louvre voir la nouvelle momie. Cette momie, c’est ((celle de(la de))) Thoukanis, un général de Toutankhamon. Sur le sarcophage, on a trouvé un hiéroglyphe qui signifie « la malédiction pèse sur vous ».
-- Mais ((enfin(~~aquí //enfin// indica una cierta impaciencia~~))), Guillaume, tu ne vas pas croire à cette légende !
-- Maman, tu ne sais pas tout. La momie est venue dans ma chambre. Je ((l’ai vue(la vi, la he visto))), elle ((m’a averti(me advirtió))) : si je ne la ((ramène(ramener = volver a llevar, llevar de vuelta))) pas en Égypte, les pires malheurs vont nous arriver.
-- Ah ! alors, je comprends pourquoi vous êtes allés au Louvre et que ((vous avez voulu(//voulu// es el participio de vouloir = querer))) y entrer la nuit. Mais pourquoi tu ne m’as rien dit ?
-- Je n’ai pas voulu t’inquiéter. Regarde ce qui est arrivé : il y a eu une explosion chez Paul. on m’a opéré...
-- Mais, Guillaume, ce sont des coïncidences...
-- Mais non, ((voyons(veamos ~~verbe voir: nous voyons~~))), Paul a fait des expériences dans sa chambre et c’est un produit chimique qui a provoqué l’explosion !
-- Oui, c’est vrai. L’après-midi où nous sommes allés au Louvre, j’ai oublié d’((enlever(quitar, retirar))) l’acide de l’éprouvette à côté du bec Bunsen que j’ai laissé allumé. Il y a eu une combustion et puis le reste, on le sait.
-- D’accord, mais mon opération...//

Quelques minutes plus tard le père de Guillaume entre dans la chambre.

//-- ((Lisez ça !(¡leed esto!))) La momie du général Thoukanis n’est pas authentique ! Il y a ((même(incluso))) quelqu’un qui ((s’est amusé(passé composé de //s'amuser// = divertirse))) à inventer une histoire de malédiction, ah ah ah ! Il faut être vraiment bête pour croire à des ((histoires pareilles(semejantes historias)))... //

<<tiddler HideTiddlerToolbar>>
|''Name:''|LoadRemoteFileThroughProxy (previous LoadRemoteFileHijack)|
|''Description:''|When the TiddlyWiki file is located on the web (view over http) the content of [[SiteProxy]] tiddler is added in front of the file url. If [[SiteProxy]] does not exist "/proxy/" is added. |
|''Date:''|mar 17, 2007|
|''Author:''|BidiX (BidiX (at) bidix (dot) info)|
|''License:''|[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D ]]|
version.extensions.LoadRemoteFileThroughProxy = {
 major: 1, minor: 1, revision: 0, 
 date: new Date("mar 17, 2007"), 
 source: "http://tiddlywiki.bidix.info/#LoadRemoteFileThroughProxy"};

if (!window.bidix) window.bidix = {}; // bidix namespace
if (!bidix.core) bidix.core = {};

bidix.core.loadRemoteFile = loadRemoteFile;
loadRemoteFile = function(url,callback,params)
 if ((document.location.toString().substr(0,4) == "http") && (url.substr(0,4) == "http")){ 
 url = store.getTiddlerText("SiteProxy", "/proxy/") + url;
 return bidix.core.loadRemoteFile(url,callback,params);

Chapitre 1
[[Une visite au Louvre|Chapitre 1. Une visite au Louvre]]

Chapitre 2
[[La malédiction|Chapitre 2. La malédiction]]

Chapitre 3
[[Guillaume et la momie|Chapitre 3. Guillaume et la momie]]

Chapitre 4
[[Catastrophes !|Chapitre 4. Catastrophes !]]

Chapitre 5
[[La momie revient]]

Chapitre 6
[[Les ennuis sont finis]]
<div class='header' macro='gradient vert #464E8B'>
<div class='headerShadow'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
<div class='headerForeground'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
<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 id='displayArea'>
<div id='messageArea'></div>
<div id='tiddlerDisplay'></div>
<div id='footerContent' refresh='content' tiddler='FooterContent'></div>		    
|''Description:''|Extends TiddlyWiki options with non encrypted password option.|
|''Date:''|Apr 19, 2007|
|''Author:''|BidiX (BidiX (at) bidix (dot) info)|
|''License:''|[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D ]]|
|''~CoreVersion:''|2.2.0 (Beta 5)|
version.extensions.PasswordOptionPlugin = {
	major: 1, minor: 0, revision: 2, 
	date: new Date("Apr 19, 2007"),
	source: 'http://tiddlywiki.bidix.info/#PasswordOptionPlugin',
	author: 'BidiX (BidiX (at) bidix (dot) info',
	license: '[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D]]',
	coreVersion: '2.2.0 (Beta 5)'

config.macros.option.passwordCheckboxLabel = "Save this password on this computer";
config.macros.option.passwordInputType = "password"; // password | text
setStylesheet(".pasOptionInput {width: 11em;}\n","passwordInputTypeStyle");

merge(config.macros.option.types, {
	'pas': {
		elementType: "input",
		valueField: "value",
		eventName: "onkeyup",
		className: "pasOptionInput",
		typeValue: config.macros.option.passwordInputType,
		create: function(place,type,opt,className,desc) {
			// password field
			// checkbox linked with this password "save this password on this computer"
			// text savePasswordCheckboxLabel
		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]) 
		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

if (!config.options['pasPassword'])
	config.options['pasPassword'] = '';

		pasPassword: "Test password"
<<search>><<newTiddler>><<closeAll>><<permaview>><<saveChanges>>[[MainMenu]]<<tiddler TspotSidebar>><<slider chkSliderOptionsPanel OptionsPanel "opciones »" "Cambiar las opciones avanzadas de TiddlyWiki">>
|Author|Eric Shulman|
|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.
>see [[SinglePageModePluginInfo]]
<<option chkSinglePageMode>> Display one tiddler at a time
><<option chkSinglePagePermalink>> Automatically permalink current tiddler
><<option chkSinglePageKeepFoldedTiddlers>> Don't close tiddlers that are folded
><<option chkSinglePageKeepEditedTiddlers>> Don't close tiddlers that are being edited
<<option chkTopOfPageMode>> Open tiddlers at the top of the page
<<option chkBottomOfPageMode>> Open tiddlers at the bottom of the page
<<option chkSinglePageAutoScroll>> Automatically scroll tiddler into view (if needed)

* 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.
2010.11.30 2.9.7 use story.getTiddler()
2008.10.17 2.9.6 changed chkSinglePageAutoScroll default to false
| 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.
version.extensions.SinglePageModePlugin= {major: 2, minor: 9, revision: 7, date: new Date(2010,11,30)};
config.paramifiers.SPM = { onstart: function(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)
if (config.options.chkSinglePagePermalink==undefined)
if (config.options.chkSinglePageKeepFoldedTiddlers==undefined)
if (config.options.chkSinglePageKeepEditedTiddlers==undefined)
if (config.options.chkTopOfPageMode==undefined)
if (config.options.chkBottomOfPageMode==undefined)
if (config.options.chkSinglePageAutoScroll==undefined)
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=decodeURIComponent(window.location.hash.substr(1)).readBracketedList();
	if (tids.length==1) // permalink (single tiddler in URL)
	else { // restore permaview or default view
		config.lastURL = window.location.hash;
		if (!tids.length) tids=store.getTiddlerText("DefaultTiddlers").readBracketedList();

if (Story.prototype.SPM_coreDisplayTiddler==undefined)
Story.prototype.displayTiddler = function(srcElement,tiddler,template,animate,slowly)
	var title=(tiddler instanceof Tiddler)?tiddler.title:tiddler;
	var tiddlerElem=story.getTiddler(title); // ==null unless tiddler is already displayed
	var opt=config.options;
	var single=opt.chkSinglePageMode && !startingUp;
	var top=opt.chkTopOfPageMode && !startingUp;
	var bottom=opt.chkBottomOfPageMode && !startingUp;
	if (single) {
		story.forEachTiddler(function(tid,elem) {
			// skip current tiddler and, optionally, tiddlers that are folded.
			if (	tid==title
				|| (opt.chkSinglePageKeepFoldedTiddlers && elem.getAttribute("folded")=="true"))
			// if a tiddler is being edited, ask before closing
			if (elem.getAttribute("dirty")=="true") {
				if (opt.chkSinglePageKeepEditedTiddlers) return;
				// if tiddler to be displayed is already shown, then leave active tiddler editor as is
				// (occurs when switching between view and edit modes)
				if (tiddlerElem) return;
				// otherwise, ask for permission
				var msg="'"+tid+"' is currently being edited.\n\n";
				msg+="Press OK to save and close this tiddler\nor press Cancel to leave it opened";
				if (!confirm(msg)) return; else story.saveTiddler(tid);
	else if (top)
	else if (bottom)
	if (single && opt.chkSinglePagePermalink && !config.browser.isSafari) {
		window.location.hash = encodeURIComponent(String.encodeTiddlyLink(title));
		config.lastURL = window.location.hash;
		document.title = wikifyPlain("SiteTitle") + " - " + title;
		if (!config.SPMTimer) config.SPMTimer=window.setInterval(function() {checkLastURL();},1000);
	if (tiddlerElem && tiddlerElem.getAttribute("dirty")=="true") { // editing... move tiddler without re-rendering
		var isTopTiddler=(tiddlerElem.previousSibling==null);
		if (!isTopTiddler && (single || top))
		else if (bottom)
		else this.SPM_coreDisplayTiddler.apply(this,arguments); // let CORE render tiddler
	} else
		this.SPM_coreDisplayTiddler.apply(this,arguments); // let CORE render tiddler
	var tiddlerElem=story.getTiddler(title);
	if (tiddlerElem&&opt.chkSinglePageAutoScroll) {
		// scroll to top of page or top of tiddler
		var isTopTiddler=(tiddlerElem.previousSibling==null);
		var yPos=isTopTiddler?0:ensureVisible(tiddlerElem);
		// if animating, defer scroll until after animation completes
		var delay=opt.chkAnimate?config.animDuration+10:0;

if (Story.prototype.SPM_coreDisplayTiddlers==undefined)
Story.prototype.displayTiddlers = function() {
	// suspend single/top/bottom modes 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;
|Author|Eric Shulman|
|Description|Documentation for SinglePageModePlugin|
Normally, as you click on the links in TiddlyWiki, more and more tiddlers are displayed on the page. The order of this tiddler display depends upon when and where you have clicked. Some people like this non-linear method of reading the document, while others have reported that when many tiddlers have been opened, it can get somewhat confusing.  SinglePageModePlugin allows you to configure TiddlyWiki to navigate more like a traditional multipage web site with only one item displayed at a time.
When the plugin is enabled, only one tiddler will be displayed at a time and the browser window's titlebar is updated to include the current tiddler title.  The browser's location URL is also updated with a 'permalink' for the current tiddler so that it is easier to create a browser 'bookmark' for the current tiddler.  Alternatively, even when displaying multiple tiddlers //is// permitted, you can still reduce the potential for confusion by forcing  tiddlers to always open at the top (or bottom) of the page instead of being displayed following the tiddler containing the link that was clicked.
<<option chkSinglePageMode>> Display one tiddler at a time
><<option chkSinglePagePermalink>> Automatically permalink current tiddler
><<option chkSinglePageKeepFoldedTiddlers>> Don't close tiddlers that are folded
><<option chkSinglePageKeepEditedTiddlers>> Don't close tiddlers that are being edited
<<option chkTopOfPageMode>> Open tiddlers at the top of the page
<<option chkBottomOfPageMode>> Open tiddlers at the bottom of the page
<<option chkSinglePageAutoScroll>> Automatically scroll tiddler into view (if needed)

* {{block{
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}}}. You can also use {{{SPM:expression}}}, where 'expression' is any javascript statement that evaluates to true or false.  This allows you to create hard-coded links in other documents that can selectively enable/disable the use of this option based on various programmatic conditions, such as the current username. For example, using
enables 'one tiddler at a time' display for all users //other than// "~SomeName")}}}
* 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.
2008.10.17 2.9.6 changed chkSinglePageAutoScroll default to false
2008.06.12 2.9.5 corrected 'scroll to top of page' logic in auto-scroll handling
2008.06.11 2.9.4 added chkSinglePageKeepEditedTiddlers option
2008.06.05 2.9.3 in displayTiddler(), bypass single/top/bottom mode handling if startingUp.  Allows multiple tiddlers to be displayed during startup processing (e.g., #story:DefaultTiddlers), even if single/top/bottom mode is enabled.
2008.04.18 2.9.2 in displayTiddler() and checkLastURL(), handling for Unicode in tiddler titles (remove explicit conversion between Unicode and UTF, as this is apparently done automatically by encode/decodeURIComponent, resulting in double-encoding!
2008.04.08 2.9.1 don't automatically add options to AdvancedOptions shadow tiddler
2008.04.02 2.9.0 in displayTiddler(), when single-page mode is in use and a tiddler is being edited, ask for permission to save-and-close that tiddler, instead of just leaving it open.
2008.03.29 2.8.3 in displayTiddler(), get title from tiddler object (if needed).  Fixes errors caused when calling function passes a tiddler *object* instead of a tiddler *title*
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).
2008.03.06 2.8.1 in paramifier handler, start 'checkURL' timer if chkSinglePageMode is enabled
2008.03.06 2.8.0 added option, {{{config.options.chkSinglePageKeepFoldedTiddlers}}}, so folded tiddlers won't be closed when using single-page mode.  Also, in checkURL(), if hash is a ''permaview'' (e.g., "#foo bar baz"), then display multiple tiddlers rather than attempting to display "foo bar baz" as a single tiddler
2008.03.05 2.7.0 added support for "SPM:" URL paramifier
2008.03.01 2.6.0 in hijack of displayTiddler(), added 'title' argument to closeAllTiddlers() so that target tiddler isn't closed-and-reopened if it was already displayed.  Also, added config.options.chkSinglePageAutoScrolloption to bypass automatic 'scroll into view' logic (note: core still does it's own ensureVisible() handling)
2007.12.22 2.5.3 in checkLastURL(), use decodeURIComponent() instead of decodeURI so that tiddler titles with commas (and/or other punctuation) are correctly handled.
2007.10.26 2.5.2 documentation cleanup
2007.10.08 2.5.1 in displayTiddler(), when using single-page or top-of-page mode, scrollTo(0,0) to ensure that page header is in view.
2007.09.13 2.5.0 for TPM/BPM modes, don't force tiddler to redisplay if already shown.  Allows transition between view/edit or collapsed/view templates, without repositioning displayed tiddler.
2007.09.12 2.4.0 added option to disable automatic permalink feature.  Also, Safari is now excluded from permalinking action to avoid bug where tiddlers don't display after hash is updated.
2007.03.03 2.3.1 fix typo when adding BPM option to AdvancedOptions (prevented checkbox from appearing)
2007.03.03 2.3.0 added support for BottomOfPageMode (BPM) based on request from DaveGarbutt
2007.02.06 2.2.3 in Story.prototype.displayTiddler(), use convertUnicodeToUTF8() for correct I18N string handling when creating URL hash string from tiddler title (based on bug report from BidiX)
2007.01.08 2.2.2 use apply() to invoke hijacked core functions
2006.07.04 2.2.1 in hijack for displayTiddlers(), suspend TPM as well as SPM so that DefaultTiddlers displays in the correct order.
2006.06.01 2.2.0 added chkTopOfPageMode (TPM) handling
2006.02.04 2.1.1 moved global variable declarations to config.* to avoid FireFox crash bug when assigning to globals
2005.12.27 2.1.0 hijack displayTiddlers() so that SPM can be suspended during startup while displaying the DefaultTiddlers (or #hash list).  Also, corrected initialization for undefined SPM flag to "false", so default behavior is to display multiple tiddlers
2005.12.27 2.0.0 Update for TW2.0
2005.11.24 1.1.2 When the back and forward buttons are used, the page now changes to match the URL.  Based on code added by Clint Checketts
2005.10.14 1.1.1 permalink creation now calls encodeTiddlyLink() to handle tiddler titles with spaces in them
2005.10.14 1.1.0 added automatic setting of window title and location bar ('auto-permalink').  feature suggestion by David Dickens.
2005.10.09 1.0.1 combined documentation and code in a single tiddler
2005.08.15 1.0.0 Initial Release
Básico 1<<tiddler ToggleRightSidebar with: ".">>

|''Descripción:''|Traducción de TiddlyWiki al español|
|''Autores:''|Sergio González y Pedro Domínguez (sgm214 (at) gmail (dot) com / alpedro (at) hotmail (dot) com)|
|''Correcciónes:''|Dave Gifford y Ton van Rooijen (giff (at) giffmex (dot) org / tonsweb (at) xs4all (dot) nl)|
|''Fuente:''|http://www.ton-van-rooijen.nl/TW/locale042.es.js |
|''Código:''|http://svn.tiddlywiki.org/Trunk/association/locales/core/en/locale.en.js |
|''Fecha:''|October 2, 2010|
|''Comentarios:''|Por favor deje sus comentarios en http://groups.google.co.uk/group/TiddlyWikiDev |
|''Licencia:''|[[Creative Commons Attribution-ShareAlike 3.0 License|http://creativecommons.org/licenses/by-sa/3.0/]] |

//-- Translateable strings

// Strings in "double quotes" should be translated; strings in 'single quotes' should be left alone

config.locale = "es"; // W3C language tag

if (config.options.txtUserName == 'YourName') // do not translate this line, but do translate the next line
        merge(config.options,{txtUserName: "SuNombre"});

        save: {text: "guardar", tooltip: "Guardar los cambios hechos en este TiddlyWiki", action: saveChanges},
        sync: {text: "sincronizar", tooltip: "Sincronizar los cambios hechos con otros servidores y archivos TiddlyWiki", content: '<<sync>>'},
        importTask: {text: "importar", tooltip: "Importar tiddlers y plugins de otros servidores y archivos TiddlyWiki", content: '<<importTiddlers>>'},
        tweak: {text: "configurar", tooltip: "Cambiar la apariencia y comportamiento de TiddlyWiki", content: '<<options>>'},
        upgrade: {text: "actualizar", tooltip: "Actualizar el código del núcleo de TiddlyWiki", content: '<<upgrade>>'},      
        plugins: {text: "complementos", tooltip: "Gestionar los complementos instalados", content: '<<plugins>>'}

// Options that can be set in the options panel and/or cookies
        txtUserName: "Nombre de usuario con el que firmará lo editado",
        chkRegExpSearch: "Permitir expresiones regulares en la búsqueda",
        chkCaseSensitiveSearch: "Distinguir mayúscula/minúscula en la búsqueda",
        chkIncrementalSearch: "Búsqueda incremental letra a letra",
        chkAnimate: "Activar animaciones",
        chkSaveBackups: "Mantener la copia de seguridad cuando se guardan los cambios",
        chkAutoSave: "Guardar automáticamente los cambios",
        chkGenerateAnRssFeed: "Crear una noticia RSS cuando se guardan los cambios",
        chkSaveEmptyTemplate: "Crear una plantilla vací­a cuando se guardan los cambios",
        chkOpenInNewWindow: "Abrir los enlaces externos en una nueva ventana",
        chkToggleLinks: "Al pulsar sobre un enlace de un tiddler, éste se cierra",
        chkHttpReadOnly: "Ocultar la edición cuando se muestra en HTTP",
        chkForceMinorUpdate: "No cambiar el nombre de usuario y fecha cuando se edita un tiddler",
        chkConfirmDelete: "Preguntar antes de borrar un tiddler",
        chkInsertTabs: "Usar el tabulador para crear texto en columnas en vez de servir para moverse entre apartados",
        txtBackupFolder: "Nombre del directorio en que se guardan las copias de seguridad",
        txtMaxEditRows: "Número máximo de filas en los recuadros de edición",
        txtTheme: "Nombre de tema para utilizar",
        txtFileSystemCharSet: "Juego de caracteres por defecto para guardar los cambios (sólo Firefox/Mozilla)"});

        customConfigError: "Hubo problemas al cargar los complementos. Mire el Gestor de Complementos para más detalles",
        pluginError: "Error: %0",
        pluginDisabled: "No ejecutado porque está inhabilitado en la etiqueta 'systemConfigDisable'",
        pluginForced: "Ejecutado porque lo fuerza la etiqueta 'systemConfigForce'",
        pluginVersionError: "No ejecutado porque este complemento necesita una versión más moderna de TiddlyWiki",
        nothingSelected: "No hay nada seleccionado. Debe marcar uno o más primero",
        savedSnapshotError: "Parece que este TiddlyWiki se ha guardado incorrectamente. Por favor mire http://www.tiddlywiki.com/#Download para más detalles",
        subtitleUnknown: "(desconocido)",
        undefinedTiddlerToolTip: "El tiddler '%0' no existe todaví­a",
        shadowedTiddlerToolTip: "El tiddler '%0' no existe todaví­a, pero tiene un valor oculto definido previamente",
        tiddlerLinkTooltip: "%0 - %1, %2",
        externalLinkTooltip: "Enlace externo a %0",
        noTags: "No hay tiddlers sin etiquetas",
        notFileUrlError: "Debe guardar este TiddlyWiki en un archivo antes de que pueda guardar los cambios",
        cantSaveError: "No se pueden guardar los cambios. Algunas de las posibles causas pueden ser:\n- su navegador no permite guardar (Firefox, Internet Explorer, Safari and Opera funcionan bien si están correctamente configurados)\n- la ruta a su archivo TiddlyWiki tiene caracteres no válidos\n- El archivo HTML TiddlyWiki ha sido movido o renombrado",
        invalidFileError: "El archivo original '%0' parece que no es un archivo TiddlyWiki válido",
        backupSaved: "Copia de seguridad guardada",
        backupFailed: "Error al guardar la copia de seguridad",
        rssSaved: "Noticia RSS guardada",
        rssFailed: "Error al guardar la noticia RSS",
        emptySaved: "Plantilla en blanco guardada",
        emptyFailed: "Error al guardar la plantilla en blanco",
        mainSaved: "Archivo principal TiddlyWiki guardado",
        mainFailed: "Error al guardar el archivo principal TiddlyWiki. Los cambios no se han guardado",
        macroError: "Error en la macro <<\%0>>",
        macroErrorDetails: "Error mientras se ejecutaba la macro <<\%0>>:\n%1",
        missingMacro: "No existe esa macro",
        overwriteWarning: "Un tiddler llamado '%0' ya existe. Elija OK si quiere sobrescribirlo",
        unsavedChangesWarning: "¡ATENCIí“N! Hay cambios sin guardar en  TiddlyWiki\n\nElija OK para guardarlos\nElija CANCELAR para descartarlos",
        confirmExit: "--------------------------------\n\nHay cambios sin guardar en TiddlyWiki. Si prosigue perderá los cambios\n\n--------------------------------",
        saveInstructions: "Guardar Cambios",
        unsupportedTWFormat: "Formato de TiddlyWiki no soportado '%0'",
        tiddlerSaveError: "Error al guardar el tiddler '%0'",
        tiddlerLoadError: "Error al cargar el tiddler '%0'",
        wrongSaveFormat: "No se puede guardar en el formato '%0'. Usando el formato estandar para guardarlo.",
        invalidFieldName: "Nombre de apartado no válido %0",
        fieldCannotBeChanged: "El apartado '%0' no se puede cambiar",
        loadingMissingTiddler: "Intentando descargar el tiddler '%0' desde el servidor '%1' en:\n\n'%2' en el espacio de trabajo '%3'",
        upgradeDone: "Actualización a la versión %0 completada\n\nPulse 'OK' para cargar la nueva versión de TiddlyWiki",
        invalidCookie: "Cookie no válido '%0'"});

        text: "cerrar",
        tooltip: "cerrar el mensaje"});

config.messages.backstage = {
        open: {text: "bastidores", tooltip: "Acceder a bastidores para gestionar TiddlyWiki"},
        close: {text: "cerrar", tooltip: "Salir de bastidores"},
        prompt: "bastidores: ",
        decal: {
                edit: {text: "editar", tooltip: "Editar el tiddler '%0'"}

config.messages.listView = {
        tiddlerTooltip: "Pulse para ver el texto completo de este tiddler",
        previewUnavailable: "(Vista previa no disponible)"

config.messages.dates.months = ["Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre","Diciembre"];
config.messages.dates.days = ["Domingo", "Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado"];
config.messages.dates.shortMonths = ["Ene", "Feb", "Mar", "Abr", "May", "Jun", "Jul", "Ago", "Sep", "Oct", "Nov", "Dic"];
config.messages.dates.shortDays = ["Do", "Lu", "Ma", "Mi", "Ju", "Vi", "Sa"];
// suffixes for dates, eg "1ro","2do","3ro"..."30ro","31ro"
config.messages.dates.daySuffixes = ["ro","do","ro","to","to","to","mo","vo","no","mo",
config.messages.dates.am = "am";
config.messages.dates.pm = "pm";


        labelNoTags: "sin etiquetas",
        labelTags: "etiquetas: ",
        openTag: "Abrir etiqueta '%0'",
        tooltip: "Mostrar tiddlers que tengan la etiqueta '%0'",
        openAllText: "Abrir todos",
        openAllTooltip: "Abrir todos estos tiddlers",
        popupNone: "No abrir tiddlers que tengan por etiqueta '%0'"});

        defaultText: "El tiddler '%0' no existe todaví­a. Haga doble click para crearlo",
        defaultModifier: "(perdido)",
        shadowModifier: "(tiddler oculto interno)",
        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: "creado"});

        tagPrompt: "Escriba etiquetas separadas por espacios, [[use dobles corchetes]] si es necesario, o añada alguna existente",
        defaultText: "Escriba el texto para '%0'"});

        text: "etiquetas",
        tooltip: "Elija etiquetas ya existentes para añadirlas a este artí­culo",
        popupNone: "No hay etiquetas definidas",
        tagTooltip: "Añadir la etiqueta '%0'"});

                {unit: 1024*1024*1024, template: "%0\u00a0GB"},
                {unit: 1024*1024, template: "%0\u00a0MB"},
                {unit: 1024, template: "%0\u00a0KB"},
                {unit: 1, template: "%0\u00a0B"}

        label: "búsqueda",
        prompt: "Búsqueda en este TiddlyWiki",
        accessKey: "F",
        successMsg: "%0 tiddlers encontrados que concuerden con %1",
        failureMsg: "No hay tiddlers que concuerden con %0"});

        label: "etiquetado: ",
        labelNotTag: "Sin etiquetas",
        tooltip: "Listado de tiddlers etiquetados con '%0'"});

        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

        tooltip: "Mostrar los tiddlers etiquetados con '%0'",
        noTags: "No hay tiddlers sin etiquetas"});

config.macros.list.all.prompt = "Todos los tiddlers ordenados alfabéticamente";
config.macros.list.missing.prompt = "Tiddlers que tienen enlaces a ellos pero no están definidos";
config.macros.list.orphans.prompt = "Tiddlers que no están enlazados con otros, ni otros los enlazan";
config.macros.list.shadowed.prompt = "Tiddlers ocultos con contenidos predefinidos";
config.macros.list.touched.prompt = "Tiddlers que no han sido modificados localmente";

        label: "cerrar todo",
        prompt: "Cerrar todos los tiddlers mostrados (excepto los que estén siendo editados)"});

        label: "vistapermanente",
        prompt: "Enlazar con una URL que recoge todos los tiddlers mostrados actualmente"});

        label: "guardar cambios",
        prompt: "Guardar todos los tiddlers editados previamente",
        accessKey: "S"});

        label: "nuevo tiddler",
        prompt: "Crear un nuevo tiddler",
        title: "Nuevo Tiddler",
        accessKey: "N"});

        label: "nuevo tiddler con fecha de hoy",
        prompt: "Crear un nuevo tiddler con la fecha y hora actual",
        accessKey: "J"});

        wizardTitle: "Configurar opciones avanzadas",
        step1Title: "Estas opciones se guardarán en una cookie en su navegador",
        step1Html: "<input type='hidden' name='markList'></input><br><input type='checkbox' checked='false' name='chkUnknown'>Mostrar opciones desconocidas</input>",
        unknownDescription: "//(desconocido)//",
        listViewTemplate: {
                columns: [
                        {name: 'Option', field: 'option', title: "Opción", type: 'String'},
                        {name: 'Description', field: 'description', title: "Descripción", type: 'WikiText'},
                        {name: 'Name', field: 'name', title: "Nombre", type: 'String'}
                rowClasses: [
                        {className: 'lowlight', field: 'lowlight'} 

        wizardTitle: "Configurar complementos",
        step1Title: "Complementos que están activados",
        step1Html: "<input type='hidden' name='markList'></input>", // DO NOT TRANSLATE
        skippedText: "(Este complemento no ha sido ejecutado porque se cargó al inicio)",
        noPluginText: "No hay complementos instalados",
        confirmDeleteText: "¿Está seguro que quiere borrar estos complementos:\n\n%0?",
        removeLabel: "quitar la etiqueta de systemConfig",
        removePrompt: "Quitar la etiqueta systemConfig",
        deleteLabel: "borrar",
        deletePrompt: "Borrar estos artí­culos para siempre",
        listViewTemplate: {
                columns: [
                        {name: 'Selected', field: 'Selected', rowName: 'title', type: 'Selector'},
                        {name: 'Tiddler', field: 'tiddler', title: "Tiddler", type: 'Tiddler'},
                        {name: 'Description', field: 'Description', title: "Descripción", type: 'String'},
                        {name: 'Version', field: 'Version', title: "Versión", type: 'String'},
                        {name: 'Size', field: 'size', tiddlerLink: 'size', title: "Tamaño", type: 'Size'},
                        {name: 'Forced', field: 'forced', title: "Forzado", tag: 'systemConfigForce', type: 'TagCheckbox'},
                        {name: 'Disabled', field: 'disabled', title: "Deshabilitado", tag: 'systemConfigDisable', type: 'TagCheckbox'},
                        {name: 'Executed', field: 'executed', title: "Cargado", type: 'Boolean', trueText: "Si", falseText: "No"},
                        {name: 'Startup Time', field: 'startupTime', title: "Al inicio", type: 'String'},
                        {name: 'Error', field: 'error', title: "Estado", type: 'Boolean', trueText: "Error", falseText: "OK"},
                        {name: 'Log', field: 'log', title: "Registro", type: 'StringList'}
                rowClasses: [
                        {className: 'error', field: 'error'},
                        {className: 'warning', field: 'warning'}

        moreLabel: "más",
        morePrompt: "Mostrar más comandos",
        lessLabel: "menos",
        lessPrompt: "Ocultar comandos adicionales",
        separator: "|"

        label: "actualizar",
        prompt: "Actualizar la vista de todo TiddlyWiki"

        readOnlyWarning: "No puede importar a un archivo TiddlyWiki de sólo lectura. Pruebe a abrirlo desde un archivo:// URL",
        wizardTitle: "Importar tiddlers de otro archivo o servidor",
        step1Title: "Primer paso: Localice el servidor o el archivo TiddlyWiki",
        step1Html: "Indique el tipo de servidor: <select name='selTypes'><option value=''>Elija...</option></select><br>Escriba la URL o la ruta aquí­: <input type='text' size=50 name='txtPath'><br>...o navegue hasta un archivo: <input type='file' size=50 name='txtBrowse'><br><hr>...o elija una fuente predefinida: <select name='selFeeds'><option value=''>Elige...</option></select>",
        openLabel: "abrir",
        openPrompt: "Abrir la conexión a este archivo o servidor",
        statusOpenHost: "Accediendo al anfitrión",
        statusGetWorkspaceList: "Obteniendo el listado de espacios de trabajo",
        step2Title: "Segundo paso: Elegir el espacio de trabajo",
        step2Html: "Escriba el nombre de un espacio de trabajo: <input type='text' size=50 name='txtWorkspace'><br>...o seleccione uno: <select name='selWorkspace'><option value=''>Elegir...</option></select>",
        cancelLabel: "cancelar",
        cancelPrompt: "Cancelar esta importación",
        statusOpenWorkspace: "Accediendo al espacio de trabajo",
        statusGetTiddlerList: "Obteniendo el listado de tiddlers disponibles",
        errorGettingTiddlerList: "Error al obtener la lista de tiddlers, pulsa Cancelar para intentarlo de nuevo",
        step3Title: "Tercer paso: Elegir los tiddlers que quiere importar",
        step3Html: "<input type='hidden' name='markList'></input><br><input type='checkbox' checked='true' name='chkSync'>Mantener estos tiddlers enlazados a este servidor para poder sincronizar los cambios posteriores</input><br><input type='checkbox' name='chkSave'>Guardar los datos de este servidor en un tiddler con etiqueta 'systemServer' cuyo nombre será:</input> <input type='text' size=25 name='txtSaveTiddler'>",
        importLabel: "importar",
        importPrompt: "Importar estos tiddlers",
        confirmOverwriteText: "¿Está seguro de que quiere sobrescribir estos tiddlers:\n\n%0?",
        step4Title: "Cuarto paso: Importar %0 tiddler(s)",
        step4Html: "<input type='hidden' name='markReport'></input>", // DO NOT TRANSLATE
        doneLabel: "hecho",
        donePrompt: "Cerrar el asistente",
        statusDoingImport: "Importando tiddlers",
        statusDoneImport: "Todos los tiddlers se importaron",
        systemServerNamePattern: "%2 en %1",
        systemServerNamePatternNoWorkspace: "%1",
        confirmOverwriteSaveTiddler: "El tiddler '%0' ya existe. Pulse en 'OK' para sobrescribirlo con el que hay en este servidor, o 'Cancel' para dejarlo sin modificar",
        serverSaveTemplate: "|''Tipo:''|%0|\n|''URL:''|%1|\n|''Espacio de trabajo:''|%2|\n\nEste tiddler se creó automáticamente para recoger todos los datos de este servidor",
        serverSaveModifier: "(Sistema)",
        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: "Tamaño", type: 'Size'},
                        {name: 'Tags', field: 'tags', title: "Etiquetas", type: 'Tags'}
                rowClasses: [

        wizardTitle: "Actualizar el código del núcleo de TiddlyWiki",
        step1Title: "Actualizar o reparar TiddlyWiki a la última versión",
        step1Html: "Está a punto de actualizar el código del núcleo de TiddlyWiki ala última versión (desde <a href='%0' class='externalLink' target='_blank'>%1</a>). El contenido de TiddlyWiki permanecerá tras la actualización.<br><br>Las actualizaciones del núcleo interfieren con complementos antiguos. Si tiene problemas tras la actualización, mire <a href='http://www.tiddlywiki.org/wiki/CoreUpgrades' class='externalLink' target='_blank'>http://www.tiddlywiki.org/wiki/CoreUpgrades</a>",
        errorCantUpgrade: "No se puede actualizar. Sólo se pueden actualizar archivos TiddlyWiki que estén guardados localmente (disco duro, etc.)",
        errorNotSaved: "Debe guardar los cambios antes de poder actualizar",
        step2Title: "Confirmar los detalles de la actualización",
        step2Html_downgrade: "Está a punto de retroceder en su versión de TilldyWiki, pasará a la versión anterior %0 desde %1.<br><br>Retroceder a una versión anterior del núcleo no es recomendable",
        step2Html_restore: "Este archivo TiddlyWiki parece que usa la última versión disponible del núcleo (%0).<br><br>Puede seguir con la actualización si quiere asegurarse que su núcleo no está estropeado o dañado",
        step2Html_upgrade: "Está a punto de actualizar TiddlyWiki a la versión %0 desde %1",
        upgradeLabel: "actualizar",
        upgradePrompt: "Preparándose para el proceso de actualización",
        statusPreparingBackup: "Preparando la copia de seguridad",
        statusSavingBackup: "Guardando la copia de seguridad",
        errorSavingBackup: "Hubo poblemas al guardar la copia de seguridad",
        statusLoadingCore: "Cargando el código del núcleo",
        errorLoadingCore: "Error al cargar el código del núcleo",
        errorCoreFormat: "Error con el código del nuevo núcleo",
        statusSavingCore: "Guardando el código del nuevo núcleo",
        statusReloadingCore: "Recargando el código del nuevo núcleo",
        startLabel: "empezar",
        startPrompt: "Empezar el proceso de actualización",
        cancelLabel: "cancelar",
        cancelPrompt: "Cancelar la actualización",
        step3Title: "Actualización cancelada",
        step3Html: "Ha cancelado el proceso de actualización"

        listViewTemplate: {
                columns: [
                        {name: 'Selected', field: 'selected', rowName: 'title', type: 'Selector'},
                        {name: 'Tiddler', field: 'tiddler', title: "Tiddler", type: 'Tiddler'},
                        {name: 'Server Type', field: 'serverType', title: "Tipo de servidor", type: 'String'},
                        {name: 'Server Host', field: 'serverHost', title: "Servidor anfitrión", type: 'String'},
                        {name: 'Server Workspace', field: 'serverWorkspace', title: "Espacio de trabajo en el servidor", type: 'String'},
                        {name: 'Status', field: 'status', title: "Estado de la sincronización", type: 'String'},
                        {name: 'Server URL', field: 'serverUrl', title: "URL del servidor", text: "Ver", type: 'Link'}
                rowClasses: [
                buttons: [
                        {caption: "Sincronizar estos tiddlers", name: 'sync'}
        wizardTitle: "Sincronizar con servidores externos y archivos",
        step1Title: "Elija los tiddlers que quieres sincronizar",
        step1Html: "<input type='hidden' name='markList'></input>", // DO NOT TRANSLATE
        syncLabel: "sinc",
        syncPrompt: "Sincronizar estos tiddlers",
        hasChanged: "Modificado mientras no estaba desconectado",
        hasNotChanged: "Sin cambios mientras estaba desconectado",
        syncStatusList: {
                none: {text: "...", display:null, className:'notChanged'},
                changedServer: {text: "Modificado en el servidor", display:null, className:'changedServer'},
                changedLocally: {text: "Modificado mientras estaba desconectado", display:null, className:'changedLocally'},
                changedBoth: {text: "Modificado mientras estaba desconectado y también en el servidor", display:null, className:'changedBoth'},
                notFound: {text: "No está en el servidor", display:null, className:'notFound'},
                putToServer: {text: "Guardada la actualización en el servidor", display:null, className:'putToServer'},
                gotFromServer: {text: "Actualización obtenida del servidor", display:null, className:'gotFromServer'}

        text: "cerrar",
        tooltip: "Cerrar este tiddler"});

        text: "cerrar otros",
        tooltip: "Cerrar todos los otros tiddlers"});

        text: "editar",
        tooltip: "Editar este tiddler",
        readOnlyText: "ver",
        readOnlyTooltip: "Ver el código de este tiddler"});

        text: "hecho",
        tooltip: "Guardar los cambios hechos en este tiddler"});

        text: "cancelar",
        tooltip: "Cancelar los cambios hechos en este tiddler",
        warning: "¿Está seguro que quiere salir sin guardar los cambios en '%0'?",
        readOnlyText: "hecho",
        readOnlyTooltip: "Vista normal de este tiddler"});

        text: "borrar",
        tooltip: "Borrar este tiddler",
        warning: "¿Está seguro de que quiere borrar '%0'?"});

        text: "enlacepermanente",
        tooltip: "Enlace permanente para este tiddler"});

        text: "referencias",
        tooltip: "Mostrar tiddlers que enlazan con éste",
        popupNone: "Sin referencias"});

        text: "ir a",
        tooltip: "Ir a otro tiddler abierto"});

        text: "sinc",
        tooltip: "Controlar la sincronización de este tiddler con un servidor o archivo externo",
        currentlySyncing: "<div>Sincronizando ahora mediante  <span class='popupHighlight'>'%0'</span> a:</"+"div><div>anfitrión: <span class='popupHighlight'>%1</span></"+"div><div>espacio de trabajo: <span class='popupHighlight'>%2</span></"+"div>", // Note escaping of closing <div> tag
        notCurrentlySyncing: "Ahora no se está sincronizando",
        captionUnSync: "Parar la sincronización para este tiddler",
        chooseServer: "Sincronizar este tiddler con otro servidor:",
        currServerMarker: "\u25cf ",
        notCurrServerMarker: "  "});

        text: "apartados",
        tooltip: "Mostrar los apartados extras de este tiddler",
        emptyText: "No hay apartados extras para este tiddler",
        listViewTemplate: {
                columns: [
                        {name: 'Field', field: 'field', title: "Apartado", type: 'String'},
                        {name: 'Value', field: 'value', title: "Valor", type: 'String'}
                rowClasses: [
                buttons: [

        DefaultTiddlers: "[[ParaEmpezar]]",
        MainMenu: "[[ParaEmpezar]]\n\n\n",
        ParaEmpezar: "Para empezar con este archivo TiddlyWiki vací­o, necesitará modificar los siguientes tiddlers (en este contexto podemos entender que un tiddler es un artí­culo):\n* SiteTitle & SiteSubtitle: El tí­tulo y subtí­tulo del sitio, como se muestra arriba (tras guardalo, también aparecerá en el tí­tulo de la ventana del navegador)\n* MainMenu: El menú (normalmente a la izquierda)\n* DefaultTiddlers: Contiene los nombres de los tiddlers que por defecto quiere que se muestren cuando TiddlyWiki se abre\nTambién deberí­a cambiar el nombre de usuario con el que firmará sus escritos: <<option txtUserName>>",
        SiteTitle: "Mi TiddlyWiki",
        SiteSubtitle: "un diario web personal, reutilizable y no lineal",
        SiteUrl: "",
        OptionsPanel: "Estas opciones personales de visualización de TiddlyWiki se guardan en el navegador\n\nSu nombre de usuario con el que firmará tus escritos. Escrí­balo como si fuera una PalabraWiki (ej JuanEscribió)\n<<option txtUserName>>\n\n<<option chkSaveBackups>> Guardar copia de seguridad\n<<option chkAutoSave>> Autoguardado\n<<option chkRegExpSearch>> Búscar expresiones regulares\n<<option chkCaseSensitiveSearch>> Buscar distinguiendo mayúsculas\n<<option chkAnimate>> Permitir animaciones\n\n----\nMirar también las [[OpcionesAvanzadas|AdvancedOptions]]",
        SideBarOptions: '<<search>><<closeAll>><<permaview>><<newTiddler>><<newJournal "DD MMM YYYY">><<saveChanges>><<slider chkSliderOptionsPanel OptionsPanel "opciones \u00bb" "Cambiar las opciones avanzadas de TiddlyWiki">>',
        SideBarTabs: '<<tabs txtMainTab "Historial" "Historial" TabTimeline "Todo" "Todos los tiddlers" TabAll "Etiquetas" "Todas las etiquetas" TabTags "Más" "Más listados" TabMore>>',
        TabMore: '<<tabs txtMoreTab "Perdidos" "Tiddlers perdidos" TabMoreMissing "Huérfanos" "Tiddlers huérfanos" TabMoreOrphans "Ocultos" "Tiddlers ocultos" TabMoreShadowed>>'

        AdvancedOptions: "Este tiddler oculto permite controlar bastantes opciones avanzadas",
        ColorPalette: "Los valores en este tiddler oculto configuran el esquema de colores de la interfaz de ~TiddlyWiki",
        DefaultTiddlers: "Los tiddlers listados en este tiddler oculto son que se mostrarán por defecto cuando se abre ~TiddlyWiki",
        EditTemplate: "La plantilla HTML en este tiddler oculto indica cómo se muestran los tiddlers mientras se editan",
        GettingStarted: "Este tiddler oculto contiene las instrucciones básicas de utilización",
        ImportTiddlers: "Este tiddler oculto permite acceder a los tiddlers que se están importando",
        MainMenu: "Este tiddler oculto contiene los apartados que se muestran en el menú principal de la columna de la izquierda de la pantalla",
        MarkupPreHead: "Este tiddler se inserta al principio de la sección <head> del archivo HTML de TiddlyWiki",
        MarkupPostHead: "Este tiddler se inserta al final de la sección  <head> del archivo HTML de TiddlyWiki",
        MarkupPreBody: "Este tiddler se inserta al principio de la sección <body> del archivo HTML de TiddlyWiki",
        MarkupPostBody: "Este tiddler se inserta al final de la sección <body> del archivo HTML de TiddlyWiki, justo antes del bloque de script",
        OptionsPanel: "Este tiddler oculto contiene los apartados de la opción desplegable Opciones, de la barra de la derecha",
        PageTemplate: "La plantilla HTML en este tiddler oculto determina la estructura general de ~TiddlyWiki",
        PluginManager: "Este tiddler oculto permite acceder al Gestor de Complementos",
        SideBarOptions: "Este tiddler oculto contiene lo que hay en el apartado de opciones de la barra de la derecha",
        SideBarTabs: "Este tiddler oculto contiene lo que hay en el panel de pestañas de la barra de la derecha",
        SiteSubtitle: "Este tiddler oculto contiene la segunda parte del tí­tulo de la página",
        SiteTitle: "Este tiddler oculto contiene la primera parte del tí­tulo de la página",
        SiteUrl: "Este tiddler oculto deberí­a contener la dirección completa URL en la que se publica",
        StyleSheetColours: "Este tiddler oculto contiene las definiciones para CSS relacionadas con el color de los elementos de la página",
        StyleSheet: "En este tiddler oculto se pueden poner definiciones para CSS personales",
        StyleSheetLayout: "Este tiddler oculto contiene las definiciones para CSS relacionadas con la distribución de los elementos de la página. ''NO EDITE ESTE TIDDLER'', si quiere hacer alguna modificación hágalo en el tiddler oculto StyleSheet",
        StyleSheetLocale: "Este tiddler oculto contiene las definiciones para CSS relacionadas con la traducción al idioma local",
        StyleSheetPrint: "Este tiddler oculto contiene las definiciones para CSS relacionadas con la impresión",
        TabAll: "Este tiddler oculto contiene todo lo que hay en la pestaña 'Todo' de la barra de la derecha",
        TabMore: "Este tiddler oculto contiene todo lo que hay en la pestaña 'Más' de la barra de la derecha",
        TabMoreMissing: "Este tiddler oculto contiene todo lo que hay en la pestaña 'Perdidos' de la barra de la derecha",
        TabMoreOrphans: "Este tiddler oculto contiene todo lo que hay en la pestaña 'Huérfanos' de la barra de la derecha",
        TabMoreShadowed: "Este tiddler oculto contiene todo lo que hay en la pestaña 'Ocultos' de la barra de la derecha",
        TabTags: "Este tiddler oculto contiene todo lo que hay en la pestaña 'Etiquetas' de la barra de la derecha",
        TabTimeline: "Este tiddler oculto contiene todo lo que hay en la pestaña 'Historial' de la barra de la derecha",
        ToolbarCommands: "Este tiddler oculto indica los comandos que deben mostrarse en la barra de herramientas de cualquier tiddler",        
        ViewTemplate: "Este tiddler oculto contiene la plantilla HTML que indica cómo se muestran los tiddlers"


body {font-family: Century Schoolbook L; font-size: 12pt;}

.headerShadow {padding: 1em 0em .8em 1em;}
.headerForeground {padding: 1em 0em .8em 1em;}
.siteTitle {font-size:1.0em;}
.siteSubtitle {font-size:1em;}

.tagged, .tagging {
display: none;

#mainMenu {width: 12em; text-align: left; font-size: .85em;font-weight: bold;}
#displayArea {margin: 0em 14.5em 0em 11em;}
#mainMenu .sliderPanel { margin-left: 1.2em; }
#mainMenu .tiddlyLinkExisting {font-weight: bold;}
|Author|Eric Shulman|
|Description|show/hide right sidebar (SideBarOptions)|
<<tiddler ToggleRightSidebar>>
<<tiddler ToggleRightSidebar with: label tooltip>>
Try it: <<tiddler ToggleRightSidebar##show
	with: {{config.options.chkShowRightSidebar?'►':'◄'}}>>
copy/paste the following settings into a tiddler tagged with <<tag systemConfig>> and then modify the values to suit your preferences:
<<tiddler {{
	var co=config.options;
	if (co.chkShowRightSidebar===undefined) co.chkShowRightSidebar=true;
	var sb=document.getElementById('sidebar');
	var da=document.getElementById('displayArea');
	if (sb) {
'';}}>><html><nowiki><a href='javascript:;' title="$2"
	var co=config.options;
	var opt='chkShowRightSidebar';
	var show=co[opt]=!co[opt];
	var sb=document.getElementById('sidebar');
	var da=document.getElementById('displayArea');
	if (sb) {
	var labelShow=co.txtToggleRightSideBarLabelShow||'&#x25C4;';
	var labelHide=co.txtToggleRightSideBarLabelHide||'&#x25BA;';
	if (this.innerHTML==labelShow||this.innerHTML==labelHide) 
	this.title=(show?'hide':'show')+' right sidebar';
	var sm=document.getElementById('storyMenu');
	if (sm) config.refreshers.content(sm);
	return false;
%/<<tiddler {{
	var src='ToggleRightSidebar';
}} with: {{
	var co=config.options;
	var labelShow=co.txtToggleRightSideBarLabelShow||'&#x25C4;';
	var labelHide=co.txtToggleRightSideBarLabelHide||'&#x25BA;';
}} {{
	var tip=(config.options.chkShowRightSidebar?'hide':'show')+' right sidebar';
|Author|Eric Shulman|
|Description|command link to show/hide tiddler tags display in all tiddlers at once|
in tiddler content:
<<tiddler ToggleTiddlerTags>>
<<tiddler ToggleTiddlerTags with: label>>
or, in ViewTemplate:
<span class='toolbar' macro='tiddler ToggleTiddlerTags'></span>
	OR, if TiddlyTools' CoreTweaks for ticket #610 is installed:
<span class='toolbar' macro='toolbar ... ToggleTiddlerTags...'></span>
or, in ToolbarCommands (with CoreTweaks #610 installed):
| ViewToolbar| ... ToggleTiddlerTags... |
| EditToolbar| ... ToggleTiddlerTags... |

<html><nowiki><a href='javascript:;' title='show/hide tiddler tags' onclick="
	var show=config.options.chkHideTiddlerTags?'none':'block';
	setStylesheet('.tiddler .tagged { display:'+show+'; }','toggleTiddlerTags');
%/<<tiddler {{'ToggleTiddlerTags##'+(tiddler&&tiddler.title=='ToggleTiddlerTags'?'info':'show')}}
	with: {{"$1"=='$'+'1'?'tags':"$1"}}>>
Description: Contains the stuff you need to use Tiddlyspot
Note, you also need UploadPlugin, PasswordOptionPlugin and LoadRemoteFileThroughProxy
from http://tiddlywiki.bidix.info for a complete working Tiddlyspot site.

// edit this if you are migrating sites or retrofitting an existing TW
config.tiddlyspotSiteId = 'pedruchini';

// make it so you can by default see edit controls via http
config.options.chkHttpReadOnly = false;
window.readOnly = false; // make sure of it (for tw 2.2)
window.showBackstage = true; // show backstage too

// disable autosave in d3
if (window.location.protocol != "file:")
	config.options.chkGTDLazyAutoSave = false;

// tweak shadow tiddlers to add upload button, password entry box etc
with (config.shadowTiddlers) {
	SiteUrl = 'http://'+config.tiddlyspotSiteId+'.tiddlyspot.com';
	SideBarOptions = SideBarOptions.replace(/(<<saveChanges>>)/,"$1<<tiddler TspotSidebar>>");
	OptionsPanel = OptionsPanel.replace(/^/,"<<tiddler TspotOptions>>");
	DefaultTiddlers = DefaultTiddlers.replace(/^/,"[[WelcomeToTiddlyspot]] ");
	MainMenu = MainMenu.replace(/^/,"[[WelcomeToTiddlyspot]] ");

// create some shadow tiddler content

 "| tiddlyspot password:|<<option pasUploadPassword>>|",
 "| site management:|<<upload http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/store.cgi index.html . .  " + config.tiddlyspotSiteId + ">>//(requires tiddlyspot password)//<br>[[control panel|http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/controlpanel]], [[download (go offline)|http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/download]]|",
 "| links:|[[tiddlyspot.com|http://tiddlyspot.com/]], [[FAQs|http://faq.tiddlyspot.com/]], [[blog|http://tiddlyspot.blogspot.com/]], email [[support|mailto:support@tiddlyspot.com]] & [[feedback|mailto:feedback@tiddlyspot.com]], [[donate|http://tiddlyspot.com/?page=donate]]|"

 "tiddlyspot password:",
 "<<option pasUploadPassword>>",

 "<<upload http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/store.cgi index.html . .  " + config.tiddlyspotSiteId + ">><html><a href='http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/download' class='button'>download</a></html>"

 "This document is a ~TiddlyWiki from tiddlyspot.com.  A ~TiddlyWiki is an electronic notebook that is great for managing todo lists, personal information, and all sorts of things.",
 "@@font-weight:bold;font-size:1.3em;color:#444; //What now?// &nbsp;&nbsp;@@ Before you can save any changes, you need to enter your password in the form below.  Then configure privacy and other site settings at your [[control panel|http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/controlpanel]] (your control panel username is //" + config.tiddlyspotSiteId + "//).",
 "<<tiddler TspotControls>>",
 "See also GettingStarted.",
 "@@font-weight:bold;font-size:1.3em;color:#444; //Working online// &nbsp;&nbsp;@@ You can edit this ~TiddlyWiki right now, and save your changes using the \"save to web\" button in the column on the right.",
 "@@font-weight:bold;font-size:1.3em;color:#444; //Working offline// &nbsp;&nbsp;@@ A fully functioning copy of this ~TiddlyWiki can be saved onto your hard drive or USB stick.  You can make changes and save them locally without being connected to the Internet.  When you're ready to sync up again, just click \"upload\" and your ~TiddlyWiki will be saved back to tiddlyspot.com.",
 "@@font-weight:bold;font-size:1.3em;color:#444; //Help!// &nbsp;&nbsp;@@ Find out more about ~TiddlyWiki at [[TiddlyWiki.com|http://tiddlywiki.com]].  Also visit [[TiddlyWiki.org|http://tiddlywiki.org]] for documentation on learning and using ~TiddlyWiki. New users are especially welcome on the [[TiddlyWiki mailing list|http://groups.google.com/group/TiddlyWiki]], which is an excellent place to ask questions and get help.  If you have a tiddlyspot related problem email [[tiddlyspot support|mailto:support@tiddlyspot.com]].",
 "@@font-weight:bold;font-size:1.3em;color:#444; //Enjoy :)// &nbsp;&nbsp;@@ We hope you like using your tiddlyspot.com site.  Please email [[feedback@tiddlyspot.com|mailto:feedback@tiddlyspot.com]] with any comments or suggestions."

| !date | !user | !location | !storeUrl | !uploadDir | !toFilename | !backupdir | !origin |
| 16/04/2014 14:30:00 | SuNombre | [[/|http://pedruchini.tiddlyspot.com/#MainMenu]] | [[store.cgi|http://pedruchini.tiddlyspot.com/store.cgi]] | . | [[index.html | http://pedruchini.tiddlyspot.com/index.html]] | . |
| 08/09/2014 22:52:56 | SuNombre | [[/|http://pedruchini.tiddlyspot.com/]] | [[store.cgi|http://pedruchini.tiddlyspot.com/store.cgi]] | . | [[index.html | http://pedruchini.tiddlyspot.com/index.html]] | . |
| 08/09/2014 22:55:26 | pedruchini | [[/|http://pedruchini.tiddlyspot.com/#OptionsPanel]] | [[store.cgi|http://pedruchini.tiddlyspot.com/store.cgi]] | . | [[index.html | http://pedruchini.tiddlyspot.com/index.html]] | . |
| 08/09/2014 22:58:42 | Pedruchini | [[/|http://pedruchini.tiddlyspot.com/]] | [[store.cgi|http://pedruchini.tiddlyspot.com/store.cgi]] | . | [[index.html | http://pedruchini.tiddlyspot.com/index.html]] | . |
| 28/12/2016 23:09:34 | pedruchini | [[/|http://pedruchini.tiddlyspot.com/#MainMenu]] | [[store.cgi|http://pedruchini.tiddlyspot.com/store.cgi]] | . | [[index.html | http://pedruchini.tiddlyspot.com/index.html]] | . |
| 03/04/2017 23:42:05 | SuNombre | [[/|http://pedruchini.tiddlyspot.com/]] | [[store.cgi|http://pedruchini.tiddlyspot.com/store.cgi]] | . | [[index.html | http://pedruchini.tiddlyspot.com/index.html]] | . | ok |
| 03/04/2017 23:45:53 | SuNombre | [[/|http://pedruchini.tiddlyspot.com/]] | [[store.cgi|http://pedruchini.tiddlyspot.com/store.cgi]] | . | [[index.html | http://pedruchini.tiddlyspot.com/index.html]] | . | ok |
| 04/04/2017 00:12:37 | SuNombre | [[/|http://pedruchini.tiddlyspot.com/]] | [[store.cgi|http://pedruchini.tiddlyspot.com/store.cgi]] | . | [[index.html | http://pedruchini.tiddlyspot.com/index.html]] | . | ok |
| 04/04/2017 00:15:56 | SuNombre | [[/|http://pedruchini.tiddlyspot.com/]] | [[store.cgi|http://pedruchini.tiddlyspot.com/store.cgi]] | . | [[index.html | http://pedruchini.tiddlyspot.com/index.html]] | . |
| 04/04/2018 04:20:57 | Pedruchini | [[/|http://pedruchini.tiddlyspot.com/]] | [[store.cgi|http://pedruchini.tiddlyspot.com/store.cgi]] | . | [[index.html | http://pedruchini.tiddlyspot.com/index.html]] | . |
|''Description:''|Save to web a TiddlyWiki|
|''Date:''|Feb 24, 2008|
|''Author:''|BidiX (BidiX (at) bidix (dot) info)|
|''License:''|[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D ]]|
version.extensions.UploadPlugin = {
	major: 4, minor: 1, revision: 3,
	date: new Date("Feb 24, 2008"),
	source: 'http://tiddlywiki.bidix.info/#UploadPlugin',
	author: 'BidiX (BidiX (at) bidix (dot) info',
	coreVersion: '2.2.0'

// Environment

if (!window.bidix) window.bidix = {}; // bidix namespace
bidix.debugMode = false;	// true to activate both in Plugin and UploadService
// Upload Macro

config.macros.upload = {
// default values
	defaultBackupDir: '',	//no backup
	defaultStoreScript: "store.php",
	defaultToFilename: "index.html",
	defaultUploadDir: ".",
	authenticateUser: true	// UploadService Authenticate User
config.macros.upload.label = {
	promptOption: "Save and Upload this TiddlyWiki with UploadOptions",
	promptParamMacro: "Save and Upload this TiddlyWiki in %0",
	saveLabel: "save to web", 
	saveToDisk: "save to disk",
	uploadLabel: "upload"	

config.macros.upload.messages = {
	noStoreUrl: "No store URL in parmeters or options",
	usernameOrPasswordMissing: "Username or password missing"

config.macros.upload.handler = function(place,macroName,params) {
	if (readOnly)
	var label;
	if (document.location.toString().substr(0,4) == "http") 
		label = this.label.saveLabel;
		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) {
			return false;
		if (config.macros.upload.authenticateUser && (!username || !password)) {
			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();
		var markList = wizard.getElement("markList");
		var listWrapper = document.createElement("div");
		var uploadCaption;
		if (document.location.toString().substr(0,4) == "http") 
			uploadCaption = config.macros.upload.label.saveLabel;
			uploadCaption = config.macros.upload.label.uploadLabel;
				{caption: uploadCaption, tooltip: config.macros.upload.label.promptOption, 
					onClick: config.macros.upload.action},
				{caption: this.cancelButton, tooltip: this.cancelButtonPrompt, onClick: this.onCancel}
	options: [
	refreshOptions: function(listWrapper) {
		var opts = [];
		for(i=0; i<this.options.length; i++) {
			var opt = {};
			opt.option = "";
			n = this.options[i];
			opt.name = n;
			opt.lowlight = !config.optionsDesc[n];
			opt.description = opt.lowlight ? this.unknownDescription : config.optionsDesc[n];
		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) {
	onCancel: function(e)
		return false;
	wizardTitle: "Upload with options",
	step1Title: "These options are saved in cookies in your browser",
	step1Html: "<input type='hidden' name='markList'></input><br>",
	cancelButton: "Cancel",
	cancelButtonPrompt: "Cancel prompt",
	listViewTemplate: {
		columns: [
			{name: 'Description', field: 'description', title: "Description", type: 'WikiText'},
			{name: 'Option', field: 'option', title: "Option", type: 'String'},
			{name: 'Name', field: 'name', title: "Name", type: 'String'}
		rowClasses: [
			{className: 'lowlight', field: 'lowlight'} 

// upload functions

if (!bidix.upload) bidix.upload = {};

if (!bidix.upload.messages) bidix.upload.messages = {
	//from saving
	invalidFileError: "The original file '%0' does not appear to be a valid TiddlyWiki",
	backupSaved: "Backup saved",
	backupFailed: "Failed to upload backup file",
	rssSaved: "RSS feed uploaded",
	rssFailed: "Failed to upload RSS feed file",
	emptySaved: "Empty template uploaded",
	emptyFailed: "Failed to upload empty template file",
	mainSaved: "Main TiddlyWiki file uploaded",
	mainFailed: "Failed to upload main TiddlyWiki file. Your changes have not been saved",
	//specific upload
	loadOriginalHttpPostError: "Can't get original file",
	aboutToSaveOnHttpPost: 'About to upload on %0 ...',
	storePhpNotFound: "The store script '%0' was not found."

bidix.upload.uploadChanges = function(onlyIfDirty,tiddlers,storeUrl,toFilename,uploadDir,backupDir,username,password)
	var callback = function(status,uploadParams,original,url,xhr) {
		if (!status) {
		if (bidix.debugMode) 
		// Locate the storeArea div's 
		var posDiv = locateStoreArea(original);
		if((posDiv[0] == -1) || (posDiv[1] == -1)) {
	if(onlyIfDirty && !store.isDirty())
	// save on localdisk ?
	if (document.location.toString().substr(0,4) == "file") {
		var path = document.location.toString();
		var localPath = getLocalPath(path);
	// 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);
	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")
	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:")));
		} else {
	// 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);	
	} else {

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:")));
			var destfile = responseText.substring(responseText.indexOf("destfile:")+9,responseText.indexOf("\n", responseText.indexOf("destfile:")));
		} else {
	// do uploadMain
	var revised = bidix.upload.updateOriginal(original,posDiv);

bidix.upload.httpUpload = function(uploadParams,data,callback,params)
	var localCallback = function(status,params,responseText,url,xhr) {
		url = (url.indexOf("nocache=") < 0 ? url : url.substring(0,url.indexOf("nocache=")-1));
		if (xhr.status == 404)
		if ((bidix.debugMode) || (responseText.indexOf("Debug mode") >= 0 )) {
			if (responseText.indexOf("Debug mode") >= 0 )
				responseText = responseText.substring(responseText.indexOf("\n\n")+2);
		} else if (responseText.charAt(0) != '0') 
		if (responseText.charAt(0) != '0')
			status = null;
	// 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")
	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)) {
	var revised = original.substr(0,posDiv[0] + startSaveArea.length) + "\n" +
				store.allTiddlersAsHtml() + "\n" +
	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();
	return this;

bidix.UploadLog.prototype.addText = function(text) {
	if (!this.tiddler)
	// 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)
			this.tiddler.text = textArray.join('\n');		
	// update tiddler fields
	this.tiddler.modifier = config.options.txtUserName;
	this.tiddler.modified = new Date();
	// refresh and notifiy for immediate update
	store.notify(this.tiddler.title, true);

bidix.UploadLog.prototype.startUpload = function(storeUrl, toFilename, uploadDir,  backupDir) {
	if (!this.tiddler)
	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 + " |";

bidix.UploadLog.prototype.endUpload = function(status) {
	if (!this.tiddler)
	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) 
	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) 
	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");

	txtUploadStoreUrl: "Url of the UploadService script (default: store.php)",
	txtUploadFilename: "Filename of the uploaded file (default: in index.html)",
	txtUploadDir: "Relative Directory where to store the file (default: . (downloadService directory))",
	txtUploadBackupDir: "Relative Directory where to backup the file. If empty no backup. (default: ''(empty))",
	txtUploadUserName: "Upload Username",
	pasUploadPassword: "Upload Password",
	chkUploadLog: "do Logging in UploadLog (default: true)",
	txtUploadLogMaxLine: "Maximum of lines in UploadLog (default: 10)"

// Options Initializations

// Backstage
	uploadOptions: {text: "upload", tooltip: "Change UploadOptions and Upload", content: '<<uploadOptions>>'}


<div class='toolbar' macro='toolbar [[ToolbarCommands::ViewToolbar]]'></div>
<div class='title' macro='view title'></div>
<div class='tagging' macro='tagging'></div>
<div class='tagged' macro='tags'></div>
<div class='viewer' macro='view text wikified'></div>
<div class='tagClear'></div>


config.options.chkSinglePageMode = true;