<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]]
Le quotidien de Valnuit. 
[[Eliane Keurd]] en est la directrice de la rédaction.

Dans [[l'épisode 3|E3]] il est signalé que le quotidien ne paraîtra plus que de lundi à jeudi (l'édition du jeudi valant pour le weekend) à cause, entre autre, de "la diminution massive de la population lettrée".

Dans [[l'épisode 4|E4]], face à la crise économique (tous les journalistes ont été renvoyés), décision est prise de d'afficher des publicités "platinum premium" en première page. Il est indiqué que le centre de distribution a explosé l'an dernier (par "pur" accident).

Dans [[l'épisode 5|E5]], [[Eliane Keurd]], toujours pour des raisons d'économie, déclare rendre l'abonnement obligatoire et remplacer l'édition papier par une édition "imagination".
Le scientifique et son équipe

"coupe de cheveux si parfaite et magnifique"
"matériel électrique grésillant"
Utilise [[le labo]] qu’il vient de louer, celui à coté de [[la pizzeria du Gros Rico]]

Sa fait couper les cheveux dans [[l'épisode 3|E3]], sans doute par [[Thomas le Barbier]]. [[Emile Pellerin]] le prend très mal !

N'est peut-être pas d'accord avec la décision de supprimer la porte plaquée au plomb dans [[les gorges de Radon|Les gorges de Radon]] ([[épisode 4|E4]]). Il aurait déclaré à un rectangle noir dans sa main : "On n’a plus le temps. Plus de temps du tout".
D'après [[la vieille Josette|La vieille Josette]], il sent le chewing-gum à la lavande (!)
Stagiaire à [[la station de radio|La station de radio]] ([[épisode 3|E3]]), il a disparu lors d'une enquête sur l'éventuel lien entre [[le magasin d’équipement sportif discount et d’occasion|Le magasin d’équipement sportif discount et d’occasion]] et [[le gouvernement mondial|Le gouvernement mondial]].
On y fait ses courses
On pourrait y rencontrer [[des anges|Les anges]] (mais il ne faut pas en parler)
|Description:|Closes the tiddler if you click new tiddler then cancel. Default behaviour is to leave it open|
|Author:|Simon Baird <simon.baird@gmail.com>|

  handler_mptw_orig_closeUnsaved: config.commands.cancelTiddler.handler,

  handler: function(event,src,title) {
    if (!story.isDirty(title) && !store.tiddlerExists(title) && !store.isShadowTiddler(title))
    return false;


On pourrait y rencontrer [[des anges|Les anges]] (mais il ne faut pas en parler)
Son propriétaire, [[Théo Martin]]
Entrée d'[[une vaste cité souterraine|Une vaste cité souterraine]] sous la zone de récupération de quilles de l’allée numéro 5
membres d’un service indéfini
... mais néanmoins menaçants

Dans l'épisode 2, et en collaboration avec [[le conseil municipal|Le Conseil Municipal]], ils demandent que les citoyens se présentent au gymnase de l'école primaire de Valnuit pour répondre à un questionnaire sur les étranges pensées et les apparitions mystérieuses.
Les envahisseurs d’un autre monde
Environ 30 mètres au-dessus du [[Flunch]]
Elles semblent être des conducteurs prudents et raisonnables
[[La météo|Météo]] de chaque épisode propose de présenter un nouveau groupe musical.

Chaque épisode est également l'occasion de partager un grand moment de sagesse à l'aide du [[proverbe du jour|Les proverbes du jour]].

Directrice de la rédaction du quotidien "[[Aujourd'hui Valnuit]]"
L'animateur radio qui fait l'émission //(qui donne lieu au podcast)//

Adore la coupe de cheveux de [[Carlos]] ([[épisode 3|E3]] : contemplation lubrique de la coiffe munificiente de Carlos).

Dans l'[[épisode 3|E3]], il lance une campagne de soutiens pour l'aider à garder l'émission que la direction de la station de radio menace de supprimer.

Il se pose des questions metaphysiques dans l'[[épisode 5|E5]] concernant l'existence effective du monde, en dehors de lui-même, de sa voix. Il s'interroge également sur la Lune, son existence et ce qu'elle regarde.
Situé à côte de [[la station de radio|La station de radio]].

Un magasin d'équipements sportifs, concurrent [[du magasin d’équipement sportif discount et d’occasion|Le magasin d’équipement sportif discount et d’occasion]].
Ce magasin est également une couverture, mais cette fois pour [[la Police Secrète Municipale|La Police Secrète Municipale]]. Donc tout va bien.
| [[Episode 1|http://valnuit.blogspot.fr/2015/03/episode-1-pilote.html]] ([[podcast|http://valnuit.podcloud.fr/episode-pilote]]) |Pilote |
| [[Episode 2|http://valnuit.blogspot.fr/2015/04/episode-2-le-nuage-luminescent.html]] ([[podcast|http://valnuit.podcloud.fr/le-nuage-luminescent]]) |Le nuage luminescent |
| [[Episode 3|http://valnuit.blogspot.fr/2015/05/episode-3-management-de-la-station.html]] ([[podcast|http://valnuit.podcloud.fr/episode-3-management-de-la-station]]) |Management de la station |
| [[Episode 4|http://valnuit.blogspot.fr/2015/06/episode-4-reunion-de-parents-deleves.html]] ([[podcast|http://valnuit.podcloud.fr/episode-4-reunion-des-parents-deleves]]) |Réunion de parents d'élèves |
| [[Episode 5|http://valnuit.blogspot.fr/2015/07/episode-5-la-forme-dans-le-parc.html]] ([[podcast|http://valnuit.podcloud.fr/episode-5-la-forme-dans-le-parc-paroissial]]) |La forme dans le parc paroissial |
| [[Episode 6|http://valnuit.blogspot.fr/2015/08/episode-6-le-pont-levis.html]] ([[podcast|http://valnuit.podcloud.fr/episode-6-le-pont-levis]]) |Le pont-levis |
| [[Episode 7|http://valnuit.blogspot.fr/2015/09/episode-7-semaine-de-lhistoire.html]] ([[podcast|http://valnuit.podcloud.fr/episode-7-semaine-de-lhistoire]]) |La semaine de l'histoire |
| [[Episode 8|http://valnuit.blogspot.fr/2015/10/episode-8-les-lumieres-dans-les-gorges.html]] ([[podcast|http://valnuit.podcloud.fr/episode-8-les-lumieres-dans-les-gorges-de-radon]]) |Les lumières dans les Gorges de Radon |

|Description:|Adds a New tiddler button in the tag drop down|
|Author:|Simon Baird <simon.baird@gmail.com>|

window.onClickTag_mptw_orig = window.onClickTag;
window.onClickTag = function(e) {
  var tag = this.getAttribute("tag");
  var title = this.getAttribute("tiddler");
  // Thanks Saq, you're a genius :)
  var popup = Popup.stack[Popup.stack.length-1].popup;
  wikify("<<newTiddler label:'New tiddler' tag:'"+tag+"'>>",createTiddlyElement(popup,"li"));
  return false;

Sous [[les lumières]] des envahisseurs
Habitant aux abords de la ville, c'est lui qui signale l'arrivée de [[la Peur Rampante|La Peur Rampante]].
|Description:|Allows conditional inclusion/exclusion in templates|
|Author:|Simon Baird <simon.baird@gmail.com>|
For use in ViewTemplate and EditTemplate. Example usage:
{{{<div macro="showWhenTagged Task">[[TaskToolbar]]</div>}}}
{{{<div macro="showWhen tiddler.modifier == 'BartSimpson'"><img src="bart.gif"/></div>}}}

Warning: the showWhen and hideWhen macros will blindly eval paramString.
This could be used to execute harmful javascript from a tiddler.

(TODO: Make some effort to sanitize paramString. Perhaps disallow the equals sign?)

window.hideWhenLastTest = false;

window.removeElementWhen = function(test,place) {
  window.hideWhenLastTest = test;
  if (test) {


  hideWhen: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
    removeElementWhen( eval(paramString), place );

  showWhen: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
    removeElementWhen( !eval(paramString), place );

  hideWhenTagged: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
    removeElementWhen( tiddler.tags.containsAll(params), place );

  showWhenTagged: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
    removeElementWhen( !tiddler.tags.containsAll(params), place );

  hideWhenTaggedAny: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
    removeElementWhen( tiddler.tags.containsAny(params), place );

  showWhenTaggedAny: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
    removeElementWhen( !tiddler.tags.containsAny(params), place );

  hideWhenTaggedAll: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
    removeElementWhen( tiddler.tags.containsAll(params), place );

  showWhenTaggedAll: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
    removeElementWhen( !tiddler.tags.containsAll(params), place );

  hideWhenExists: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
    removeElementWhen( store.tiddlerExists(params[0]) || store.isShadowTiddler(params[0]), place );

  showWhenExists: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
    removeElementWhen( !(store.tiddlerExists(params[0]) || store.isShadowTiddler(params[0])), place );

  hideWhenTitleIs: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
    removeElementWhen( tiddler.title == params[0], place );

  showWhenTitleIs: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
    removeElementWhen( tiddler.title != params[0], place );

  'else': { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
    removeElementWhen( !window.hideWhenLastTest, place );


Ressemble à un dragon à cinq têtes, d’environ 50m de haut avec des yeux globalement verts et pesant dans les 1800 kilos.

* Soupçonné d’escroquerie à l’assurance, 
* arrêté pour excès de vitesse, 
* a fourni à la police secrète un faux permis de conduire au nom de François Chen, 
* s’est évadé de sa garde à vue en crachant du feu par sa tête pourpre, 
* a été aperçu pour la dernière fois volant et hurlant au-dessus de la Vallée Rouge

[[L'officier Ben]], de [[la police secrète|La Police Secrète Municipale]], est la personne à contacter pour toute information.
La [[vieille Josette|La vieille Josette]] aurait vu Ingrid Bergman prendre de l'essence près du bowling. Incroyable !
Un [[ange|Les anges]] lui a confirmé que c'était bien la célébrité du monde cinéphile (même si l'apparence physique ne correspondait pas tout à fait).
|Description:|A handy way to insert timestamps in your tiddler content|
|Author:|Simon Baird <simon.baird@gmail.com>|
If you enter {ts} in your tiddler content (without the spaces) it will be replaced with a timestamp when you save the tiddler. Full list of formats:
* {ts} or {t} -> timestamp
* {ds} or {d} -> datestamp
* !ts or !t at start of line -> !!timestamp
* !ds or !d at start of line -> !!datestamp
(I added the extra ! since that's how I like it. Remove it from translations below if required)
* Change the timeFormat and dateFormat below to suit your preference.
* See also http://mptw2.tiddlyspot.com/#AutoCorrectPlugin
* You could invent other translations and add them to the translations array below.

config.InstantTimestamp = {

  // adjust to suit
  timeFormat: 'DD/0MM/YY 0hh:0mm',
  dateFormat: 'DD/0MM/YY',

  translations: [
    [/^!ts?$/img,  "'!!{{ts{'+now.formatString(config.InstantTimestamp.timeFormat)+'}}}'"],
    [/^!ds?$/img,  "'!!{{ds{'+now.formatString(config.InstantTimestamp.dateFormat)+'}}}'"],

    // thanks Adapted Cat


  excludeTags: [

  excludeTiddlers: [
    // more?


TiddlyWiki.prototype.saveTiddler_mptw_instanttimestamp = TiddlyWiki.prototype.saveTiddler;
TiddlyWiki.prototype.saveTiddler = function(title,newTitle,newBody,modifier,modified,tags,fields,clearChangeCount,created) {

  tags = tags ? tags : []; // just in case tags is null
  tags = (typeof(tags) == "string") ? tags.readBracketedList() : tags;
  var conf = config.InstantTimestamp;

  if ( !tags.containsAny(conf.excludeTags) && !conf.excludeTiddlers.contains(newTitle) ) {

    var now = new Date();
    var trans = conf.translations;
    for (var i=0;i<trans.length;i++) {
      newBody = newBody.replace(trans[i][0], eval(trans[i][1]));

  // TODO: use apply() instead of naming all args?
  return this.saveTiddler_mptw_instanttimestamp(title,newTitle,newBody,modifier,modified,tags,fields,clearChangeCount,created);

// you can override these in StyleSheet
setStylesheet(".ts,.ds { font-style:italic; }","instantTimestampStyles");

Dans l'épisode 2, il dit est le premier à signaler [[le Nuage Luminescent|Le Nuage Luminescent]].
Il continue ensuite à donner des informations sur l'évolution du nuage.
Expert en dinosaures volants, il n'a pa pu donner son expertise sur les [[ptérodactyles|Les ptérodactyles]] car il encore sous le choc d'une attaque d'araignées de gorges.
Présidente d'une organisations d’amélioration du voisinage, elle s'élève contre la suppression des [[arbres métalliques noirs|Les arbres métalliques noirs]].
Cependant sa protestation ocille entre la psalmodie et le délire. Elle est alors emmenée au [[CHU|Le CHU]] en [[hélicoptère|Les hélicoptères]] ou son état se stabilisera.
Opérateur du standard à [[la station de radio|La station de radio]].

Il y est absorbé par la direction lors d'une des rares sorties de cette dernière.
Dans l'[[épisode 4|E4]], elle se réunit dans [[l'auditorium du centre de loisirs|L'auditorium du centre de loisirs]] et subit l'ouverture d'une déchirure spatio-temporelle d'où s'échappent des ptérodactyles (pris au départ pour des ptéranodons) ainsi qu'un son continu et malsain. 
Les dégâts sont très importants, tant humains (38 morts) que matériels. 
La réunion abordait des sujets passionnants tel la balancoire, le prix de la cantine, le rapport entre cartable et autisme...
Grande Rue, près d'un terrain de handball.

C'est là qu'a lieu la [[déchirure spatio-temporelle|La déchirure spatio-temporelle]] pendant la réunion de [[l'association des parents d’élèves de Valnuit|L'association des parents d’élèves de Valnuit]].
Il existe un aéroport à Valnuit, signalé dans l'[[Episode 6|E6]].
En charge du dossier [[Hiram Mc Daniels|Hiram Mc Daniels, le dragon]]. ([[Episode 2]])
Prépare un spectacle d’automne « Il était une fois sur cette île ». ([[Episode 5|E5]])
Elle recherche des candidats pour ce spectacle et montre des critères de recrutements assez curieux (connaissance ne programmation Fortran, tir, survie, test de radiation, ...).
Près de chez [[La vieille Josette]]
Président du comité du Marché bio : [[Tristan Cortez]]

S'est décidé à vendre des fruits et légumes au bout de 15 ans d'existence suite à des études de marché encore controversées en interne.
Lieu d'une forte activité d'espionnage intérieur.
Gère un marché et une épicerie.
Citée dans l'[[Épisode 7|E7]], où elle est en charge de la rénovation des routes et de la signalisation associée. Elle fait pour cela appel à Kara Walker, artiste contemporain, qui profite du projet pour transmettre un message politique fort sur l'esclavage et la déshumanisation.

On apprend également dans cet épisode que l'absence de dons de pourboires aux chefs d'équipe de la DLT favoriserait l'apparition de dolines.

~~[Une [[doline|https://fr.wikipedia.org/wiki/Doline]] est une formation géologique particulière en milieu karstique, en forme de dépression circulaire allant jusqu'à plusieurs centaines de mètres]~~
Signalée pour la première fois dans l'[[épisode 6|E6]] où elle essaye de comprendre la cause de certaines [[coupures électriques|Les coupures électriques]].
Cette forme n'existe pas.
D'ailleurs personne n'en parle.

Ne pas confondre avec [[les silhouettes encapuchonnées|Les silhouettes encapuchonnées]], ça n'a rien à voir. Rien.Même si dans les deux cas, il ne faut pas regarder dans leur direction.

Ceci dit, il semble que les historiens locaux aient manifesté contre l’enlèvement de cette Forme du [[parc|Le parc paroissial]] ([[Episode 5|E5]]).
La Forme a gémi et trembloté (sans exister, oui).
Le [[conseil municipal|Le Conseil Municipal]] l'a été déplacée en face de [[la station de radio|La station de radio]] où elle finit par vaporiser [[Lucas]], l'interne du moment.
Arrivée signalée par [[Henri Leroy]].
Elle est arrivée du côté de [[La concession Automobile|La Concession Automobile]] (sans affecter [[la vieille Josette|La vieille Josette]] néanmoins) puis a contaminé toute la ville.

Espérons qu'elle partira contaminer [[Saint-Falaise]], après !
Au service du [[conseil municipal|Le Conseil Municipal]], elle a une présence importante à Valnuit, s'impliquant dans la vie quotidienne. Ce qui transparaît dans les émissions d'[[Emile Pellerin]] puisqu'elle est citée presque à chaque épisode.
Ne sont repris ici que ce qui nous a paru significatif.

Possède des [[hélicoptères bleus|Les hélicoptères]] dénués d’immatriculation. ([[Episode 1|E1]])

L'officier Ben est en charge du dossier [[Hiram Mc Daniels|Hiram Mc Daniels, le dragon]]. ([[Episode 2|E2]])

A un magasin de sport comme couverture ([[EntreSport]]). ([[Episode 3|E3]])

Dans [[l'épisode 4|E4]], on indique qu'elle prend une personne par famille en otage (le temps des élections municipales) dans le puit de mine abandonné à l'extérieur de la ville.
"Inconnaissable" le temps d'une rénovation dont on ne connait pas la teneur. ([[Episode 2|E2]])

Des [[arbres métalliques noirs|Les arbres métalliques noirs]] non-identifiables sont apparus à proximité "en juin" puis ont été enlevés. ([[Episode 6|E6]])

Dans l'[[Épisode 7|E7]], résultat d'un sondage.
Insatisfaction des citoyens concernant la bibliothèque municipale : les ordinateurs sont jugés trop lents, son cercle de jaspe sanguin est mal entretenu, la mortalité dans son enceinte au dessus de la moyenne). Il semble qu'au moins un spectre hante les lieux (et tue des usagers).
Là où apparaît [[le Nuage Luminescent|Le Nuage Luminescent]] dans l'épisode 2.
Dite aussi "le portail".
Celui-ci s'est ouvert dans [[l'auditorium du centre de loisirs|L'auditorium du centre de loisirs]] en pleine réunion de [[l'association des parents d’élèves de Valnuit|L'association des parents d’élèves de Valnuit]], dans [[l'épisode 4|E4]]. Des [[ptérodactyles|Les ptérodactyles]] s'en sont échappés, heureusement tous renvoyés un peu plus tard par ce même portail.
Il semble que plusieurs joueurs de handball curieux aient passés la tête à travers le portail et en soient revenus vieillis de plusieurs siècles, oscillant entre "flétrissement millénaire et folie totale". Il est indiqué - au passage - que ce type d'atteintes (dommages physiologiques ou émotionnels) ne sont plus reconnus par la Sécurité Sociale...
Construite par [[le syndicat des commerçant|Le syndicat des commerçants de Valnuit]]
à l’aide de matériaux écologiques et recyclés

On apprend dans l'[[Épisode 7|E7]], par un communiqué du même syndicat des commerçants, que cette marina n'aurait jamais existé et que ce projet n'est donc pas un énorme fiasco ni un trou noir financier. Toute vision d'un bâtiment de cette marina ne serait qu'une hallucination.
Dans l'[[Episode 7|E7]], [[Emile|Emile Pellerin]] nous donne l'occasion de découvrir l'histoire de Valnuit.

!-4000, Premiers campements humains à Valnuit

Extrapolations à partir de taches : quelques peintures de formes et inhumaines qui les surveillaient au loin

!1745, Les premiers hommes arrivèrent à Valnuit

Un peu par hasard, quelques groupes d'explorateurs se posent et fondent Valnuit

!1824, Premier meeting du Conseil des Anciens de la Ville

Prédécesseurs du [[Conseil MunicipalLe Conseil Municipal]]
Un curieuse allusion à des couronnes de viande molle rapelle l'information transmise dans l'[[Episode 4|E4]] lors de la découverte d'un [[ptérodactyles|Les ptérodactyles]] mort près du [[parc à chien|Le parc à chiens]].
Il semble que de nombreux "rituels"^Wprocessus civiques encore d'actualités aient été créés à ce moment là mais les comptes-rendus de réunion ont été détruits et Emile ne peut en dire plus.

!1943, l'action de Résistance, les citoyens de Valnuit
Ils ont choisis de psalmodier autour de pierres de jaspe sanglant //[une pierre qui a servi à graver des scènes de la crucifixion, et qu'on appelait du coup la pierre des martyrs]//.
Il est certain que cette action fut décisive dans le dénouement de la seconde guerre mondiale, mais le gouvernement a exigé la destruction d'un monument érigé dans le parc paroissial en honneur à cette action.

Des informations éparses sont données, dont une sur [[la vieille Josette|La vieille Josette]] qui déplace un paquet suspect d'un coin de son jardin vers un autre.

Quelques prédictions malheureuses sont proposées pour cette date.
Là où travaille [[Emile Pellerin]].

!!Les stagiaires

[[Charles]] était stagiaire. Mort en mission.([[Episode 3|E3]])
[[Jérôme Lanqueur]] était opérateur du standard l'après-midi. Absorbé par la direction.([[Episode 3|E3]])
[[Lucas]] était interne, il fut vaporisé par un rayon lumineux émanant sans doute de [[la Forme dont Personne Ne Parle|La Forme dans le Parc Paroissial]] ([[Episode 5|E5]])

!!La direction

La direction reste enfermée dans son bureau ([[épisode 3|E3]]), dans lequel personne ne doit pénétrer. Ce qui ne facilite pas les entretiens annuels. 
La direction communique via enveloppes scellées, les salariés doivent répondre en criant vers la porte.

La porte du bureau de la direction est translucide. On a aperçu derrière de grandes formes remuantes, avec d’étranges vrilles fouettant l’air...

Dans l'[[épisode 3|E3]], la direction sort de son bureau pour la première fois et Emile en profite pour s'y cacher. [[Jérôme Lanqueur]], opérateur du standard l'après midi, est allé à leur rencontre mais s'est fait absorber !

!!La vie de la station

Dans [[l'épisode 2|E2]], on y trouve un chat flottant dans les toilettes.

Dans l'[[épisode 5|E5]], la [[Forme dont Personne Ne Reconnaît l’Existence|La Forme dans le Parc Paroissial]] est placée en face de la station. Elle y génère des mini-tornades et vaporise l'interne du moment, sans doute à cause d'[[Emile|Emile Pellerin]] qui transgresse l'interdiction de parler d'elle.

Toujours dans l'[[épisode 6|E6]], [[Emile|Emile Pellerin]] fait appel aux auditeurs pour des dons. Appel qui réussit avec UN donc de 45000€ (une allusion //peu// subtile indique que le donateur serait Otto Perez Molina, un ancien président du Guatemala ayant démissionné suite à un scandale de corruption).
Proche de [[la départementale D800]]
Utilisée par [[Carlos]] et son équipe
Leurs sismographes ont détecté de violentes secousses sismiques
Personne ne semble les ressentir
Habite près de [[la Concession Automobile|La Concession Automobile]] ([[épisode 1|E1]])
A vu [[les anges|Les anges]]

Est d'accord avec la décision de supprimer la porte plaquée au plomb dans [[les gorges de Radon|Les gorges de Radon]] ([[épisode 4|E4]]).

A vu [[Ingrid Bergman]] prendre de l'essence près du bowling ([[épisode 5|E5]])
Son existence est signalée dans l'[[Episode 6|E6]].

On y amène [[Juanita Josserand]] alors qu'elle délire aux sujet des [[arbres métalliques noirs|Les arbres métalliques noirs]].
Gère la police secrète.
Collabore avec [[les agents gouvernementaux|Des agents gouvernementaux]].
Présidé par [[Pamela Vasseur]], son énergique, quoiqu'étrange, maire.

Possède des preuves troublantes (et sous scellés) concernant le récent incident ([[épisode 1|E1]]) survenu au [[bureau de poste de Valnuit|Le bureau de poste de Valnuit]].
Annonce l'ouverture du [[parc à chiens|Le parc à chiens]].
Merci de signaler toute apparition d'[[ange|Les anges]].

Interroge les valnuitains, avec les agents gouvernementaux, sur leurs étranges pensées et les apparitions mystérieuses ([[épisode 2|E2]]).

Demande (via [[Emile|Emile Pellerin]]) de se rappeler que tout déchet signalé d’un petit drapeau rouge ne doit être ni ramassé ni approché : "Pas d’drapeau ? Vas dans l’pot. Drapeau rouge ? FUIS !" ([[épisode 3|E3]]).
Pense que [[les livres|Les livres cessent de fonctionner]] sont dangereux, fortement déconseillés et qu’ils ne devraient pas être conservés dans les foyers.

Menace d'emprisonnement toute personne voyant des auras étranges autour de certains objets ([[épisode 4|E4]]).
Vote l'enlèvement de la grande porte plaquée au plomb des [[gorges de Radon|Les gorges de Radon]].

Décide du déplacement de [[la Forme dont Personne Ne Parle|La Forme dans le Parc Paroissial]] en face de [[la station de radio|La station de radio]] ([[épisode 5|E5]]).
Equipement :
[[stade Allan Kardec|Le stade Allan Kardec du Lycée]]

Possède un club de football ([[Les scorpions|Les Scorpions de Valnuit]]), dont fait partie [[Michel Sandero]], géré par [[Nazr Al-Mujaheed]].

Dans l'[[Épisode 1|E1]], un avion y apparaît dans le gymnase (sans doute un mauvais coup de [[Saint-Falaise]]).
Le lycée met en place des détecteurs de métaux dans l'[[Épisode 7|E7]], ce qui provoque un scandale chez les parents et étudiants.
Apparaît dans l'épisode 2, venant de l'ouest (repéré au dessus de [[la corniche Ouest|La corniche Ouest]]). Il luit de multiples couleurs, et semble émettre un sifflement sourd.
C'est [[Jean-Pierre, le fermier]] qui le signale.

Le nuage semble faire pleuvoir de petites créatures déjà mortes sur le sol : Des tatous, des lézards, quelques corbeaux.

Après avoir atteint la verticale du vieux Valnuit, le nuage a grossi jusqu'à recouvrir la totalité de Valnuit, rendant [[Emile Pellerin]] un peu hystérique pendant un instant.

Il est ensuite reparti.
Trois effondrements en trois mois, et les ingénieurs et  équipes de constructions toujours dépassées, cherchant vainement une solution. 
Les auditeurs sont invités à en proposer. (des solutions).

L'adresse des ingénieurs est Pont Magique S.A., Boîte Postale 616

[[Le Conseil Municipal]] est très critiqué pour sa mauvaise gestion. 
En particulier par un individu, [[Stéphane Carlsberg]], qui dénonce l'inutilité du pont vu qu'il n'y a ni rivière ni bateau à Valnuit.
Ce qui ne plaît pas du tout à [[Emile|Emile Pellerin]], qui en profite pour rappeler dans son édito que ces projets chers et ambitieux deviennent parfois réalité, comme la construction du beffroi invisible. Il traite [[Stéphane Carlsberg]] de rabat-joie, tout juste bon à rejoindre [[Saint-Falaise]] ...

Le Conseil municipal a réagi en augmentant fortement le budget (20 millions d'euros sur 14 ans).

//NB : première apparition de cette vieille ville, sauf erreur.//
Le club de football du [[Lycée|Le Lycée]] de Valnuit.
Dans l'[[Épisode 5|E5]], ce club est appellé "[[Les Scorpions de Valnuit]]".

Son entraîneur est [[Nazr Al-Mujaheed]].

Dans l'[[Épisode 4|E4]], le club se prépare à défendre son titre face à Saint-Falaise.
S'il souhaite éviter la pestilence envoyée par le gouvernement après une saison perdante, il aura besoin de [[Michel Sandero]].

Il prend sa revanche dans l'[[Épisode 7|E7]] contre le Dynamo de [[Saint-Falaise]]. [[Michel Sandero]] pense que l'aide [[des anges|Les anges]] a été décisive, mais son jugement est controversé (une enquête a été ouverte).
"Ils" nous appellent à les rejoindre dans cet endroit, pour se blottir avec "eux, à pas cher en plus...
Un long hurlement y a été entendu.
[[Le pisteur indien]] a décidé dans [[l'épisode 1|E1]] qu'il allait enquêter sur ce hurlement.

Dans [[l'épisode 2|E2]], le même pisteur prétend avoir vu (malgré la surveillance mise en place par [[le conseil municipal|Le Conseil Municipal]]) du désordre dans les paquets, des traces de chair carbonisée et un message écrit en lettres de sang : "D’autres, encore… et bientôt".
Trouvé dans les toilette des hommes de [[la station de radio|La station de radio]], ce chat flotte à environ un mètre vingt au-dessus du sol près du lavabo, dans une sorte de cage invisible.
A reçu un lion mort sur le toit pendant l'apparition du [[Nuage Luminescent|Le Nuage Luminescent]].
Possède des [[hélicoptères|Les hélicoptères]] noirs sans immatriculation.

Pourrait utiliser [[le magasin d’équipement sportif discount et d’occasion|Le magasin d’équipement sportif discount et d’occasion]] comme façade. [[Charles]], le stagiaire de la radio y a été envoyé il y a plusieurs semaines ([[épisode 3|E3]]) pour enquête mais n'est pas revenu.
Un avion y est apparu
Les [[Pumas de Valnuit]] (handball)
Les [[Les Cactus de Saint-Falaise]] (les adversaires au handball)
Le magasin a brûlé il y a des années mais Louis propose de s'y rendre, de faire comme s'il était là à donner des leçons de musique (50€).
Rue des Acacias
Serait une façade pour [[le gouvernement mondial|Le gouvernement mondial]].

Équipé d'une piste d’atterrissage pour [[hélicoptère noirs|Les hélicoptères]], de laquelle décollent et atterrissent régulièrement des hélicoptères noirs...
[[Charles]], le stagiaire de la radio, y a été envoyé acquérir une raquette de tennis (prétexte à enquête).
Annoncé dans [[l'épisode 3|E3]] par [[le syndicat des commerçants|Le syndicat des commerçants de Valnuit]], il est situé près de [[la marina et parc de récration aquatique|La marina et parc de récréation aquatique de Valnuit]] (construite par ce même syndicat).
Il est prévu qu'il ne soit ouvert que le 10 novembre pour la Parade Annuelle des Mystérieuses [[Figures Encapuchonnées|Les silhouettes encapuchonnées]].
([[Episode 5|E5]])
Les historiens ont manifesté contre l’enlèvement de [[la Forme|La Forme dans le Parc Paroissial]] du parc.
Mais la mairie indique que les seuls travaux sont réalisés pour installer de nouveaux équipements (balançoire, espace de pique-nique, décorations).
Annoncé par [[le conseil municipal|Le Conseil Municipal]] dans [[l'épisode 1|E1]].

Aux coins des rues Lecomte et Couchant
Près de [[Chez Raphael]]
Ne pas regarder dans sa direction, surtout ne pas regarder [[les silhouettes encapuchonnées|Les silhouettes encapuchonnées]]
Semble d’origine slave, mais porte quand même une coiffe d’indien toute droit sortie d’une bande dessinée raciste
Enquête sur le hurlement entendu au [[bureau de Poste|Le bureau de poste de Valnuit]] dans [[l'épisode 1|E1]].
Difficile de le prendre au sérieux, avec cette coiffe.

Dans l'[[Épisode 2|E2]], il prétend qu'il a utilisé une magie indienne pour pénétrer dans le lieux et qu'il y a découvert des traces de chairs carbonisées, des écritures sur le mur et un grand désordre.

Dans l'[[Épisode 7|E7]], plusieurs semaines après, il semble que personne n'ait plus vu ce personnage. Sa maison a disparu. Le terrain qui l'entourait est maintenant évité par les enfants.
Situé à l'extérieur de la ville ([[Episode 4|E4]]).

[[La Police Secrète Municipale]] y enferme des citoyens illégalement depuis longtemps. L'endroit est aménagé de façon agréable : lits extra-larges, wi-fi gratuit et Canal +.
Il y existerait aussi des salles de tortures.
Signalé dans l'[[Episode 6|E6]], le stade accueille la rencontre annuelle de rugby entre la brigade de pompiers de Valnuit et la [[Police Secrète Municipale|La Police Secrète Municipale]].
Dirigé par [[Madeleine Lafleur]].

Initie la campagne “Valnuit Visitable” dans l'épisode 2.

Dans l'épisode 7, sa directrice rappelle à l'ordre l'agresseur télépathique des touristes (qui se mettent à gaspiller des brochures touristiques en se les enfonçant dans les yeux). Elle dispose d'ailleurs du soutien de la mairie (qui parle d'//infractions psychologiques//). Pour toute information au sujet de l'agresseur, le syndicat offre un ou deux chiots (un de ces chiots dont les locaux municipaux sont envahis). Même sans information, d'ailleurs.
A construit [[la marina|La marina et parc de récréation aquatique de Valnuit]]

Dans [[l'épisode 3|E3]], il annonce la construction d'un nouveau stade de 50 000 places.
L'équipe concurrente de handball.
Mais ils sont mauvais et viles. "Quelle honte, [[Saint-Falaise]]. Quelle honte !"

On se demande si ce ne sont pas eux qui ont envoyé un avion dans [[le gymnase|Le gymnase du lycée de Valnuit]] ([[épisode 1|E1]])
Autre nom, il semble du [[racing club de foot|Le Racing Club de Valnuit]] (dans l'[[Episode 5|E5]].
Apparus chez [[Josette|La vieille Josette]]. Elle a déclaré qu’ils faisaient 3m de haut, étaient luminescents et que l’un d’entre eux était noir. Lui aurait changé une ampoule...
Existence de la hiérarchie angélique et des niveaux au sein du paradis. [[Le Conseil Municipal]] rappelle que vous ne devriez rien savoir du tout à ce sujet.

Ont assisté à la réunion du [[Conseil Municipal|Le Conseil Municipal]] où a été voté l'enlèvement de [[la porte plaquée au plomb des gorges du Radon|Les gorges de Radon]] ([[épisode 4|E4]]).
Ils apparaissent près de [[La bibliothèque|La bibliothèque municipale]].
Ils ont cette particularité de faire prendre feu à tout objet aéroporté s’élevant au dessus de 10 mètres !!

Apparus "en juin", ils sont enlevés dans l'[[Episode 6|E6]] opur être remplacés par un centre commercial et un parking.
Dans l'[[épisode 6|E6]], [[Emile|Emile Pellerin]] signale des coupures électriques discontinues et provoquant l'étrange sensation de ne plus être tout à fait soi-même.

[[La Direction Municipale de l'Equipement de Valnuit]] travaille sur le sujet. 
“Une vue à vous couper le souffle. Pour de vrai.”, dixit la campagne “Valnuit Visitable” lancée par le [[syndicat d'initiative de Valnuit|Le syndicat d'initiatives de Valnuit]] ([[épisode 2|E2]]).

[[Episode 4|E4]], est voté par [[le Conseil Municipal|Le Conseil Municipal]] l'enlèvement de la grande porte plaquée en plomb du creux le plus au nord-ouest des gorges de Radon. 
Cet endroit d' "où pulse de la lumière verte et où l’on entend des murmures de basses sotto voce"...
Il parait que des [[anges|Les anges]] ont assisté à la délibération du Conseil. 
La [[vieille Josette|La vieille Josette]], elle, est d’accord avec cette décision, et a ajouté que le plomb est dangereux pour la santé...
Noirs et dénués d’immatriculation : [[gouvernement mondial|Le gouvernement mondial]]
Bleus : [[Police Secrète Municipale|La Police Secrète Municipale]]
Décorés de fresques complexes représentant des oiseaux de proie attaquant en piqué : dangereux

Dans l'[[Episode 6|E6]], les hélicoptères noirs survolent Valnuit pour s'assurer que tous les citoyens se rendent sur le [[stade Allan Kardec|Le stade Allan Kardec du Lycée]] pour le match de rugby confrontant les équipes de [[la brigade de pompiers|Les pompiers]] et de [[la police secrète|La Police Secrète Municipale]].

Un hélicoptère, piloté par un couple d’épileptiques, sert de transport d'urgence vers le [[CHU de Valnuit|Le CHU]].
Il semble ([[épisode 3|E3]]) que les livres aient cessés de fonctionner. On ne sait pas pourquoi, mais les gens évoquent "étincelles", "odeur de viande", "mordre" et "gaz mortel".
[[Le conseil municipal|Le Conseil Municipal]] déconseille fortement leur lecture ou même leur possession.
Il existe une brigade de pompiers à Valnuit.

Dans l'[[Episode 6|E6]], on apprend la tenue prochaine d'un match entre cette brigade et l'équipe de [[la police secrète|La Police Secrète Municipale]] au [[stade|Le stade Allan Kardec du Lycée]] du [[Lycée|Le Lycée]].
[[Episode 1|E1]] : "Regardez vers le nord. Continuez à regarder. Rien ne provient du sud."
[[Episode 2|E2]] : "Les hommes viennent de Mars, les femmes de Venus. La Terre est une hallucination, les podcasts sont des rêves."
[[Episode 3|E3]] : "Il y a un lieu spécial en Enfer. C’est très hype, très exclusif."
[[Episode 4|E4]] : "Un million d’euros n’a rien de cool. Vous savez ce qui est cool ? Un basilique."
[[Episode 5|E5]] : "Qu’est-ce qui a quatre jambes le matin, deux jambes le midi, et trois jambes le soir ? Je ne sais pas, mais je l’ai enfermé dans ma chambre. Envoyez de l’aide."
[[Episode 6|E6]] : "Perdu ? Confus ? Vous manquez d’un but ? Vous cherchez un sens à votre vie ?."
[[Episode 7|E7]] : "Il doit être 15h23 quelque part. Peut être dans l’espace ?"
[[Episode 8|E8]] : "Nous vivons dans un monde immatériel - un monde fantôme et je suis un gars immatériel - un fantôme."
"L’affaire de l’attaque des ptéranodons"

Appelés à tort ptéranodons, il s'agit en réalité tout bêtement de ptérodactyles. C'est la [[Police Secrète|La Police Secrète Municipale]] qui a rétabli la vérité.
Ceux-ci apparaissent, sortant d'une déchirure spatio-temporelle en pleine réunion de [[parents d'élèves|L'association des parents d’élèves de Valnuit]]. Ils semblent s'en prendre en priorité aux femmes à lunettes. Le seul expert local - [[Joël Eisenberg]] - n'est pas disponible, donc on n'en saura pas plus.
Les bêtes ont été ramenées vivantes dans le vortex dont elles étaient issues. Sauf une dont on n'a pu ramener que le corps dépouillé de toute chair - sauf une partie de ses organes enroulés autour de sa tête comme une couronne - et trouvé près de l'entrée du [[parc à chien|Le parc à chiens]] (vous êtes priés de ne pas entrer, regarder, ou penser trop longtemps à ce parc !).

La [[Police Secrète|La Police Secrète Municipale]] a indiqué qu'il fallait "se recouvrir de crème solaire à bas indice de protection solaire et se cacher dans une salle de bains à sol carrelé" pour se protéger.
Les grades :
* Louveteau, 
* Scout, 
* Pionnier, 
* Scout du Pacte Sanglant, 
* Scout Bizarre, 
* Scout Cuirassé, 
* Scout Ténébreux, 
* Scout Terrifiant, 
* et, enfin, Scout Eternel.

Le recrutement reste automatique et aléatoire, signalé par une lettre écarlate.
Ne pas regarder

Sauf le 10 novembre pour "la Parade Annuelle des Mystérieuses Figures Encapuchonnées" (E3).

Les silhouettes se retrouvent à différents endroits : [[le parc à chiens|Les silhouettes encapuchonnées]] ou sous le toboggan de la cour de l’école primaire.
Il arrive qu'elles volent des bébés en plein jours sans que personne ne réagissent ! 
Il semble que les tarentules de Valnuit connaissent des problèmes non négligeables : analphabétisme, grosses non désirées, crimes violents, .... ([[Episode 5|E5]]).
Un programme parascolaire propose de leur apprendre à lire.
|Description:|Intelligently limit the number of backup files you create|
|Author:|Simon Baird|
You end up with just backup one per year, per month, per weekday, per hour, minute, and second.  So total number won't exceed about 200 or so. Can be reduced by commenting out the seconds/minutes/hours line from modes array
Works in IE and Firefox only.  Algorithm by Daniel Baird. IE specific code by by Saq Imtiaz.

var MINS  = 60 * 1000;
var HOURS = 60 * MINS;
var DAYS  = 24 * HOURS;

if (!config.lessBackups) {
  config.lessBackups = {
    // comment out the ones you don't want or set config.lessBackups.modes in your 'tweaks' plugin
    modes: [
      ["YYYY",  365*DAYS], // one per year for ever
      ["MMM",   31*DAYS],  // one per month
      ["ddd",   7*DAYS],   // one per weekday
      //["d0DD",  1*DAYS],   // one per day of month
      ["h0hh",  24*HOURS], // one per hour
      ["m0mm",  1*HOURS],  // one per minute
      ["s0ss",  1*MINS],   // one per second
      ["latest",0]         // always keep last version. (leave this).

window.getSpecialBackupPath = function(backupPath) {

  var now = new Date();

  var modes = config.lessBackups.modes;

  for (var i=0;i<modes.length;i++) {

    // the filename we will try
    var specialBackupPath = backupPath.replace(/(\.)([0-9]+\.[0-9]+)(\.html)$/,

    // open the file
    try {
      if (config.browser.isIE) {
        var fsobject = new ActiveXObject("Scripting.FileSystemObject")
        var fileExists  = fsobject.FileExists(specialBackupPath);
        if (fileExists) {
          var fileObject = fsobject.GetFile(specialBackupPath);
          var modDate = new Date(fileObject.DateLastModified).valueOf();
      else {
        var file = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
        var fileExists = file.exists();
        if (fileExists) {
          var modDate = file.lastModifiedTime;
    catch(e) {
      // give up
      return backupPath;

    // expiry is used to tell if it's an 'old' one. Eg, if the month is June and there is a
    // June file on disk that's more than an month old then it must be stale so overwrite
    // note that "latest" should be always written because the expiration period is zero (see above)
    var expiry = new Date(modDate + modes[i][1]);
    if (!fileExists || now > expiry)
      return specialBackupPath;

// hijack the core function
window.getBackupPath_mptw_orig = window.getBackupPath;
window.getBackupPath = function(localPath) {
  return getSpecialBackupPath(getBackupPath_mptw_orig(localPath));


|''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);
Derrière [[l’école primaire]]
Avec sa maison qui n’existe pas (d’après [[Carlos]])
Ancien propriétaire du [[magasin de musique|Le magasin de musique “Chez Louis”]] aujourd'hui carbonisé.
Il est parti en empochant l'argent de l'assurance mais continue de proposer des cours, payants, même en son absence.
Interne à [[la station de radio|La station de radio]], il disparaît, vaporisé par [[la Forme dont Personne Ne Veut Parler|La Forme dans le Parc Paroissial]].
Il est enterré dans la salle de pause (il semble que cela soit la coutume).
L’association locale des chasseurs valnuitains
dite aussi ALCV

Distribue des stickers
Directrice du [[syndicat d'initiatives de Valnuit|Le syndicat d'initiatives de Valnuit]].
<<tag Personnages>>
<<tag Organisations>>
<<tag Lieux>>
<<tag Etrange>>
<<tag Episodes>>
<<tag Divers>>
  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),

  ga('create', 'UA-62747105-1', 'auto');
  ga('send', 'pageview');

Attaquant junior au [[racing club de football|Le Racing Club de Valnuit]] de Valnuit.

L'année précédent l'[[Episode 4|E4]], Michel était mauvais en raison de sa paralysie cérébrale et de son pied en moins (une punition suite à un retour de livres en retard à [[la bibliothèque|La bibliothèque municipale]]). 
Un éclair "intelligent" l'a frappé entre les deux saisons, le rendant (beaucoup) plus fort et (un peu) plus intelligent. Il a fait de gros progrès depuis ce moment. Il a toute la confiance de son [[entraîneur|Nazr Al-Mujaheed]] pour la saison à venir.

Il développe une seconde tête dans l'[[Episode 5|E5]], qui serait plus intelligente que la première et que sa mère préfèrerait... Au conditionnel, rien n'ayant été vérifié.
Name: MptwBlack
Background: #000
Foreground: #fff
PrimaryPale: #333
PrimaryLight: #555
PrimaryMid: #888
PrimaryDark: #aaa
SecondaryPale: #111
SecondaryLight: #222
SecondaryMid: #555
SecondaryDark: #888
TertiaryPale: #222
TertiaryLight: #666
TertiaryMid: #888
TertiaryDark: #aaa
Error: #300

Name: MptwBlue
Background: #fff
Foreground: #000
PrimaryPale: #cdf
PrimaryLight: #57c
PrimaryMid: #114
PrimaryDark: #012
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
Error: #f88

// Pretty sure this is incomplete and experimental
// TODO: Fix it or remove it.


  mptwCollapse: {
    handler: function(place,macroName,params) {
      createTiddlyButton(place, params[0] == '+' ? '\u25AD' : '\u25AC', 'collapse/uncollapse', function(){

/* this doesn't work unless you have a modified ViewTempate */
config.shadowTiddlers["MptwCollapsePluginStyles"] = ""
  +".collapsed .uncollapsedView { display:none;       }"
  +".collapsedView              { display:none;       }"
  +".collapsed .collapsedView   { display:block;      }"
  +".tiddler.collapsed          { padding-bottom:1em; }"
  +".tiddler.collapsed .title   { font-size:100%;     }"



|Description:|Miscellaneous tweaks used by MPTW|
|Author:|Simon Baird <simon.baird@gmail.com>|
!!Note: instead of editing this you should put overrides in MptwUserConfigPlugin
var originalReadOnly = readOnly;
var originalShowBackstage = showBackstage;

config.options.chkHttpReadOnly = false;  // means web visitors can experiment with your site by clicking edit
readOnly = false;                        // needed because the above doesn't work any more post 2.1 (??)
showBackstage = true;                    // show backstage for same reason

config.options.chkInsertTabs = true;     // tab inserts a tab when editing a tiddler
config.views.wikified.defaultText = "";  // don't need message when a tiddler doesn't exist
config.views.editor.defaultText = "";    // don't need message when creating a new tiddler

config.options.chkSaveBackups = true;         // do save backups
config.options.txtBackupFolder = 'twbackup';  // put backups in a backups folder

config.options.chkAutoSave = (window.location.protocol == "file:"); // do autosave if we're in local file

config.mptwVersion = "2.7.4";


if (config.options.txtTheme == '')
  config.options.txtTheme = 'MptwTheme';

// add to default GettingStarted
config.shadowTiddlers.GettingStarted += "\n\nSee also [[MPTW]].";

// add select theme and palette controls in default OptionsPanel
config.shadowTiddlers.OptionsPanel = config.shadowTiddlers.OptionsPanel.replace(/(\n\-\-\-\-\nAlso see \[\[AdvancedOptions\]\])/, "{{select{<<selectTheme>>\n<<selectPalette>>}}}$1");

// these are used by ViewTemplate
config.mptwDateFormat = 'DD/MM/YY';
config.mptwJournalFormat = 'Journal DD/MM/YY';

Name: MptwGreen
Background: #fff
Foreground: #000
PrimaryPale: #9b9
PrimaryLight: #385
PrimaryMid: #031
PrimaryDark: #020
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
Error: #f88

Name: MptwRed
Background: #fff
Foreground: #000
PrimaryPale: #eaa
PrimaryLight: #c55
PrimaryMid: #711
PrimaryDark: #500
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
Error: #f88

|Description|Mptw Theme with some rounded corners (Firefox only)|



{ -moz-border-radius: 1em; }

.tab {
	-moz-border-radius-topleft: 0.5em;
	-moz-border-radius-topright: 0.5em;
#topMenu {
	-moz-border-radius-bottomleft: 2em;
	-moz-border-radius-bottomright: 2em;


Name: MptwSmoke
Background: #fff
Foreground: #000
PrimaryPale: #aaa
PrimaryLight: #777
PrimaryMid: #111
PrimaryDark: #000
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
Error: #f88

|Description|Mptw Theme with the default TiddlyWiki PageLayout and Styles|
Name: MptwTeal
Background: #fff
Foreground: #000
PrimaryPale: #B5D1DF
PrimaryLight: #618FA9
PrimaryMid: #1a3844
PrimaryDark: #000
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #f8f8f8
TertiaryLight: #bbb
TertiaryMid: #999
TertiaryDark: #888
Error: #f88
|Description|Mptw Theme including custom PageLayout|

http://mptw.tiddlyspot.com/#MptwTheme ($Rev: 1829 $)

<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>
<!-- horizontal MainMenu -->
<div id='topMenu' refresh='content' tiddler='MainMenu'></div>
<!-- original MainMenu menu -->
<!-- <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="uncollapsedView">

<div class="tagglyTagged" macro="tags"></div>

<div class='titleContainer'>
	<span class='title' macro='view title'></span>
	<span macro="miniTag"></span>

<div class='subtitle'>
	(updated <span macro='view modified date {{config.mptwDateFormat?config.mptwDateFormat:"MM/0DD/YY"}}'></span>
	by <span macro='view modifier link'></span>)
	(<span macro='message views.wikified.createdPrompt'></span>
	<span macro='view created date {{config.mptwDateFormat?config.mptwDateFormat:"MM/0DD/YY"}}'></span>)

<div macro="showWhen tiddler.tags.containsAny(['css','html','pre','systemConfig']) && !tiddler.text.match('{{'+'{')">
	<div class='viewer'><pre macro='view text'></pre></div>
<div macro="else">
	<div class='viewer' macro='view text wikified'></div>

<div class="tagglyTagging" macro="tagglyTagging"></div>
<div class="collapsedView">
	<span class='toolbar'>
		<span macro='toolbar closeTiddler'></span>
		<span macro='mptwCollapse +'></span>
	<span class='title' macro='view title'></span>


<div class='toolbar'>
	<span macro="showWhenTagged systemConfig">
		<span macro="toggleTag systemConfigDisable . '[[disable|systemConfigDisable]]'"></span>
	<span macro="showWhenTagged systemTheme"><span macro="applyTheme"></span></span>
	<span macro="showWhenTagged systemPalette"><span macro="applyPalette"></span></span>
	<span macro="showWhen tiddler.tags.contains('css') || tiddler.title == 'StyleSheet'"><span macro="refreshAll"></span></span>
	<span style="padding:1em;"></span>
	<span macro='toolbar closeTiddler closeOthers +editTiddler deleteTiddler > fields syncing permalink references jump'></span> <span macro='newHere label:"new here"'></span>
	<span macro='newJournalHere {{config.mptwJournalFormat?config.mptwJournalFormat:"MM/0DD/YY"}}'></span>
	<!--span macro='mptwCollapse -'></span-->

<div class="toolbar" macro="toolbar +saveTiddler saveCloseTiddler closeOthers -cancelTiddler cancelCloseTiddler deleteTiddler"></div>
<div class="title" macro="view title"></div>
<div class="editLabel">Title</div><div class="editor" macro="edit title"></div>
<div macro='annotations'></div>
<div class="editLabel">Content</div><div class="editor" macro="edit text"></div>
<div class="editLabel">Tags</div><div class="editor" macro="edit tags"></div>
<div class="editorFooter"><span macro="message views.editor.tagPrompt"></span><span macro="tagChooser"></span></div>


/* a contrasting background so I can see where one tiddler ends and the other begins */
body {
	background: [[ColorPalette::TertiaryLight]];

/* sexy colours and font for the header */
.headerForeground {
	color: [[ColorPalette::PrimaryPale]];
.headerShadow, .headerShadow a {
	color: [[ColorPalette::PrimaryMid]];

/* separate the top menu parts */
.headerForeground, .headerShadow {
	padding: 1em 1em 0;

.headerForeground, .headerShadow {
	font-family: 'Trebuchet MS', sans-serif;
.headerForeground .siteSubtitle {
	color: [[ColorPalette::PrimaryLight]];
.headerShadow .siteSubtitle {
	color: [[ColorPalette::PrimaryMid]];

/* make shadow go and down right instead of up and left */
.headerShadow {
	left: 1px;
	top: 1px;

/* prefer monospace for editing */
.editor textarea, .editor input {
	font-family: 'Consolas', monospace;

/* sexy tiddler titles */
.title {
	font-size: 250%;
	color: [[ColorPalette::PrimaryLight]];
	font-family: 'Trebuchet MS', sans-serif;

/* more subtle tiddler subtitle */
.subtitle {
	font-size: 90%;
	color: [[ColorPalette::TertiaryMid]];
.subtitle .tiddlyLink {
	color: [[ColorPalette::TertiaryMid]];

/* a little bit of extra whitespace */
.viewer {

/* don't want any background color for headings */
h1,h2,h3,h4,h5,h6 {
	background-color: transparent;
	color: [[ColorPalette::Foreground]];

/* give tiddlers 3d style border and explicit background */
.tiddler {
	background: [[ColorPalette::Background]];
	border-right: 2px [[ColorPalette::TertiaryMid]] solid;
	border-bottom: 2px [[ColorPalette::TertiaryMid]] solid;
	margin-bottom: 1em;
	padding:1em 2em 2em 1.5em;

/* make options slider look nicer */
#sidebarOptions .sliderPanel {
	border:solid 1px [[ColorPalette::PrimaryLight]];

/* the borders look wrong with the body background */
#sidebar .button {
	border-style: none;

/* this means you can put line breaks in SidebarOptions for readability */
#sidebarOptions br {
/* undo the above in OptionsPanel */
#sidebarOptions .sliderPanel br {

/* horizontal main menu stuff */
#displayArea {
	margin: 1em 15.7em 0em 1em; /* use the freed up space */
#topMenu br {
	display: none;
#topMenu {
	background: [[ColorPalette::PrimaryMid]];
#topMenu {
#topMenu .button, #topMenu .tiddlyLink, #topMenu a {
	margin-left: 0.5em;
	margin-right: 0.5em;
	padding-left: 3px;
	padding-right: 3px;
	color: [[ColorPalette::PrimaryPale]];
	font-size: 115%;
#topMenu .button:hover, #topMenu .tiddlyLink:hover {
	background: [[ColorPalette::PrimaryDark]];

/* make 2.2 act like 2.1 with the invisible buttons */
.toolbar {
.selected .toolbar {

/* experimental. this is a little borked in IE7 with the button 
 * borders but worth it I think for the extra screen realestate */
.toolbar { float:right; }

/* fix for TaggerPlugin. from sb56637. improved by FND */
.popup li .tagger a {

/* makes theme selector look a little better */
#sidebarOptions .sliderPanel .select .button {
#sidebarOptions .sliderPanel .select br {

/* make it print a little cleaner */
@media print {
	#topMenu {
		display: none ! important;
	/* not sure if we need all the importants */
	.tiddler {
		border-style: none ! important;
		margin:0px ! important;
		padding:0px ! important;
		padding-bottom:2em ! important;
	.tagglyTagging .button, .tagglyTagging .hidebutton {
		display: none ! important;
	.headerShadow {
		visibility: hidden ! important;
	.tagglyTagged .quickopentag, .tagged .quickopentag {
		border-style: none ! important;
	.quickopentag a.button, .miniTag {
		display: none ! important;

/* get user styles specified in StyleSheet */


|Description|Mptw Theme with a reduced header to increase useful space|


<!-- horizontal MainMenu -->
<div id='topMenu' macro='gradient vert [[ColorPalette::PrimaryLight]] [[ColorPalette::PrimaryMid]]'>
<span refresh='content' tiddler='SiteTitle' style="padding-left:1em;font-weight:bold;"></span>:
<span refresh='content' tiddler='MainMenu'></span>
<div id='sidebar'>
	<div id='sidebarOptions'>
		<div refresh='content' tiddler='SideBarOptions'></div>
		<div style="margin-left:0.1em;"
			macro='slider chkTabSliderPanel SideBarTabs {{"tabs \u00bb"}} "Show Timeline, All, Tags, etc"'></div>
<div id='displayArea'>
	<div id='messageArea'></div>
	<div id='tiddlerDisplay'></div>

|Description:|A place to put your config tweaks so they aren't overwritten when you upgrade MPTW|
See http://www.tiddlywiki.org/wiki/Configuration_Options for other options you can set. In some cases where there are clashes with other plugins it might help to rename this to zzMptwUserConfigPlugin so it gets executed last.

// example: set your preferred date format
//config.mptwDateFormat = 'MM/0DD/YY';
//config.mptwJournalFormat = 'Journal MM/0DD/YY';

// example: set the theme you want to start with
//config.options.txtTheme = 'MptwRoundTheme';

// example: switch off autosave, switch on backups and set a backup folder
//config.options.chkSaveBackups = true;
//config.options.chkAutoSave = false;
//config.options.txtBackupFolder = 'backups';

// uncomment to disable 'new means new' functionality for the new journal macro
//config.newMeansNewForJournalsToo = false;

Le générique est de Disparition. Il peut être téléchargé sur [[disparition.info|http://disparition.info/]]. 

Chaque épisode est l'occasion de présenter un nouveau groupe.

[[Episode 1|E1]] : [[These and more than these]] par [[J. Fink]] ( J.Fink est un des auteurs de l'édition originale de Valnuit)
[[Episode 2|E2]] : [[Pure Mathematics|https://angilandthehiddentracks.bandcamp.com/track/5-pure-mathematics]] par [[Angil and the Hiddentracks|https://angilandthehiddentracks.bandcamp.com/]]
[[Episode 3|E3]] : Mechanical Credence par [[Narval|http://www.narvalband.com/]]
[[Episode 4|E4]] : Darkness, par [[Bakounine|http://bakounine.bandcamp.com/]]
[[Episode 5|E5]] : Heated Leather Floor, par [[Buddy Peace|http://www.buddypeace.com]]
[[Episode 6|E6]] : Straitjacket, par [[Ray MondHeated|http://raymondmusic.bandcamp.com/]]
[[Episode 7|E7]] : Hello Demon, par [[So Many Lines|https://soundcloud.com/so-many-lines]]
[[Episode 8|E8]] : extrait du quatuor en la mineur de Saverio Mercadante, par [[Quatuor Monzani|http://www.quatuormonzani.com/]]
Entraîneur du [[club de foot|Le Racing Club de Valnuit]] de Valnuit.
|Description:|Creates the new here and new journal macros|
|Author:|Simon Baird <simon.baird@gmail.com>|
merge(config.macros, {
  newHere: {
    handler: function(place,macroName,params,wikifier,paramString,tiddler) {
      wikify("<<newTiddler "+paramString+" tag:[["+tiddler.title+"]]>>",place,null,tiddler);
  newJournalHere: {
    handler: function(place,macroName,params,wikifier,paramString,tiddler) {
      wikify("<<newJournal "+paramString+" tag:[["+tiddler.title+"]]>>",place,null,tiddler);

|Description:|If 'New Tiddler' already exists then create 'New Tiddler (1)' and so on|
|Author:|Simon Baird <simon.baird@gmail.com>|
!!Note: I think this should be in the core

// change this or set config.newMeansNewForJournalsToo it in MptwUuserConfigPlugin
if (config.newMeansNewForJournalsToo == undefined) config.newMeansNewForJournalsToo = true;

String.prototype.getNextFreeName = function() {
  numberRegExp = / \(([0-9]+)\)$/;
  var match = numberRegExp.exec(this);
  if (match) {
  var num = parseInt(match[1]) + 1;
    return this.replace(numberRegExp," ("+num+")");
  else {
    return this + " (1)";

config.macros.newTiddler.checkForUnsaved = function(newName) {
  var r = false;
  story.forEachTiddler(function(title,element) {
    if (title == newName)
      r = true;
  return r;

config.macros.newTiddler.getName = function(newName) {
  while (store.getTiddler(newName) || config.macros.newTiddler.checkForUnsaved(newName))
    newName = newName.getNextFreeName();
  return newName;

config.macros.newTiddler.onClickNewTiddler = function()
  var title = this.getAttribute("newTitle");
  if(this.getAttribute("isJournal") == "true") {
    title = new Date().formatString(title.trim());

  // ---- these three lines should be the only difference between this and the core onClickNewTiddler
  if (config.newMeansNewForJournalsToo || this.getAttribute("isJournal") != "true")
    title = config.macros.newTiddler.getName(title);

  var params = this.getAttribute("params");
  var tags = params ? params.split("|") : [];
  var focus = this.getAttribute("newFocus");
  var template = this.getAttribute("newTemplate");
  var customFields = this.getAttribute("customFields");
  if(!customFields && !store.isShadowTiddler(title))
    customFields = String.encodeHashMap(config.defaultCustomFields);
  var tiddlerElem = story.getTiddler(title);
  var text = this.getAttribute("newText");
  if(typeof text == "string")
    story.getTiddlerField(title,"text").value = text.format([title]);
  for(var t=0;t<tags.length;t++)
  return false;


Maire de Valnuit
Préside [[le Conseil Municipal|Le Conseil Municipal]]

Assure qu'aucun bourdonnement ou autre bruit étrange n'émane du [[parc à chiens|Le parc à chiens]] lors d'une conférence de 90 secondes ([[Episode 6|E6]]).
|''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"

|Description:|Provides a new date format ('pppp') that displays times such as '2 days ago'|
|Author:|Simon Baird <simon.baird@gmail.com>|
* If you want to you can rename this plugin. :) Some suggestions: LastUpdatedPlugin, RelativeDatesPlugin, SmartDatesPlugin, SexyDatesPlugin.
* Inspired by http://ejohn.org/files/pretty.js
Date.prototype.prettyDate = function() {
  var diff = (((new Date()).getTime() - this.getTime()) / 1000);
  var day_diff = Math.floor(diff / 86400);

  if (isNaN(day_diff))      return "";
  else if (diff < 0)        return "in the future";
  else if (diff < 60)       return "just now";
  else if (diff < 120)      return "1 minute ago";
  else if (diff < 3600)     return Math.floor(diff/60) + " minutes ago";
  else if (diff < 7200)     return "1 hour ago";
  else if (diff < 86400)    return Math.floor(diff/3600) + " hours ago";
  else if (day_diff == 1)   return "Yesterday";
  else if (day_diff < 7)    return day_diff + " days ago";
  else if (day_diff < 14)   return  "a week ago";
  else if (day_diff < 31)   return Math.ceil(day_diff/7) + " weeks ago";
  else if (day_diff < 62)   return "a month ago";
  else if (day_diff < 365)  return "about " + Math.ceil(day_diff/31) + " months ago";
  else if (day_diff < 730)  return "a year ago";
  else                      return Math.ceil(day_diff/365) + " years ago";

Date.prototype.formatString_orig_mptw = Date.prototype.formatString;

Date.prototype.formatString = function(template) {
  return this.formatString_orig_mptw(template).replace(/pppp/,this.prettyDate());

// for MPTW. otherwise edit your ViewTemplate as required.
// config.mptwDateFormat = 'pppp (DD/MM/YY)';
config.mptwDateFormat = 'pppp';

|Description:|Changes tag links to make it easier to open tags as tiddlers|
|Author:|Simon Baird <simon.baird@gmail.com>|
config.quickOpenTag = {

  dropdownChar: (document.all ? "\u25bc" : "\u25be"), // the little one doesn't work in IE?

  createTagButton: function(place,tag,excludeTiddler) {
    // little hack so we can do this: <<tag PrettyTagName|RealTagName>>
    var splitTag = tag.split("|");
    var pretty = tag;
    if (splitTag.length == 2) {
      tag = splitTag[1];
      pretty = splitTag[0];

    var sp = createTiddlyElement(place,"span",null,"quickopentag");

    var theTag = createTiddlyButton(sp,config.quickOpenTag.dropdownChar,
    if (excludeTiddler)

  miniTagHandler: function(place,macroName,params,wikifier,paramString,tiddler) {
    var tagged = store.getTaggedTiddlers(tiddler.title);
    if (tagged.length > 0) {
      var theTag = createTiddlyButton(place,config.quickOpenTag.dropdownChar,
      theTag.className = "miniTag";

  allTagsHandler: function(place,macroName,params) {
    var tags = store.getTags(params[0]);
    var filter = params[1]; // new feature
    var ul = createTiddlyElement(place,"ul");
    if(tags.length == 0)
    for(var t=0; t<tags.length; t++) {
      var title = tags[t][0];
      if (!filter || (title.match(new RegExp('^'+filter)))) {
        var info = getTiddlyLinkInfo(title);
        var theListItem =createTiddlyElement(ul,"li");
        var theLink = createTiddlyLink(theListItem,tags[t][0],true);
        var theCount = " (" + tags[t][1] + ")";
        var theDropDownBtn = createTiddlyButton(theListItem," " +

  // todo fix these up a bit
  styles: [
"/* created by QuickOpenTagPlugin */",
".tagglyTagged .quickopentag, .tagged .quickopentag ",
" { margin-right:1.2em; border:1px solid #eee; padding:2px; padding-right:0px; padding-left:1px; }",
".quickopentag .tiddlyLink { padding:2px; padding-left:3px; }",
".quickopentag a.button { padding:1px; padding-left:2px; padding-right:2px;}",
"/* extra specificity to make it work right */",
"#displayArea .viewer .quickopentag a.button, ",
"#displayArea .viewer .quickopentag a.tiddyLink, ",
"#mainMenu .quickopentag a.tiddyLink, ",
"#mainMenu .quickopentag a.tiddyLink ",
" { border:0px solid black; }",
"#displayArea .viewer .quickopentag a.button, ",
"#mainMenu .quickopentag a.button ",
" { margin-left:0px; padding-left:2px; }",
"#displayArea .viewer .quickopentag a.tiddlyLink, ",
"#mainMenu .quickopentag a.tiddlyLink ",
" { margin-right:0px; padding-right:0px; padding-left:0px; margin-left:0px; }",
"a.miniTag {font-size:150%;} ",
"#mainMenu .quickopentag a.button ",
" /* looks better in right justified main menus */",
" { margin-left:0px; padding-left:2px; margin-right:0px; padding-right:0px; }",
"#topMenu .quickopentag { padding:0px; margin:0px; border:0px; }",
"#topMenu .quickopentag .tiddlyLink { padding-right:1px; margin-right:0px; }",
"#topMenu .quickopentag .button { padding-left:1px; margin-left:0px; border:0px; }",

  init: function() {
    // we fully replace these builtins. can't hijack them easily
    window.createTagButton = this.createTagButton;
    config.macros.allTags.handler = this.allTagsHandler;
    config.macros.miniTag = { handler: this.miniTagHandler };
    config.shadowTiddlers["QuickOpenTagStyles"] = this.styles;


|Description:|Allows you to easily rename or delete tags across multiple tiddlers|
|Author:|Simon Baird <simon.baird@gmail.com>|
Rename a tag and you will be prompted to rename it in all its tagged tiddlers.
config.renameTags = {

  prompts: {
    rename: "Rename the tag '%0' to '%1' in %2 tidder%3?",
    remove: "Remove the tag '%0' from %1 tidder%2?"

  removeTag: function(tag,tiddlers) {
    for (var i=0;i<tiddlers.length;i++) {

  renameTag: function(oldTag,newTag,tiddlers) {
    for (var i=0;i<tiddlers.length;i++) {
      var title = tiddlers[i].title;
      store.setTiddlerTag(title, false, oldTag); // remove old
      store.setTiddlerTag(title, true, newTag);  // add new
      store.getTiddler(title).modified = new Date(); // touch modified date

  storeMethods: {

    saveTiddler_orig_renameTags: TiddlyWiki.prototype.saveTiddler,

    saveTiddler: function(title,newTitle,newBody,modifier,modified,tags,fields,clearChangeCount,created,creator) {
      if (title != newTitle) {
        var tagged = this.getTaggedTiddlers(title);
        if (tagged.length > 0) {
          // then we are renaming a tag
          if (confirm(config.renameTags.prompts.rename.format([title,newTitle,tagged.length,tagged.length>1?"s":""])))

          if (!this.tiddlerExists(title) && newBody == "")
            // dont create unwanted tiddler
            return null;
      return this.saveTiddler_orig_renameTags(title,newTitle,newBody,modifier,modified,tags,fields,clearChangeCount,created,creator);

    removeTiddler_orig_renameTags: TiddlyWiki.prototype.removeTiddler,

    removeTiddler: function(title) {
      var tagged = this.getTaggedTiddlers(title);
      if (tagged.length > 0)
        if (confirm(config.renameTags.prompts.remove.format([title,tagged.length,tagged.length>1?"s":""])))
      return this.removeTiddler_orig_renameTags(title);


  init: function() {


Le village ennemi !

Possède une équipe de football (Le Dynamo)
Possède une équipe de handball (Les Cactus)
|Description:|Provides two extra toolbar commands, saveCloseTiddler and cancelCloseTiddler|
|Author:|Simon Baird <simon.baird@gmail.com>|
To use these add them to the commands in ToolbarCommands under EditToolbar,
or in the MptwTheme tiddler under EditTemplate.

  saveCloseTiddler: {
    text: 'done/close',
    tooltip: 'Save changes to this tiddler and close it',
    handler: function(ev,src,title) {
      var closeTitle = title;
      var newTitle = story.saveTiddler(title,ev.shiftKey);
      if (newTitle)
        closeTitle = newTitle;
      return config.commands.closeTiddler.handler(ev,src,closeTitle);

  cancelCloseTiddler: {
    text: 'cancel/close',
    tooltip: 'Undo changes to this tiddler and close it',
    handler: function(ev,src,title) {
      // the same as closeTiddler now actually
      return config.commands.closeTiddler.handler(ev,src,title);


|Description:|Lets you easily switch theme and palette|
|Author:|Simon Baird <simon.baird@gmail.com>|
* Borrows largely from ThemeSwitcherPlugin by Martin Budden http://www.martinswiki.com/#ThemeSwitcherPlugin
* Theme is cookie based. But set a default by setting config.options.txtTheme in MptwConfigPlugin (for example)
* Palette is not cookie based. It actually overwrites your ColorPalette tiddler when you select a palette, so beware.
* {{{<<selectTheme>>}}} makes a dropdown selector
* {{{<<selectPalette>>}}} makes a dropdown selector
* {{{<<applyTheme>>}}} applies the current tiddler as a theme
* {{{<<applyPalette>>}}} applies the current tiddler as a palette
* {{{<<applyTheme TiddlerName>>}}} applies TiddlerName as a theme
* {{{<<applyPalette TiddlerName>>}}} applies TiddlerName as a palette

config.macros.selectTheme = {
  label: {
    selectTheme:"select theme",
    selectPalette:"select palette"
  prompt: {
    selectTheme:"Select the current theme",
    selectPalette:"Select the current palette"
  tags: {

config.macros.selectTheme.handler = function(place,macroName)
  var btn = createTiddlyButton(place,this.label[macroName],this.prompt[macroName],this.onClick);
  // want to handle palettes and themes with same code. use mode attribute to distinguish

config.macros.selectTheme.onClick = function(ev)
  var e = ev ? ev : window.event;
  var popup = Popup.create(this);
  var mode = this.getAttribute('mode');
  var tiddlers = store.getTaggedTiddlers(config.macros.selectTheme.tags[mode]);
  // for default
  if (mode == "selectPalette") {
    var btn = createTiddlyButton(createTiddlyElement(popup,'li'),"(default)","default color palette",config.macros.selectTheme.onClickTheme);
  for(var i=0; i<tiddlers.length; i++) {
    var t = tiddlers[i].title;
    var name = store.getTiddlerSlice(t,'Name');
    var desc = store.getTiddlerSlice(t,'Description');
    var btn = createTiddlyButton(createTiddlyElement(popup,'li'), name?name:t, desc?desc:config.macros.selectTheme.label['mode'], config.macros.selectTheme.onClickTheme);
  return stopEvent(e);

config.macros.selectTheme.onClickTheme = function(ev)
  var mode = this.getAttribute('mode');
  var theme = this.getAttribute('theme');
  if (mode == 'selectTheme')
  else // selectPalette
  return false;

config.macros.selectTheme.updatePalette = function(title)
  if (title != "") {
    if (title != "(default)")

config.macros.applyTheme = {
  label: "apply",
  prompt: "apply this theme or palette" // i'm lazy

config.macros.applyTheme.handler = function(place,macroName,params,wikifier,paramString,tiddler) {
  var useTiddler = params[0] ? params[0] : tiddler.title;
  var btn = createTiddlyButton(place,this.label,this.prompt,config.macros.selectTheme.onClickTheme);
  btn.setAttribute('mode',macroName=="applyTheme"?"selectTheme":"selectPalette"); // a bit untidy here

config.macros.selectPalette = config.macros.selectTheme;
config.macros.applyPalette = config.macros.applyTheme;

config.macros.refreshAll = { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
  createTiddlyButton(place,"refresh","refresh layout and styles",function() { refreshAll(); });

Ce triste individu ose critiquer la gestion du [[Conseil Municipal|Le Conseil Municipal]] sur le projet "[[Pont-Levis|Le Pont-Levis de la Vieille Ville]]". "Quel con" (dixit [[Emile|Emile Pellerin]]). ([[Episode 6|E6]])

La [[Police Secrète Municipale|La Police Secrète Municipale]] semble partager l'avis d'[[Emile|Emile Pellerin]] car Stéphane est enlevé pendant 2 jours avant de réapparaître la tête pleine de bandages et mangeant du polystyrène. ([[Episode 6|E6]])
|Description:|tagglyTagging macro is a replacement for the builtin tagging macro in your ViewTemplate|
|Author:|Simon Baird <simon.baird@gmail.com>|
See http://mptw.tiddlyspot.com/#TagglyTagging


  parseTagExpr: function(debug) {

    if (this.trim() == "")
      return "(true)";

    var anyLogicOp = /(!|&&|\|\||\(|\))/g;
    var singleLogicOp = /^(!|&&|\|\||\(|\))$/;

    var spaced = this.
      // because square brackets in templates are no good
      // this means you can use [(With Spaces)] instead of [[With Spaces]]
      replace(/\[\(/g," [[").
      replace(/\)\]/g,"]] ").
      // space things out so we can use readBracketedList. tricky eh?
      replace(anyLogicOp," $1 ");

    var expr = "";

    var tokens = spaced.readBracketedList(false); // false means don't uniq the list. nice one JR!

    for (var i=0;i<tokens.length;i++)
      if (tokens[i].match(singleLogicOp))
        expr += tokens[i];
        expr += "tiddler.tags.contains('%0')".format([tokens[i].replace(/'/,"\\'")]); // fix single quote bug. still have round bracket bug i think

    if (debug)

    return '('+expr+')';


  getTiddlersByTagExpr: function(tagExpr,sortField) {

    var result = [];

    var expr = tagExpr.parseTagExpr();

    store.forEachTiddler(function(title,tiddler) {
      if (eval(expr))

      sortField = "title";

    result.sort(function(a,b) {return a[sortField] < b[sortField] ? -1 : (a[sortField] == b[sortField] ? 0 : +1);});

    return result;

config.taggly = {

  // for translations
  lingo: {
    labels: {
      asc:        "\u2191", // down arrow
      desc:       "\u2193", // up arrow
      title:      "title",
      modified:   "modified",
      created:    "created",
      show:       "+",
      hide:       "-",
      normal:     "normal",
      group:      "group",
      commas:     "commas",
      sitemap:    "sitemap",
      numCols:    "cols\u00b1", // plus minus sign
      label:      "Tagged as '%0':",
      exprLabel:  "Matching tag expression '%0':",
      excerpts:   "excerpts",
      descr:      "descr",
      slices:     "slices",
      contents:   "contents",
      sliders:    "sliders",
      noexcerpts: "title only",
      noneFound:  "(none)"

    tooltips: {
      title:      "Click to sort by title",
      modified:   "Click to sort by modified date",
      created:    "Click to sort by created date",
      show:       "Click to show tagging list",
      hide:       "Click to hide tagging list",
      normal:     "Click to show a normal ungrouped list",
      group:      "Click to show list grouped by tag",
      sitemap:    "Click to show a sitemap style list",
      commas:     "Click to show a comma separated list",
      numCols:    "Click to change number of columns",
      excerpts:   "Click to show excerpts",
      descr:      "Click to show the description slice",
      slices:     "Click to show all slices",
      contents:   "Click to show entire tiddler contents",
      sliders:    "Click to show tiddler contents in sliders",
      noexcerpts: "Click to show entire title only"

    tooDeepMessage: "* //sitemap too deep...//"

  config: {
    showTaggingCounts: true,
    listOpts: {
      // the first one will be the default
      sortBy:     ["title","modified","created"],
      sortOrder:  ["asc","desc"],
      hideState:  ["show","hide"],
      listMode:   ["normal","group","sitemap","commas"],
      numCols:    ["1","2","3","4","5","6"],
      excerpts:   ["noexcerpts","excerpts","descr","slices","contents","sliders"]
    valuePrefix: "taggly.",
    excludeTags: ["excludeLists","excludeTagging"],
    excerptSize: 50,
    excerptMarker: "/%"+"%/",
    siteMapDepthLimit: 25

  getTagglyOpt: function(title,opt) {
    var val = store.getValue(title,this.config.valuePrefix+opt);
    return val ? val : this.config.listOpts[opt][0];

  setTagglyOpt: function(title,opt,value) {
    // create it silently if it doesn't exist
    if (!store.tiddlerExists(title)) {
      store.saveTiddler(title,title,config.views.editor.defaultText.format([title]),config.options.txtUserName,new Date(),"");

      // <<tagglyTagging expr:"...">> creates a tiddler to store its display settings
      // Make those tiddlers less noticeable by tagging as excludeSearch and excludeLists
      // Because we don't want to hide real tags, check that they aren't actually tags before doing so
      // Also tag them as tagglyExpression for manageability
      // (contributed by RA)
      if (!store.getTaggedTiddlers(title).length) {

    // if value is default then remove it to save space
    return store.setValue(title, this.config.valuePrefix+opt, value == this.config.listOpts[opt][0] ? null : value);

  getNextValue: function(title,opt) {
    var current = this.getTagglyOpt(title,opt);
    var pos = this.config.listOpts[opt].indexOf(current);
    // supposed to automagically don't let cols cycle up past the number of items
    // currently broken in some situations, eg when using an expression
    // lets fix it later when we rewrite for jquery
    // the columns thing should be jquery table manipulation probably
    var limit = (opt == "numCols" ? store.getTaggedTiddlers(title).length : this.config.listOpts[opt].length);
    var newPos = (pos + 1) % limit;
    return this.config.listOpts[opt][newPos];

  toggleTagglyOpt: function(title,opt) {
    var newVal = this.getNextValue(title,opt);

  createListControl: function(place,title,type) {
    var lingo = config.taggly.lingo;
    var label;
    var tooltip;
    var onclick;

    if ((type == "title" || type == "modified" || type == "created")) {
      // "special" controls. a little tricky. derived from sortOrder and sortBy
      label = lingo.labels[type];
      tooltip = lingo.tooltips[type];

      if (this.getTagglyOpt(title,"sortBy") == type) {
        label += lingo.labels[this.getTagglyOpt(title,"sortOrder")];
        onclick = function() {
          return false;
      else {
        onclick = function() {
          return false;
    else {
      // "regular" controls, nice and simple
      label = lingo.labels[type == "numCols" ? type : this.getNextValue(title,type)];
      tooltip = lingo.tooltips[type == "numCols" ? type : this.getNextValue(title,type)];
      onclick = function() {
        return false;

    // hide button because commas don't have columns
    if (!(this.getTagglyOpt(title,"listMode") == "commas" && type == "numCols"))
      createTiddlyButton(place,label,tooltip,onclick,type == "hideState" ? "hidebutton" : "button");

  makeColumns: function(orig,numCols) {
    var listSize = orig.length;
    var colSize = listSize/numCols;
    var remainder = listSize % numCols;

    var upperColsize = colSize;
    var lowerColsize = colSize;

    if (colSize != Math.floor(colSize)) {
      // it's not an exact fit so..
      upperColsize = Math.floor(colSize) + 1;
      lowerColsize = Math.floor(colSize);

    var output = [];
    var c = 0;
    for (var j=0;j<numCols;j++) {
      var singleCol = [];
      var thisSize = j < remainder ? upperColsize : lowerColsize;
      for (var i=0;i<thisSize;i++)

    return output;

  drawTable: function(place,columns,theClass) {
    var newTable = createTiddlyElement(place,"table",null,theClass);
    var newTbody = createTiddlyElement(newTable,"tbody");
    var newTr = createTiddlyElement(newTbody,"tr");
    for (var j=0;j<columns.length;j++) {
      var colOutput = "";
      for (var i=0;i<columns[j].length;i++)
        colOutput += columns[j][i];
      var newTd = createTiddlyElement(newTr,"td",null,"tagglyTagging"); // todo should not need this class
    return newTable;

  createTagglyList: function(place,title,isTagExpr) {
    switch(this.getTagglyOpt(title,"listMode")) {
      case "group":  return this.createTagglyListGrouped(place,title,isTagExpr); break;
      case "normal": return this.createTagglyListNormal(place,title,false,isTagExpr); break;
      case "commas": return this.createTagglyListNormal(place,title,true,isTagExpr); break;
      case "sitemap":return this.createTagglyListSiteMap(place,title,isTagExpr); break;

  getTaggingCount: function(title,isTagExpr) {
    // thanks to Doug Edmunds
    if (this.config.showTaggingCounts) {
      var tagCount = config.taggly.getTiddlers(title,'title',isTagExpr).length;
      if (tagCount > 0)
        return " ("+tagCount+")";
    return "";

  getTiddlers: function(titleOrExpr,sortBy,isTagExpr) {
    return isTagExpr ? store.getTiddlersByTagExpr(titleOrExpr,sortBy) : store.getTaggedTiddlers(titleOrExpr,sortBy);

  getExcerpt: function(inTiddlerTitle,title,indent) {
    if (!indent)
      indent = 1;

    var displayMode = this.getTagglyOpt(inTiddlerTitle,"excerpts");
    var t = store.getTiddler(title);

    if (t && displayMode == "excerpts") {
      var text = t.text.replace(/\n/," ");
      var marker = text.indexOf(this.config.excerptMarker);
      if (marker != -1) {
        return " {{excerpt{<nowiki>" + text.substr(0,marker) + "</nowiki>}}}";
      else if (text.length < this.config.excerptSize) {
        return " {{excerpt{<nowiki>" + t.text + "</nowiki>}}}";
      else {
        return " {{excerpt{<nowiki>" + t.text.substr(0,this.config.excerptSize) + "..." + "</nowiki>}}}";
    else if (t && displayMode == "contents") {
      return "\n{{contents indent"+indent+"{\n" + t.text + "\n}}}";
    else if (t && displayMode == "sliders") {
      return "<slider slide>\n{{contents{\n" + t.text + "\n}}}\n</slider>";
    else if (t && displayMode == "descr") {
      var descr = store.getTiddlerSlice(title,'Description');
      return descr ? " {{excerpt{" + descr  + "}}}" : "";
    else if (t && displayMode == "slices") {
      var result = "";
      var slices = store.calcAllSlices(title);
      for (var s in slices)
        result += "|%0|<nowiki>%1</nowiki>|\n".format([s,slices[s]]);
      return result ? "\n{{excerpt excerptIndent{\n" + result  + "}}}" : "";
    return "";

  notHidden: function(t,inTiddler) {
    if (typeof t == "string")
      t = store.getTiddler(t);
    return (!t || !t.tags.containsAny(this.config.excludeTags) ||
        (inTiddler && this.config.excludeTags.contains(inTiddler)));

  // this is for normal and commas mode
  createTagglyListNormal: function(place,title,useCommas,isTagExpr) {

    var list = config.taggly.getTiddlers(title,this.getTagglyOpt(title,"sortBy"),isTagExpr);

    if (this.getTagglyOpt(title,"sortOrder") == "desc")
      list = list.reverse();

    var output = [];
    var first = true;
    for (var i=0;i<list.length;i++) {
      if (this.notHidden(list[i],title)) {
        var countString = this.getTaggingCount(list[i].title);
        var excerpt = this.getExcerpt(title,list[i].title);
        if (useCommas)
          output.push((first ? "" : ", ") + "[[" + list[i].title + "]]" + countString + excerpt);
          output.push("*[[" + list[i].title + "]]" + countString + excerpt + "\n");

        first = false;

    return this.drawTable(place,
      this.makeColumns(output,useCommas ? 1 : parseInt(this.getTagglyOpt(title,"numCols"))),
      useCommas ? "commas" : "normal");

  // this is for the "grouped" mode
  createTagglyListGrouped: function(place,title,isTagExpr) {
    var sortBy = this.getTagglyOpt(title,"sortBy");
    var sortOrder = this.getTagglyOpt(title,"sortOrder");

    var list = config.taggly.getTiddlers(title,sortBy,isTagExpr);

    if (sortOrder == "desc")
      list = list.reverse();

    var leftOvers = []
    for (var i=0;i<list.length;i++)

    var allTagsHolder = {};
    for (var i=0;i<list.length;i++) {
      for (var j=0;j<list[i].tags.length;j++) {

        if (list[i].tags[j] != title) { // not this tiddler

          if (this.notHidden(list[i].tags[j],title)) {

            if (!allTagsHolder[list[i].tags[j]])
              allTagsHolder[list[i].tags[j]] = "";

            if (this.notHidden(list[i],title)) {
              allTagsHolder[list[i].tags[j]] += "**[["+list[i].title+"]]"
                    + this.getTaggingCount(list[i].title) + this.getExcerpt(title,list[i].title) + "\n";

              leftOvers.setItem(list[i].title,-1); // remove from leftovers. at the end it will contain the leftovers


    var allTags = [];
    for (var t in allTagsHolder)

    var sortHelper = function(a,b) {
      if (a == b) return 0;
      if (a < b) return -1;
      return 1;

    allTags.sort(function(a,b) {
      var tidA = store.getTiddler(a);
      var tidB = store.getTiddler(b);
      if (sortBy == "title") return sortHelper(a,b);
      else if (!tidA && !tidB) return 0;
      else if (!tidA) return -1;
      else if (!tidB) return +1;
      else return sortHelper(tidA[sortBy],tidB[sortBy]);

    var leftOverOutput = "";
    for (var i=0;i<leftOvers.length;i++)
      if (this.notHidden(leftOvers[i],title))
        leftOverOutput += "*[["+leftOvers[i]+"]]" + this.getTaggingCount(leftOvers[i]) + this.getExcerpt(title,leftOvers[i]) + "\n";

    var output = [];

    if (sortOrder == "desc")
    else if (leftOverOutput != "")
      // leftovers first...

    for (var i=0;i<allTags.length;i++)
      if (allTagsHolder[allTags[i]] != "")
        output.push("*[["+allTags[i]+"]]" + this.getTaggingCount(allTags[i]) + this.getExcerpt(title,allTags[i]) + "\n" + allTagsHolder[allTags[i]]);

    if (sortOrder == "desc" && leftOverOutput != "")
      // leftovers last...

    return this.drawTable(place,


  // used to build site map
  treeTraverse: function(title,depth,sortBy,sortOrder,isTagExpr) {

    var list = config.taggly.getTiddlers(title,sortBy,isTagExpr);

    if (sortOrder == "desc")

    var indent = "";
    for (var j=0;j<depth;j++)
      indent += "*"

    var childOutput = "";

    if (depth > this.config.siteMapDepthLimit)
      childOutput += indent + this.lingo.tooDeepMessage + "\n";
      for (var i=0;i<list.length;i++)
        if (list[i].title != title)
          if (this.notHidden(list[i].title,this.config.inTiddler))
            childOutput += this.treeTraverse(list[i].title,depth+1,sortBy,sortOrder,false);

    if (depth == 0)
      return childOutput;
      return indent + "[["+title+"]]" + this.getTaggingCount(title) + this.getExcerpt(this.config.inTiddler,title,depth) + "\n" + childOutput;

  // this if for the site map mode
  createTagglyListSiteMap: function(place,title,isTagExpr) {
    this.config.inTiddler = title; // nasty. should pass it in to traverse probably
    var output = this.treeTraverse(title,0,this.getTagglyOpt(title,"sortBy"),this.getTagglyOpt(title,"sortOrder"),isTagExpr);
    return this.drawTable(place,
        this.makeColumns(output.split(/(?=^\*\[)/m),parseInt(this.getTagglyOpt(title,"numCols"))), // regexp magic

  macros: {
    tagglyTagging: {
      handler: function (place,macroName,params,wikifier,paramString,tiddler) {
        var parsedParams = paramString.parseParams("tag",null,true);
        var refreshContainer = createTiddlyElement(place,"div");

        // do some refresh magic to make it keep the list fresh - thanks Saq

        var tag = getParam(parsedParams,"tag");
        var expr = getParam(parsedParams,"expr");

        if (expr) {
        else {
          if (tag) {
          else {

      refresh: function(place) {
        var title = place.getAttribute("title");
        var isTagExpr = place.getAttribute("isTagExpr") == "true";
        var showEmpty = place.getAttribute("showEmpty") == "true";
        var countFound = config.taggly.getTiddlers(title,'title',isTagExpr).length
        if (countFound > 0 || showEmpty) {
          var lingo = config.taggly.lingo;
          if (config.taggly.getTagglyOpt(title,"hideState") == "show") {
                isTagExpr ? lingo.labels.exprLabel.format([title]) : lingo.labels.label.format([title]));
            if (countFound == 0 && showEmpty)

  // todo fix these up a bit
  styles: [
"/* created by TagglyTaggingPlugin */",
".tagglyTagging { padding-top:0.5em; }",
".tagglyTagging li.listTitle { display:none; }",
".tagglyTagging ul {",
" margin-top:0px; padding-top:0.5em; padding-left:2em;",
" margin-bottom:0px; padding-bottom:0px;",
".tagglyTagging { vertical-align: top; margin:0px; padding:0px; }",
".tagglyTagging table { margin:0px; padding:0px; }",
".tagglyTagging .button { visibility:hidden; margin-left:3px; margin-right:3px; }",
".tagglyTagging .button, .tagglyTagging .hidebutton {",
" color:[[ColorPalette::TertiaryLight]]; font-size:90%;",
" border:0px; padding-left:0.3em;padding-right:0.3em;",
".tagglyTagging .button:hover, .hidebutton:hover, ",
".tagglyTagging .button:active, .hidebutton:active  {",
" border:0px; background:[[ColorPalette::TertiaryPale]]; color:[[ColorPalette::TertiaryDark]];",
".selected .tagglyTagging .button { visibility:visible; }",
".tagglyTagging .hidebutton { color:[[ColorPalette::Background]]; }",
".selected .tagglyTagging .hidebutton { color:[[ColorPalette::TertiaryLight]] }",
".tagglyLabel { color:[[ColorPalette::TertiaryMid]]; font-size:90%; }",
".tagglyTagging ul {padding-top:0px; padding-bottom:0.5em; margin-left:1em; }",
".tagglyTagging ul ul {list-style-type:disc; margin-left:-1em;}",
".tagglyTagging ul ul li {margin-left:0.5em; }",
".editLabel { font-size:90%; padding-top:0.5em; }",
".tagglyTagging .commas { padding-left:1.8em; }",
"/* not technically tagglytagging but will put them here anyway */",
".tagglyTagged li.listTitle { display:none; }",
".tagglyTagged li { display: inline; font-size:90%; }",
".tagglyTagged ul { margin:0px; padding:0px; }",
".excerpt { color:[[ColorPalette::TertiaryDark]]; }",
".excerptIndent { margin-left:4em; }",
"div.tagglyTagging table,",
"div.tagglyTagging table tr,",
" {border-style:none!important; }",
".tagglyTagging .contents { border-bottom:2px solid [[ColorPalette::TertiaryPale]]; padding:0 1em 1em 0.5em;",
"  margin-bottom:0.5em; }",
".tagglyTagging .indent1  { margin-left:3em;  }",
".tagglyTagging .indent2  { margin-left:4em;  }",
".tagglyTagging .indent3  { margin-left:5em;  }",
".tagglyTagging .indent4  { margin-left:6em;  }",
".tagglyTagging .indent5  { margin-left:7em;  }",
".tagglyTagging .indent6  { margin-left:8em;  }",
".tagglyTagging .indent7  { margin-left:9em;  }",
".tagglyTagging .indent8  { margin-left:10em; }",
".tagglyTagging .indent9  { margin-left:11em; }",
".tagglyTagging .indent10 { margin-left:12em; }",
".tagglyNoneFound { margin-left:2em; color:[[ColorPalette::TertiaryMid]]; font-size:90%; font-style:italic; }",

  init: function() {
    config.shadowTiddlers["TagglyTaggingStyles"] = this.styles;



By Saq Imtiaz

// syntax adjusted to not clash with NestedSlidersPlugin
// added + syntax to start open instead of closed

config.formatters.unshift( {
  name: "inlinesliders",
  // match: "\\+\\+\\+\\+|\\<slider",
  match: "\\<slider",
  // lookaheadRegExp: /(?:\+\+\+\+|<slider) (.*?)(?:>?)\n((?:.|\n)*?)\n(?:====|<\/slider>)/mg,
  lookaheadRegExp: /(?:<slider)(\+?) (.*?)(?:>)\n((?:.|\n)*?)\n(?:<\/slider>)/mg,
  handler: function(w) {
    this.lookaheadRegExp.lastIndex = w.matchStart;
    var lookaheadMatch = this.lookaheadRegExp.exec(w.source)
    if(lookaheadMatch && lookaheadMatch.index == w.matchStart ) {
      var btn = createTiddlyButton(w.output,lookaheadMatch[2] + " "+"\u00BB",lookaheadMatch[2],this.onClickSlider,"button sliderButton");
      var panel = createTiddlyElement(w.output,"div",null,"sliderPanel");
      panel.style.display = (lookaheadMatch[1] == '+' ? "block" : "none");
      w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;
   onClickSlider : function(e) {
    if(!e) var e = window.event;
    var n = this.nextSibling;
    n.style.display = (n.style.display=="none") ? "block" : "none";
    return false;

Thomas, qui aime le sport et a des posters de peignes.
Son salon est situé à l’angle de la rue du Maréchal Leclerc avec la rue des Hirondelles, avec l’enseigne rouge et blanche qui dit “Tom’tif”. 
Thomas fait environ 1m75, avec une petite moustache et une grosse bedaine. 
Il parle avec un accent et ricane. 
Thomas le Barbier a coupé les superbes cheveux de Carlos.

Et [[Emile Pellerin]] n'a pas supporté que "son" Carlos perde sa "coupe cheveux si parfaite et magnifique"
Propriétaire du [[Complexe de bowling et salle d’arcade "fleur de garrigue"]]
|Description:|Makes a checkbox which toggles a tag in a tiddler|
|Author:|Simon Baird <simon.baird@gmail.com>|
{{{<<toggleTag }}}//{{{TagName TiddlerName LabelText}}}//{{{>>}}}
* TagName - the tag to be toggled, default value "checked"
* TiddlerName - the tiddler to toggle the tag in, default value the current tiddler
* LabelText - the text (gets wikified) to put next to the check box, default value is '{{{[[TagName]]}}}' or '{{{[[TagName]] [[TiddlerName]]}}}'
(If a parameter is '.' then the default will be used)
* TouchMod flag - if non empty then touch the tiddlers mod date. Note, can set config.toggleTagAlwaysTouchModDate to always touch mod date
|{{{<<toggleTag>>}}}|Toggles the default tag (checked) in this tiddler|<<toggleTag>>|
|{{{<<toggleTag TagName>>}}}|Toggles the TagName tag in this tiddler|<<toggleTag TagName>>|
|{{{<<toggleTag TagName TiddlerName>>}}}|Toggles the TagName tag in the TiddlerName tiddler|<<toggleTag TagName TiddlerName>>|
|{{{<<toggleTag TagName TiddlerName 'click me'>>}}}|Same but with custom label|<<toggleTag TagName TiddlerName 'click me'>>|
|{{{<<toggleTag . . 'click me'>>}}}|dot means use default value|<<toggleTag . . 'click me'>>|
* If TiddlerName doesn't exist it will be silently created
* Set label to '-' to specify no label
* See also http://mgtd-alpha.tiddlyspot.com/#ToggleTag2
!!Known issues
* Doesn't smoothly handle the case where you toggle a tag in a tiddler that is current open for editing
* Should convert to use named params

if (config.toggleTagAlwaysTouchModDate == undefined) config.toggleTagAlwaysTouchModDate = false;


  toggleTag: {

    createIfRequired: true,
    shortLabel: "[[%0]]",
    longLabel: "[[%0]] [[%1]]",

    handler: function(place,macroName,params,wikifier,paramString,tiddler) {
      var tiddlerTitle = tiddler ? tiddler.title : '';
      var tag   = (params[0] && params[0] != '.') ? params[0] : "checked";
      var title = (params[1] && params[1] != '.') ? params[1] : tiddlerTitle;
      var defaultLabel = (title == tiddlerTitle ? this.shortLabel : this.longLabel);
      var label = (params[2] && params[2] != '.') ? params[2] : defaultLabel;
      var touchMod = (params[3] && params[3] != '.') ? params[3] : "";
      label = (label == '-' ? '' : label); // dash means no label
      var theTiddler = (title == tiddlerTitle ? tiddler : store.getTiddler(title));
      var cb = createTiddlyCheckbox(place, label.format([tag,title]), theTiddler && theTiddler.isTagged(tag), function(e) {
        if (!store.tiddlerExists(title)) {
          if (config.macros.toggleTag.createIfRequired) {
            var content = store.getTiddlerText(title); // just in case it's a shadow
            store.saveTiddler(title,title,content?content:"",config.options.txtUserName,new Date(),null);
            return false;
        if ((touchMod != "" || config.toggleTagAlwaysTouchModDate) && theTiddler)
            theTiddler.modified = new Date();
        return true;


Président du comité du [[Marché bio|La Coopérative et Marché bio de Valnuit]]
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 = 'valnuit';

// 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."

Sous la zone de récupération de quilles de l’allée numéro 5 du [[Complexe de bowling et salle d’arcade "fleur de garrigue"]]
Ses étranges flèches et ses larges avenues
Les voix d’une foule distante
Nous pourrions entendre parler d’eux très prochainement
| !date | !user | !location | !storeUrl | !uploadDir | !toFilename | !backupdir | !origin |
| 10/11/2015 19:32:01 | Ackinty | [[/|http://valnuit.tiddlyspot.com/]] | [[store.cgi|http://valnuit.tiddlyspot.com/store.cgi]] | . | [[index.html | http://valnuit.tiddlyspot.com/index.html]] | . | ok |
| 10/11/2015 19:45:11 | Ackinty | [[/|http://valnuit.tiddlyspot.com/]] | [[store.cgi|http://valnuit.tiddlyspot.com/store.cgi]] | . | [[index.html | http://valnuit.tiddlyspot.com/index.html]] | . | ok |
| 10/11/2015 19:46:10 | Ackinty | [[/|http://valnuit.tiddlyspot.com/]] | [[store.cgi|http://valnuit.tiddlyspot.com/store.cgi]] | . | [[index.html | http://valnuit.tiddlyspot.com/index.html]] | . | ok |
| 10/11/2015 20:01:36 | Ackinty | [[/|http://valnuit.tiddlyspot.com/]] | [[store.cgi|http://valnuit.tiddlyspot.com/store.cgi]] | . | [[index.html | http://valnuit.tiddlyspot.com/index.html]] | . | ok |
| 10/11/2015 20:05:52 | Ackinty | [[/|http://valnuit.tiddlyspot.com/]] | [[store.cgi|http://valnuit.tiddlyspot.com/store.cgi]] | . | [[index.html | http://valnuit.tiddlyspot.com/index.html]] | . | ok |
| 10/11/2015 20:11:55 | Ackinty | [[/|http://valnuit.tiddlyspot.com/]] | [[store.cgi|http://valnuit.tiddlyspot.com/store.cgi]] | . | [[index.html | http://valnuit.tiddlyspot.com/index.html]] | . |
| 16/11/2015 19:44:34 | Ackinty | [[/|http://valnuit.tiddlyspot.com/]] | [[store.cgi|http://valnuit.tiddlyspot.com/store.cgi]] | . | [[index.html | http://valnuit.tiddlyspot.com/index.html]] | . | ok |
| 16/11/2015 19:48:38 | Ackinty | [[/|http://valnuit.tiddlyspot.com/]] | [[store.cgi|http://valnuit.tiddlyspot.com/store.cgi]] | . | [[index.html | http://valnuit.tiddlyspot.com/index.html]] | . | ok |
| 16/11/2015 19:58:24 | Ackinty | [[/|http://valnuit.tiddlyspot.com/]] | [[store.cgi|http://valnuit.tiddlyspot.com/store.cgi]] | . | [[index.html | http://valnuit.tiddlyspot.com/index.html]] | . | ok |
| 16/11/2015 20:16:25 | Ackinty | [[/|http://valnuit.tiddlyspot.com/]] | [[store.cgi|http://valnuit.tiddlyspot.com/store.cgi]] | . | [[index.html | http://valnuit.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>>'}


"[[Bienvenue à Valnuit|http://valnuit.blogspot.fr/]]" est une traduction bénévole de "[[Welcome to Night Vale|http://commonplacebooks.com/welcome-to-night-vale]]", une production "[[Commonplace Books|http://commonplacebooks.com/]]".

Le podcast en français est là : http://valnuit.podcloud.fr/
Le compte Twitter des valnuitains : https://twitter.com/Valnuitains
La page Google+ : https://plus.google.com/communities/115340129994296214785

Ici, je vais essayer de dresser une sorte d'inventaire, une encyclopédie de l'univers de Valnuit.
Ce tiddlywiki est une initiative personnelle n'ayant aucun rapport avec l'équipe des valnuitains (les traducteurs).
Avertissement : ne sont traités ici que les épisodes précédent l'épisode du mois en cours.

| ''Soyez donc conscient que ce site gâche toute surprise si vous ne connaissez pas encore l'oeuvre originale ou sa traduction française !'' |

~~La traduction française est [[CC-BY-NC-SA|https://creativecommons.org/licenses/by-nc-sa/3.0/]] donc j'espère que ça ne posera pas de problème. Ce site est une sorte d'hommage à l'oeuvre. Si cela devait poser problème, ou pour toute remarque, je suis joignable sous le pseudo "ackinty" avec un adresse en pseudo @ gmail point com.~~
Atteignant des vitesses inimaginables
Sponsorise [[la station de radio|La station de radio]].
Les pizzas du gros Rico sont appréciées par [[les silhouettes encapuchonnées|Les silhouettes encapuchonnées]] et même par le [[le conseil Municipal|Le Conseil Municipal]].
D'ailleurs, tous les citoyens de Valnuit ont l’obligation de manger à la pizzeria Le Gros Rico une fois par semaine.