\n!Guía de Instrumentos \n\nConservatorio Superior de Música de Vigo \nDepartamento de Composición \nClase de Electroacústica, Prof. Miguel Moreno \nConcepción, diseño, grabación y transcripciones: José Luis González Castro \n\n!Versión\n\n| Versión | Fecha | |\n| ''V_1.0.0'' | 25-05-06 |Primera versión de la Guía. |\n\n\n\n\n
text/plain\n.txt .text .js .vbs .asp .cgi .pl\n----\ntext/html\n.htm .html .hta .htx .mht\n----\ntext/comma-separated-values\n.csv\n----\ntext/javascript\n.js\n----\ntext/css\n.css\n----\ntext/xml\n.xml .xsl .xslt\n----\nimage/gif\n.gif\n----\nimage/jpeg\n.jpg .jpe .jpeg\n----\nimage/png\n.png\n----\nimage/bmp\n.bmp\n----\nimage/tiff\n.tif .tiff\n----\naudio/basic\n.au .snd\n----\naudio/wav\n.wav\n----\naudio/x-pn-realaudio\n.ra .rm .ram\n----\naudio/x-midi\n.mid .midi\n----\naudio/mp3\n.mp3\n----\naudio/m3u\n.m3u\n----\nvideo/x-ms-asf\n.asf\n----\nvideo/avi\n.avi\n----\nvideo/mpeg\n.mpg .mpeg\n----\nvideo/quicktime\n.qt .mov .qtvr\n----\napplication/pdf\n.pdf\n----\napplication/rtf\n.rtf\n----\napplication/postscript\n.ai .eps .ps\n----\napplication/wordperfect\n.wpd\n----\napplication/mswrite\n.wri\n----\napplication/msexcel\n.xls .xls3 .xls4 .xls5 .xlw\n----\napplication/msword\n.doc\n----\napplication/mspowerpoint\n.ppt .pps\n----\napplication/x-director\n.swa\n----\napplication/x-shockwave-flash\n.swf\n----\napplication/x-zip-compressed\n.zip\n----\napplication/x-gzip\n.gz\n----\napplication/x-rar-compressed\n.rar\n----\napplication/octet-stream\n.com .exe .dll .ocx
/***\n|''Name:''|AttachFilePlugin|\n|''Source:''|http://www.TiddlyTools.com/#AttachFilePlugin|\n|''Author:''|Eric Shulman - ELS Design Studios|\n|''License:''|[[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|\n|''~CoreVersion:''|2.0.10|\n\nStore or link binary files (such as jpg, gif, pdf or even mp3) within your TiddlyWiki document and then use them as images or links from within your tiddler content. Binary file content can be stored in three different locations:\n<<<\n#embedded in the attachment tiddler (encoded as base64)\n#on your filesystem (a 'local link' path/filename)\n#on a web server (a 'remote link' URL)\n<<<\nThe plugin creates an "attachment tiddler" for each file you attach. Regardless of where you store the binary content, your document can refer to the attachment tiddler rather than using a direct file or URL reference in your embedded image or external links, so that changing document locations will not require updating numerous tiddlers or copying files from one system to another.\n\n@@display:block;font-size:8pt;line-height:110%;Note: although you can edit an attachment tiddler, ''don't change any of the encoded content below the attachment header'', as it has been prepared for use in the rest of your document, and even changing a single character can make the attachment unusable. //If needed, you ''can'' edit the header information or even the MIME type declaration in the attachment data, but be very careful not to change any of the base64-encoded binary data.//@@\n!!!!!Inline interface (live)\n><<attach demoID>>\n!!!!!Usage\n<<<\nWhen you attach a file, a tiddler (tagged with<<tag attachment>>) is generated (using the source filename as the tiddler's title). The tiddler contains //''base64 text-encoded binary data''//, surrounded by {{{/%...%/}}} comment markers (so they are not visible when viewing the tiddler). The tiddler also includes summary details about the file: when it was attached, by whom, etc. and, if the attachment is an image file (jpg, gif, or png), the image is automatically displayed below the summary information.\n\nWith embedded data, your TW document can be completely self-contained...unfortunately, embedding just a few moderately-sized binary files using base64 text-encoding can dramatically increase the size of your document. To avoid this problem, you can create attachment tiddlers that define external local filesystem (file://) and/or remote web server (http://) 'reference' links, without embedding the binary data directly in the tiddler (i.e., uncheck "embed data" in the 'control panel').\n\nThese links provide an alternative source for the binary data: if embedded data is not found (or you are running on Internet Explorer, which does not currently support using embedded data), then the plugin tries the local filesystem reference. If a local file is not found, then the remote reference (if any) is used. This "fallback" approach also lets you 'virtualize' the external links in your document, so that you can access very large binary content such as PDFs, MP3's, and even *video* files, by using just a 'remote reference link' without embedding any data or downloading huge files to your hard disk.\n\nOf course, when you //do// download an attached file, the local copy will be used instead of accessing a remote server each time, thereby saving bandwidth and allowing you to 'go mobile' without having to edit any tiddlers to alter the link locations...\n\nLastly, though not completed (but nearly there), the plugin includes an integrated 'uploader' that will let you create a 'remote link' attachment tiddler AND transfer the local file to a remote server location in the same step!\n<<<\n!!!!!Syntax / Examples\n<<<\nTo embed attached files as images or link to them from other tiddlers, use the standard ~TiddlyWiki image syntax ({{{[img[tooltip|filename]]}}}), linked image syntax ({{{[img[tooltip|filename][tiddlername]]}}}) , or "external link" syntax ({{{[[text|URL]]}}}), replacing the filename or URL that is normally entered with the title of an attachment tiddler.\n\nembedded image data:\n>{{{[img[Meow|AttachFileSample]]}}}\n>[img[Meow|AttachFileSample]]\nembedded image data with link to larger remote image:\n>{{{[img[click for larger view|AttachFileSample][AttachFileSample2]]}}}\n>[img[click for larger view|AttachFileSample][AttachFileSample2]]\n'external' link to embedded image data:\n>{{{[[click to view attachment|AttachFileSample]]}}}\n>[[click to view attachment|AttachFileSample]]\n'external' link to remote image:\n>{{{[[click to view attachment|AttachFileSample2]]}}}\n>[[click to view attachment|AttachFileSample2]]\nregular ~TiddlyWiki links to attachment tiddlers:\n>{{{[[AttachFileSample]]}}} [[AttachFileSample]]\n>{{{[[AttachFileSample2]]}}} [[AttachFileSample2]]\n<<<\n!!!!!Defining MIME types and Server Scripts\n<<<\nWhen you select a source file, a ''[[MIME|http://en.wikipedia.org/wiki/MIME]]'' file type is automatically suggested, based on filename extension. The AttachFileMIMETypes tiddler defines the list of MIME types that will be recognized by the plugin. Each MIME type definition consists of exactly two lines of text: the official MIME type designator (e.g., "text/plain", "image/gif", etc.), and a space-separated list of file extensions associated with that type. List entries are separated by "----" (horizontal rules).\n\nTo upload files, a script must first be installed on a remote server so it can receive and store the files online. The AttachFileServerScripts tiddler defines the list of ''server scripts'' that will be available for you to select from when attaching and uploading a file. The list format is as described above for MIME types, except that the first line is simply the text that will appear in the ''server scripts'' droplist, while the second line is the fully-qualified URL for submitting files to that server (e.g., {{{http://www.xyz.com/path/to/cgi-bin/upload.cgi}}} or something similar).\n<<<\n!!!!!Known Limitations\n<<<\n* ''Internet Explorer does not support the use of //embedded// data for TW file attachments. However, you can still use the local/remote link definitions to create file attachments that are stored externally''\n## //while it is easy to read text files, reading binary files is not supported by IE's FileSystemObject (FSO) methods, and other file I/O techniques are subject to security barriers or require additional MS proprietary technologies (like ASP or VB) that make implementation more difficult.//\n## //IE does not support the data: URI scheme, and cannot render the embedded images or links. This would seem to be an insurmountable shortcoming in the browser. Let's hope it is added in the next version...//\n<<<\n!!!!!Installation\n<<<\nImport (or copy/paste) the following tiddlers into your document:\n* AttachFilePlugin (tagged with <<tag systemConfig>>)\n* AttachFilePluginFormatters ("distribution library") (tagged with <<tag systemConfig>>)\n* AttachFileSample and AttachFileSample2 //(sample attachment tiddler containing an image file)//\n* AttachFileMIMETypes //(defines known binary file types)//\n* AttachFileServerScripts //(remote upload server locations)//\n<<<\n!!!!!Revision History\n<<<\n''2006.11.09 [3.4.6]'' REAL FIX for TWv2.1.3: incorporate new TW2.1.3 core "prettyLink" formatter regexp handling logic and check for version < 2.1.3 with fallback to old plugin code. Also, cleanup table layout in HTML (added "border:0" directly to table elements to override stylesheet)\n''2006.11.08 [3.4.5]'' TEMPORARY FIX for TWv2.1.3: disable hijack of wikiLink formatter due to changes in core wikiLink regexp definition. //Links to attachments are broken, but you can still use {{{[img[TiddlerName]]}}} to render attachments as images, as well as {{{background:url('[[TiddlerName]]')}}} in CSS declarations for background images.//\n''2006.09.10 [3.4.4]'' update formatters for 2.1 compatibility (use this.lookaheadRegExp instead of temp variable)\n''2006.07.24 [3.4.3]'' in prettyLink formatter, added check for isShadowTiddler() to fix problem where shadow links became external links.\n''2006.07.13 [3.4.2]'' in getAttachment(), fixed stripping of newlines so data: used in CSS will work\n''2006.05.21 [3.4.1]'' in getAttachment(), fixed substring() to extract data: URI (was losing last character, which broken rendering of SOME images)\n''2006.05.20 [3.4.0]'' hijack core getRecursiveTiddlerText() to support rendering attachments in stylesheets (e.g. {{{url([[AttachFileSample]])}}})\n''2006.05.20 [3.3.6]'' add "description" feature to easily include notes in attachment tiddler (you can always edit to add them later... but...)\n''2006.05.19 [3.3.5]'' add "attach as" feature to change default name for attachment tiddlers. Also, new optional param to specify tiddler name (disables editing)\n''2006.05.16 [3.3.0]'' completed XMLHttpRequest handling for GET or POST to configurable server scripts\n''2006.05.13 [3.2.0]'' added interface for ''upload'' feature. Major rewrite of code for clean object definitions. Major improvements in UI interaction and validation.\n''2006.05.09 [3.1.1]'' add wikifer support for using attachments in links from "linked image" syntax: {{{[img[tip|attachment1][attachment2]]}}}\n''2006.05.09 [3.1.0]'' lots of code changes: new options for attachments that use embedded data and/or links to external files (local or remote)\n''2006.05.03 [3.0.2]'' added {{{/%...%/}}} comments around attachment data to hide it when viewing attachment tiddler.\n''2006.02.05 [3.0.1]'' wrapped wikifier hijacks in initAttachmentFormatters() function to eliminate globals and avoid FireFox crash bug when referencing globals\n''2005.12.27 [3.0.0]'' Update for TW2.0. Automatically add 'excludeMissing' tag to attachments\n''2005.12.16 [2.2.0]'' Dynamically create/remove attachPanel as needed to ensure only one instance of interface elements exists, even if there are multiple instances of macro embedding.\n''2005.11.20 [2.1.0]'' added wikifier handler extensions for "image" and "prettyLink" to render tiddler attachments\n''2005.11.09 [2.0.0]'' begin port from old ELS Design plugin/adaptation hybrid based on ~TW1.2.33\n''2005.08.05 [1.1.0]'' moved CSS and HTML definitions into plugin code tiddler instead of using separate tiddlers\n''2005.07.27 [1.0.2]'' core update 1.2.29: custom overlayStyleSheet() replaced with new core setStylesheet()\n''2005.07.23 [1.0.1]'' added parameter checks and corrected addNotification() usage\n''2005.07.20 [1.0.0]'' Initial Release\n<<<\n!!!!!Credits\n<<<\nThis feature was developed by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]]\n<<<\n!!!!!Code\n***/\n// // version\n//{{{\nversion.extensions.attach = {major: 3, minor: 4, revision: 5, date: new Date(2006,11,8)};\n//}}}\nconfig.macros.attach = {\n// // configuration\n//{{{\n hideUpload: false,\n//}}}\n// // lingo\n//{{{\n label: "attach file",\n tooltip: "Attach a file to this document",\n linkTooltip: "Attachment: ",\n\n scriptList: "AttachFileServerScripts",\n typeList: "AttachFileMIMETypes",\n\n titlePrompt: " enter tiddler title...",\n MIMEPrompt: "<option value=''>select MIME type...</option><option value='editlist'>[edit list...]</option>",\n localPrompt: " enter local path/filename...",\n URLPrompt: " enter remote URL...",\n scriptPrompt: "<option value=''>select server script...</option><option value='editlist'>[edit list...]</option>",\n targetPrompt: " enter remote path/filename...",\n\n tiddlerErr: "Please enter a tiddler title",\n sourceErr: "Please enter a source path/filename",\n storageErr: "Please select a storage method: embedded, local or remote",\n MIMEErr: "Unrecognized file format. Please select a MIME type",\n localErr: "Please enter a local path/filename",\n URLErr: "Please enter a remote URL",\n scriptErr: "Please select a server script",\n targetErr: "Please enter a remote target path/filename",\n notSupportedErr: "Sorry, this browser does not support embedded data.\snPlease uncheck 'embed data' and use a local and/or remote link instead.",\n\n sourceReport: "| source file|{{{%0}}}|\sn",\n nosourceReport: "| source file|//none//|\sn",\n dateReport: "| attached on|%0 by %1|\sn",\n notesReport: "| description|%0|\sn",\n dataReport: "| embedded data|[[%0|%0]] - {{{type=%1, size=%2 bytes, encoded=%3 bytes}}}|\sn",\n nodataReport: "| embedded data|//none//|\sn",\n localReport: "| local link|/%LOCAL_LINK%/[[%0|%1]]|\sn",\n nolocalReport: "| local link|//none//|\sn",\n URLReport: "| remote link|/%REMOTE_LINK%/[[%0|%0]]|\sn",\n noURLReport: "| remote link|//none//|\sn",\n\n uploadReport: "upload\sn<<<\sn__server script__\sn''%0''\sn{{{%1}}}\sn__remote path/filename__\sn{{{%2}}}\sn__transfer log__\sn%3/%RESULT%/\sn<<<\sn",\n\n imageReport: "image\sn<<<\snusage: {{{[img[tooltip|%0]] or [img[tooltip|%0][link]]}}}\sn[img[tooltip|%0]]\sn<<<\sn",\n dataBlock: "\sn/% DO NOT EDIT BELOW THIS POINT\sn---BEGIN_DATA---\sn%0;base64,\sn%1\sn---END_DATA---\sn%/",\n//}}}\n// // macro definition\n//{{{\n handler:\n function(place,macroName,params) {\n if (params && !params[0]) { createTiddlyButton(place,this.label,this.tooltip,this.toggleAttachPanel); return; }\n var id=params.shift();\n this.createAttachPanel(place,id+"_attachPanel",params);\n document.getElementById(id+"_attachPanel").style.position="static";\n document.getElementById(id+"_attachPanel").style.display="block";\n },\n//}}}\n//{{{\n createAttachPanel:\n function(place,panel_id,params) {\n if (!panel_id || !panel_id.length) var panel_id="_attachPanel";\n // remove existing panel (if any)\n var panel=document.getElementById(panel_id); if (panel) panel.parentNode.removeChild(panel);\n // set styles for this panel\n setStylesheet(this.css,"attachPanel");\n // create new panel\n var title=""; if (params && params[0]) title=params.shift();\n var types=this.MIMEPrompt+this.formatListOptions(store.getTiddlerText(this.typeList)); // get MIME types\n var scripts=this.scriptPrompt+this.formatListOptions(store.getTiddlerText(this.scriptList)); // get server scripts\n panel=createTiddlyElement(place,"span",panel_id,"attachPanel",null);\n var html=this.html.replace(/%id%/g,panel_id);\n html=html.replace(/%title%/g,title);\n html=html.replace(/%disabled%/g,title.length?"disabled":"");\n html=html.replace(/%types%/g,types);\n html=html.replace(/%scripts%/g,scripts);\n panel.innerHTML=html;\n return panel;\n },\n//}}}\n//{{{\n toggleAttachPanel:\n function (e) {\n if (!e) var e = window.event;\n var parent=resolveTarget(e).parentNode;\n var panel = document.getElementById("_attachPanel");\n if (panel==undefined || panel.parentNode!=parent)\n panel=config.macros.attach.createAttachPanel(parent,"_attachPanel");\n var isOpen = panel.style.display=="block";\n if(config.options.chkAnimate)\n anim.startAnimating(new Slider(panel,!isOpen,e.shiftKey || e.altKey,"none"));\n else\n panel.style.display = isOpen ? "none" : "block" ;\n e.cancelBubble = true;\n if (e.stopPropagation) e.stopPropagation();\n return(false);\n },\n//}}}\n//{{{\n formatListOptions:\n function(text,getparams) {\n if (!text || !text.trim().length) return "";\n // get server script list content from tiddler\n var parts=text.split("\sn----\sn");\n var out="";\n this.scriptParams=["","",""]; // first 3 list items: blank, prompt, editlist\n for (var p=0; p<parts.length; p++) {\n var lines=parts[p].split("\sn");\n var label=lines.shift(); // 1st line=display text\n var URL=lines.shift(); // 2nd line=item value\n var params=lines.join("\sn").replace(/<<<\sn/g,"").replace(/\sn<<</g,""); // extra lines=script params inside blockquotes\n this.scriptParams.push(params?params:"");\n out +='<option value="%1">%0</option>'.format([label,URL]);\n }\n return out;\n },\n//}}}\n// // interface definition\n//{{{\n css:\n ".attachPanel { display: none; position:absolute; z-index:10; width:35em; right:105%; top:0em;\s\n background-color: #eee; color:#000; font-size: 8pt; line-height:110%;\s\n border:1px solid black; border-bottom-width: 3px; border-right-width: 3px;\s\n padding: 0.5em; margin:0em; -moz-border-radius:1em; }\s\n .attachPanel form { display:inline;border:0;padding:0;margin:0; }\s\n .attachPanel select { width:99%;margin:0px;font-size:8pt;line-height:110%;}\s\n .attachPanel input { width:98%;padding:0px;margin:0px;font-size:8pt;line-height:110%}\s\n .attachPanel textarea { width:98%;margin:0px;height:2em;font-size:8pt;line-height:110%}\s\n .attachPanel table { width:100%;border:0;margin:0;padding:0;color:inherit; }\s\n .attachPanel tbody, .attachPanel tr, .attachPanel td { border:0;margin:0;padding:0;color:#000; }\s\n .attachPanel .box { border:1px solid black; padding:.3em; margin:.3em 0px; background:#f8f8f8; -moz-border-radius:5px; }\s\n .attachPanel .chk { width:auto;border:0; }\s\n .attachPanel .btn { width:auto; }\s\n .attachPanel .btn2 { width:49%; }\s\n ",\n//}}}\n//{{{\n html:\n '<form>\s\n attach from source file <input type="file" name="source" size=56 onChange="config.macros.attach.onChangeSource(this)">\s\n <div class="box">\s\n <table style="border:0"><tr style="border:0"><td style="border:0;text-align:right;width:1%;white-space:nowrap">\s\n embed data <input type=checkbox class=chk name="useData"\s\n onclick="if (!this.form.MIMEType.value.length)\s\n this.form.MIMEType.selectedIndex=this.checked?1:0; ">&nbsp;\s\n </td><td style="border:0">\s\n <select size=1 name="MIMEType" \s\n onchange="this.title=this.value; if (this.value==\s'editlist\s')\s\n { this.selectedIndex=this.form.useData.checked?1:0; story.displayTiddler(null,config.macros.attach.typeList,2); return; }">\s\n <option value=""></option>\s\n %types%\s\n </select>\s\n </td></tr><tr style="border:0"><td style="border:0;text-align:right;width:1%;white-space:nowrap">\s\n local link <input type=checkbox class=chk name="useLocal"\s\n onclick="this.form.local.value=this.form.local.defaultValue=this.checked?config.macros.attach.localPrompt:\s'\s';">&nbsp;\s\n </td><td style="border:0">\s\n <input type=text name="local" size=15 autocomplete=off value=""\s\n onchange="this.form.useLocal.checked=this.value.length" \s\n onkeyup="this.form.useLocal.checked=this.value.length" \s\n onfocus="if (!this.valuelength) this.value=config.macros.attach.localPrompt; this.select()">\s\n </td></tr><tr style="border:0"><td style="border:0;text-align:right;width:1%;white-space:nowrap">\s\n remote link <input type=checkbox class=chk name="useURL"\s\n onclick="this.form.URL.value=this.form.URL.defaultValue=this.checked?config.macros.attach.URLPrompt:\s'\s';\s\n config.macros.attach.toggleUploadControls(\s'%id%\s',this.checked);">&nbsp;\s\n </td><td style="border:0">\s\n <input type=text name="URL" size=15 autocomplete=off value=""\s\n onfocus="if (!this.value.length) this.value=config.macros.attach.URLPrompt; this.select()"\s\n onchange="this.form.useURL.checked=this.value.length;\s\n config.macros.attach.toggleUploadControls(\s'%id%\s',this.value.length);"\s\n onkeyup="this.form.useURL.checked=this.value.length;\s\n config.macros.attach.toggleUploadControls(\s'%id%\s',this.value.length);">\s\n </td></tr><tr style="border:0"><td style="border:0;text-align:right;width:1%;white-space:nowrap">\s\n <div id="%id%_upcheck" style="display:none">\s\n upload file <input type=checkbox class=chk name="upload"\s\n onclick="this.form.uploadScript.selectedIndex=this.checked?1:0;\s\n this.form.uploadScript.title=\s'\s';\s\n this.form.uploadTarget.disabled=!this.checked;\s\n this.form.uploadTarget.value=this.form.uploadTarget.defaultValue=this.checked?config.macros.attach.targetPrompt:\s'\s';\s">&nbsp;\s\n </div>\s\n </td><td style="border:0">\s\n <div id="%id%_uplist" style="display:none">\s\n <select size=1 name="uploadScript"\s\n onchange="this.title=this.value; if (this.value==\s'editlist\s')\s\n { this.selectedIndex=this.form.upload.checked?1:0; story.displayTiddler(null,config.macros.attach.scriptList,2); return; }\s\n this.form.upload.checked=this.value.length;\s\n if (!this.form.uploadTarget.value.length && this.value.length)\s\n this.form.uploadTarget.value=this.form.uploadTarget.defaultValue=config.macros.attach.targetPrompt;\s\n this.form.uploadTarget.disabled=!this.value.length;">\s\n <option value=""></option>\s\n %scripts%\s\n </select>\s\n </div>\s\n </td></tr><tr style="border:0"><td style="border:0;text-align:right;width:1%;white-space:nowrap">\s\n <div id="%id%_saveas" style="display:none">save as&nbsp;</div>\s\n </td><td style="border:0">\s\n <input type=text name="uploadTarget" id="%id%_uptarget" size=15 autocomplete=off value="" disabled\s\n onfocus="if (!this.value.length) this.value=config.macros.attach.targetPrompt; this.select()" style="display:none">\s\n </td></tr></table>\s\n </div>\s\n <table style="border:0"><tr style="border:0"><td style="border:0;text-align:right;width:1%;white-space:nowrap">\s\n attach as&nbsp;\s\n </td><td style="border:0" colspan=2>\s\n <input type=text name="tiddlertitle" size=15 autocomplete=off value="%title%"\s\n onkeyup="if (!this.value.length) { this.value=config.macros.attach.titlePrompt; this.select(); }"\s\n onfocus="if (!this.value.length) this.value=config.macros.attach.titlePrompt; this.select()" %disabled%>\s\n </td></tr><tr style="border:0"><td style="border:0;text-align:right;width:1%;white-space:nowrap">\s\n description&nbsp;\s\n </td><td style="border:0" colspan=2>\s\n <input type=text name="notes" size=15 autocomplete=off>\s\n </td></tr><tr style="border:0"><td style="border:0;text-align:right;width:1%;white-space:nowrap">\s\n add tags&nbsp;\s\n </td><td style="border:0">\s\n <input type=text name="tags" size=15 autocomplete=off value="" onfocus="this.select()">\s\n </td><td style="width:40%;text-align:right">\s\n <input type=button class=btn2 value="attach"\s\n onclick="config.macros.attach.onClickAttach(this)"><!--\s\n --><input type=button class=btn2 value="close"\s\n onclick="var panel=document.getElementById(\s'%id%\s'); if (panel) panel.parentNode.removeChild(panel);">\s\n </td></tr></table>\s\n </form>',\n//}}}\n// // control processing\n//{{{\n onChangeSource:\n function(here) {\n var form=here.form;\n var list=form.MIMEType;\n var theFilename = form.source.value;\n var theExtension = theFilename.substr(theFilename.lastIndexOf('.')).toLowerCase();\n for (var i=0; i<list.options.length; i++)\n if (list.options[i].value.indexOf(theExtension)!=-1) {\n list.selectedIndex = i;\n form.useData.checked = true;\n form.useLocal.checked = true;\n form.local.value = theFilename;\n break;\n }\n theFilename=theFilename.replace(/\s\s/g,"/"); // fixup: change \s to /\n if (!form.tiddlertitle.disabled)\n form.tiddlertitle.value=theFilename.substr(theFilename.lastIndexOf('/')+1); // get tiddlername from filename\n },\n//}}}\n//{{{\n toggleUploadControls:\n function(id,show) {\n if (config.macros.attach.hideUpload) return;\n document.getElementById(id+'_upcheck').style.display\n =document.getElementById(id+'_uplist').style.display\n =document.getElementById(id+'_saveas').style.display\n =document.getElementById(id+'_uptarget').style.display\n =show?'block':'none';\n },\n//}}}\n//{{{\n onClickAttach:\n function (here) {\n clearMessage();\n // get input values\n var form=here.form;\n var theDate=(new Date()).formatString(config.macros.timeline.dateFormat);\n var theSource = form.source.value!=form.source.defaultValue?form.source.value:"";\n var theTitle=form.tiddlertitle.value;\n var theLocal = form.local.value!=form.local.defaultValue?form.local.value:"";\n var theURL = form.URL.value!=form.URL.defaultValue?form.URL.value:"";\n var theNotes = form.notes.value;\n var theTags = "attachment excludeMissing "+form.tags.value;\n var useData=form.useData.checked;\n var useLocal=form.useLocal.checked;\n var useURL=form.useURL.checked;\n var upload=form.upload.checked;\n var theMIMEType = form.MIMEType.value.length?form.MIMEType.options[form.MIMEType.selectedIndex].text:"";\n // validate checkboxes and get filename\n if (useData||upload) {\n if (theSource.length) { if (!theLocation) var theLocation=theSource; }\n else { alert(this.sourceErr); form.source.focus(); return false; }\n }\n if (useLocal) {\n if (theLocal.length) { if (!theLocation) var theLocation = theLocal; }\n else { alert(this.localErr); form.local.focus(); return false; }\n }\n if (useURL) {\n if (theURL.length) { if (!theLocation) var theLocation = theURL; }\n else { alert(this.URLErr); form.URL.focus(); return false; }\n }\n if (!(useData||useLocal||useURL))\n { form.useData.focus(); alert(this.storageErr); return false; }\n if (!theLocation)\n { form.source.focus(); alert(this.sourceErr); return false; }\n if (!theTitle || !theTitle.trim().length || theTitle==this.titlePrompt)\n { form.tiddlertitle.focus(); alert(this.tiddlerErr); return false; }\n if (upload) {\n var theScript = form.uploadScript.value!=form.uploadScript.defaultValue?form.uploadScript.value:"";\n if (!theScript.length) { alert(this.scriptErr); form.uploadScript.focus(); return false; }\n var theServer = form.uploadScript.options[form.uploadScript.selectedIndex].text;\n var theParams = this.scriptParams[form.uploadScript.selectedIndex];\n var theTarget = form.uploadTarget.value!=form.uploadTarget.defaultValue?form.uploadTarget.value:"";\n if (!theTarget.length) { alert(this.targetErr); form.uploadTarget.focus(); return false; }\n }\n // if not already selected, determine MIME type based on filename extension (if any)\n if (!theMIMEType.length && theLocation.lastIndexOf('.')!=-1) {\n var theExt = theLocation.substr(theLocation.lastIndexOf('.')).toLowerCase();\n var theList=form.MIMEType;\n for (var i=0; i<theList.options.length; i++)\n if (theList.options[i].value.indexOf(theExt)!=-1)\n { var theMIMEType=theList.options[i].text; theList.selectedIndex=i; break; }\n }\n // encode the data\n if (useData) {\n if (!theMIMEType.length) {\n alert(this.MIMEErr);\n form.MIMEType.selectedIndex=1; form.MIMEType.focus();\n return false;\n }\n var theData = this.readFile(theSource); if (!theData) { alert(this.notSupportedErr); return false; }\n displayMessage('encoding '+theSource);\n var theEncoded = this.encodeBase64(theData);\n displayMessage('file size='+theData.length+' bytes, encoded size='+theEncoded.length+' bytes');\n }\n // upload the file\n if (upload) var uploadresult=this.uploadFile(theTitle,theSource,theMIMEType,theServer,theScript,theParams,theTarget);\n // generate tiddler and refresh\n var theText = "";\n theText +=theSource.length?this.sourceReport.format([theSource]):this.nosourceReport;\n theText +=this.dateReport.format([theDate,config.options.txtUserName]);\n theText +=theNotes.length?this.notesReport.format([theNotes]):"";\n theText +=useData?this.dataReport.format([theTitle,theMIMEType,theData.length,theEncoded.length]):this.nodataReport;\n theText +=useLocal?this.localReport.format([theLocal,'file:///'+theLocal.replace(/\s\s/g,"/")]):this.nolocalReport;\n theText +=useURL?this.URLReport.format([theURL]):this.noURLReport;\n theText +=(theMIMEType.substr(0,5)=="image")?this.imageReport.format([theTitle]):"";\n theText +=upload?uploadresult:"";\n theText +=useData?this.dataBlock.format([theMIMEType,theEncoded]):"";\n store.saveTiddler(theTitle,theTitle,theText,config.options.txtUserName,new Date(),theTags);\n document.getElementById("attachPanel").style.display="none";\n story.displayTiddler(null,theTitle);\n story.refreshTiddler(theTitle,null,true);\n displayMessage('attached "'+theTitle+'"');\n return true;\n },\n//}}}\n// // base64 conversion\n//{{{\n encodeBase64:\n function (theData) {\n if (!theData) return null;\n // encode as base64\n var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";\n var out = ""; //This is the output\n var chr1, chr2, chr3 = ""; //These are the 3 bytes to be encoded\n var enc1, enc2, enc3, enc4 = ""; //These are the 4 encoded bytes\n for (var count=0,i=0; i<theData.length; )\n {\n chr1 = theData.charCodeAt(i++); //Grab the first byte\n chr2 = theData.charCodeAt(i++); //Grab the second byte\n chr3 = theData.charCodeAt(i++); //Grab the third byte\n enc1 = chr1 >> 2;\n enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);\n enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);\n enc4 = chr3 & 63;\n if (isNaN(chr2))\n enc3 = enc4 = 64;\n else if (isNaN(chr3))\n enc4 = 64;\n out += keyStr.charAt(enc1)+keyStr.charAt(enc2)+keyStr.charAt(enc3)+keyStr.charAt(enc4);\n chr1 = chr2 = chr3 = "";\n enc1 = enc2 = enc3 = enc4 = "";\n count+=4; if (count>60) { out+='\sn'; count=0; } // add line break every 60 chars for readability\n }\n return out;\n },\n//}}}\n// // I/O functions\n//{{{\n readFile:\n function(filePath) {\n if(!window.Components) { return(null); }\n try {\n netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");\n var file = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);\n file.initWithPath(filePath);\n if (!file.exists()) { alert("File not found: "+filePath); return(null); }\n var inputStream = Components.classes["@mozilla.org/network/file-input-stream;1"].createInstance(Components.interfaces.nsIFileInputStream);\n inputStream.init(file, 0x01, 00004, null);\n var bInputStream = Components.classes["@mozilla.org/binaryinputstream;1"].createInstance(Components.interfaces.nsIBinaryInputStream);\n bInputStream.setInputStream(inputStream);\n return(bInputStream.readBytes(inputStream.available()));\n }\n catch(e) { alert("An error occured while attempting to attach\sn"+filePath+"\sn\sn" + e); }\n return(null);\n },\n//}}}\n//{{{\n writeFile:\n function(filepath,data) {\n // TBD: decode base64 and write data to specified local path/filename\n return(false);\n },\n//}}}\n//{{{\n uploadFile:\n function(title,source,MIMEType,server,URL,scriptparams,target) {\n displayMessage("begin upload: \s""+title+"\s"");\n if (URL==undefined || !URL.length)\n return this.uploadReport.format([server,URL,target,"error: missing script URL"]);\n var x; // XML object\n try {x = new XMLHttpRequest()}\n catch(e) {\n try {x = new ActiveXObject("Msxml2.XMLHTTP")}\n catch (e) {\n try {x = new ActiveXObject("Microsoft.XMLHTTP")}\n catch (e) { return this.uploadReport.format([server,URL,target,"error: could not create XMLHttpRequest object"]); }\n }\n }\n var starttime=new Date();\n x.onreadystatechange = function() {\n if (x.readyState == 4) {\n var endtime=new Date();\n var elapsed=(endtime-starttime+1)/1000;\n displayMessage("end upload: \s""+title+"\s" ("+elapsed+" seconds)");\n var response="\sn''"+endtime.formatString("DD MMM YYYY 0hh:0mm:0ss")+"'' - upload ended (elapsed="+elapsed+" seconds).\sn";\n; response+="status code="+x.status+"\snserver response:\sn{{{\sn"+x.responseText+"\sn}}}\sn";\n var tiddler=store.getTiddler(title);\n if (tiddler) {\n var marker="/%RESULT%/"; var pos=tiddler.text.indexOf(marker);\n if (pos!=-1) {\n tiddler.set(null,tiddler.text.substr(0,pos)+response+tiddler.text.substr(pos+marker.length));\n story.displayTiddler(null,title); story.refreshTiddler(title,null,true); store.setDirty(true);\n } \n }\n }\n }\n if ((document.location.protocol=="file:") && (typeof(netscape)!="undefined")) { // UniversalBrowserRead only works from a local file context\n try { netscape.security.PrivilegeManager.enablePrivilege('UniversalBrowserRead')}\n catch (e) { displayMessage(e.description?e.description:e.toString()); }\n }\n try {\n var data=this.readFile(source);\n if (!data) return this.uploadReport.format([server,URL,target,"could not read local source file"]);\n scriptparams=scriptparams.replace(/%TARGET%/g,target).replace(/%TYPE%/g,MIMEType).replace(/%SIZE%/g,data.length);\n if (scriptparams.indexOf("\sn")==-1) { // single-line params=GET\n x.open("GET",URL,true);\n scriptparams=scriptparams.replace(/%DATA%/g,encodeURIComponent(data));\n x.setRequestHeader('Content-type','application/x-www-form-urlencoded');\n }\n else { // multi-line params=POST\n x.open("POST",URL,true);\n var boundary="----------AttachFilePluginDataBoundary----------";\n scriptparams="\sn"+scriptparams.replace(/%BOUNDARY%/g,boundary).replace(/%DATA%/g,data)+"\sn";\n x.setRequestHeader('Content-Length',scriptparams.length);\n x.setRequestHeader('Content-Type','multipart/form-data; boundary='+boundary);\n }\n x.send(scriptparams);\n // DEBUG alert("params\sn-----\sn"+scriptparams+"\sn-----\sn"); // wffl DEBUG\n }\n catch (e) { displayMessage(e.description?e.description:e.toString()); }\n var response="''"+starttime.formatString("DD MMM YYYY 0hh:0mm:0ss")+"'' - upload started...";\n return this.uploadReport.format([server,URL,target,response]);\n }\n};\n//}}}\n\n/***\n!!!!!Formatters\n|NOTE: These functions are also defined separately in a small, "run-time library" plugin: AttachFilePluginFormatters, which provides "stand-alone" processing for //rendering// attachment tiddlers, but does not include the AttachTiddlers control panel and supporting functions. To reduce your document size, you can include AttachFilePluginFormatters ''instead of'' AttachFilePlugin when distributing documents that contain attachments, as long you don't intend to create any new attachment tiddlers to your document.|\n\n''Extends wikify() formatters to process attachment tiddler references''\n* embedded images: {{{[img[tooltip|image]]}}}\n* linked embedded images: {{{[img[tooltip|image][link]]}}}\n* external/"pretty" links: {{{[[label|link]]}}}\n\n***/\n//{{{\nif (config.macros.attach==undefined) config.macros.attach= { };\n//}}}\n//{{{\nif (config.macros.attach.isAttachment==undefined) config.macros.attach.isAttachment=function (title) {\n var tiddler = store.getTiddler(title);\n if (tiddler==undefined || tiddler.tags==undefined) return false;\n return (tiddler.tags.find("attachment")!=null);\n}\n//}}}\n//{{{\nif (config.macros.attach.getAttachment==undefined) config.macros.attach.getAttachment=function(title) {\n var text = store.getTiddlerText(title);\n var result=""; var pos=0; var endpos=0;\n\n var startmarker="---BEGIN_DATA---\sn";\n var endmarker="\sn---END_DATA---";\n if (!config.browser.isIE && (pos=text.indexOf(startmarker))!=-1 && (endpos=text.indexOf(endmarker))!=-1) {\n var out="data:"+(text.substring(pos+startmarker.length,endpos)).replace(/\sn/g,''); // strip embedded newlines\n return out;\n }\n if ((pos=text.indexOf("/%LOCAL_LINK%/"))!=-1) // fallback to local link\n return text.substring(text.indexOf("|",pos)+1,text.indexOf("]]",pos)); \n if ((pos=text.indexOf("/%REMOTE_LINK%/"))!=-1) // fallback to remote URL\n return text.substring(text.indexOf("|",pos)+1,text.indexOf("]]",pos));\n\n // fallback for backward-compatibility:\n // before 3.2.0 encoded datablock was located between ----'s instead of using embedded 'keyword markers' in the tiddler content\n var data=text.split('\sn----\sn');\n if (!config.browser.isIE && data[1] && data[1].length) // NOTE: IE does not support the "data:" URI scheme\n return "data:"+data[1].replace(/\s\sn/g,'');\n\n return "";\n}\n//}}}\n//{{{\nif (config.macros.attach.init_formatters==undefined) config.macros.attach.init_formatters=function() {\n if (this.initialized) return;\n // find the formatter for "image" and replace the handler\n for (var i=0; i<config.formatters.length && config.formatters[i].name!="image"; i++);\n if (i<config.formatters.length) config.formatters[i].handler=function(w) {\n if (!this.lookaheadRegExp) // fixup for TW2.0.x\n this.lookaheadRegExp = new RegExp(this.lookahead,"mg");\n this.lookaheadRegExp.lastIndex = w.matchStart;\n var lookaheadMatch = this.lookaheadRegExp.exec(w.source)\n if(lookaheadMatch && lookaheadMatch.index == w.matchStart) // Simple bracketted link\n {\n var e = w.output;\n if(lookaheadMatch[5])\n {\n var link = lookaheadMatch[5];\n // ELS -------------\n if (!config.formatterHelpers.isExternalLink) // fixup for TW2.0.x\n var external=!store.tiddlerExists(link)&&!store.isShadowTiddler(link);\n else\n var external=config.formatterHelpers.isExternalLink(link);\n if (external)\n {\n if (config.macros.attach.isAttachment(link))\n {\n e = createExternalLink(w.output,link);\n e.href=config.macros.attach.getAttachment(link);\n e.title = config.macros.attach.linkTooltip + link;\n }\n else\n e = createExternalLink(w.output,link);\n }\n else \n e = createTiddlyLink(w.output,link,false,null,w.isStatic);\n // ELS -------------\n addClass(e,"imageLink");\n }\n var img = createTiddlyElement(e,"img");\n if(lookaheadMatch[1])\n img.align = "left";\n else if(lookaheadMatch[2])\n img.align = "right";\n if(lookaheadMatch[3])\n img.title = lookaheadMatch[3];\n img.src = lookaheadMatch[4];\n // ELS -------------\n if (config.macros.attach.isAttachment(lookaheadMatch[4]))\n img.src=config.macros.attach.getAttachment(lookaheadMatch[4]);\n // ELS -------------\n w.nextMatch = this.lookaheadRegExp.lastIndex;\n }\n }\n//}}}\n//{{{\n // find the formatter for "prettyLink" and replace the handler\n for (var i=0; i<config.formatters.length && config.formatters[i].name!="prettyLink"; i++);\n if (i<config.formatters.length) {\n if (version.major>=2 && version.minor>=1 && version.revision>2) {\n config.formatters[i].handler=function(w) \n {\n this.lookaheadRegExp.lastIndex = w.matchStart;\n var lookaheadMatch = this.lookaheadRegExp.exec(w.source);\n if(lookaheadMatch && lookaheadMatch.index == w.matchStart)\n {\n var e;\n var text = lookaheadMatch[1];\n if(lookaheadMatch[3])\n {\n // Pretty bracketted link\n var link = lookaheadMatch[3];\n if (config.macros.attach.isAttachment(link))\n {\n e = createExternalLink(w.output,link);\n e.href=config.macros.attach.getAttachment(link);\n e.title=config.macros.attach.linkTooltip+link;\n }\n else e = (!lookaheadMatch[2] && config.formatterHelpers.isExternalLink(link))\n ? createExternalLink(w.output,link)\n : createTiddlyLink(w.output,link,false,null,w.isStatic);\n }\n else\n {\n // Simple bracketted link\n if (config.macros.attach.isAttachment(text))\n {\n e = createExternalLink(w.output,text);\n e.href=config.macros.attach.getAttachment(text);\n e.title=config.macros.attach.linkTooltip+text;\n }\n else e = createTiddlyLink(w.output,text,false,null,w.isStatic);\n }\n createTiddlyText(e,text);\n w.nextMatch = this.lookaheadRegExp.lastIndex;\n }\n }\n } else { // FALLBACK for TW2.1.2 and earlier\n config.formatters[i].handler=function(w)\n {\n if (!this.lookaheadRegExp) // fixup for TW2.0.x\n this.lookaheadRegExp = new RegExp(this.lookahead,"mg");\n this.lookaheadRegExp.lastIndex = w.matchStart;\n var lookaheadMatch = this.lookaheadRegExp.exec(w.source)\n if(lookaheadMatch && lookaheadMatch.index == w.matchStart)\n {\n var e;\n var text = lookaheadMatch[1];\n if (lookaheadMatch[2]) // Simple bracketted link\n {\n e = createTiddlyLink(w.output,text,false,null,w.isStatic);\n }\n else if(lookaheadMatch[3]) // Pretty bracketted link\n {\n var link = lookaheadMatch[4];\n // ELS -------------\n if (!config.formatterHelpers.isExternalLink) // fixup for TW2.0.x\n var external=!store.tiddlerExists(link)&&!store.isShadowTiddler(link);\n else\n var external=config.formatterHelpers.isExternalLink(link);\n if (external)\n {\n if (config.macros.attach.isAttachment(link))\n {\n e = createExternalLink(w.output,link);\n e.href=config.macros.attach.getAttachment(link);\n e.title = config.macros.attach.linkTooltip + link;\n }\n else\n e = createExternalLink(w.output,link);\n }\n else \n e = createTiddlyLink(w.output,link,false,null,w.isStatic);\n // ELS -------------\n }\n createTiddlyText(e,text);\n w.nextMatch = this.lookaheadRegExp.lastIndex;\n }\n }\n } // END FALLBACK\n } // if "prettyLink" formatter found\n this.initialized=true;\n}\n//}}}\n//{{{\nconfig.macros.attach.init_formatters(); // load time init\n//}}}\n//{{{\nif (TiddlyWiki.prototype.coreGetRecursiveTiddlerText==undefined) {\n TiddlyWiki.prototype.coreGetRecursiveTiddlerText = TiddlyWiki.prototype.getRecursiveTiddlerText;\n TiddlyWiki.prototype.getRecursiveTiddlerText = function(title,defaultText,depth) {\n return config.macros.attach.isAttachment(title)?\n config.macros.attach.getAttachment(title):this.coreGetRecursiveTiddlerText(title,defaultText,depth);\n }\n}\n//}}}
/***\n|''Name:''|AttachFilePluginFormatters|\n|''Source:''|http://www.TiddlyTools.com/#AttachFilePluginFormatters|\n|''Author:''|Eric Shulman - ELS Design Studios|\n|''License:''|[[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|\n|''~CoreVersion:''|2.0.10|\n\nYou can include this small //''run time library''// in your documents to render ''attachment tiddlers'' created by the AttachFilePlugin. Attachment tiddlers are tagged with<<tag attachment>>and contain binary file content (e.g., jpg, gif, pdf, mp3, etc.) that can be stored directly as base64 text-encoded data or loaded from external files stored on a local filesystem or remote web server.\n\nThis plugin extends the behavior of the following TiddlyWiki core "wikify()" formatters:\n* embedded images: {{{[img[tooltip|image]]}}}\n* linked embedded images: {{{[img[tooltip|image][link]]}}}\n* external/"pretty" links: {{{[[label|link]]}}}\n\n''Please refer to AttachFilePlugin (source: http://www.TiddlyTools.com/#AttachFilePlugin) for additional information.''\n!!!!!Revision History\n<<<\n''2006.11.09 []'' sync with AttachFilePlugin v3.4.6 (real fix for TW2.1.3)\n''2006.11.08 []'' sync with AttachFilePlugin v3.4.5 (temporary fix for TW2.1.3)\n''2006.09.10 []'' sync with AttachFilePlugin v3.4.4\n''2006.07.24 []'' sync with AttachFilePlugin v3.4.3\n''2006.07.13 []'' sync with AttachFilePlugin v3.4.2\n''2006.06.15 []'' sync with AttachFilePlugin v3.4.1\n''2006.05.20 []'' sync with AttachFilePlugin v3.4.0\n''2006.05.13 []'' created from AttachFilePlugin v3.2.0\n<<<\n!!!!!Code\n***/\n//{{{\nif (config.macros.attach==undefined) config.macros.attach= { };\n//}}}\n//{{{\nif (config.macros.attach.isAttachment==undefined) config.macros.attach.isAttachment=function (title) {\n var tiddler = store.getTiddler(title);\n if (tiddler==undefined || tiddler.tags==undefined) return false;\n return (tiddler.tags.find("attachment")!=null);\n}\n//}}}\n//{{{\nif (config.macros.attach.getAttachment==undefined) config.macros.attach.getAttachment=function(title) {\n var text = store.getTiddlerText(title);\n var result=""; var pos=0; var endpos=0;\n\n var startmarker="---BEGIN_DATA---\sn";\n var endmarker="\sn---END_DATA---";\n if (!config.browser.isIE && (pos=text.indexOf(startmarker))!=-1 && (endpos=text.indexOf(endmarker))!=-1) {\n var out="data:"+(text.substring(pos+startmarker.length,endpos)).replace(/\sn/g,''); // strip embedded newlines\n return out;\n }\n if ((pos=text.indexOf("/%LOCAL_LINK%/"))!=-1) // fallback to local link\n return text.substring(text.indexOf("|",pos)+1,text.indexOf("]]",pos)); \n if ((pos=text.indexOf("/%REMOTE_LINK%/"))!=-1) // fallback to remote URL\n return text.substring(text.indexOf("|",pos)+1,text.indexOf("]]",pos));\n\n // fallback for backward-compatibility:\n // before 3.2.0 encoded datablock was located between ----'s instead of using embedded 'keyword markers' in the tiddler content\n var data=text.split('\sn----\sn');\n if (!config.browser.isIE && data[1] && data[1].length) // NOTE: IE does not support the "data:" URI scheme\n return "data:"+data[1].replace(/\s\sn/g,'');\n\n return "";\n}\n//}}}\n//{{{\nif (config.macros.attach.init_formatters==undefined) config.macros.attach.init_formatters=function() {\n if (this.initialized) return;\n // find the formatter for "image" and replace the handler\n for (var i=0; i<config.formatters.length && config.formatters[i].name!="image"; i++);\n if (i<config.formatters.length) config.formatters[i].handler=function(w) {\n if (!this.lookaheadRegExp) // fixup for TW2.0.x\n this.lookaheadRegExp = new RegExp(this.lookahead,"mg");\n this.lookaheadRegExp.lastIndex = w.matchStart;\n var lookaheadMatch = this.lookaheadRegExp.exec(w.source)\n if(lookaheadMatch && lookaheadMatch.index == w.matchStart) // Simple bracketted link\n {\n var e = w.output;\n if(lookaheadMatch[5])\n {\n var link = lookaheadMatch[5];\n // ELS -------------\n if (!config.formatterHelpers.isExternalLink) // fixup for TW2.0.x\n var external=!store.tiddlerExists(link)&&!store.isShadowTiddler(link);\n else\n var external=config.formatterHelpers.isExternalLink(link);\n if (external)\n {\n if (config.macros.attach.isAttachment(link))\n {\n e = createExternalLink(w.output,link);\n e.href=config.macros.attach.getAttachment(link);\n e.title = config.macros.attach.linkTooltip + link;\n }\n else\n e = createExternalLink(w.output,link);\n }\n else \n e = createTiddlyLink(w.output,link,false,null,w.isStatic);\n // ELS -------------\n addClass(e,"imageLink");\n }\n var img = createTiddlyElement(e,"img");\n if(lookaheadMatch[1])\n img.align = "left";\n else if(lookaheadMatch[2])\n img.align = "right";\n if(lookaheadMatch[3])\n img.title = lookaheadMatch[3];\n img.src = lookaheadMatch[4];\n // ELS -------------\n if (config.macros.attach.isAttachment(lookaheadMatch[4]))\n img.src=config.macros.attach.getAttachment(lookaheadMatch[4]);\n // ELS -------------\n w.nextMatch = this.lookaheadRegExp.lastIndex;\n }\n }\n//}}}\n//{{{\n // find the formatter for "prettyLink" and replace the handler\n for (var i=0; i<config.formatters.length && config.formatters[i].name!="prettyLink"; i++);\n if (i<config.formatters.length) {\n if (version.major>=2 && version.minor>=1 && version.revision>2) {\n config.formatters[i].handler=function(w) \n {\n this.lookaheadRegExp.lastIndex = w.matchStart;\n var lookaheadMatch = this.lookaheadRegExp.exec(w.source);\n if(lookaheadMatch && lookaheadMatch.index == w.matchStart)\n {\n var e;\n var text = lookaheadMatch[1];\n if(lookaheadMatch[3])\n {\n // Pretty bracketted link\n var link = lookaheadMatch[3];\n if (config.macros.attach.isAttachment(link))\n {\n e = createExternalLink(w.output,link);\n e.href=config.macros.attach.getAttachment(link);\n e.title=config.macros.attach.linkTooltip+link;\n }\n else e = (!lookaheadMatch[2] && config.formatterHelpers.isExternalLink(link))\n ? createExternalLink(w.output,link)\n : createTiddlyLink(w.output,link,false,null,w.isStatic);\n }\n else\n {\n // Simple bracketted link\n if (config.macros.attach.isAttachment(text))\n {\n e = createExternalLink(w.output,text);\n e.href=config.macros.attach.getAttachment(text);\n e.title=config.macros.attach.linkTooltip+text;\n }\n else e = createTiddlyLink(w.output,text,false,null,w.isStatic);\n }\n createTiddlyText(e,text);\n w.nextMatch = this.lookaheadRegExp.lastIndex;\n }\n }\n } else { // FALLBACK for TW2.1.2 and earlier\n config.formatters[i].handler=function(w)\n {\n if (!this.lookaheadRegExp) // fixup for TW2.0.x\n this.lookaheadRegExp = new RegExp(this.lookahead,"mg");\n this.lookaheadRegExp.lastIndex = w.matchStart;\n var lookaheadMatch = this.lookaheadRegExp.exec(w.source)\n if(lookaheadMatch && lookaheadMatch.index == w.matchStart)\n {\n var e;\n var text = lookaheadMatch[1];\n if (lookaheadMatch[2]) // Simple bracketted link\n {\n e = createTiddlyLink(w.output,text,false,null,w.isStatic);\n }\n else if(lookaheadMatch[3]) // Pretty bracketted link\n {\n var link = lookaheadMatch[4];\n // ELS -------------\n if (!config.formatterHelpers.isExternalLink) // fixup for TW2.0.x\n var external=!store.tiddlerExists(link)&&!store.isShadowTiddler(link);\n else\n var external=config.formatterHelpers.isExternalLink(link);\n if (external)\n {\n if (config.macros.attach.isAttachment(link))\n {\n e = createExternalLink(w.output,link);\n e.href=config.macros.attach.getAttachment(link);\n e.title = config.macros.attach.linkTooltip + link;\n }\n else\n e = createExternalLink(w.output,link);\n }\n else \n e = createTiddlyLink(w.output,link,false,null,w.isStatic);\n // ELS -------------\n }\n createTiddlyText(e,text);\n w.nextMatch = this.lookaheadRegExp.lastIndex;\n }\n }\n } // END FALLBACK\n } // if "prettyLink" formatter found\n this.initialized=true;\n}\n//}}}\n//{{{\nconfig.macros.attach.init_formatters(); // load time init\n//}}}\n//{{{\nif (TiddlyWiki.prototype.coreGetRecursiveTiddlerText==undefined) {\n TiddlyWiki.prototype.coreGetRecursiveTiddlerText = TiddlyWiki.prototype.getRecursiveTiddlerText;\n TiddlyWiki.prototype.getRecursiveTiddlerText = function(title,defaultText,depth) {\n return config.macros.attach.isAttachment(title)?\n config.macros.attach.getAttachment(title):this.coreGetRecursiveTiddlerText(title,defaultText,depth);\n }\n}\n//}}}
| source file|{{{...\simages\smeow.gif}}}|\n| attached on|15 May 2006 by ELSDesignStudios|\n| embedded data|[[meow.gif|AttachFileSample]] - {{{type=image/gif, size=3399 bytes, encoded=4602 bytes}}}|\n| local link|/%LOCAL_LINK%/[[images/meow.gif|images/meow.gif]]|\n| remote link|/%REMOTE_LINK%/[[http://www.TiddlyTools.com/images/meow.gif|http://www.TiddlyTools.com/images/meow.gif]]|\nimage\n<<<\nusage: {{{[img[tooltip|AttachFileSample]] or [img[tooltip|AttachFileSample][link]]}}})\n[img[tooltip|AttachFileSample]]\n<<<\n\n/% DO NOT EDIT BELOW THIS POINT\n---BEGIN_DATA---\nimage/gif;base64,\nR0lGODlhOABQAPcAAAAACAAAEAAICAgICAgLDBAQCAQQGRAIEBgICBAQEBAQGBAY\nFBoOEhwUFCEYEBgYGA4cIBkgGyEcHCEhISkYGCkcHCEpHCklIRAgMRkmNSElKSEp\nNikeKykpKSExQiE5QjEhJTEpITEpKSkpMSkxISk1KTExITExKSktNTEpMTEpOTEx\nMSk5MSkxOSkxQik5PTkrKTkxMTE8KTFCMTExOTExQjE5PTFCPTk3MzlCMTkxQjk5\nQkI0MzlGPUg9M01JNi88TTlEUkI8REJCSkZDRFBDQkY/UFA/TjNMUkNOS1JKSkpW\nRj1KWEpKWj9OXEVZZlhMRlVLVVpSUlReUFdSYFVhX1JSa1VfbmBbU11ia2dcV3Fj\nXVpldWVkb2tnb3tnbGZ1ZHV6aWVwe3d5c2N4iXN3gntzgHeBiYd2dYWHeoh/jIKL\nkJWEfZmUh5CNlJ+VkICPn46XpZiSo5WfoJycnKaemaGcqKWlpZWnraWtqa2qoq2l\nrZavvKW4xK2lta2ws/8A/7WcjLWllLWlpbWlrb2tnMatnLWtpbWtrb2trbWttb2t\ntbWtvbW1pca1pbW1ra21va21xrW1tbW1vbW1xrW9tb21rb21tb21vb21xr29rb29\ntca9sca1vc69rda9ra29wa3GxrW9vbW9xq29zrHGyrPB0rXG1r29vb29xr29zr3G\nvb3Gxr3Gzr3G1sa9vcbGtc7GtdbGtcbGvc7GvdbGvd7Gvca9xsa9zsbGxsbGzsbG\n1s7DyNbGxtbGzs7G1rjQ2MbO0sbO3sbW1s7Owc7OzsbW3sbe3s7O1s7W0tbQx+HU\nzNDQ29bW1tvb1ufa1sPW6dDW4dbW3trY4sni7dbk797e3tbx9N7n3ufe3t7e597n\n597i7+fe597s9N73++fn3ufn5+fn7+fv5+fv7+/e5+/r4vfr4ufn9+fv9+fv/+/n\n7+/v8/Pz7/fv9+/v/+f3++f//+/39+/3/+//9+////f37/f39/f3//f/9/f////3\n7//39//3////9////yH5BAEAAIAALAAAAAA4AFAAQAj+AAEJHEiwoMGDCBMqXIiw\niA8tXbxIgXHhgY+FICSIiCFFihIeXRgm9OKlDJMqYs506UIDRIUKD7w8kLCiAw0q\n0ao8WCFhwgQqDx7E+EJHm0gpUaI0ibKDBo0dXeakazEkxYUOGjRMSQOmQw874eR9\nIHNPXrFba5Y8CLNDyYULGlZQRVjtzJCmTnew2AGp2j19gAGTC6ctnLvDZfWR07Aj\nCJAd4fTduxctFapbiDKTQ7gjSZcsT6PQqLmCxhA78v4GnuxOHuGzeei8kVLkh5I1\nb9y80XPp0q1s+lK7E3eQjSIvbqJAEiPGjR0/c9REqyavtTx9rVtn09asmJsvbMb+\nuLlcrFn3YsqsiRM33M3CDlkUsWMnT978cM206Y/WjH+187cEGOArqKCiCCJ00DEH\nHXXkIdJBEgQVlEsS1iThAwlg+EAXcNgBySiQQILKJWOM8YYy2Tyo4oqA5HELMtxx\nVwyLNA5UxAUxxPBWjTjGIIIWNSKUhhddUFFFU0O89BZjQ9DQwYUPVKABCEJg8cYZ\nK5aRxRNM0JDCCimkQMUONXUAwlVOKbGDGHhAMEczgemjTV2jXeCTBqZFoZASVDDR\nxGildTbHX3zUgJeTZ0Cimj5kBLHDEEM0IU59cd6TDmHm7WFQNHDAwcVoT5m2Qg2t\nAJPYau6wY01/2ohTjDb+Z91hhiK3FMiILnkcWIw1iLlz0BuPquHEFaDWtEMVclyX\nWpz1pUNONdKkkkoWyEGSqyKXvYJeNtmEo6pRCEkyaX3ykMPOYOWSw41+2rDTGjnd\nNoMMMsXoUkw05SFzXnlnFaiIikpOIIEUbrzaSit+RPFWByK4ocoordzC74iKKHLG\nFmm4kQciQSIkgQQIIEAAAQ+Q/IDIIieQAAFROPcHI9heUodh2ujT8c0CzcEdt8Ph\n7DONGgwxxs+A7BADEUT4SOMEMWyBBRYiEA2ID16oYYYZDsXwQGNOMHGFFUz4ucMF\nND2qRBdmeDEE0Uq0IccWSuDQwdwXXrBCkxVFKOH+VVB8UceMNHohxhVNipDCEBqk\noIGUTu70AA4P3PUEYG6cEQXiM0lwwRBryKNiF1dcwYQQDK+wQxZijGYmnk+tsEIV\nGrgTZ6VniMHUCHZ3EAWQCWlRxe+X47BCy8UEc08GcmfVwVUxLDHFECPoE01TTWhj\nTRQimBBDEW64QUYTZczBhBcJCTFEFKODSkMUZcAJWDWMjDJHGW4089df3DiRBRDg\nwzE7YPLgji5uIQmEzIMaeHgU+nbwqCaEaFEAXI82rqOav8gDLgOzjj5c9YpbXEIR\n2bjHLQ5yBjdw4QxjGs0OOvA6MQSjGrNLjX2akQ1U0KEMXlACDYh0uS3M4Q3+CeoA\nHbKBmHuE4yBJ6EEXUveomiBuCKhwA3AqOJmypIMb+ILEH1ChhTXoIUEbqwMiXsEL\nZThjOOEgB8cO4gYqKOEMDNxhFKjQBFmFw4IAZM25uJOKMWyhi35gxFk6WAxnqOcw\n5wKcQdAgJz84shrVcIMfRpEOSMqjGtGoTnVSJY78dIcRf2ADFPwgsbM0Q2LmaRVm\nGNKGYmzSPvYxFzsqOZ12dSsbACrlq85Sq1sQ6EBrfBAReHI1baTjUuGIhjZ0UZkC\n3cI89CqPeQrkBzq4IQ1nWMOCCsijoPhgBUKoQstokJUJQOkBSlADJVqRimKgghEw\ne4MW0KCxZvisIif+QwCUMnShkD2ABmaQAyQoMYoCXYINdCgGcKRmEAkRQAErI4DK\ngiIHP/wBEoy4hDvN0wxfMXRFo7CXNYh4j492TBG7VJVJV1oQKDBUCzi6WZQuUAai\n+UAEPvDRBWikEaTxIGo/EwIP/igFH0hARZoTwRC+8AUtFEFqPlCCFryghZtSRE8H\n6cIOHnABH0iBWl4wwxGgupIiKUEIPqjAqKhihSY4igYjMGcHUrCDKIS1hFKTAlVF\nAwIq1W19NMCnhCRQgRBAAQ28SIPP1nCGNBTDaXfZQQoq8LGgYAVSILjQBC6wAyEQ\nAQ11SFGNuvC7P+2ACXO4i+kipNYHdIBMppn+hxteRyYqCEwCOJDCHDyqIixoQQxu\nleyXojA3rFxgBK57ixcmcNozAOYeeAjCGWZiN7hM4AmjUFEVmpCFJrjuSxEhE1ZA\nYLq7KQFS0RjU/+5xhjI0YQcauEBesKoQM2QBUp113dzm4CjFZaVM8RWCGwA4u3sA\nowmq1cAE8GQF+iJECXNkwg6E11kmuCEdGSATCLISlyqAwXkQSI0TuACHdBTjDh0A\ngwmw0EAyiWElCilCEvDrlKfsoAzC0Ecc9uI6DXDVxxPwwgjuAQc8NSEa3UiDMngh\nu3v8oXZ3QIYX/KCQIdCxKYGiQhei8dw5tHEIXqjCHGAImHR8QAhAuEL+FsrwP8E0\nQxdwVogC71JjIXShFdcJDH6sUQxFQJAccHCvE87Qh0WVJRrhCJCBFEKNK0yYgZ3N\nwgrcAIl0zK414qAPAPPsXQvBSR7TrNiBJKGPNyAkGsbgA1NcxwLXuQEPwrA0s9wR\nDms8N1XuOOYQJLCF/ESDPwOsVR7glCoSliEOZWCgapNwJDm0AoKSqc49FEGFMtyh\nVqhIWArWoAgF5WEPLmqDfGTXM4M8oQxXSF2kxpSFHbTADX/wS6XIBatmSKILQzAc\npMIkhTSo4Q1pGGM2NqmYg1xhd2sYTQqcdAEqJMENmSywJtnBnVsoopomagMQGVSH\nQVziFc1AETn+qmNPg1CBCkFwQxC+RKa71bUMsnvuZDRZrmog45138HKu6FCxzGhr\nVdkQRzhEexAiZRMFe2nSClB3B21AsIrycNav34lDN9wiDwW6TBmdEQ720NoaCTmD\nGqgghnbvQA7ppt8twnKq+rwLktHIgxbaAIU1+AEVxSgGL3hRSF5tkFt3QEgsdOyG\nO1zUDWVgxK/1lQ53jbwsnNzOKf2giDdAgQ54zzu/aLgePi9kMqZIRzBGMYpfV6Px\nlaxGu7BjH3FkwxqrwvYYftDO7jxTl2dBRBsYcongkKtcs4w63AszmGaIA1ZnyTtH\nzaN5iQVIEXpwj0iw4Abr1OdcFKcPu/T+I/lc8rJftapYbOrAItNhQRHyyLS5CMOf\nfb0qGvqqV949WDE63MEN2qRDbGgUg+WtQARbdnr/cUq6wAg5NwfK1H7TdAl+kAd5\n4AYYswYJ8gpBQllcNTdj4AWMEAxyAAE+JiFKIB6jcAvBUC8jAjNugAUmQgfBVCNB\nAVsLVwVZwAQPYE5Q8hZ/MAqM0AonqAiDoAXioQdEFyTnVIRBoTIJoAAg0AVyYAeR\nACIjgghh8AaoMFI+gyEhgwAJoE9QQgBaqAAvWAaBdBmXcQd1ACdl8VE6kk8ZsoVJ\nCFEJMGl2MAdzADOv8AYdpQ+8wFIDUTIj44VBAQgeQlC1ogvNgAouykAHFMiHCkEJ\nqtAK0rQqjKgipWcNvyE7k6gip8QOXTeEmcgQbAAI3VByNBIQAAA7\n---END_DATA---\n%/
| source file|{{{...images\smeow2.jpg}}}|\n| attached on|15 May 2006 by ELSDesignStudios|\n| embedded data|//none//|\n| local link|/%LOCAL_LINK%/[[images/meow2.jpg|images/meow2.jpg]]|\n| remote link|/%REMOTE_LINK%/[[http://www.TiddlyTools.com/images/meow2.jpg|http://www.TiddlyTools.com/images/meow2.jpg]]|\nimage\n<<<\nusage: {{{[img[tooltip|AttachFileSample2]] or [img[tooltip|AttachFileSample2][link]]}}})\n[img[tooltip|AttachFileSample2]]\n<<<\n
test store.php\nhttp://www.tiddlytools.com/store.php\n<<<\n--%BOUNDARY%\nContent-disposition: form-data;name="UploadPlugin";\n\nbackupDir=;user=;password=;uploaddir=upload;\n--%BOUNDARY%\nContent-disposition: form-data;name="userfile";filename="%TARGET%"\nContent-Type: %TYPE%\nContent-Length: %SIZE%\n\n%DATA%\n--%BOUNDARY%--\n<<<\n----\npublish for public web access\nhttp://www.tiddlytools.com/response.txt\n<<<\n?file=%TARGET%&data=%DATA%\n<<<\n----\npublish for password-protected web access\nhttp://www.tiddlytools.com/response.txt\n<<<\n?file=%TARGET%&data=%DATA%\n<<<\n----\nsend to WebTPS report server (encrypted)\nhttps://www.WebTPS.com/reports/upload.asp\n<<<\n?workgroup=Y2K&key=3141592653589&file=%TARGET%\n<<<\n----\nsend to my Flickr account\nhttp://www.flickr.com/\n<<<\n\n<<<
/***\n|''Name:''|CheckboxPlugin|\n|''Source:''|http://www.TiddlyTools.com/#CheckboxPlugin|\n|''Author:''|Eric Shulman - ELS Design Studios|\n|''License:''|[[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|\n|''~CoreVersion:''|2.0.10|\n\nAdd checkboxes to your tiddler content. Checkbox states can be preserved in the document by either automatically modifying the tiddler content or setting/removing tags on specified tiddlers, or they may be saved as local cookies by assigning an optional 'chkID' to the checkbox. Add custom javascript for programmatic initialization and onClick handling for any checkbox. Also provides access to checkbox DOM element data and tracks the checkbox state in TiddlyWiki's config.options[] internal data.\n\n!!!!!Usage\n<<<\nThe checkbox syntax, including all optional parameters, is contained inside a matched set of [ and ] brackets.\n{{{ [x=id(title|tag){init_script}{onclick_script}] }}}\n\nAn alternative syntax lets you place the optional parameters ''outside'' the [ and ] brackets, and is provided for backward-compatibility with existing content that may include checkbox definitions based on earlier releases of this plugin:\n{{{ [x]=id(title|tag){init_script}{onclick_script} }}}\n\n//{{{\n[ ]or[_] and [x]or[X]\n//}}}\nSimple checkboxes. The current unchecked/checked state is indicated by the character between the {{{[}}} and {{{]}}} brackets ("_" means unchecked, "X" means checked). When you click on a checkbox, the current state is retained by directly modifying the tiddler content to place the corresponding "_" or "X" character in between the brackets\n//{{{\n[x=id]\n//}}}\nAssign an optional ID to the checkbox so you can use {{{document.getElementByID("id")}}} to manipulate the checkbox DOM element, as well as tracking the current checkbox state in {{{config.options["id"]}}}. If the ID starts with "chk" the checkbox state will also be saved in a cookie, so it can be automatically restored whenever the checkbox is re-rendered (overrides any default {{{[x]}}} or {{{[_]}}} value). If a cookie value is kept, the "_" or "X" character in the tiddler content remains unchanged, and is only applied as the default when a cookie-based value is not currently defined.\n//{{{\n[x(title|tag)] or [x(title:tag)]\n//}}}\nInitializes and tracks the current checkbox state by setting or removing ("TogglyTagging") a particular tag value from a specified tiddler. If you omit the tiddler title (and the | or : separator), the specified tag is assigned to the current tiddler. If you omit the tag value, as in {{{(title|)}}}, the default tag, {{{checked}}}, is assumed. Omitting both the title and tag, {{{()}}}, tracks the checkbox state by setting the "checked" tag on the current tiddler. When tag tracking is used, the "_" or "X" character in the tiddler content remains unchanged, and is not used to set or track the checkbox state. If a tiddler title named in the tag does not exist, the checkbox state defaults to //unselected//. When the checkbox is subsequently changed to //selected//, it will automatically (and silently) create the missing tiddler and then add the tag to it. //''NOTE: beginning with version 2.1.2 of this plugin, the "|" separator is the preferred separator between the title and tag name, as it avoids syntactic ambiguity when ":" is used within tiddler titles or tag names.''//\n//{{{\n[x{javascript}{javascript}]\n//}}}\nYou can define optional javascript code segments to add custom initialization and/or 'onClick' handling to a checkbox. The current checkbox state (and it's other DOM attributes) can be set or read from within these code segments by reference to the default context-object, 'this'.\n\nThe first code segment will be executed when the checkbox is initially displayed, so that you can programmatically determine it's starting checked/unchecked state. The second code segment (if present) is executed whenever the checkbox is clicked, so that you can perform programmed responses or intercept and override the checkbox state based on complex logic using the TW core API or custom functions defined in plugins (e.g. testing a particular tiddler title to see if certain tags are set or setting some tags when the checkbox is clicked).\n\nNote: if you want to use the default checkbox initialization processing with a custom onclick function, use this syntax: {{{ [x=id{}{javascript}] }}} \n<<<\n!!!!!Configuration\n<<<\nNormally, when a checkbox state is changed, the affected tiddlers are automatically re-rendered, so that any checkbox-dependent dynamic content can be updated. There are three possible tiddlers to be re-rendered, depending upon where the checkbox is placed, and what kind of storage method it is using.\n*''container'': the tiddler in which the checkbox is displayed. (e.g., this tiddler)\n*''tagged'': the tiddler that is being tagged (e.g., "~MyTask" when tagging "~MyTask:done")\n*''tagging'': the "tag tiddler" (e.g., "~done" when tagging "~MyTask:done")\nYou can set the default refresh handling for all checkboxes in your document by using the following javascript syntax either in a systemConfig plugin, or as an inline script. (Substitute true/false values as desired):\n{{{config.checkbox.refresh = { tagged:true, tagging:true, container:true };}}}\n\nYou can also override these defaults for any given checkbox by using an initialization function to set one or more of the refresh options. For example:\n{{{[_{this.refresh.container=false}]}}}\n<<<\n!!!!!Examples\n<<<\n//{{{\n[X] label\n[_] label\n//}}}\n>checked and unchecked static default values\n>[X] label\n>[_] label\n//{{{\n[_=demo] label\n//}}}\n>document-based value (id='demo', no cookie)\n>[_=demo] label\n//{{{\n[_=chkDemo] label\n//}}}\n>cookie-based value (id='chkDemo')\n>[_=chkDemo] label\n//{{{\n[_(CheckboxPlugin|demotag)]\n[_(CheckboxPlugin|demotag){this.refresh.tagged=this.refresh.container=false}]\n//}}}\n>tag-based value (TogglyTagging)\n>[_(CheckboxPlugin|demotag)] toggle 'demotag' (and refresh tiddler display)\n>[_(CheckboxPlugin|demotag){this.refresh.tagged=this.refresh.container=false}] toggle 'demotag' (no refresh)\n>current tags: <script>return store.getTiddler(story.findContainingTiddler(place).id.substr(7)).tags.toString();</script>\n><script label="click to view current tags">alert(store.getTiddler(story.findContainingTiddler(place).id.substr(7)).tags.toString());return false</script>\n//{{{\n[X{this.checked=true}{alert(this.checked?"on":"off")}] message box with checkbox state\n//}}}\n>custom init and onClick functions\n>[X{this.checked=true}{alert(this.checked?"on":"off")}] message box with checkbox state\nRetrieving option values:\nconfig.options['demo']=<script>return config.options['demo']?"true":"false";</script>\nconfig.options['chkDemo']=<script>return config.options['chkDemo']?"true":"false";</script>\n\n!!!!!Installation\nimport (or copy/paste) the following tiddlers into your document:\n''CheckboxPlugin'' (tagged with <<tag systemConfig>>)\n<<<\n!!!!!Revision History\n<<<\n2006.05.04 - 2.1.3 fix use of findContainingTiddler() to check for a non-null return value, so that checkboxes won't crash when used outside of tiddler display context (such as in header, sidebar or mainmenu)\n2006.03.11 - 2.1.2 added "|" as delimiter to tag-based storage syntax (e.g. "tiddler|tag") to avoid parsing ambiguity when tiddler titles or tag names contain ":". Using ":" as a delimiter is still supported but is deprecated in favor of the new "|" usage. Based on a problem reported by JeffMason.\n2006.02.25 - 2.1.0 added configuration options to enable/disable forced refresh of tiddlers when toggling tags\n2006.02.23 - 2.0.4 when toggling tags, force refresh of the tiddler containing the checkbox.\n2006.02.23 - 2.0.3 when toggling tags, force refresh of the 'tagged tiddler' so that tag-related tiddler content (such as "to-do" lists) can be re-rendered.\n2006.02.23 - 2.0.2 when using tag-based storage, allow use [[ and ]] to quote tiddler or tag names that contain spaces:\n{{{[x([[Tiddler with spaces]]:[[tag with spaces]])]}}}\n2006.01.10 - 2.0.1 when toggling tags, force refresh of the 'tagging tiddler'. For example, if you toggle the "systemConfig" tag on a plugin, the corresponding "systemConfig" TIDDLER will be automatically refreshed (if currently displayed), so that the 'tagged' list in that tiddler will remain up-to-date.\n2006.01.04 - 2.0.0 update for ~TW2.0\n2005.12.27 - 1.1.2 Fix lookAhead regExp handling for {{{[x=id]}}}, which had been including the "]" in the extracted ID. \nAdded check for "chk" prefix on ID before calling saveOptionCookie()\n2005.12.26 - 1.1.2 Corrected use of toUpperCase() in tiddler re-write code when comparing {{{[X]}}} in tiddler content with checkbox state. Fixes a problem where simple checkboxes could be set, but never cleared.\n2005.12.26 - 1.1.0 Revise syntax so all optional parameters are included INSIDE the [ and ] brackets. Backward compatibility with older syntax is supported, so content changes are not required when upgrading to the current version of this plugin. Based on a suggestion by GeoffSlocock\n2005.12.25 - 1.0.0 added support for tracking checkbox state using tags ("TogglyTagging")\nRevised version number for official post-beta release.\n2005.12.08 - 0.9.3 support separate 'init' and 'onclick' function definitions.\n2005.12.08 - 0.9.2 clean up lookahead pattern\n2005.12.07 - 0.9.1 only update tiddler source content if checkbox state is actually different. Eliminates unnecessary tiddler changes (and 'unsaved changes' warnings)\n2005.12.07 - 0.9.0 initial BETA release\n<<<\n!!!!!Credits\n<<<\nThis feature was created by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]]\n<<<\n!!!!!Code\n***/\n//{{{\nversion.extensions.CheckboxPlugin = {major: 2, minor: 1, revision:3 , date: new Date(2006,5,4)};\n//}}}\n\n// // 1.2.x compatibility\n//{{{\nif (!window.story) window.story=window;\nif (!store.getTiddler) store.getTiddler=function(title){return store.tiddlers[title]}\nif (!store.addTiddler) store.addTiddler=function(tiddler){store.tiddlers[tiddler.title]=tiddler}\nif (!store.deleteTiddler) store.deleteTiddler=function(title){delete store.tiddlers[title]}\n//}}}\n\n//{{{\nconfig.checkbox = { refresh: { tagged:true, tagging:true, container:true } };\nconfig.formatters.push( {\n name: "checkbox",\n match: "\s\s[[xX_ ][\s\s]\s\s=\s\s(\s\s{]",\n lookahead: "\s\s[([xX_ ])(\s\s])?(=[^\s\ss\s\s(\s\s]{]+)?(\s\s([^\s\s)]*\s\s))?({[^}]*})?({[^}]*})?(\s\s])?",\n handler: function(w)\n {\n var lookaheadRegExp = new RegExp(this.lookahead,"mg");\n lookaheadRegExp.lastIndex = w.matchStart;\n var lookaheadMatch = lookaheadRegExp.exec(w.source)\n if(lookaheadMatch && lookaheadMatch.index == w.matchStart)\n {\n // get params\n var checked=lookaheadMatch[1];\n var id=lookaheadMatch[3];\n var tag=lookaheadMatch[4];\n var fn_init=lookaheadMatch[5];\n var fn_click=lookaheadMatch[6];\n // create checkbox element\n var c = document.createElement("input");\n c.setAttribute("type","checkbox");\n c.onclick=onClickCheckbox;\n c.srcpos=w.matchStart+1; // remember location of "X"\n c.container=story.findContainingTiddler(w.output); if (c.container) c.container=c.container.id.substr(7); // tiddler containing checkbox\n c.refresh = { };\n c.refresh.container=config.checkbox.refresh.container;\n c.refresh.tagged=config.checkbox.refresh.tagged;\n c.refresh.tagging=config.checkbox.refresh.tagging;\n w.output.appendChild(c);\n // set default state\n c.checked=(checked.toUpperCase()=="X");\n // get/set state by ID\n if (id) {\n c.id=id.substr(1); // trim off leading "="\n if (config.options[c.id]!=undefined)\n c.checked=config.options[c.id];\n else\n config.options[c.id]=c.checked;\n }\n // get/set state by tag\n if (tag) {\n c.tiddler=c.container;\n c.tag=tag.substr(1,tag.length-2).trim(); // trim off parentheses\n var pos=c.tag.indexOf("|"); if (pos==-1) var pos=c.tag.indexOf(":");\n if (pos==0) { c.tag=tag.substr(1); }\n if (pos>0) { c.tiddler=c.tag.substr(0,pos).replace(/\s[\s[/g,"").replace(/\s]\s]/g,""); c.tag=c.tag.substr(pos+1); }\n c.tag.replace(/\s[\s[/g,"").replace(/\s]\s]/g,"");\n if (!c.tag.length) c.tag="checked";\n var t=store.getTiddler(c.tiddler);\n c.checked = (t && t.tags)?(t.tags.find(c.tag)!=null):false;\n }\n if (fn_init) c.fn_init=fn_init.trim().substr(1,fn_init.length-2); // trim off surrounding { and } delimiters\n if (fn_click) c.fn_click=fn_click.trim().substr(1,fn_click.length-2);\n c.init=true; c.onclick(); c.init=false; // compute initial state and save in tiddler/config/cookie\n w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;\n }\n }\n }\n)\n//}}}\n\n//{{{\nfunction onClickCheckbox()\n{\n if (this.fn_init)\n // custom function hook to set initial state (run only once)\n { try { eval(this.fn_init); this.fn_init=null; } catch(e) { displayMessage("Checkbox init error: "+e.toString()); } }\n else if (this.fn_click)\n // custom function hook to override or react to changes in checkbox state\n { try { eval(this.fn_click) } catch(e) { displayMessage("Checkbox click error: "+e.toString()); } }\n if (this.id)\n // save state in config AND cookie (only when ID starts with 'chk')\n { config.options[this.id]=this.checked; if (this.id.substr(0,3)=="chk") saveOptionCookie(this.id); }\n if ((!this.id || this.id.substr(0,3)!="chk") && !this.tag) {\n // save state in tiddler content only if not using cookie or tag tracking\n var t=story.findContainingTiddler(this); if (t) {\n var t=store.getTiddler(t.id.substr(7));\n if (this.checked!=(t.text.substr(this.srcpos,1).toUpperCase()=="X")) { // if changed\n t.set(null,t.text.substr(0,this.srcpos)+(this.checked?"X":"_")+t.text.substr(this.srcpos+1),null,null,t.tags);\n store.setDirty(true);\n }\n }\n }\n if (this.tag) {\n var t=store.getTiddler(this.tiddler);\n if (!t) { t=(new Tiddler()); t.set(this.tiddler,"",config.options.txtUserName,(new Date()),null); store.addTiddler(t); } \n var tagged=(t.tags && t.tags.find(this.tag)!=null);\n if (this.checked && !tagged) { t.tags.push(this.tag); store.setDirty(true); }\n if (!this.checked && tagged) { t.tags.splice(t.tags.find(this.tag),1); store.setDirty(true); }\n // if tag state has been changed, force a display update\n if (this.checked!=tagged) {\n if (this.refresh.tagged) story.refreshTiddler(this.tiddler,null,true); // the TAGGED tiddler\n if (this.refresh.tagging) story.refreshTiddler(this.tag,null,true); // the TAGGING tiddler\n }\n }\n // refresh containing tiddler (but not during initial rendering, or we get an infinite loop!)\n if (!this.init && this.refresh.container && this.container!=this.tiddler)\n story.refreshTiddler(this.container,null,true); // the tiddler CONTAINING the checkbox\n return true;\n}\n//}}}
\n<<formTiddler fichaPlantilla>>\n<data>{"tecnico":"José Luis González Castro","mes":"Abril","año":"2006","lugar":"aula","notes":"ibook G3/600 con Protools\snMbox (modelo 2005)\snMicrófono AKG C414 B\sn","interprete":"Santiago Comesaña"}</data>
\n|[img[clarinete bajo|materiales/fotografías/clarinete_bajo.jpg]]|\n\n!Guía\n\nInstrumento más grave de la famila de los clarinetes. Existen dos notaciones: normalmente se escribe en clave de sol, una novena alta (notación francesa). La otra notación (strauss, wagner- notación alemana), lo escribe en la tesitura de fagot, una nota por encima de la real.\n\n1.Extremos del registro.\nHay problemas con el registro agudo a partir del mi/fa (escritas).\n+++[Ejemplo 1]...\n<<player id=1 quicktime materiales/grabaciones/clarinete_bajo/clarinete_bajo1.wav 400 15>>\n===\n\n\nLa nota aislada del ejemplo es el fa (nota real mib).\n\n2.Escalas. A partir del sol4 (sonido real), hay dificultades.\n+++[Ejemplo 2]...\n<<player id=2 quicktime materiales/grabaciones/clarinete_bajo/clarinete_bajo2.wav 400 15>>\n===\n\n+++[Ejemplo 3]...\n<<player id=3 quicktime materiales/grabaciones/clarinete_bajo/clarinete_bajo3.wav 400 15>>\n===\n\n\n3.Arpegios (en fa).\n+++[Ejemplo 4]...\n<<player id=4 quicktime materiales/grabaciones/clarinete_bajo/clarinete_bajo4.wav 400 15>>\n===\n\n\n4.Agilidad.\n+++[Ejemplo 5]...\n<<player id=5 quicktime materiales/grabaciones/clarinete_bajo/clarinete_bajo5.wav 400 15>>\n===\n\n\n5.Dinámica.\n\nMuy p en el registro grave.\nGradaciones en el grave.\nOtro ejemplo, con menos ruido de llaves.\n+++[Ejemplo 6]...\n<<player id=6 quicktime materiales/grabaciones/clarinete_bajo/clarinete_bajo6.wav 400 15>>\n===\n\n\n6.Ruido de platos.\n+++[Ejemplo 7]...\n<<player id=7 quicktime materiales/grabaciones/clarinete_bajo/clarinete_bajo7.wav 400 15>>\n===\n\n\n7.Glissandos: a través de los registros hay zonas en las que no se puede hacerlos continuos.\n+++[Ejemplo 8]...\n<<player id=8 quicktime materiales/grabaciones/clarinete_bajo/clarinete_bajo8.wav 400 15>>\n===\n\n\n8.Multifónicos: hay más distancia entre armónicos que en el clarinete normal. Se hacen con la embocadura, modificando la cavidad interna. (El tubo del c.b. es cilíndrico).\n+++[Ejemplo 9]...\n<<player id=9 quicktime materiales/grabaciones/clarinete_bajo/clarinete_bajo9.wav 400 15>>\n===\n\n\n9.Repertorio: Stravinsky- Consagración de la Primavera.\n+++[Ejemplo 10]...\n<<player id=10 quicktime materiales/grabaciones/clarinete_bajo/clarinete_bajo10.wav 400 15>>\n===\n\n\n \n
\n<<formTiddler fichaPlantilla>>\n<data>{"tecnico":"José Luis González Castro","mes":"Abril","año":"2006","lugar":"aula","notes":"ibook G3/600 con Protools\snMbox (modelo 2005)\snMicrófono AKG C414 B\snEn ocasiones se percibe distorsiones provocadas por el aire que se pierde por la embocadura","interprete":"Roberto Noche, Iván Maía, Santiago Comesaña, Felipe González "}</data>\n
\n|[img[clarinete en la|materiales/fotografías/clarinete_la.jpg]]|\n\n!Guía\n\n\n1.La tesitura general del clarinete abarca desde el mi2 hasta el do6; como índice acústico se toma el la4 (para el clarinetista, si4).\n\nEscala en todo el registro, primero ligado y después picado.\n+++[Ejemplo 1]...\n<<player id=1 quicktime materiales/grabaciones/clarinete/clarinete_1.wav 400 15>>\n===\n\n\n2.Registros:\n\nChalumeau(mi grave-sol)/registro de garganta (sol#-la-sib)\nRegistro medio (clarión) (si-do)\nRegistro agudo y sobreagudo (do#sol)\nRegistro sobreagudo (sol a do)\n+++[Ejemplo 2]...\n<<player id=2 quicktime materiales/grabaciones/clarinete/clarinete_2.wav 400 15>>\n===\n\n\nPor encima del do6 (sobreagudo) se consiguen notas afinadas hasta el mi o el fa6; son notas con digitaciones poco habituales, sólo se emplean en ciertas obras contemporáneas. En la zona sobreaguda hay notas que permiten trabajar desde pp o ppp, pero no son la mayoría; depende del tipo de digitación y de si acústicamente es más o menos favorable. En todo caso, no hay problemas para tocar suave (aunque son notas difíciles de tocar; se tocan mejor cuando forman parte de pasajes). \n\nRegistro sobreagudo, tocando suave.\n+++[Ejemplo 3]...\n<<player id=3 quicktime materiales/grabaciones/clarinete/clarinete_3.wav 400 15>>\n===\n\n\nTampoco hay problemas para tocar suave en los graves (al contrario que ocurre con el fagot o el saxofón). \nBerlioz habla del "sonido crepuscular" del clarinete en este rango de intensidades.\n\nEscala mi-mi, veloz y suave (ppp, pppp).\n+++[Ejemplo 4]...\n<<player id=4 quicktime materiales/grabaciones/clarinete/clarinete_4.wav 400 15>>\n===\n\n\nEl clarinete en sib puede a priori tocar en todas las escalas, pero es más difícil trabajar (afinar) con muchos sostenidos que con muchos bemoles, de ahí que se use el clarinete en la. Un ejemplo es el op. 73 de Schumann: las piezas están escritas para clarinete en la; hay ediciones para clarinete en sib. Alguna de las piezas tiene cinco sosteniados (y alteraciones accidentales). En sib estas piezas ofrecen una dificultad mucho mayor que tocadas con el clarinete en la. No se trata de un problema mecánico, sino acústico; la afinación propia del clarinete en sib, tocando solo, se resiente en tonalidades con muchos sostenidos. En el clasicismo, para clarinete de cinco llaves, las tonalidades básicas de orquesta son mib, sib... caso del concierto en laM, se toca con el clarinete en la (que trabajaría en ese caso en su doM). En el sistema temperado no existen estas diferencias (do#M equivale a rebM), pero __el diseño del clarinete no es temperado__. En escalas con pocas alteraciones no hay esta clase de problemas.\n\nSe puede hacer inflexiones en cuartos de tono en casi toda la tesitura excepto en el extremo inferior (con digitaciones o con embocadura).\nPara hacer escalas en cuartos de tono se utilizaría digitaciones, pero en momentos puntuales se utilizaría la embocadura. \n\n3.Variación de frecuencia en do5 (sonido real sib5), última nota del registro medio: glissando descendente modificando sólo la embocadura.\n+++[Ejemplo 5]...\n<<player id=5 quicktime materiales/grabaciones/clarinete/clarinete_5.wav 400 15>>\n===\n\n\nConforme se sube en la tesitura, es fácil mantener la distancia del ejemplo (sexta mayor, en el ejemplo se acerca a la octava); más de una sexta no es recomendable porque el instrumento salta a una 12a (octava más quinta) en vez de una octava: es un instrumento quintante. Los otros instrumentos de viento madera son octavantes. \n\nEl registro clarión (medio), se corresponde con la primera serie de armónicos del clarinete. Las digitaciones son las de la fundamental pero accionando la llave de registro se obtienen 12as, no 8as.\n+++[Ejemplo 6]...\n<<player id=6 quicktime materiales/grabaciones/clarinete/clarinete_6.wav 400 15>>\n===\n\n \nEl ejemplo anterior corresponde, en la primera serie de armónicos, al tercer armónico (el registro fundamental no tiene armónicos pares). \n\nNOTA: El primer armónico es la fundamental, el segundo la octava, el tercero la quinta.\n\nEn el registro medio, la amplitud del segundo armónico (la octava) es casi la misma que la de la nota que se está haciendo en digitación. Las diferencias de timbre entre clarinetistas se aprecian en el predominio en volumen de los armónicos 3 y 5. \n\nResonancia del quinto armónico con la garganta "un poco mayor"/ Armónico aislado/ Si se fuerza, salta el armónico/ más ejemplos.\n+++[Ejemplo 7]...\n<<player id=7 quicktime materiales/grabaciones/clarinete/clarinete_7.wav 400 15>>\n===\n\n\n6.Desarrollo armónico de la primera nota del grave(mi). \n+++[Ejemplo 8]...\n<<player id=8 quicktime materiales/grabaciones/clarinete/clarinete_8.wav 400 15>>\n===\n\n\nLos armónicos no están perfectamente afinados dado que el tubo no es perfectamente cilíndrico; la zona del canal barrilete es cónica inversa, y el final es un poco cónico, por lo que las frecuencias no son múltiplo directo. La 12a está bastante bien afinada, que es la que se utiliza siempre, el quinto armónico está fuera de lugar y de ahí en adelante no es aprovechable (hay algunas notas más arriba que están algo mejor).\n\n7 Arpegio ligado/picado. \n+++[Ejemplo 9]...\n<<player id=9 quicktime materiales/grabaciones/clarinete/clarinete_9.wav 400 15>>\n===\n\n\n8.Trino de color. Se modifica la digitación para conseguir un cambio en la afinación que se percibe como un color diferente.\n+++[Ejemplo 10]...\n<<player id=10 quicktime materiales/grabaciones/clarinete/clarinete_10.wav 400 15>>\n===\n\n\n9.Prueba de velocidad tocando un pasaje rápido (mozart, tocado en sib, no en la). Mecánicamente no hay zonas más lentas que otras, excepto el final del registro (por falta de costumbre).\n+++[Ejemplo 11]...\n<<player id=11 quicktime materiales/grabaciones/clarinete/clarinete_11.wav 400 15>>\n===\n\n\n10.Domaines (Boulez): ejemplos de efectos\n\nCahier D- pasaje1\nPasaje 2 con frulato sobreagudo\nPasaje3, staccato, con trino, muy piano, y staccato\nPasaje4 con desafinaciones de color\nPasaje5 con trinos de color\nPasaje6 con trinos muy rápidos\n+++[Ejemplo 12]...\n<<player id=12 quicktime materiales/grabaciones/clarinete/clarinete_12.wav 400 15>>\n===\n\n\n11.Glissandos: Si se entiende como el portamento en cuerda(deslizando), es problemático en las fundamentales. Si es cromático o diatónico, no hay problemas.\n\nGlissandos cromáticos (escalas)\nGlissando deslizado (ejemplo de Gershwin, proveniente de la tradición de música Klezmer -música popular judía-)\n+++[Ejemplo 13]...\n<<player id=13 quicktime materiales/grabaciones/clarinete/clarinete_13.wav 400 15>>\n===\n\n\nLos cambios de registro desde las notas fundamentales a los armónicos dan problemas para mantener el portamento porque hay un corte brusco en la columna de aire; por eso el glissando de Gershwin del ejemplo anterior comienza siendo diatónico, casi cromático, y termina siendo continuo al pasar al registro medio, donde se puede hacer glissandos de extensión variable sin problemas (en la partitura aparece marcado como glissando en toda la extensión, sin marcar diferencias).\n"Segunda sección" del glissando de Gershwin\n+++[Ejemplo 14]...\n<<player id=14 quicktime materiales/grabaciones/clarinete/clarinete_14.wav 400 15>>\n===\n\n\nSe puede pasar de registro medio a agudo casi sin problemas porque siempre está accionada la llave de registro. En el ámbito de fundamentales, es más difícil hacer el glissando deslizado; se hará diatónico o cromático. Como referencia, el glissando deslizando se hace sin problemas desde la nota re en segunda línea en clave de sol en adelante.\n\nEl glissando deslizado es más difícil de hacer en fundamentales (es difícil vencer la resistencia); si el ámbito del glissando es pequeño, se puede hacer con la embocadura.\n\nGlissandos deslizados hechos con embocadura en las fundamentales\nGlissando sobre una nota grave, con embocadura\nMismo efecto de embocadura (deformación), sobre una nota aguda\nOtro ejemplo en una fundamental.\n+++[Ejemplo 15]...\n<<player id=15 quicktime materiales/grabaciones/clarinete/clarinete_15.wav 400 15>>\n===\n\n\n12.Dobles notas: multifónicos naturales: (fundamental más su primer armónico). Salen en el ámbito de pp, ppp. Ejemplo en torno a do5 (sib5, sonido real).\n+++[Ejemplo 16]...\n<<player id=16 quicktime materiales/grabaciones/clarinete/clarinete_16.wav 400 15>>\n===\n\n\n13.Efectos de Slap (chasquido). La dificultad en el clarinete reside en el ángulo en el que se toca, lo que dificulta el trabajo con la lengua. Se hace un vacío en la caña con la lengua.\n+++[Ejemplo 17]...\n<<player id=17 quicktime materiales/grabaciones/clarinete/clarinete_17.wav 400 15>>\n===\n\n\nSobre las cañas: los clarinetistas no las hacen, las compran. Sin embargo, aunque todas estén cortadas igual, las fibras internas no son idénticas, de ahí la diferencia entre unas cañas y otras.\n\n14.Ruidos de llaves (no son tan efectivos como en el saxofón porque se utiliza llaves en vez de platos).\n+++[Ejemplo 18]...\n<<player id=18 quicktime materiales/grabaciones/clarinete/clarinete_18.wav 400 15>>\n===\n\n\n15.Frulato (pronunciar la rr). En el clarinete (y saxofón) hay poco espacio para mover la lengua, y el ángulo del clarinete tampoco ayuda. La facilidad para hacerlo varía según el intérprete.\n+++[Ejemplo 19]...\n<<player id=19 quicktime materiales/grabaciones/clarinete/clarinete_19.wav 400 15>>\n===\n\n\n16.Cantar y tocar a la vez:\nFunciona principalmente bien en el registro grave.\nEl choque es menor si se afina, por ejemplo tocando la misma nota.\nExige mucho aire para mover las cuerdas vocales y la caña.\nTambién se puede cantar por encima.\n+++[Ejemplo 20]...\n<<player id=20 quicktime materiales/grabaciones/clarinete/clarinete_20.wav 400 15>>\n===\n\n\n17.Efecto de "Beso" contra la caña.\n+++[Ejemplo 21]...\n<<player id=21 quicktime materiales/grabaciones/clarinete/clarinete_21.wav 400 15>>\n===\n\n\n18.Tocar apoyando el clarinete sobre la rodilla: al casi tapar el tubo los armónicos se hacen más fácilmente. El segundo ejemplo se hace sin cambiar la fundamental, sólo con armónicos.\n+++[Ejemplo 22]...\n<<player id=22 quicktime materiales/grabaciones/clarinete/clarinete_22.wav 400 15>>\n===\n\n\nLos clarinetistas no utilizan sordinas(comerciales), pero pueden utilizar un paño para tapar el tubo.\n\n19.Boquilla: La frecuencia es un re (do5 real). \nEfectos con la boquilla.\nEfecto "reclamo para patos" (mismo elemento generador, una lengüeta batiente simple).\nBoquilla acoplada al cuerpo inferior del instrumento.\n+++[Ejemplo 23]...\n<<player id=23 quicktime materiales/grabaciones/clarinete/clarinete_23.wav 400 15>>\n===\n\n\n20.Dientes inferiores tocando la caña (sonidos de pájaros).\n+++[Ejemplo 24]...\n<<player id=24 quicktime materiales/grabaciones/clarinete/clarinete_24.wav 400 15>>\n===\n\n\n21.Sonido del aire en el tubo.\n+++[Ejemplo 25]...\n<<player id=25 quicktime materiales/grabaciones/clarinete/clarinete_25.wav 400 15>>\n===\n\n\n22.Vibratos (u oscilado, según la intensidad)/vibrato conseguido al mover el clarinete.\n+++[Ejemplo 26]...\n<<player id=26 quicktime materiales/grabaciones/clarinete/clarinete_26.wav 400 15>>\n===\n\n\nLos trinos y trémolos no tienen dificultad.\n\n23.Multifónicos:\n\nJarrel, (Asonance) Multifónicos de tercera (dos ejemplos).\n+++[Ejemplo 27]...\n<<player id=27 quicktime materiales/grabaciones/clarinete/clarinete_27.wav 400 15>>\n===\n\n\nGrisey, (Charmes) Multifónicos con "ondas". Las "ondas" se pueden controlar. \n+++[Ejemplo 28]...\n<<player id=28 quicktime materiales/grabaciones/clarinete/clarinete_28.wav 400 15>>\n===\n\n\nMismo autor, multifónicos de posición real (ya comentados). Dos ejemplos.\n+++[Ejemplo 29]...\n<<player id=29 quicktime materiales/grabaciones/clarinete/clarinete_28.wav 400 15>>\n===\n\n\nMagnus Limberdg, multifónico en si, muy potente.\n+++[Ejemplo 30]...\n<<player id=30 quicktime materiales/grabaciones/clarinete/clarinete_30.wav 400 15>>\n===\n\n\nBerio\n+++[Ejemplo 31]...\n<<player id=31 quicktime materiales/grabaciones/clarinete/clarinete_31.wav 400 15>>\n===\n\n\nCarter, Multifónico fa#-do#\n+++[Ejemplo 32]...\n<<player id=32 quicktime materiales/grabaciones/clarinete/clarinete_32.wav 400 15>>\n===\n\n\nBoulez, (Domaines)\n+++[Ejemplo 33]...\n<<player id=33 quicktime materiales/grabaciones/clarinete/clarinete_33.wav 400 15>>\n===\n\n\nSciarrino, (Let me die before I wake) Tremolos con multifónico superior (tres ejemplos)\n+++[Ejemplo 34]...\n<<player id=34 quicktime materiales/grabaciones/clarinete/clarinete_34.wav 400 15>>\n===\n\n\nPara encadenar multifónicos hay que saber escoger las digitaciones.\nLa mayor parte de la música italiana contemporánea está pensada para un clarinete de 20 llaves, que llega hasta mib grave, no hasta mi, lo que plantea problemas (por ejemplo en Sciarrino).\n\nFrase en multifónicos\n+++[Ejemplo 35]...\n<<player id=35 quicktime materiales/grabaciones/clarinete/clarinete_35.wav 400 15>>\n===\n\n\nNormalmente las dos notas van al mismo tiempo, pero no tienen por qué. En todo caso, no son más fáciles si son simultáneos.\n\nMultifónicos no simultáneos (dos ejemplos).\n+++[Ejemplo 36]...\n<<player id=36 quicktime materiales/grabaciones/clarinete/clarinete_36.wav 400 15>>\n===\n\n\nSe puede hacer trémolos entre dos multifónicos si entre uno y otro cambia uno o dos dedos, pero es difícil.\nEfecto con frulato.\n+++[Ejemplo 37]...\n<<player id=37 quicktime materiales/grabaciones/clarinete/clarinete_37.wav 400 15>>\n===\n\n\nEfectos con ondas.\n+++[Ejemplo 38]...\n<<player id=38 quicktime materiales/grabaciones/clarinete/clarinete_38.wav 400 15>>\n===\n\n\nSonidos de aire/mezcla con cuartos de tono (tres ejemplos).\n+++[Ejemplo 39]...\n<<player id=39 quicktime materiales/grabaciones/clarinete/clarinete_39.wav 400 15>>\n===\n\n\nCuartos de tono y oscilaciones.\n+++[Ejemplo 40]...\n<<player id=40 quicktime materiales/grabaciones/clarinete/clarinete_40.wav 400 15>>\n===\n\n\nBisbigliando (de embocadura)-trino de color. \n+++[Ejemplo 41]...\n<<player id=41 quicktime materiales/grabaciones/clarinete/clarinete_41.wav 400 15>>\n===\n\n\nGrisey utiliza en una misma nota la onda continua, y a la vez oscilación (dos ejemplos).\n+++[Ejemplo 42]...\n<<player id=42 quicktime materiales/grabaciones/clarinete/clarinete_42.wav 400 15>>\n===\n\n\nEl trino de color (bisbigliando) no se nota igual si se hace con embocadura que si hace con llaves. En el primer caso hay una línea; cuando se hace con llaves se escribe "más" o "menos". El compositor Hans Joachim Espos lo denomina "Jelow tremoli".\n+++[Ejemplo 43]...\n<<player id=43 quicktime materiales/grabaciones/clarinete/clarinete_42.wav 400 15>>\n===\n\n\n\n\n
<<refreshDisplay>>\n\nBackground: #fff\nForeground: #336\nPrimaryPale: #ccf\nPrimaryLight: #99c\nPrimaryMid: #669\nPrimaryDark: #336\nSecondaryPale: #ffc\nSecondaryLight: #fe8\nSecondaryMid: #db4\nSecondaryDark: #841\nTertiaryPale: #eee\nTertiaryLight: #ccc\nTertiaryMid: #999\nTertiaryDark: #666\nError: #f88\n
<<tabs tabsClass\nComposición "Plantillas Diseño" DiseñoSistema\nSistema "Tiddlers Sistema" TiddlersSistema\nEstilo "Hojas de Estilo" HojasEstilo\n"Paneles Laterales" "Elementos de los paneles laterales" PanelesLateralesSistema\nOpciones "Preferencias Personales" OpcionesSistema\nPlugins "Plugins Instalados" PluginsSistema\nShadows "Páginas de Sistema Ocultas" ShadowPages\n>>
\nEn verano de 2005 el profesor Rafael Yebra se puso en contacto conmigo con el objeto de encargarme una obra de música electroacústica para su instrumento. En consecuencia, organizamos una sesión de grabación en el mes de agosto con un doble propósito: tomar muestras de sonido que pudiera utilizar más adelante, y familiarizarme con el instrumento, del cual sabía entonces bastante poco.\n\nLa Orquestación es una de las asignaturas principales de la carrera de Composición. Es tarea indispensable que los alumnos conozcan tanto como sea posible los instrumentos para los que escribirán: en consecuencia, los alumnos deberían de estar en contacto directo y permanente con la orquesta y los distintos instrumentistas. Sin embargo la realidad suele ser bien otra, y los más diversos factores obran de tal forma que en la práctica un alumno puede terminar la carrera sin haber visto más que los instrumentos que estrictamente toque y los de la falsa orquesta del ordenador.\n\nPor tal motivo, en el curso 2005-2006 propuse al profesor de Electroacústica D. Miguel Moreno me ayudase a confeccionar una pequeña guía con transcripciones de conversaciones con los intérpretes y ejemplos musicales de cuantos instrumentos fuese posible, continuando las que previemante había hecho con el saxofón. El objetivo era pues crear un "manual de campo" para estudiantes del centro con ejemplos tomados de conversaciones con intérpretes profesionales en un contexto relajado, haciendo por mi parte preguntas sobre cuestiones técnicas con las que me había ido encontrando a lo largo de la carrera y dándoles a su vez total libertad para añadir cuanto quisieran aportar. \n\nLa propuesta así realizada se planteaba por primera vez en el Conservatorio, lo cual presentaba varias dificultades: en primer lugar, conseguir el beneplácito de las instancias superiores; en segundo lugar, atraer el interés de los profesores (y alumnos colaboradores) y encontrar un tiempo prestado para hacer las grabaciones; finalmente, enfrentarse a las demandas técnicas de un proyecto de este tipo, tanto materiales como de organización y presentación de la información.\n\nCuando escribo estas líneas estamos a primeros de Mayo de 2007 y prácticamente he terminado la primera serie de grabaciones, por lo que puedo reflejar algunas conclusiones sobre el trabajo que aún estoy desempeñando. En particular, la colaboración del centro y de todos y cada uno de los departamentos y profesores implicados ha sido excepcional; a cambio, he desempeñado labores de "reportero de guerra", siempre con el equipo dispuesto para grabar donde y como fuese menester.\n\nEn el aspecto técnico, el centro dispone de muy buenos equipos pero todavía carece de un estudio, lo que de partida impide realizar grabaciones de calidad profesional: peor aún, la deficiente insonorización de la mayor parte de aulas hace imposible evitar que en ocasiones se filtren instrumentos desde el exterior. Sin embargo, y aunque esto fuese deseable, la calidad absoluta de sonido no es un objetivo prioritario de esta guía, y grabar a los intérpretes en su propia aula o en el auditorio ha tenido la virtud de permitir conversar en un ambiente distendido, lo que a todos los efectos ha sido provechoso. \n\nEn cuanto a los contenidos, he intentado mantener un "guión de mínimos" común a todos los instrumentos, pero favoreciendo el carácter de entrevista antes que de sesión de grabación. Al ir transcribiendo las conversaciones he ido también homogeneizándolas, pero es evidente que de este carácter casi improvisado surgen desequilibrios en la cantidad de material disponible para cada instrumento. En este sentido me parece especialmente útil el formato wiki que he adoptado para la presentación del material, por la flexibilidad y facilidades que aporta en la organización, modificación y publicación de contenidos. \n\nMi intención al presentar esta primera versión de esta Guía no es por tanto la de mostrar un trabajo acabado, sino la de plantear las bases de un proyecto en continua revisión y desarrollo con la esperanza de que sea una referencia útil a los alumnos de Composición en los años venideros. \n\n\n\n\nJosé Luis González Castro\n\n\n\n\n\n\n\n\n\n\n\n \n\n
\nCada grabación se ha normalizado en conjunto, de forma que la intensidad de sonido en cada ejemplo es relativo al sonido de mayor intensidad tocado durante la toma (a excepción de los saxofones, de los cuales algunos ejemplos fueron normalizados individualmente).\n\nLa mayor parte de instrumentos se ha grabado en una sola toma para mantener una referencia de intensidad común a todos los ejemplos para ese instrumento. \n\nEn la medida de lo posible sa ha intentado mantener a los intérpretes en una posición fija respecto del micrófono durante la grabación, aunque se ha preferido sacrificar la homogeneidad de sonido a la libertad del intérprete.\n\n!!Ayuda\n\n''Algunas funciones no se muestran correctamente''\n\nEl navegador recomendado para ver esta Guía es [[Firefox|http://www.mozilla.com/en-US/]]. En principio la página debería de funcionar correctamente en otros navegadores.\n\n''El sonido no se reproduce''\n*Comprobar que el reproductor Quicktime está instalado (seleccionar de la siguiente lista):\nhttps://addons.mozilla.org/en-US/firefox/browse/type:7 \n*Si Firefox insiste en que el plugin de Quicktime no está instalado, seguir las indicaciones de la página\nhttp://kb.mozillazine.org/Quicktime#Quicktime_browser_settings\n\n * Abrir el panel de preferencias desde el reproductor Quicktime ("Edit -> Preferences -> Quicktime Preferences") o haciendo doble click sobre el icono "Quicktime" en el Panel de Control de Windows.\n * Ir a la pestaña Browser y hacer click sobre el botón "MIME Settings".\n * En cada categoría, seleccionar los tipos de archivo que Quicktime debe reproducir en el navegador. No autorizar Flash.\n * Confirmar con OK. \n\n
<html>\n<style>\n.rolodex table {\nborder: 0px solid;\nbackground-color:#FFFF99;\n}\n\n.rolodex tr, .rolodex td {\nborder: 0px solid;\nbackground-color:#CCFF99;\n}\n</style>\n<span class="rolodex">\n <table>\n <tr>\n <td align="right"><b>Nombre:</b></td>\n <td colspan="3"><input name= nombre type=text style="width:100%" /></td></tr>\n <tr>\n <td align="right"><b>Apellidos:</b></td>\n <td colspan="3"><input name=apellidos type=text style="width:100%" /></td></tr>\n <tr>\n <td align="right"><b>Email:</b></td>\n <td colspan="3"><input name=email type=text style="width:100%" /></td></tr>\n <tr>\n <td align="right"><b>Teléfono:</b></td>\n <td colspan="3"><input name=teléfono type=text style="width:100%" /></td></tr>\n <tr>\n <td align="right" valign="top"><b>Dirección:</b></td>\n <td colspan="3"><textarea name=dirección rows="2" cols="40" style="width:100%" ></textarea></td></tr>\n <tr>\n <td align="right"><b>Ciudad:</b></td>\n <td colspan="3"><input name=ciudad type=text style="width:100%" /></td></tr>\n <tr>\n <td align="right"><b>Provincia:</b></td>\n <td><input name=provincia type=text size="5" /></td>\n <td align="right"><b style="width:100%" >Código Postal:</b></td>\n <td><input name=códigopostal type=text size="5" style="width:100%" /></td></tr>\n <tr>\n <td align="right"><b>País:</b></td>\n <td colspan="3"><input name=país type=text style="width:100%" /></td></tr>\n <tr>\n <td align="right"><b>Página web:</b></td>\n <td colspan="3"><input name=webpage type=text style="width:100%" /></td></tr>\n <tr>\n <td colspan="4"><sub><b>Notas</b></sub><br>\n <textarea name=notas rows="4" cols="40" style="width:100%" ></textarea></td></tr>\n</span>\n</html>
\n<<formTiddler fichaPlantilla>>\n<data>{"tecnico":"José Luis González Castro","mes":"Marzo","año":"2007","lugar":"aula","notes":"Tascam HD-P2\snMicrófono AKG C414 B\sn\snMuchas interferencias exteriores de trompeta.\snAlgunos principios y finales de ejemplo editados con fundidos para corregir solapamientos con la voz del intérprete y con las trompetas de fondo.","interprete":"Saúl Puga"}</data>\n
\n|[img[contrabajo|materiales/fotografías/contrabajo.jpg]]|\n\n!Guía\n\n\nEl contrabajo es un instrumento que sigue en evolución; hasta hace poco tenía diferentes afinaciones y los había de tres o cuatro cuerdas. La tendencia actual avanza hacia un estándar de aproximadamente 1,32 de tiro desde el puente hasta la cejilla. Se busca contrabajos más pequeños porque son más ágiles y más cómodos.\n\n1. Ámbito: Escrito, desde el mi en primera línea adicional en clave de fa hasta un re en cuarta línea en clave de sol. Algunos modelos están adaptados para ampliar ligeramente la tesitura en agudos. \n\nNotas más agudas del registro.\n+++[Ejemplo 1]...\n<<player id=1 quicktime materiales/grabaciones/contrabajo/contrabajo_1.wav 400 15>>\n===\n\n\nComo solista es posiblemente el instrumento de cuerda que más se utiliza en armónicos. Los armónicos tienen bastante intensidad.\n+++[Ejemplo 2]...\n<<player id=2 quicktime materiales/grabaciones/contrabajo/contrabajo_2.wav 400 15>>\n===\n\n\nAdemás de los armónicos naturales, se puede conseguir armónicos artificiales pulsando una nota y colocando oro dedo a distancia de cuarta. Estos armónicos se hacen por regla general en la zona más aguda, sobre todo a partir de la octava de cada cuerda. En zonas más graves la distancia entre la nota que se pulsa y la cuarta se amplía al punto de hacer el armónico impracticable.\n+++[Ejemplo 3]...\n<<player id=3 quicktime materiales/grabaciones/contrabajo/contrabajo_3.wav 400 15>>\n===\n\n\nEn contrabajo hay dos arcos diferentes, el francés y el alemán, siendo el francés similar al del violín. En cuanto a los golpes de arco, son en esencia los mismos que los del violín.\n\n2. Velocidad: Para expandir el sonido de una cuerda del grosor y longitud de las cuerdas graves se necesita un tiempo de respuesta que condiciona la velocidad a la que se puede tocar en este registro. En el registro agudo el contrabajo puede llegar a velocidades similares al violonchelo. En términos generales se sobreentiende que un allegro de sonata para contrabajo es más lento que un allegro de sonata para violín, por ejemplo.\n\nUna escala, en dos velocidades distintas.\n+++[Ejemplo 4]...\n<<player id=4 quicktime materiales/grabaciones/contrabajo/contrabajo_4.wav 400 15>>\n===\n\n\nHacer arpegios tiene la dificultad de los cambios continuos de cuerda. Con la mano el instrumentista abarca un tono.\n+++[Ejemplo 5]...\n<<player id=5 quicktime materiales/grabaciones/contrabajo/contrabajo_5.wav 400 15>>\n===\n\n\nA propósito de esta cuestión, la gran distancia entre nota y nota acarrea ciertas dificultades de afinación, en particular en el dúo de contrabajos (es decir, cuando ambos tocan la misma nota). Las diferencias de afinación o disonancias entre dos contrabajos pueden llegar a molestar físicamente a los intérpretes.\n\nLos contrabajistas afinan el instrumento de forma diferente según si tocan en orquesta o como solistas. En este último caso suben el instrumento un tono para darle más brillo. Sin embargo no transportan, es decir, tocan en las mismas posiciones, con lo que es el acompañante quien tiene que transportar. Este hábito es relativamente reciente. Por otra parte, no es aconsejable someter al instrumento a cambios de afinación tan pronunciados de forma constante; es preferible tener dos contrabajos, cada uno con una afinación, antes que subir y bajar un solo contrabajo cada vez que se alterna entre práctica solista y orquestal. Por otra parte, las escordaturas son muy infrecuentes.\n\n4.Dinámica: El ámbito es un tanto limitado; el contrabajo tiene una dinámica más reducida que un violín o un violonchelo, en parte debido a su tesitura y a la facilidad con la que empasta con otros instrumentos (lo que también dificulta el hacerlo destacar).\n\nRango dinámico del instrumento en una misma nota.\n+++[Ejemplo 6]...\n<<player id=6 quicktime materiales/grabaciones/contrabajo/contrabajo_6.wav 400 15>>\n===\n\n\n5. Articulaciones:\n\nLegato\nMarcato\nSpiccato\nPizzicato\nPizzicato Bartok\nSlap, golpeando la cuerda para crear un contratiempo con la nota\nTres notas de Pizzicato "clásico" (buscando profundidad), y dos pasajes de Pizzicato "jazz" \n+++[Ejemplo 7]...\n<<player id=7 quicktime materiales/grabaciones/contrabajo/contrabajo_7.wav 400 15>>\n===\n\n\n6.Trémolos: Existe una cierta dificultad en conseguir trémolos limpios en forte al no poder utilizar la punta del arco (lo que permite mayor precisión). No obstante, en un contexto orquestal quizás se busca precisamente este "defecto". El instrumentista lleva en este caso el arco hacia el puente para conseguir de forma natural una mayor intensidad de sonido.\n\nTrémolos en diferentes intensidades y velocidades\nTrémolo en forte\n+++[Ejemplo 8]...\n<<player id=8 quicktime materiales/grabaciones/contrabajo/contrabajo_8.wav 400 15>>\n===\n\n\n\n7. Posición del arco: Al tocar sobre la tastiera se consigue un sonido más oscuro y más piano; al tocar hacia el puente se consigue un sonido más estridente y más forte.\n\nTocar sobre la tastiera\nSonido en posición media\nSonido hacia el puente\n+++[Ejemplo 9]...\n<<player id=9 quicktime materiales/grabaciones/contrabajo/contrabajo_9.wav 400 15>>\n===\n\n\nAl tocar hacia el puente se hace de forma natural más presión sobre el arco.\n\nTocar sobre la tastiera no implica necesariamente tocar en piano; se puede tocar fuerte para conseguir un efecto de color: se escucha más el sonido del arco al pasar por la cuerda.\n+++[Ejemplo 10]...\n<<player id=10 quicktime materiales/grabaciones/contrabajo/contrabajo_10.wav 400 15>>\n===\n\n\nMoviendo ligeramente el puente se puede ajustar la afinación de la parte de las cuerdas que queda detrás. Los contrabajistas intentan afinar estos segmentos con armónicos naturales del instrumento. Ajustando esos armónicos se consigue que el instrumento tenga mucha más potencia, más calidad de sonido y mejor proyección.\n\nEn cierto sentido, considerados en conjunto estos segmentos forman un segundo grupo de cuerdas al aire, afinados prácticamente (hasta donde se consigue) por cuartas\n\nTocando detrás del puente.\n+++[Ejemplo 11]...\n<<player id=11 quicktime materiales/grabaciones/contrabajo/contrabajo_11.wav 400 15>>\n===\n\n\nOtros efectos:\n\nArco directamente sobre la madera del puente (dos ejemplos)\nArco sobre el cordal\nArco sobre el cuerpo del instrumento (al contrabajo se le saca sonido de todas partes, pero debe tenerse una cierta prevención ya que ciertos efectos violentan tanto al instrumento como al arco, en particular si éste está recién encerdado).\n+++[Ejemplo 12]...\n<<player id=12 quicktime materiales/grabaciones/contrabajo/contrabajo_12.wav 400 15>>\n===\n\n\n8.Col legno, esto es, tocar con la madera del arco:\n\nCol Legno en melodías (el intérprete busca zonas con resina para que el arco agarre más)\nCol Legno en trémolo (técnica físicamente agresiva para el arco).\n+++[Ejemplo 13]...\n<<player id=13 quicktime materiales/grabaciones/contrabajo/contrabajo_13.wav 400 15>>\n===\n\n\nCol Legno Battuto. \n+++[Ejemplo 14]...\n<<player id=14 quicktime materiales/grabaciones/contrabajo/contrabajo_14.wav 400 15>>\n=== \n\n\n9. Glissandos: Se puede pedir Glissandos de extensiones bastante amplias.\n+++[Ejemplo 15]...\n<<player id=15 quicktime materiales/grabaciones/contrabajo/contrabajo_15.wav 400 15>>\n=== \n\n\n10. Dobles Cuerdas: \n\nSe suele hacer terceras, cuartas y quintas.\nEn tesituras agudas se puede llegar a hacer octavas, siempre y cuando la nota superior sea armónico (si fuera pulsada la mano difícilmente podría alcanzarla). Tras este ejemplo hay otro con dobles cuerdasen varias posiciones.\n+++[Ejemplo 16]...\n<<player id=16 quicktime materiales/grabaciones/contrabajo/contrabajo_16.wav 400 15>>\n=== \n\n\nLas triples cuerdas o acordes se parten en grupos de dos. Algunas triples cuerdas pueden hacerse sin necesidad de partirlas, pero esto es muy poco habitual.\n\n11.Efectos: Percusiones, silbido.\n+++[Ejemplo 17]...\n<<player id=17 quicktime materiales/grabaciones/contrabajo/contrabajo_17.wav 400 15>>\n=== \n\n\n \n\n
<<tiddlerList tags: frotada,-etiquetasusuales format:"table" header:"Frotada" >>\n
/***\n|''Name:''|DataTiddlerPlugin|\n|''Version:''|1.0.6 (2006-08-26)|\n|''Source:''|http://tiddlywiki.abego-software.de/#DataTiddlerPlugin|\n|''Author:''|UdoBorkowski (ub [at] abego-software [dot] de)|\n|''Licence:''|[[BSD open source license]]|\n|''TiddlyWiki:''|1.2.38+, 2.0|\n|''Browser:''|Firefox 1.0.4+; InternetExplorer 6.0|\n!Description\nEnhance your tiddlers with structured data (such as strings, booleans, numbers, or even arrays and compound objects) that can be easily accessed and modified through named fields (in JavaScript code).\n\nSuch tiddler data can be used in various applications. E.g. you may create tables that collect data from various tiddlers. \n\n''//Example: "Table with all December Expenses"//''\n{{{\n<<forEachTiddler\n where\n 'tiddler.tags.contains("expense") && tiddler.data("month") == "Dec"'\n write\n '"|[["+tiddler.title+"]]|"+tiddler.data("descr")+"| "+tiddler.data("amount")+"|\sn"'\n>>\n}}}\n//(This assumes that expenses are stored in tiddlers tagged with "expense".)//\n<<forEachTiddler\n where\n 'tiddler.tags.contains("expense") && tiddler.data("month") == "Dec"'\n write\n '"|[["+tiddler.title+"]]|"+tiddler.data("descr")+"| "+tiddler.data("amount")+"|\sn"'\n>>\nFor other examples see DataTiddlerExamples.\n\n\n\n\n''Access and Modify Tiddler Data''\n\nYou can "attach" data to every tiddler by assigning a JavaScript value (such as a string, boolean, number, or even arrays and compound objects) to named fields. \n\nThese values can be accessed and modified through the following Tiddler methods:\n|!Method|!Example|!Description|\n|{{{data(field)}}}|{{{t.data("age")}}}|Returns the value of the given data field of the tiddler. When no such field is defined or its value is undefined {{{undefined}}} is returned.|\n|{{{data(field,defaultValue)}}}|{{{t.data("isVIP",false)}}}|Returns the value of the given data field of the tiddler. When no such field is defined or its value is undefined the defaultValue is returned.|\n|{{{data()}}}|{{{t.data()}}}|Returns the data object of the tiddler, with a property for every field. The properties of the returned data object may only be read and not be modified. To modify the data use DataTiddler.setData(...) or the corresponding Tiddler method.|\n|{{{setData(field,value)}}}|{{{t.setData("age",42)}}}|Sets the value of the given data field of the tiddler to the value. When the value is {{{undefined}}} the field is removed.|\n|{{{setData(field,value,defaultValue)}}}|{{{t.setData("isVIP",flag,false)}}}|Sets the value of the given data field of the tiddler to the value. When the value is equal to the defaultValue no value is set (and the field is removed).|\n\nAlternatively you may use the following functions to access and modify the data. In this case the tiddler argument is either a tiddler or the name of a tiddler.\n|!Method|!Description|\n|{{{DataTiddler.getData(tiddler,field)}}}|Returns the value of the given data field of the tiddler. When no such field is defined or its value is undefined {{{undefined}}} is returned.|\n|{{{DataTiddler.getData(tiddler,field,defaultValue)}}}|Returns the value of the given data field of the tiddler. When no such field is defined or its value is undefined the defaultValue is returned.|\n|{{{DataTiddler.getDataObject(tiddler)}}}|Returns the data object of the tiddler, with a property for every field. The properties of the returned data object may only be read and not be modified. To modify the data use DataTiddler.setData(...) or the corresponding Tiddler method.|\n|{{{DataTiddler.setData(tiddler,field,value)}}}|Sets the value of the given data field of the tiddler to the value. When the value is {{{undefined}}} the field is removed.|\n|{{{DataTiddler.setData(tiddler,field,value,defaultValue)}}}|Sets the value of the given data field of the tiddler to the value. When the value is equal to the defaultValue no value is set (and the field is removed).|\n//(For details on the various functions see the detailed comments in the source code.)//\n\n\n''Data Representation in a Tiddler''\n\nThe data of a tiddler is stored as plain text in the tiddler's content/text, inside a "data" section that is framed by a {{{<data>...</data>}}} block. Inside the data section the information is stored in the [[JSON format|http://www.crockford.com/JSON/index.html]]. \n\n//''Data Section Example:''//\n{{{\n<data>{"isVIP":true,"user":"John Brown","age":34}</data>\n}}}\n\nThe data section is not displayed when viewing the tiddler (see also "The showData Macro").\n\nBeside the data section a tiddler may have all kind of other content.\n\nTypically you will not access the data section text directly but use the methods given above. Nevertheless you may retrieve the text of the data section's content through the {{{DataTiddler.getDataText(tiddler)}}} function.\n\n\n''Saving Changes''\n\nThe "setData" methods respect the "ForceMinorUpdate" and "AutoSave" configuration values. I.e. when "ForceMinorUpdate" is true changing a value using setData will not affect the "modifier" and "modified" attributes. With "AutoSave" set to true every setData will directly save the changes after a setData.\n\n\n''Notifications''\n\nNo notifications are sent when a tiddler's data value is changed through the "setData" methods. \n\n''Escape Data Section''\nIn case that you want to use the text {{{<data>}}} or {{{</data>}}} in a tiddler text you must prefix the text with a tilde ('~'). Otherwise it may be wrongly considered as the data section. The tiddler text {{{~<data>}}} is displayed as {{{<data>}}}.\n\n\n''The showData Macro''\n\nBy default the data of a tiddler (that is stored in the {{{<data>...</data>}}} section of the tiddler) is not displayed. If you want to display this data you may used the {{{<<showData ...>>}}} macro:\n\n''Syntax:'' \n|>|{{{<<}}}''showData '' [''JSON''] [//tiddlerName//] {{{>>}}}|\n|''JSON''|By default the data is rendered as a table with a "Name" and "Value" column. When defining ''JSON'' the data is rendered in JSON format|\n|//tiddlerName//|Defines the tiddler holding the data to be displayed. When no tiddler is given the tiddler containing the showData macro is used. When the tiddler name contains spaces you must quote the name (or use the {{{[[...]]}}} syntax.)|\n|>|~~Syntax formatting: Keywords in ''bold'', optional parts in [...]. 'or' means that exactly one of the two alternatives must exist.~~|\n\n\n!Revision history\n* v1.0.6 (2006-08-26) \n** Removed misleading comment\n* v1.0.5 (2006-02-27) (Internal Release Only)\n** Internal\n*** Make "JSLint" conform\n* v1.0.4 (2006-02-05)\n** Bugfix: showData fails in TiddlyWiki 2.0\n* v1.0.3 (2006-01-06)\n** Support TiddlyWiki 2.0\n* v1.0.2 (2005-12-22)\n** Enhancements:\n*** Handle texts "<data>" or "</data>" more robust when used in a tiddler text or as a field value.\n*** Improved (JSON) error messages.\n** Bugs fixed: \n*** References are not updated when using the DataTiddler.\n*** Changes to compound objects are not always saved.\n*** "~</data>" is not rendered correctly (expected "</data>")\n* v1.0.1 (2005-12-13)\n** Features: \n*** The showData macro supports an optional "tiddlername" argument to specify the tiddler containing the data to be displayed\n** Bugs fixed: \n*** A script immediately following a data section is deleted when the data is changed. (Thanks to GeoffS for reporting.)\n* v1.0.0 (2005-12-12)\n** initial version\n\n!Code\n***/\n//{{{\n//============================================================================\n//============================================================================\n// DataTiddlerPlugin\n//============================================================================\n//============================================================================\n\n// Ensure that the DataTiddler Plugin is only installed once.\n//\nif (!version.extensions.DataTiddlerPlugin) {\n\n\n\nversion.extensions.DataTiddlerPlugin = {\n major: 1, minor: 0, revision: 6,\n date: new Date(2006, 7, 26), \n type: 'plugin',\n source: "http://tiddlywiki.abego-software.de/#DataTiddlerPlugin"\n};\n\n// For backward compatibility with v1.2.x\n//\nif (!window.story) window.story=window; \nif (!TiddlyWiki.prototype.getTiddler) {\n TiddlyWiki.prototype.getTiddler = function(title) { \n var t = this.tiddlers[title]; \n return (t !== undefined && t instanceof Tiddler) ? t : null; \n };\n}\n\n//============================================================================\n// DataTiddler Class\n//============================================================================\n\n// ---------------------------------------------------------------------------\n// Configurations and constants \n// ---------------------------------------------------------------------------\n\nfunction DataTiddler() {\n}\n\nDataTiddler = {\n // Function to stringify a JavaScript value, producing the text for the data section content.\n // (Must match the implementation of DataTiddler.parse.)\n //\n stringify : null,\n \n\n // Function to parse the text for the data section content, producing a JavaScript value.\n // (Must match the implementation of DataTiddler.stringify.)\n //\n parse : null\n};\n\n// Ensure access for IE\nwindow.DataTiddler = DataTiddler;\n\n// ---------------------------------------------------------------------------\n// Data Accessor and Mutator\n// ---------------------------------------------------------------------------\n\n\n// Returns the value of the given data field of the tiddler.\n// When no such field is defined or its value is undefined\n// the defaultValue is returned.\n// \n// @param tiddler either a tiddler name or a tiddler\n//\nDataTiddler.getData = function(tiddler, field, defaultValue) {\n var t = (typeof tiddler == "string") ? store.getTiddler(tiddler) : tiddler;\n if (!(t instanceof Tiddler)) {\n throw "Tiddler expected. Got "+tiddler;\n }\n\n return DataTiddler.getTiddlerDataValue(t, field, defaultValue);\n};\n\n\n// Sets the value of the given data field of the tiddler to\n// the value. When the value is equal to the defaultValue\n// no value is set (and the field is removed)\n//\n// Changing data of a tiddler will not trigger notifications.\n// \n// @param tiddler either a tiddler name or a tiddler\n//\nDataTiddler.setData = function(tiddler, field, value, defaultValue) {\n var t = (typeof tiddler == "string") ? store.getTiddler(tiddler) : tiddler;\n if (!(t instanceof Tiddler)) {\n throw "Tiddler expected. Got "+tiddler+ "("+t+")";\n }\n\n DataTiddler.setTiddlerDataValue(t, field, value, defaultValue);\n};\n\n\n// Returns the data object of the tiddler, with a property for every field.\n//\n// The properties of the returned data object may only be read and\n// not be modified. To modify the data use DataTiddler.setData(...) \n// or the corresponding Tiddler method.\n//\n// If no data section is defined a new (empty) object is returned.\n//\n// @param tiddler either a tiddler name or a Tiddler\n//\nDataTiddler.getDataObject = function(tiddler) {\n var t = (typeof tiddler == "string") ? store.getTiddler(tiddler) : tiddler;\n if (!(t instanceof Tiddler)) {\n throw "Tiddler expected. Got "+tiddler;\n }\n\n return DataTiddler.getTiddlerDataObject(t);\n};\n\n// Returns the text of the content of the data section of the tiddler.\n//\n// When no data section is defined for the tiddler null is returned \n//\n// @param tiddler either a tiddler name or a Tiddler\n// @return [may be null]\n//\nDataTiddler.getDataText = function(tiddler) {\n var t = (typeof tiddler == "string") ? store.getTiddler(tiddler) : tiddler;\n if (!(t instanceof Tiddler)) {\n throw "Tiddler expected. Got "+tiddler;\n }\n\n return DataTiddler.readDataSectionText(t);\n};\n\n\n// ---------------------------------------------------------------------------\n// Internal helper methods (must not be used by code from outside this plugin)\n// ---------------------------------------------------------------------------\n\n// Internal.\n//\n// The original JSONError is not very user friendly, \n// especially it does not define a toString() method\n// Therefore we extend it here.\n//\nDataTiddler.extendJSONError = function(ex) {\n if (ex.name == 'JSONError') {\n ex.toString = function() {\n return ex.name + ": "+ex.message+" ("+ex.text+")";\n };\n }\n return ex;\n};\n\n// Internal.\n//\n// @param t a Tiddler\n//\nDataTiddler.getTiddlerDataObject = function(t) {\n if (t.dataObject === undefined) {\n var data = DataTiddler.readData(t);\n t.dataObject = (data) ? data : {};\n }\n \n return t.dataObject;\n};\n\n\n// Internal.\n//\n// @param tiddler a Tiddler\n//\nDataTiddler.getTiddlerDataValue = function(tiddler, field, defaultValue) {\n var value = DataTiddler.getTiddlerDataObject(tiddler)[field];\n return (value === undefined) ? defaultValue : value;\n};\n\n\n// Internal.\n//\n// @param tiddler a Tiddler\n//\nDataTiddler.setTiddlerDataValue = function(tiddler, field, value, defaultValue) {\n var data = DataTiddler.getTiddlerDataObject(tiddler);\n var oldValue = data[field];\n \n if (value == defaultValue) {\n if (oldValue !== undefined) {\n delete data[field];\n DataTiddler.save(tiddler);\n }\n return;\n }\n data[field] = value;\n DataTiddler.save(tiddler);\n};\n\n// Internal.\n//\n// Reads the data section from the tiddler's content and returns its text\n// (as a String).\n//\n// Returns null when no data is defined.\n//\n// @param tiddler a Tiddler\n// @return [may be null]\n//\nDataTiddler.readDataSectionText = function(tiddler) {\n var matches = DataTiddler.getDataTiddlerMatches(tiddler);\n if (matches === null || !matches[2]) {\n return null;\n }\n return matches[2];\n};\n\n// Internal.\n//\n// Reads the data section from the tiddler's content and returns it\n// (as an internalized object).\n//\n// Returns null when no data is defined.\n//\n// @param tiddler a Tiddler\n// @return [may be null]\n//\nDataTiddler.readData = function(tiddler) {\n var text = DataTiddler.readDataSectionText(tiddler);\n try {\n return text ? DataTiddler.parse(text) : null;\n } catch(ex) {\n throw DataTiddler.extendJSONError(ex);\n }\n};\n\n// Internal.\n// \n// Returns the serialized text of the data of the given tiddler, as it\n// should be stored in the data section.\n//\n// @param tiddler a Tiddler\n//\nDataTiddler.getDataTextOfTiddler = function(tiddler) {\n var data = DataTiddler.getTiddlerDataObject(tiddler);\n return DataTiddler.stringify(data);\n};\n\n\n// Internal.\n// \nDataTiddler.indexOfNonEscapedText = function(s, subString, startIndex) {\n var index = s.indexOf(subString, startIndex);\n while ((index > 0) && (s[index-1] == '~')) { \n index = s.indexOf(subString, index+1);\n }\n return index;\n};\n\n// Internal.\n//\nDataTiddler.getDataSectionInfo = function(text) {\n // Special care must be taken to handle "<data>" and "</data>" texts inside\n // a data section. \n // Also take care not to use an escaped <data> (i.e. "~<data>") as the start \n // of a data section. (Same for </data>)\n\n // NOTE: we are explicitly searching for a data section that contains a JSON\n // string, i.e. framed with braces. This way we are little bit more robust in\n // case the tiddler contains unescaped texts "<data>" or "</data>". This must\n // be changed when using a different stringifier.\n\n var startTagText = "<data>{";\n var endTagText = "}</data>";\n\n var startPos = 0;\n\n // Find the first not escaped "<data>".\n var startDataTagIndex = DataTiddler.indexOfNonEscapedText(text, startTagText, 0);\n if (startDataTagIndex < 0) {\n return null;\n }\n\n // Find the *last* not escaped "</data>".\n var endDataTagIndex = text.indexOf(endTagText, startDataTagIndex);\n if (endDataTagIndex < 0) {\n return null;\n }\n var nextEndDataTagIndex;\n while ((nextEndDataTagIndex = text.indexOf(endTagText, endDataTagIndex+1)) >= 0) {\n endDataTagIndex = nextEndDataTagIndex;\n }\n\n return {\n prefixEnd: startDataTagIndex, \n dataStart: startDataTagIndex+(startTagText.length)-1, \n dataEnd: endDataTagIndex, \n suffixStart: endDataTagIndex+(endTagText.length)\n };\n};\n\n// Internal.\n// \n// Returns the "matches" of a content of a DataTiddler on the\n// "data" regular expression. Return null when no data is defined\n// in the tiddler content.\n//\n// Group 1: text before data section (prefix)\n// Group 2: content of data section\n// Group 3: text behind data section (suffix)\n//\n// @param tiddler a Tiddler\n// @return [may be null] null when the tiddler contains no data section, otherwise see above.\n//\nDataTiddler.getDataTiddlerMatches = function(tiddler) {\n var text = tiddler.text;\n var info = DataTiddler.getDataSectionInfo(text);\n if (!info) {\n return null;\n }\n\n var prefix = text.substr(0,info.prefixEnd);\n var data = text.substr(info.dataStart, info.dataEnd-info.dataStart+1);\n var suffix = text.substr(info.suffixStart);\n \n return [text, prefix, data, suffix];\n};\n\n\n// Internal.\n//\n// Saves the data in a <data> block of the given tiddler (as a minor change). \n//\n// The "chkAutoSave" and "chkForceMinorUpdate" options are respected. \n// I.e. the TiddlyWiki *file* is only saved when AutoSave is on.\n//\n// Notifications are not send. \n//\n// This method should only be called when the data really has changed. \n//\n// @param tiddler\n// the tiddler to be saved.\n//\nDataTiddler.save = function(tiddler) {\n\n var matches = DataTiddler.getDataTiddlerMatches(tiddler);\n\n var prefix;\n var suffix;\n if (matches === null) {\n prefix = tiddler.text;\n suffix = "";\n } else {\n prefix = matches[1];\n suffix = matches[3];\n }\n\n var dataText = DataTiddler.getDataTextOfTiddler(tiddler);\n var newText = \n (dataText !== null) \n ? prefix + "<data>" + dataText + "</data>" + suffix\n : prefix + suffix;\n if (newText != tiddler.text) {\n // make the change in the tiddlers text\n \n // ... see DataTiddler.MyTiddlerChangedFunction\n tiddler.isDataTiddlerChange = true;\n \n // ... do the action change\n tiddler.set(\n tiddler.title,\n newText,\n config.options.txtUserName, \n config.options.chkForceMinorUpdate? undefined : new Date(),\n tiddler.tags);\n\n // ... see DataTiddler.MyTiddlerChangedFunction\n delete tiddler.isDataTiddlerChange;\n\n // Mark the store as dirty.\n store.dirty = true;\n \n // AutoSave if option is selected\n if(config.options.chkAutoSave) {\n saveChanges();\n }\n }\n};\n\n// Internal.\n//\nDataTiddler.MyTiddlerChangedFunction = function() {\n // Remove the data object from the tiddler when the tiddler is changed\n // by code other than DataTiddler code. \n //\n // This is necessary since the data object is just a "cached version" \n // of the data defined in the data section of the tiddler and the \n // "external" change may have changed the content of the data section.\n // Thus we are not sure if the data object reflects the data section \n // contents. \n // \n // By deleting the data object we ensure that the data object is \n // reconstructed the next time it is needed, with the data defined by\n // the data section in the tiddler's text.\n \n // To indicate that a change is a "DataTiddler change" a temporary\n // property "isDataTiddlerChange" is added to the tiddler.\n if (this.dataObject && !this.isDataTiddlerChange) {\n delete this.dataObject;\n }\n \n // call the original code.\n DataTiddler.originalTiddlerChangedFunction.apply(this, arguments);\n};\n\n\n//============================================================================\n// Formatters\n//============================================================================\n\n// This formatter ensures that "~<data>" is rendered as "<data>". This is used to \n// escape the "<data>" of a data section, just in case someone really wants to use\n// "<data>" as a text in a tiddler and not start a data section.\n//\n// Same for </data>.\n//\nconfig.formatters.push( {\n name: "data-escape",\n match: "~<\s\s/?data>",\n\n handler: function(w) {\n w.outputText(w.output,w.matchStart + 1,w.nextMatch);\n }\n} );\n\n\n// This formatter ensures that <data>...</data> sections are not rendered.\n//\nconfig.formatters.push( {\n name: "data",\n match: "<data>",\n\n handler: function(w) {\n var info = DataTiddler.getDataSectionInfo(w.source);\n if (info && info.prefixEnd == w.matchStart) {\n w.nextMatch = info.suffixStart;\n } else {\n w.outputText(w.output,w.matchStart,w.nextMatch);\n }\n }\n} );\n\n\n//============================================================================\n// Tiddler Class Extension\n//============================================================================\n\n// "Hijack" the changed method ---------------------------------------------------\n\nDataTiddler.originalTiddlerChangedFunction = Tiddler.prototype.changed;\nTiddler.prototype.changed = DataTiddler.MyTiddlerChangedFunction;\n\n// Define accessor methods -------------------------------------------------------\n\n// Returns the value of the given data field of the tiddler. When no such field \n// is defined or its value is undefined the defaultValue is returned.\n//\n// When field is undefined (or null) the data object is returned. (See \n// DataTiddler.getDataObject.)\n//\n// @param field [may be null, undefined]\n// @param defaultValue [may be null, undefined]\n// @return [may be null, undefined]\n//\nTiddler.prototype.data = function(field, defaultValue) {\n return (field) \n ? DataTiddler.getTiddlerDataValue(this, field, defaultValue)\n : DataTiddler.getTiddlerDataObject(this);\n};\n\n// Sets the value of the given data field of the tiddler to the value. When the \n// value is equal to the defaultValue no value is set (and the field is removed).\n//\n// @param value [may be null, undefined]\n// @param defaultValue [may be null, undefined]\n//\nTiddler.prototype.setData = function(field, value, defaultValue) {\n DataTiddler.setTiddlerDataValue(this, field, value, defaultValue);\n};\n\n\n//============================================================================\n// showData Macro\n//============================================================================\n\nconfig.macros.showData = {\n // Standard Properties\n label: "showData",\n prompt: "Display the values stored in the data section of the tiddler"\n};\n\nconfig.macros.showData.handler = function(place,macroName,params) {\n // --- Parsing ------------------------------------------\n\n var i = 0; // index running over the params\n // Parse the optional "JSON"\n var showInJSONFormat = false;\n if ((i < params.length) && params[i] == "JSON") {\n i++;\n showInJSONFormat = true;\n }\n \n var tiddlerName = story.findContainingTiddler(place).id.substr(7);\n if (i < params.length) {\n tiddlerName = params[i];\n i++;\n }\n\n // --- Processing ------------------------------------------\n try {\n if (showInJSONFormat) {\n this.renderDataInJSONFormat(place, tiddlerName);\n } else {\n this.renderDataAsTable(place, tiddlerName);\n }\n } catch (e) {\n this.createErrorElement(place, e);\n }\n};\n\nconfig.macros.showData.renderDataInJSONFormat = function(place,tiddlerName) {\n var text = DataTiddler.getDataText(tiddlerName);\n if (text) {\n createTiddlyElement(place,"pre",null,null,text);\n }\n};\n\nconfig.macros.showData.renderDataAsTable = function(place,tiddlerName) {\n var text = "|!Name|!Value|\sn";\n var data = DataTiddler.getDataObject(tiddlerName);\n if (data) {\n for (var i in data) {\n var value = data[i];\n text += "|"+i+"|"+DataTiddler.stringify(value)+"|\sn";\n }\n }\n \n wikify(text, place);\n};\n\n\n// Internal.\n//\n// Creates an element that holds an error message\n// \nconfig.macros.showData.createErrorElement = function(place, exception) {\n var message = (exception.description) ? exception.description : exception.toString();\n return createTiddlyElement(place,"span",null,"showDataError","<<showData ...>>: "+message);\n};\n\n// ---------------------------------------------------------------------------\n// Stylesheet Extensions (may be overridden by local StyleSheet)\n// ---------------------------------------------------------------------------\n//\nsetStylesheet(\n ".showDataError{color: #ffffff;background-color: #880000;}",\n "showData");\n\n\n} // of "install only once"\n// Used Globals (for JSLint) ==============\n\n// ... TiddlyWiki Core\n/*global createTiddlyElement, saveChanges, store, story, wikify */\n// ... DataTiddler\n/*global DataTiddler */\n// ... JSON\n/*global JSON */\n \n\n/***\n!JSON Code, used to serialize the data\n***/\n/*\nCopyright (c) 2005 JSON.org\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the "Software"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe Software shall be used for Good, not Evil.\n\nTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n*/\n\n/*\n The global object JSON contains two methods.\n\n JSON.stringify(value) takes a JavaScript value and produces a JSON text.\n The value must not be cyclical.\n\n JSON.parse(text) takes a JSON text and produces a JavaScript value. It will\n throw a 'JSONError' exception if there is an error.\n*/\nvar JSON = {\n copyright: '(c)2005 JSON.org',\n license: 'http://www.crockford.com/JSON/license.html',\n/*\n Stringify a JavaScript value, producing a JSON text.\n*/\n stringify: function (v) {\n var a = [];\n\n/*\n Emit a string.\n*/\n function e(s) {\n a[a.length] = s;\n }\n\n/*\n Convert a value.\n*/\n function g(x) {\n var c, i, l, v;\n\n switch (typeof x) {\n case 'object':\n if (x) {\n if (x instanceof Array) {\n e('[');\n l = a.length;\n for (i = 0; i < x.length; i += 1) {\n v = x[i];\n if (typeof v != 'undefined' &&\n typeof v != 'function') {\n if (l < a.length) {\n e(',');\n }\n g(v);\n }\n }\n e(']');\n return;\n } else if (typeof x.toString != 'undefined') {\n e('{');\n l = a.length;\n for (i in x) {\n v = x[i];\n if (x.hasOwnProperty(i) &&\n typeof v != 'undefined' &&\n typeof v != 'function') {\n if (l < a.length) {\n e(',');\n }\n g(i);\n e(':');\n g(v);\n }\n }\n return e('}');\n }\n }\n e('null');\n return;\n case 'number':\n e(isFinite(x) ? +x : 'null');\n return;\n case 'string':\n l = x.length;\n e('"');\n for (i = 0; i < l; i += 1) {\n c = x.charAt(i);\n if (c >= ' ') {\n if (c == '\s\s' || c == '"') {\n e('\s\s');\n }\n e(c);\n } else {\n switch (c) {\n case '\sb':\n e('\s\sb');\n break;\n case '\sf':\n e('\s\sf');\n break;\n case '\sn':\n e('\s\sn');\n break;\n case '\sr':\n e('\s\sr');\n break;\n case '\st':\n e('\s\st');\n break;\n default:\n c = c.charCodeAt();\n e('\s\su00' + Math.floor(c / 16).toString(16) +\n (c % 16).toString(16));\n }\n }\n }\n e('"');\n return;\n case 'boolean':\n e(String(x));\n return;\n default:\n e('null');\n return;\n }\n }\n g(v);\n return a.join('');\n },\n/*\n Parse a JSON text, producing a JavaScript value.\n*/\n parse: function (text) {\n var p = /^\ss*(([,:{}\s[\s]])|"(\s\s.|[^\sx00-\sx1f"\s\s])*"|-?\sd+(\s.\sd*)?([eE][+-]?\sd+)?|true|false|null)\ss*/,\n token,\n operator;\n\n function error(m, t) {\n throw {\n name: 'JSONError',\n message: m,\n text: t || operator || token\n };\n }\n\n function next(b) {\n if (b && b != operator) {\n error("Expected '" + b + "'");\n }\n if (text) {\n var t = p.exec(text);\n if (t) {\n if (t[2]) {\n token = null;\n operator = t[2];\n } else {\n operator = null;\n try {\n token = eval(t[1]);\n } catch (e) {\n error("Bad token", t[1]);\n }\n }\n text = text.substring(t[0].length);\n } else {\n error("Unrecognized token", text);\n }\n } else {\n token = operator = undefined;\n }\n }\n\n\n function val() {\n var k, o;\n switch (operator) {\n case '{':\n next('{');\n o = {};\n if (operator != '}') {\n for (;;) {\n if (operator || typeof token != 'string') {\n error("Missing key");\n }\n k = token;\n next();\n next(':');\n o[k] = val();\n if (operator != ',') {\n break;\n }\n next(',');\n }\n }\n next('}');\n return o;\n case '[':\n next('[');\n o = [];\n if (operator != ']') {\n for (;;) {\n o.push(val());\n if (operator != ',') {\n break;\n }\n next(',');\n }\n }\n next(']');\n return o;\n default:\n if (operator !== null) {\n error("Missing value");\n }\n k = token;\n next();\n return k;\n }\n }\n next();\n return val();\n }\n};\n\n/***\n!Setup the data serialization\n***/\n\nDataTiddler.format = "JSON";\nDataTiddler.stringify = JSON.stringify;\nDataTiddler.parse = JSON.parse;\n\n//}}}\n\n
[[Guía de Instrumentos]]
|>|>|!PageTemplate|\n|>|>|[[SiteTitle]] - [[SiteSubtitle]]|\n|[[MainMenu]]|[[DefaultTiddlers]]<<br>><<br>>[[ViewTemplate]]<<br>><<br>>[[EditTemplate]]|[[SideBarOptions]]|\n|~|~|[[OptionsPanel]]<<br>>AdvancedOptions|\n|~|~|SideBarTabs|\n|>|>|[[SiteUrl]]|
/***\n| Name:|''dropTagging''|\n| Created by:|SaqImtiaz|\n| Location:|http://lewcid.googlepages.com/lewcid.html|\n| Version:|0.1 (06-Apr-2006)|\n| Requires:|~TW2.07|\n\n!About\n*provides a drop down list of tiddlers tagged with the specified tag, a replacement for the core tagging macro.\n\n!Demonstration\n*<<dropTagging Saq>>\n''I recommend using either TaggerPlugin or monkeyTagger, with dropTags and dropTagging in the toolbar:''\n\n\n!Usage\n{{{<<dropTagging>>}}} for tiddlers tagged by current tiddler/tag\n{{{<<dropTagging 'Saq'>>}}} for tiddlers tagged by the tag 'Saq' <<dropTagging 'Saq'>>\n{{{<<dropTagging 'Saq' 'custom label'>>}}} for tiddlers tagged by the tag 'Saq' with a custom label. <<dropTagging 'Saq' 'custom label'>>\n\n!Installation:\n*Copy this tiddler to your TW with the systemConfig tag\n* copy the following to your ViewTemplate:\n#either {{{<div class='tagging' macro='dropTagging'></div>}}} to add next to or replace tagging macro, or\n#{{{<div class='toolbar' >\n<span style="padding-right:1.75em;" macro='dropTagging''></span>\n<span macro='toolbar -closeTiddler closeOthers +editTiddler permalink references jump'></span>\n</div>}}}(adjust padding to taste)\n\n!To Do\n*tweak popup css to optimize placement and colors.\n*''optimize code to use core onClickTag function, can cut code size by half!''\n\n!Code\n***/\n//{{{\nconfig.macros.dropTagging={};\nconfig.macros.dropTagging.dropdownchar = (document.all?"▼":"▾"); // the fat one is the only one that works in IE\nconfig.macros.dropTagging.handler = function(place,macroName,params,wikifier,paramString,tiddler)\n{\n var arrow=': '+ config.macros.dropTagging.dropdownchar;\n if(params[0] && store.tiddlerExists(params[0]))\n tiddler = store.getTiddler(params[0]);\n\n\n\n var droptagginglabel= (params[1] && params[1] !='.')? params[1]: 'tagging'+arrow;\n var droptaggingtooltip="tiddlers tagged with '"+tiddler.title+"'";\n \n if(params[0] && store.tiddlerExists(params[0]))\n tiddler = store.getTiddler(params[0]);\n var tagged = store.getTaggedTiddlers(tiddler.title);\n\n if(tagged.length==0)\n return false; \n \n var droptagging = function(e)\n { if (!e) var e = window.event;\n var popup = Popup.create(this);\n \n\n\n for(var t=0; t<tagged.length; t++)\n createTiddlyLink(createTiddlyElement(popup,"li"),tagged[t].title,true);\n\n Popup.show(popup,false);\n e.cancelBubble = true;\n if (e.stopPropagation)\n e.stopPropagation();\n return(false);\n };\n \nvar createdropperButton = function(place){\nvar sp = createTiddlyElement(place,"span",null,"taggingdropbutton");\nvar theDropDownBtn = createTiddlyButton(sp,droptagginglabel,droptaggingtooltip,droptagging);\n };\ncreatedropperButton(place);\n};\n\nsetStylesheet(\n ".toolbar .taggingdropbutton {margin-right:0em; border:0px solid #eee; padding:0px; padding-right:0px; padding-left:0px; }\sn"+\n ".taggingdropbutton a.button {padding:2px; padding-left:2px; padding-right:2px;}\sn"+\n// ".taggingdropbutton {font-size:150%;}\sn"+\n".popup .highlight{background: #fe8; color:#000;}\sn"+\n "",\n"DropTaggingStyles");\n\n//}}}
/***\n|''Name:''|''dropTags''|\n|''Version:''|0.5 (12-May-2006)|\n|''Created by:''|SaqImtiaz|\n|''Location:''|http://lewcid.googlepages.com/lewcid.html#DropTagsMacro|\n|''Description:''|provides a drop down list of tags in the current tiddler,<<br>> a replacement for the core tags macro.|\n|''Documentation:''|DropTagsMacroDocumentation |\n|''Source Code:''|[[DropTagsMacroSource|DropTagsMacroDocumentation]] |\n|''Requires:''|~TW2.07|\n\n***/\n// /%\nconfig.macros.dropTags={};config.macros.dropTags.dropdownchar=(document.all?"▼":"▾");config.macros.dropTags.handler=function(_1,_2,_3,_4,_5,_6){var _7=config.macros.dropTags.dropdownchar;var _8=(_3[0]&&_3[0]!=".")?_3[0]+_7:"tags"+_7;var _9="current tags for this tiddler";var _a=function(e){if(!e){var e=window.event;}var _d=Popup.create(this);var _e=config.views.wikified.tag;if(_6.tags.length==0){createTiddlyElement(_d,"li",null,"listTitle",_e.labelNoTags);}else{for(var t=0;t<_6.tags.length;t++){createTagButton(createTiddlyElement(_d,"li"),_6.tags[t],_6.title);}}if(version.extensions.IntelliTaggerPlugin){createTiddlyElement(createTiddlyElement(_d,"li"),"hr");abego.IntelliTagger.createEditTagsButton(_6,createTiddlyElement(_d,"li"),"[IntelliEdit]","Edit tags with Intellitagger");}Popup.show(_d,false);e.cancelBubble=true;if(e.stopPropagation){e.stopPropagation();}return (false);};createTiddlyButton(_1,_8,_8,_a,"button","dropTagBtn");};setStylesheet(".popup .highlight{background: #fe8; color:#000;}\sn"+"#nestedtagger {background:#2E5ADF; border: 1px solid #0331BF;}\sn"+"","DropTagsStyles");if(!config.macros.tagger){window.onClickTag=function(e){if(!e){var e=window.event;}var _12=resolveTarget(e);var _13=(!isNested(_12));if((Popup.stack.length>1)&&(_13==true)){Popup.removeFrom(1);}else{if(Popup.stack.length>0&&_13==false){Popup.removeFrom(0);}}var _14=(_13==false)?"popup":"nestedtagger";var _15=createTiddlyElement(document.body,"ol",_14,"popup",null);Popup.stack.push({root:this,popup:_15});var tag=this.getAttribute("tag");var _17=this.getAttribute("tiddler");if(_15&&tag){var _18=store.getTaggedTiddlers(tag);var _19=[];var li,r;for(r=0;r<_18.length;r++){if(_18[r].title!=_17){_19.push(_18[r].title);}}var _1b=config.views.wikified.tag;if(_19.length>0){var _1c=createTiddlyButton(createTiddlyElement(_15,"li"),_1b.openAllText.format([tag]),_1b.openAllTooltip,onClickTagOpenAll);_1c.setAttribute("tag",tag);createTiddlyElement(createTiddlyElement(_15,"li"),"hr");for(r=0;r<_19.length;r++){createTiddlyLink(createTiddlyElement(_15,"li"),_19[r],true);}}else{createTiddlyText(createTiddlyElement(_15,"li",null,"disabled"),_1b.popupNone.format([tag]));}createTiddlyElement(createTiddlyElement(_15,"li"),"hr");var h=createTiddlyLink(createTiddlyElement(_15,"li"),tag,false);createTiddlyText(h,_1b.openTag.format([tag]));}Popup.show(_15,false);e.cancelBubble=true;if(e.stopPropagation){e.stopPropagation();}return (false);};}if(!window.isNested){window.isNested=function(e){while(e!=null){var _1f=document.getElementById("contentWrapper");if(_1f==e){return true;}e=e.parentNode;}return false;};};config.shadowTiddlers.DropTagsMacroDocumentation="The documentation is available [[here.|http://lewcid.googlepages.com/lewcid.html#DropTagsMacroDocumentation]]";config.shadowTiddlers.DropTagsMacroSource="The documentation is available [[here.|http://lewcid.googlepages.com/lewcid.html#DropTagsMacroDocumentation]]";\n// %/
/***\n|''Name:''|''dropTags''|\n|''Version:''|0.5 (12-May-2006)|\n|''Created by:''|SaqImtiaz|\n|''Location:''|http://lewcid.googlepages.com/lewcid.html#DropTagsMacro|\n|''Description:''|provides a drop down list of tags in the current tiddler,<<br>> a replacement for the core tags macro.|\n|''Documentation:''|DropTagsMacroDocumentation |\n|''Source Code:''|DropTagsMacroSource |\n|''Requires:''|~TW2.07|\n\n!About\n*provides a drop down list of tags in the current tiddler, a replacement for the core tags macro.\n\n''I recommend using either TaggerPlugin or monkeyTagger, with dropTags and dropTagging in the toolbar:''\n\n\n!Usage\n{{{<<dropTags>>}}} for <<dropTags>>\nor {{{<<dropTags 'custom label'>>}}} for <<dropTags 'custom label'>>\n\n!Installation:\n*Copy this tiddler to your TW with the systemConfig tag\n* copy the following to your ViewTemplate:\n#either {{{<div class='tagged' macro='dropTags'></div>}}} to add to next to the tags macro in the viewer area, or\n#{{{<div class='toolbar' >\n<span style="padding-right:8.75em;" macro='dropTags "current tags: "+config.macros.dropTags.dropdownchar}}'></span>\n<span macro='toolbar -closeTiddler closeOthers +editTiddler permalink references jump'></span>\n</div>}}}\n\n\n!History\n*May 12th, version 0.5, fixed some nesting bugs, added support for IntellitaggerPlugin.\n*May 3rd, version 0.41, made compatible with CustomPopups.\n\n!Source Code\n***/\n//{{{\nconfig.macros.dropTags={};\nconfig.macros.dropTags.dropdownchar = (document.all?"▼":"▾"); // the fat one is the only one that works in IE\nconfig.macros.dropTags.handler = function(place,macroName,params,wikifier,paramString,tiddler)\n{\n var arrow=config.macros.dropTags.dropdownchar;\n var droptaglabel= (params[0] && params[0] !='.')? params[0]+arrow: 'tags'+arrow;\n var droptagtooltip="current tags for this tiddler";\n\n var droptag = function(e){\n if (!e) var e = window.event;\n var popup = Popup.create(this);\n var lingo = config.views.wikified.tag;\n if (tiddler.tags.length==0)\n createTiddlyElement(popup,"li",null,"listTitle",lingo.labelNoTags);\n else\n for(var t=0; t<tiddler.tags.length; t++)\n {createTagButton(createTiddlyElement(popup,"li"),tiddler.tags[t],tiddler.title);}\n if (version.extensions.IntelliTaggerPlugin)\n {createTiddlyElement(createTiddlyElement(popup,"li"),"hr");\n abego.IntelliTagger.createEditTagsButton(tiddler, createTiddlyElement(popup,"li"),"[IntelliEdit]","Edit tags with Intellitagger");}\n Popup.show(popup,false);\n e.cancelBubble = true;\n if (e.stopPropagation)\n e.stopPropagation();\n return(false);\n };\n createTiddlyButton(place,droptaglabel,droptaglabel,droptag,"button","dropTagBtn");\n};\n\nsetStylesheet(\n".popup .highlight{background: #fe8; color:#000;}\sn"+\n"#nestedtagger {background:#2E5ADF; border: 1px solid #0331BF;}\sn"+\n "",\n"DropTagsStyles");\n\nif (!config.macros.tagger)\n window.onClickTag=function(e){\n if (!e) var e = window.event;\n var theTarget = resolveTarget(e);\n\n var nested = (!isNested(theTarget));\n if ((Popup.stack.length > 1)&&(nested==true)) {Popup.removeFrom(1);}\n else if(Popup.stack.length > 0 && nested==false) {Popup.removeFrom(0);};\n\n var theId = (nested==false)? "popup" : "nestedtagger";\n var popup = createTiddlyElement(document.body,"ol",theId,"popup",null);\n Popup.stack.push({root: this, popup: popup});\n\n var tag = this.getAttribute("tag");\n var title = this.getAttribute("tiddler");\n if(popup && tag)\n {\n var tagged = store.getTaggedTiddlers(tag);\n var titles = [];\n var li,r;\n for(r=0;r<tagged.length;r++)\n if(tagged[r].title != title)\n titles.push(tagged[r].title);\n var lingo = config.views.wikified.tag;\n if(titles.length > 0)\n {\n var openAll = createTiddlyButton(createTiddlyElement(popup,"li"),lingo.openAllText.format([tag]),lingo.openAllTooltip,onClickTagOpenAll);\n openAll.setAttribute("tag",tag);\n createTiddlyElement(createTiddlyElement(popup,"li"),"hr");\n for(r=0; r<titles.length; r++)\n {\n createTiddlyLink(createTiddlyElement(popup,"li"),titles[r],true);\n }\n }\n else\n createTiddlyText(createTiddlyElement(popup,"li",null,"disabled"),lingo.popupNone.format([tag]));\n createTiddlyElement(createTiddlyElement(popup,"li"),"hr");\n var h = createTiddlyLink(createTiddlyElement(popup,"li"),tag,false);\n createTiddlyText(h,lingo.openTag.format([tag]));\n }\n Popup.show(popup,false);\n e.cancelBubble = true;\n if (e.stopPropagation) e.stopPropagation();\n return(false);\n }\n\nif (!window.isNested)\n window.isNested = function(e) {\n while (e != null) {\n var contentWrapper = document.getElementById("contentWrapper");\n if (contentWrapper == e) return true;\n e = e.parentNode;\n }\n return false;\n };\n\nconfig.shadowTiddlers.DropTagsMacroDocumentation="The documentation is available [[here.|http://lewcid.googlepages.com/lewcid.html#DropTagsMacroDocumentation]]";\n\nconfig.shadowTiddlers.DropTagsMacroSource="The documentation is available [[here.|http://lewcid.googlepages.com/lewcid.html#DropTagsMacroDocumentation]]";\n\n//}}}
<!--{{{-->\n<div class='toolbar' macro='toolbar +saveTiddler -cancelTiddler deleteTiddler wikibar'></div>\n<div class='title' macro='view title'></div>\n<div class='editor' macro='edit title'></div>\n<div class='editor' macro='edit text'></div>\n<div class='editor' macro='edit tags'></div><div class='editorFooter'><span macro='message views.editor.tagPrompt'></span><span macro='tagChooser'></span></div>\n<!--}}}-->
Las etiquetas que se le asignen a este tiddler son las que después estarán disponibles para añadir a los tiddlers a través del apartado {{{"Etiquetas:" }}}\n\nPara añadir etiquetas a este tiddler sin necesidad de "editarlo", se puede utilizar la lista que aparece a continuación, la cual muestra todas las etiquetas disponibles.\n\n<<tagger>>\n\n!''este plugin interacciona con el de listas de tiddlers:''\n\nEstamos utilizando un plugin para hacer listas de tiddlers automáticamente: por ejemplo, todos los tiddlers que tengan la etiqueta ''ayuda'' se agregan automáticamente a la lista que aparece en el tiddler [[Ayuda]]\n\nHay un problema que aparece debido a que la forma de hacer que haya etiquetas disponibles en ''Etiquetas:'' para añadírselas automáticamente a los artículos es añadírselas como etiquetas a éste. Lo que ocurre es que, si añadimos a este tiddler la etiqueta ''ayuda'' para que esa etiqueta esté disponible en la lista de etiquetas más usuales, automáticamente el tiddler se añade a la lista de tiddlers disponibles en [[Ayuda]]. En este caso coincide que nos interesa, pero es la excepción. Por ejemplo, en el tiddler [[Nocturna]], en el apartado de documentación, aparecía también este tiddler.\n\nLa solución ha sido un poco enrevesada, pero funciona: he añadido a este tiddler una etiqueta, ''etiquetasusuales'', y después he hecho lo siguiente:\n\n-He añadido a las listas donde no me interesaba que apareciera esete tiddler el añadido -etiquetasusuales.\n-He añadido en [[ViewTemplate]] un parámetro para excluir esta etiqueta de entre las que se muestran.\n\nPor tanto, al utilizar este tiddler para hacer disponibles más etiquetas en la "lista rápida", hay que tener cuidado de añadir ''-etiquetasusuales'' a las listas donde se utilicen esas mismas etiquetas.\n\n
The following macro call exports all tiddlers to a text file "c:/MyTiddlyWikiExport.txt", using a customized format.\n{{{\n<<forEachTiddler\n script 'function getSortedTagsText(tiddler) {var tags = tiddler.tags; if (!tags) return ""; tags.sort(); var result = ""; for (var i = 0; i < tags.length;i++) {result += tags[i]+ " ";} return result;} function writeTiddler(tiddler) {return "==== "+tiddler.title+"=========================\snTags: "+ getSortedTagsText(tiddler)+"\snModified: "+tiddler.modified.convertToYYYYMMDDHHMM()+"\snModifier: "+tiddler.modifier+"\sn--------------------------------------------------\sn"+tiddler.text+"\sn--------------------------------------------------\sn(End of "+tiddler.title+")\sn\sn\sn\sn"}'\n write \n 'writeTiddler(tiddler)' \n toFile 'file:///c:/MyTiddlyWikiExport.txt' withLineSeparator '\sr\sn'\n>>\n}}}\nFor better readablility here the script text in a nicer layout:\n{{{\nfunction getSortedTagsText(tiddler) {\n var tags = tiddler.tags; \n if (!tags) \n return ""; \n tags.sort(); \n var result = ""; \n for (var i = 0; i < tags.length;i++) {\n result += tags[i]+ " ";\n } \n return result;\n} \n\nfunction writeTiddler(tiddler) {\n return "==== "+tiddler.title+"=========================\sn"+\n "Tags: "+ getSortedTagsText(tiddler)+"\sn"+\n "Modified: "+tiddler.modified.convertToYYYYMMDDHHMM()+"\sn"+\n "Modifier: "+tiddler.modifier+"\sn"+\n "--------------------------------------------------\sn"+\n tiddler.text+"\sn"+\n "--------------------------------------------------\sn"\n "(End of "+tiddler.title+")\sn\sn\sn\sn"\n}\n}}}\n\n<<forEachTiddler\n script 'function getSortedTagsText(tiddler) {var tags = tiddler.tags; if (!tags) return ""; tags.sort(); var result = ""; for (var i = 0; i < tags.length;i++) {result += tags[i]+ " ";} return result;} function writeTiddler(tiddler) {return "==== "+tiddler.title+"=========================\snTags: "+ getSortedTagsText(tiddler)+"\snModified: "+tiddler.modified.convertToYYYYMMDDHHMM()+"\snModifier: "+tiddler.modifier+"\sn--------------------------------------------------\sn"+tiddler.text+"\sn--------------------------------------------------\sn(End of "+tiddler.title+")\sn\sn\sn\sn"}'\n write \n 'writeTiddler(tiddler)' \n toFile 'file:///c:/MyTiddlyWikiExport.txt' withLineSeparator '\sr\sn'\n>>\n\n
/***\n|''Name:''|ExportTiddlersPlugin|\n|''Source:''|http://www.TiddlyTools.com/#ExportTiddlersPlugin|\n|''Author:''|Eric Shulman - ELS Design Studios|\n|''License:''|[[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|\n|''~CoreVersion:''|2.0.10|\n\nWhen many people edit copies of the same TiddlyWiki document, the ability to easily copy and share these changes so they can then be redistributed to the entire group is very important. This ability is also very useful when moving your own tiddlers from document to document (e.g., when upgrading to the latest version of TiddlyWiki, or 'pre-loading' your favorite stylesheets into a new 'empty' TiddlyWiki document.)\n\nExportTiddlersPlugin let you ''select and extract tiddlers from your ~TiddlyWiki documents and save them to a local file'' or a remote server (requires installation of compatible server-side scripting, still under development...). An interactive control panel lets you specify a destination, and then select which tiddlers to export. A convenient 'selection filter' helps you pick desired tiddlers by specifying a combination of modification dates, tags, or tiddler text to be matched or excluded. ''Tiddler data can be output as ~TiddlyWiki "storeArea ~DIVs" that can be imported into another ~TiddlyWiki or as ~RSS-compatible XML that can be published for RSS syndication.''\n\n!!!!!Inline interface (live)\n<<<\n<<exportTiddlers inline>>\n<<<\n!!!!!Usage\n<<<\nOptional "special tiddlers" used by this plugin:\n* SiteUrl^^\nURL for official server-published version of document being viewed (used in XML export)\ndefault: //none//^^\n* SiteHost^^\nhost name/address for remote server (e.g., "www.server.com" or "")\ndefault: //none//^^\n* SitePost^^\nremote path/filename for submitting changes (e.g., "/cgi-bin/submit.cgi")\ndefault: //none//^^\n* SiteParams^^\narguments (if any) for server-side receiving script\ndefault: //none//^^\n* SiteNotify^^\naddresses (if any) for sending automatic server-side email notices\ndefault: //none//^^\n* SiteID^^\nusername or other authorization identifier for login-controlled access to remote server\ndefault: current TiddlyWiki username (e.g., "YourName")^^\n* SiteDate^^\nstored date/time stamp for most recent published version of document\ndefault: current document.modified value (i.e., the 'file date')^^\n<<<\n!!!!!Example\n<<<\n<<exportTiddlers>>\n<<<\n!!!!!Installation\n<<<\nImport (or copy/paste) the following tiddlers into your document:\n''ExportTiddlersPlugin'' (tagged with <<tag systemConfig>>)\n\ncreate/edit ''SideBarOptions'': (sidebar menu items) \n^^Add {{{<<exportTiddlers>>}}} macro^^\n<<<\n!!!!!Revision History\n<<<\n''2006.10.12 [2.2.3]'' in exportDIVFooter(), write POST-BODY-START/END markers for compatibility with TW2.1 core file format. Based on report from Jose Gonzalez.\n''2006.05.11 [2.2.2]''\nin createExportPanel, removed call to addNotification() to no longer auto-refresh the list every time a tiddler is changed. Instead, call refreshExportList(0) only when the panel is first rendered and each time it is made visible. Prevents unneeded feedback messages from being displayed and increases overall document performance, since the listbox is no longer being updated each time a tiddler is saved.\n''2006.05.02 [2.2.1]''\nUse displayMessage() to show number of selected tiddlers instead of updating listbox 'header' item after each selection. Prevents awkward 'scroll-to-top' behavior that made multi-select via ctrl-click nearly impossible. Reported by Paul Reiber.\n''2006.04.29 [2.2.0]''\nNew features: "Notes" are free-form text that is inserted in the header of a TWDIV export file. When exporting to a server, the "notify" checkbox indicates that server-side script processing should send an email message when the export file is stored on the server. Comma-separated addresses may be typed in, or pre-defined in the SiteNotify tiddler.\n''2006.03.29 [2.1.3]''\nadded calls to convertUnicodeToUTF8() for generated output, so it better handles international characters.\n''2006.02.12 [2.1.2]''\nadded var to unintended global 'tags' in matchTags(). Avoids FF1501 bug when filtering by tags. (based on report by TedPavlic)\n''2006.02.04 [2.1.1]''\nadded var to variables that were unintentionally global. Avoids FireFox crash bug when referencing global variables\n''2006.02.02 [2.1.0]''\nAdded support for output of complete TiddlyWiki documents. Let's you use ExportTiddlers to generate 'starter' documents from selected tiddlers.\n''2006.01.21 [2.0.1]''\nDefer initial panel creation and only register a notification function when panel first is created\nin saveChanges 'hijack', create panel as needed. Note: if window.event is not available to identify the click location, the export panel is positioned relative to the 'tiddlerDisplay' element of the TW document.\n''2005.12.27 [2.0.0]''\nUpdate for TW2.0\nDefer initial panel creation and only register a notification function when panel first is created\n''2005.12.24 [0.9.5]''\nMinor adjustments to CSS to force correct link colors regardless of TW stylesheet selection\n''2005.12.16 [0.9.4]''\nDynamically create/remove exportPanel as needed to ensure only one instance of interface elements exists, even if there are multiple instances of macro embedding.\n''2005.11.15 [0.9.2]''\nadded non-Ajax post function to bypass javascript security restrictions on cross-domain I/O. Moved AJAX functions to separate tiddler (no longer needed here). Generalized HTTP server to support UnaWiki servers\n''2005.11.08 [0.9.1]''\nmoved HTML, CSS and control initialization into exportInit() function and call from macro handler instead of at load time. This allows exportPanel to be placed within the same containing element as the "export tiddlers" button, so that relative positioning can be achieved.\n''2005.10.28 [0.9.0]''\nadded 'select opened tiddlers' feature\nBased on a suggestion by Geoff Slocock\n''2005.10.24 [0.8.3]''\nCorrected hijack of 'save changes' when using http:\n''2005.10.18 [0.8.2]''\nadded AJAX functions\n''2005.10.18 [0.8.1]''\nCorrected timezone handling when filtering for date ranges.\nImproved error checking/reporting for invalid filter values and filters that don't match any tiddlers.\nExporting localfile-to-localfile is working for IE and FF\nExporting server-to-localfile works in IE (after ActiveX warnings), but has security issues in FF\nCross-domain exporting (localfile/server-to-server) is under development\nCookies to remember filter settings - coming soon\nMore style tweaks, minor text changes and some assorted layout cleanup.\n''2005.10.17 [0.8.0]''\nFirst pre-release.\n''2005.10.16 [0.7.0]''\nfilter by tags\n''2005.10.15 [0.6.0]''\nfilter by title/text\n''2005.10.14 [0.5.0]''\nexport to local file (DIV or XML)\n''2005.10.14 [0.4.0]''\nfilter by start/end date\n''2005.10.13 [0.3.0]''\npanel interaction\n''2005.10.11 [0.2.0]''\npanel layout\n''2005.10.10 [0.1.0]''\ncode framework\n''2005.10.09 [0.0.0]''\ndevelopment started\n<<<\n!!!!!Credits\n<<<\nThis feature was developed by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]]\n<<<\n!!!!!Code\n***/\n// // +++[version]\n//{{{\nversion.extensions.exportTiddlers = {major: 2, minor: 2, revision: 3, date: new Date(2006,10,12)};\n//}}}\n// //===\n\n// // +++[macro handler]\n//{{{\nconfig.macros.exportTiddlers = {\n label: "export tiddlers",\n prompt: "Copy selected tiddlers to an export document",\n datetimefmt: "0MM/0DD/YYYY 0hh:0mm:0ss" // for "filter date/time" edit fields\n};\n\nconfig.macros.exportTiddlers.handler = function(place,macroName,params) {\n if (params[0]!="inline")\n { createTiddlyButton(place,this.label,this.prompt,onClickExportMenu); return; }\n var panel=createExportPanel(place);\n panel.style.position="static";\n panel.style.display="block";\n}\n\nfunction createExportPanel(place) {\n var panel=document.getElementById("exportPanel");\n if (panel) { panel.parentNode.removeChild(panel); }\n setStylesheet(config.macros.exportTiddlers.css,"exportTiddlers");\n panel=createTiddlyElement(place,"span","exportPanel",null,null)\n panel.innerHTML=config.macros.exportTiddlers.html;\n exportShowPanel(document.location.protocol);\n exportInitFilter();\n refreshExportList(0);\n return panel;\n}\n\nfunction onClickExportMenu(e)\n{\n if (!e) var e = window.event;\n var parent=resolveTarget(e).parentNode;\n var panel = document.getElementById("exportPanel");\n if (panel==undefined || panel.parentNode!=parent)\n panel=createExportPanel(parent);\n var isOpen = panel.style.display=="block";\n if(config.options.chkAnimate)\n anim.startAnimating(new Slider(panel,!isOpen,e.shiftKey || e.altKey,"none"));\n else\n panel.style.display = isOpen ? "none" : "block" ;\n if (panel.style.display!="none") refreshExportList(0); // update list when panel is made visible\n e.cancelBubble = true;\n if (e.stopPropagation) e.stopPropagation();\n return(false);\n}\n//}}}\n// //===\n\n// // +++[Hijack saveChanges] diverts 'notFileUrlError' to display export control panel instead\n//{{{\nwindow.coreSaveChanges=window.saveChanges;\nwindow.saveChanges = function()\n{\n if (document.location.protocol=="file:") { coreSaveChanges(); return; }\n var e = window.event;\n var parent=e?resolveTarget(e).parentNode:document.body;\n var panel = document.getElementById("exportPanel");\n if (panel==undefined || panel.parentNode!=parent) panel=createExportPanel(parent);\n exportShowPanel(document.location.protocol);\n if (parent==document.body) { panel.style.left="30%"; panel.style.top="30%"; }\n panel.style.display = "block" ;\n}\n//}}}\n// //===\n\n// // +++[IE needs explicit scoping] for functions called by browser events\n//{{{\nwindow.onClickExportMenu=onClickExportMenu;\nwindow.onClickExportButton=onClickExportButton;\nwindow.exportShowPanel=exportShowPanel;\nwindow.exportShowFilterFields=exportShowFilterFields;\nwindow.refreshExportList=refreshExportList;\n//}}}\n// //===\n\n// // +++[CSS] for floating export control panel\n//{{{\nconfig.macros.exportTiddlers.css = '\s\n#exportPanel {\s\n display: none; position:absolute; z-index:12; width:35em; right:105%; top:6em;\s\n background-color: #eee; color:#000; font-size: 8pt; line-height:110%;\s\n border:1px solid black; border-bottom-width: 3px; border-right-width: 3px;\s\n padding: 0.5em; margin:0em; -moz-border-radius:1em;\s\n}\s\n#exportPanel a, #exportPanel td a { color:#009; display:inline; margin:0px; padding:1px; }\s\n#exportPanel table { width:100%; border:0px; padding:0px; margin:0px; font-size:8pt; line-height:110%; background:transparent; }\s\n#exportPanel tr { border:0px;padding:0px;margin:0px; background:transparent; }\s\n#exportPanel td { color:#000; border:0px;padding:0px;margin:0px; background:transparent; }\s\n#exportPanel select { width:98%;margin:0px;font-size:8pt;line-height:110%;}\s\n#exportPanel input { width:98%;padding:0px;margin:0px;font-size:8pt;line-height:110%; }\s\n#exportPanel textarea { width:98%;padding:0px;margin:0px;overflow:auto;font-size:8pt; }\s\n#exportPanel .box { border:1px solid black; padding:3px; margin-bottom:5px; background:#f8f8f8; -moz-border-radius:5px; }\s\n#exportPanel .topline { border-top:2px solid black; padding-top:3px; margin-bottom:5px; }\s\n#exportPanel .rad { width:auto;border:0 }\s\n#exportPanel .chk { width:auto;border:0 }\s\n#exportPanel .btn { width:auto; }\s\n#exportPanel .btn1 { width:98%; }\s\n#exportPanel .btn2 { width:48%; }\s\n#exportPanel .btn3 { width:32%; }\s\n#exportPanel .btn4 { width:24%; }\s\n#exportPanel .btn5 { width:19%; }\s\n';\n//}}}\n// //===\n\n// // +++[HTML] for export control panel interface\n//{{{\nconfig.macros.exportTiddlers.html = '\s\n<!-- output target and format -->\s\n<table cellpadding="0" cellspacing="0"><tr><td width=50%>\s\n export to\s\n <select size=1 id="exportTo" onchange="exportShowPanel(this.value);">\s\n <option value="file:" SELECTED>this computer</option>\s\n <option value="http:">web server (http)</option>\s\n <option value="https:">secure web server (https)</option>\s\n <option value="ftp:">file server (ftp)</option>\s\n </select>\s\n</td><td width=50%>\s\n output format\s\n <select id="exportFormat" size=1>\s\n <option value="DIV">TiddlyWiki export file</option>\s\n <option value="TW">TiddlyWiki document</option>\s\n <option value="XML">RSS feed (XML)</option>\s\n </select>\s\n</td></tr></table>\s\n\s\n<!-- export to local file -->\s\n<div id="exportLocalPanel" style="margin-top:5px;">\s\nlocal path/filename<br>\s\n<input type="file" id="exportFilename" size=57 style="width:100%"><br>\s\n</div><!--panel-->\s\n\s\n<!-- export to http server -->\s\n<div id="exportHTTPPanel" style="display:none;margin-top:5px;">\s\n<table><tr><td align=left>\s\n server location, script, and parameters<br>\s\n</td><td align=right>\s\n <input type="checkbox" class="chk" id="exportNotify"\s\n onClick="document.getElementById(\s'exportSetNotifyPanel\s').style.display=this.checked?\s'block\s':\s'none\s'"> notify\s\n</td></tr></table>\s\n<input type="text" id="exportHTTPServerURL" onfocus="this.select()"><br>\s\n<div id="exportSetNotifyPanel" style="display:none">\s\n send email notices to<br>\s\n <input type="text" id="exportNotifyTo" onfocus="this.select()"><br>\s\n</div>\s\n</div><!--panel-->\s\n\s\n<!-- export to ftp server -->\s\n<div id="exportFTPPanel" style="display:none;margin-top:5px;">\s\n<table cellpadding="0" cellspacing="0" width="32%"><tr valign="top"><td>\s\n host server<br>\s\n <input type="text" id="exportFTPHost" onfocus="this.select()"><br>\s\n</td><td width="32%">\s\n username<br>\s\n <input type="text" id="exportFTPID" onfocus="this.select()"><br>\s\n</td><td width="32%">\s\n password<br>\s\n <input type="password" id="exportFTPPW" onfocus="this.select()"><br>\s\n</td></tr></table>\s\nFTP path/filename<br>\s\n<input type="text" id="exportFTPFilename" onfocus="this.select()"><br>\s\n</div><!--panel-->\s\n\s\n<!-- notes -->\s\nnotes<br>\s\n<textarea id="exportNotes" rows=3 cols=40 style="height:4em;margin-bottom:5px;" onfocus="this.select()"></textarea> \s\n\s\n<!-- list of tiddlers -->\s\n<table><tr align="left"><td>\s\n select:\s\n <a href="JavaScript:;" id="exportSelectAll"\s\n onclick="onClickExportButton(this)" title="select all tiddlers">\s\n &nbsp;all&nbsp;</a>\s\n <a href="JavaScript:;" id="exportSelectChanges"\s\n onclick="onClickExportButton(this)" title="select tiddlers changed since last save">\s\n &nbsp;changes&nbsp;</a> \s\n <a href="JavaScript:;" id="exportSelectOpened"\s\n onclick="onClickExportButton(this)" title="select tiddlers currently being displayed">\s\n &nbsp;opened&nbsp;</a> \s\n <a href="JavaScript:;" id="exportToggleFilter"\s\n onclick="onClickExportButton(this)" title="show/hide selection filter">\s\n &nbsp;filter&nbsp;</a> \s\n</td><td align="right">\s\n <a href="JavaScript:;" id="exportListSmaller"\s\n onclick="onClickExportButton(this)" title="reduce list size">\s\n &nbsp;&#150;&nbsp;</a>\s\n <a href="JavaScript:;" id="exportListLarger"\s\n onclick="onClickExportButton(this)" title="increase list size">\s\n &nbsp;+&nbsp;</a>\s\n</td></tr></table>\s\n<select id="exportList" multiple size="10" style="margin-bottom:5px;"\s\n onchange="refreshExportList(this.selectedIndex)">\s\n</select><br>\s\n</div><!--box-->\s\n\s\n<!-- selection filter -->\s\n<div id="exportFilterPanel" style="display:none">\s\n<table><tr align="left"><td>\s\n selection filter\s\n</td><td align="right">\s\n <a href="JavaScript:;" id="exportHideFilter"\s\n onclick="onClickExportButton(this)" title="hide selection filter">hide</a>\s\n</td></tr></table>\s\n<div class="box">\s\n<input type="checkbox" class="chk" id="exportFilterStart" value="1"\s\n onclick="exportShowFilterFields(this)"> starting date/time<br>\s\n<table cellpadding="0" cellspacing="0"><tr valign="center"><td width="50%">\s\n <select size=1 id="exportFilterStartBy" onchange="exportShowFilterFields(this);">\s\n <option value="0">today</option>\s\n <option value="1">yesterday</option>\s\n <option value="7">a week ago</option>\s\n <option value="30">a month ago</option>\s\n <option value="site">SiteDate</option>\s\n <option value="file">file date</option>\s\n <option value="other">other (mm/dd/yyyy hh:mm)</option>\s\n </select>\s\n</td><td width="50%">\s\n <input type="text" id="exportStartDate" onfocus="this.select()"\s\n onchange="document.getElementById(\s'exportFilterStartBy\s').value=\s'other\s';">\s\n</td></tr></table>\s\n<input type="checkbox" class="chk" id="exportFilterEnd" value="1"\s\n onclick="exportShowFilterFields(this)"> ending date/time<br>\s\n<table cellpadding="0" cellspacing="0"><tr valign="center"><td width="50%">\s\n <select size=1 id="exportFilterEndBy" onchange="exportShowFilterFields(this);">\s\n <option value="0">today</option>\s\n <option value="1">yesterday</option>\s\n <option value="7">a week ago</option>\s\n <option value="30">a month ago</option>\s\n <option value="site">SiteDate</option>\s\n <option value="file">file date</option>\s\n <option value="other">other (mm/dd/yyyy hh:mm)</option>\s\n </select>\s\n</td><td width="50%">\s\n <input type="text" id="exportEndDate" onfocus="this.select()"\s\n onchange="document.getElementById(\s'exportFilterEndBy\s').value=\s'other\s';">\s\n</td></tr></table>\s\n<input type="checkbox" class="chk" id=exportFilterTags value="1"\s\n onclick="exportShowFilterFields(this)"> match tags<br>\s\n<input type="text" id="exportTags" onfocus="this.select()">\s\n<input type="checkbox" class="chk" id=exportFilterText value="1"\s\n onclick="exportShowFilterFields(this)"> match titles/tiddler text<br>\s\n<input type="text" id="exportText" onfocus="this.select()">\s\n</div> <!--box-->\s\n</div> <!--panel-->\s\n\s\n<!-- action buttons -->\s\n<div style="text-align:center">\s\n<input type=button class="btn3" onclick="onClickExportButton(this)"\s\n id="exportFilter" value="apply filter">\s\n<input type=button class="btn3" onclick="onClickExportButton(this)"\s\n id="exportStart" value="export tiddlers">\s\n<input type=button class="btn3" onclick="onClickExportButton(this)"\s\n id="exportClose" value="close">\s\n</div><!--center-->\s\n';\n//}}}\n// //===\n\n// // +++[initialize interface]>\n// // +++[exportShowPanel(which)]\n//{{{\nfunction exportShowPanel(which) {\n var index=0; var panel='exportLocalPanel';\n switch (which) {\n case 'file:':\n case undefined:\n index=0; panel='exportLocalPanel'; break;\n case 'http:':\n index=1; panel='exportHTTPPanel'; break;\n case 'https:':\n index=2; panel='exportHTTPPanel'; break;\n case 'ftp:':\n index=3; panel='exportFTPPanel'; break;\n default:\n alert("Sorry, export to "+which+" is not yet available");\n break;\n }\n exportInitPanel(which);\n document.getElementById('exportTo').selectedIndex=index;\n document.getElementById('exportLocalPanel').style.display='none';\n document.getElementById('exportHTTPPanel').style.display='none';\n document.getElementById('exportFTPPanel').style.display='none';\n document.getElementById(panel).style.display='block';\n}\n//}}}\n// //===\n\n// // +++[exportInitPanel(which)]\n//{{{\nfunction exportInitPanel(which) {\n switch (which) {\n case "file:": // LOCAL EXPORT PANEL: file/path:\n // ** no init - security issues in IE **\n break;\n case "http:": // WEB EXPORT PANEL\n case "https:": // SECURE WEB EXPORT PANEL\n // url\n if (store.tiddlerExists("unawiki_download")) {\n var theURL=store.getTiddlerText("unawiki_download");\n theURL=theURL.replace(/\s[\s[download\s|/,'').replace(/\s]\s]/,'');\n var title=(store.tiddlerExists("unawiki_host"))?"unawiki_host":"SiteHost";\n var theHost=store.getTiddlerText(title);\n if (!theHost || !theHost.length) theHost=document.location.host;\n if (!theHost || !theHost.length) theHost=title;\n }\n // server script/params\n var title=(store.tiddlerExists("unawiki_host"))?"unawiki_host":"SiteHost";\n var theHost=store.getTiddlerText(title);\n if (!theHost || !theHost.length) theHost=document.location.host;\n if (!theHost || !theHost.length) theHost=title;\n // get POST\n var title=(store.tiddlerExists("unawiki_post"))?"unawiki_post":"SitePost";\n var thePost=store.getTiddlerText(title);\n if (!thePost || !thePost.length) thePost="/"+title;\n // get PARAMS\n var title=(store.tiddlerExists("unawiki_params"))?"unawiki_params":"SiteParams";\n var theParams=store.getTiddlerText(title);\n if (!theParams|| !theParams.length) theParams=title;\n var serverURL = which+"//"+theHost+thePost+"?"+theParams;\n document.getElementById("exportHTTPServerURL").value=serverURL;\n // get NOTIFY\n var theAddresses=store.getTiddlerText("SiteNotify");\n if (!theAddresses|| !theAddresses.length) theAddresses="SiteNotify";\n document.getElementById("exportNotifyTo").value=theAddresses;\n break;\n case "ftp:": // FTP EXPORT PANEL\n // host\n var siteHost=store.getTiddlerText("SiteHost");\n if (!siteHost || !siteHost.length) siteHost=document.location.host;\n if (!siteHost || !siteHost.length) siteHost="SiteHost";\n document.getElementById("exportFTPHost").value=siteHost;\n // username\n var siteID=store.getTiddlerText("SiteID");\n if (!siteID || !siteID.length) siteID=config.options.txtUserName;\n document.getElementById("exportFTPID").value=siteID;\n // password\n document.getElementById("exportFTPPW").value="";\n // file/path\n document.getElementById("exportFTPFilename").value="";\n break;\n }\n}\n//}}}\n// //===\n\n// // +++[exportInitFilter()]\n//{{{\nfunction exportInitFilter() {\n // start date\n document.getElementById("exportFilterStart").checked=false;\n document.getElementById("exportStartDate").value="";\n // end date\n document.getElementById("exportFilterEnd").checked=false;\n document.getElementById("exportEndDate").value="";\n // tags\n document.getElementById("exportFilterTags").checked=false;\n document.getElementById("exportTags").value="";\n // text\n document.getElementById("exportFilterText").checked=false;\n document.getElementById("exportText").value="";\n // show/hide filter input fields\n exportShowFilterFields();\n}\n//}}}\n// //===\n\n// // +++[exportShowFilterFields(which)]\n//{{{\nfunction exportShowFilterFields(which) {\n var show;\n\n show=document.getElementById('exportFilterStart').checked;\n document.getElementById('exportFilterStartBy').style.display=show?"block":"none";\n document.getElementById('exportStartDate').style.display=show?"block":"none";\n var val=document.getElementById('exportFilterStartBy').value;\n document.getElementById('exportStartDate').value\n =getFilterDate(val,'exportStartDate').formatString(config.macros.exportTiddlers.datetimefmt);\n if (which && (which.id=='exportFilterStartBy') && (val=='other'))\n document.getElementById('exportStartDate').focus();\n\n show=document.getElementById('exportFilterEnd').checked;\n document.getElementById('exportFilterEndBy').style.display=show?"block":"none";\n document.getElementById('exportEndDate').style.display=show?"block":"none";\n var val=document.getElementById('exportFilterEndBy').value;\n document.getElementById('exportEndDate').value\n =getFilterDate(val,'exportEndDate').formatString(config.macros.exportTiddlers.datetimefmt);\n if (which && (which.id=='exportFilterEndBy') && (val=='other'))\n document.getElementById('exportEndDate').focus();\n\n show=document.getElementById('exportFilterTags').checked;\n document.getElementById('exportTags').style.display=show?"block":"none";\n\n show=document.getElementById('exportFilterText').checked;\n document.getElementById('exportText').style.display=show?"block":"none";\n}\n//}}}\n// //===\n// //===\n\n// // +++[onClickExportButton(which): control interactions]\n//{{{\nfunction onClickExportButton(which)\n{\n // DEBUG alert(which.id);\n var theList=document.getElementById('exportList'); if (!theList) return;\n var count = 0;\n var total = store.getTiddlers('title').length;\n switch (which.id)\n {\n case 'exportFilter':\n count=filterExportList();\n var panel=document.getElementById('exportFilterPanel');\n if (count==-1) { panel.style.display='block'; break; }\n document.getElementById("exportStart").disabled=(count==0);\n clearMessage(); displayMessage("filtered "+formatExportMessage(count,total));\n if (count==0) { alert("No tiddlers were selected"); panel.style.display='block'; }\n break;\n case 'exportStart':\n exportTiddlers();\n break;\n case 'exportHideFilter':\n case 'exportToggleFilter':\n var panel=document.getElementById('exportFilterPanel')\n panel.style.display=(panel.style.display=='block')?'none':'block';\n break;\n case 'exportSelectChanges':\n var lastmod=new Date(document.lastModified);\n for (var t = 0; t < theList.options.length; t++) {\n if (theList.options[t].value=="") continue;\n var tiddler=store.getTiddler(theList.options[t].value); if (!tiddler) continue;\n theList.options[t].selected=(tiddler.modified>lastmod);\n count += (tiddler.modified>lastmod)?1:0;\n }\n document.getElementById("exportStart").disabled=(count==0);\n clearMessage(); displayMessage(formatExportMessage(count,total));\n if (count==0) alert("There are no unsaved changes");\n break;\n case 'exportSelectAll':\n for (var t = 0; t < theList.options.length; t++) {\n if (theList.options[t].value=="") continue;\n theList.options[t].selected=true;\n count += 1;\n }\n document.getElementById("exportStart").disabled=(count==0);\n clearMessage(); displayMessage(formatExportMessage(count,count));\n break;\n case 'exportSelectOpened':\n for (var t = 0; t < theList.options.length; t++) theList.options[t].selected=false;\n var tiddlerDisplay = document.getElementById("tiddlerDisplay");\n for (var t=0;t<tiddlerDisplay.childNodes.length;t++) {\n var tiddler=tiddlerDisplay.childNodes[t].id.substr(7);\n for (var i = 0; i < theList.options.length; i++) {\n if (theList.options[i].value!=tiddler) continue;\n theList.options[i].selected=true; count++; break;\n }\n }\n document.getElementById("exportStart").disabled=(count==0);\n clearMessage(); displayMessage(formatExportMessage(count,total));\n if (count==0) alert("There are no tiddlers currently opened");\n break;\n case 'exportListSmaller': // decrease current listbox size\n var min=5;\n theList.size-=(theList.size>min)?1:0;\n break;\n case 'exportListLarger': // increase current listbox size\n var max=(theList.options.length>25)?theList.options.length:25;\n theList.size+=(theList.size<max)?1:0;\n break;\n case 'exportClose':\n document.getElementById('exportPanel').style.display='none';\n break;\n }\n}\n//}}}\n// //===\n\n// // +++[list display]\n//{{{\nfunction formatExportMessage(count,total)\n{\n var txt=total+' tiddler'+((total!=1)?'s':'')+" - ";\n txt += (count==0)?"none":(count==total)?"all":count;\n txt += " selected for export";\n return txt;\n}\n\nfunction refreshExportList(selectedIndex)\n{\n var theList = document.getElementById("exportList");\n var sort;\n if (!theList) return;\n // get the sort order\n if (!selectedIndex) selectedIndex=0;\n if (selectedIndex==0) sort='modified';\n if (selectedIndex==1) sort='title';\n if (selectedIndex==2) sort='modified';\n if (selectedIndex==3) sort='modifier';\n\n // get the alphasorted list of tiddlers\n var tiddlers = store.getTiddlers('title');\n // unselect headings and count number of tiddlers actually selected\n var count=0;\n for (var i=0; i<theList.options.length; i++) {\n if (theList.options[i].value=="") theList.options[i].selected=false;\n count+=theList.options[i].selected?1:0;\n }\n // disable "export" button if no tiddlers selected\n document.getElementById("exportStart").disabled=(count==0);\n // update listbox heading to show selection count\n if (theList.options.length) { clearMessage(); displayMessage(formatExportMessage(count,tiddlers.length)); }\n\n // if a [command] item, reload list... otherwise, no further refresh needed\n if (selectedIndex>3) return;\n\n // clear current list contents\n while (theList.length > 0) { theList.options[0] = null; }\n // add heading and control items to list\n var i=0;\n var indent=String.fromCharCode(160)+String.fromCharCode(160);\n theList.options[i++]=\n new Option(tiddlers.length+" tiddlers in document", "",false,false);\n theList.options[i++]=\n new Option(((sort=="title" )?">":indent)+' [by title]', "",false,false);\n theList.options[i++]=\n new Option(((sort=="modified")?">":indent)+' [by date]', "",false,false);\n theList.options[i++]=\n new Option(((sort=="modifier")?">":indent)+' [by author]', "",false,false);\n // output the tiddler list\n switch(sort)\n {\n case "title":\n for(var t = 0; t < tiddlers.length; t++)\n theList.options[i++] = new Option(tiddlers[t].title,tiddlers[t].title,false,false);\n break;\n case "modifier":\n case "modified":\n var tiddlers = store.getTiddlers(sort);\n // sort descending for newest date first\n tiddlers.sort(function (a,b) {if(a[sort] == b[sort]) return(0); else return (a[sort] > b[sort]) ? -1 : +1; });\n var lastSection = "";\n for(var t = 0; t < tiddlers.length; t++)\n {\n var tiddler = tiddlers[t];\n var theSection = "";\n if (sort=="modified") theSection=tiddler.modified.toLocaleDateString();\n if (sort=="modifier") theSection=tiddler.modifier;\n if (theSection != lastSection)\n {\n theList.options[i++] = new Option(theSection,"",false,false);\n lastSection = theSection;\n }\n theList.options[i++] = new Option(indent+indent+tiddler.title,tiddler.title,false,false);\n }\n break;\n }\n theList.selectedIndex=selectedIndex; // select current control item\n}\n//}}}\n// //===\n\n// // +++[list filtering]\n//{{{\nfunction getFilterDate(val,id)\n{\n var result=0;\n switch (val) {\n case 'site':\n var timestamp=store.getTiddlerText("SiteDate");\n if (!timestamp) timestamp=document.lastModified;\n result=new Date(timestamp);\n break;\n case 'file':\n result=new Date(document.lastModified);\n break;\n case 'other':\n result=new Date(document.getElementById(id).value);\n break;\n default: // today=0, yesterday=1, one week=7, two weeks=14, a month=31\n var now=new Date(); var tz=now.getTimezoneOffset()*60000; now-=tz;\n var oneday=86400000;\n if (id=='exportStartDate')\n result=new Date((Math.floor(now/oneday)-val)*oneday+tz);\n else\n result=new Date((Math.floor(now/oneday)-val+1)*oneday+tz-1);\n break;\n }\n // DEBUG alert('getFilterDate('+val+','+id+')=='+result+"\snnow="+now);\n return result;\n}\n\nfunction filterExportList()\n{\n var theList = document.getElementById("exportList"); if (!theList) return -1;\n\n var filterStart=document.getElementById("exportFilterStart").checked;\n var val=document.getElementById("exportFilterStartBy").value;\n var startDate=getFilterDate(val,'exportStartDate');\n\n var filterEnd=document.getElementById("exportFilterEnd").checked;\n var val=document.getElementById("exportFilterEndBy").value;\n var endDate=getFilterDate(val,'exportEndDate');\n\n var filterTags=document.getElementById("exportFilterTags").checked;\n var tags=document.getElementById("exportTags").value;\n\n var filterText=document.getElementById("exportFilterText").checked;\n var text=document.getElementById("exportText").value;\n\n if (!(filterStart||filterEnd||filterTags||filterText)) {\n alert("Please set the selection filter");\n document.getElementById('exportFilterPanel').style.display="block";\n return -1;\n }\n if (filterStart&&filterEnd&&(startDate>endDate)) {\n var msg="starting date/time:\sn"\n msg+=startDate.toLocaleString()+"\sn";\n msg+="is later than ending date/time:\sn"\n msg+=endDate.toLocaleString()\n alert(msg);\n return -1;\n }\n\n // scan list and select tiddlers that match all applicable criteria\n var total=0;\n var count=0;\n for (var i=0; i<theList.options.length; i++) {\n // get item, skip non-tiddler list items (section headings)\n var opt=theList.options[i]; if (opt.value=="") continue;\n // get tiddler, skip missing tiddlers (this should NOT happen)\n var tiddler=store.getTiddler(opt.value); if (!tiddler) continue; \n var sel=true;\n if ( (filterStart && tiddler.modified<startDate)\n || (filterEnd && tiddler.modified>endDate)\n || (filterTags && !matchTags(tiddler,tags))\n || (filterText && (tiddler.text.indexOf(text)==-1) && (tiddler.title.indexOf(text)==-1)))\n sel=false;\n opt.selected=sel;\n count+=sel?1:0;\n total++;\n }\n return count;\n}\n//}}}\n\n//{{{\nfunction matchTags(tiddler,cond)\n{\n if (!cond||!cond.trim().length) return false;\n\n // build a regex of all tags as a big-old regex that \n // OR's the tags together (tag1|tag2|tag3...) in length order\n var tgs = store.getTags();\n if ( tgs.length == 0 ) return results ;\n var tags = tgs.sort( function(a,b){return (a[0].length<b[0].length)-(a[0].length>b[0].length);});\n var exp = "(" + tags.join("|") + ")" ;\n exp = exp.replace( /(,[\sd]+)/g, "" ) ;\n var regex = new RegExp( exp, "ig" );\n\n // build a string such that an expression that looks like this: tag1 AND tag2 OR NOT tag3\n // turns into : /tag1/.test(...) && /tag2/.test(...) || ! /tag2/.test(...)\n cond = cond.replace( regex, "/$1\s\s|/.test(tiddlerTags)" );\n cond = cond.replace( /\ssand\ss/ig, " && " ) ;\n cond = cond.replace( /\ssor\ss/ig, " || " ) ;\n cond = cond.replace( /\ss?not\ss/ig, " ! " ) ;\n\n // if a boolean uses a tag that doesn't exist - it will get left alone \n // (we only turn existing tags into actual tests).\n // replace anything that wasn't found as a tag, AND, OR, or NOT with the string "false"\n // if the tag doesn't exist then /tag/.test(...) will always return false.\n cond = cond.replace( /(\ss|^)+[^\s/\s|&!][^\ss]*/g, "false" ) ;\n\n // make a string of the tags in the tiddler and eval the 'cond' string against that string \n // if it's TRUE then the tiddler qualifies!\n var tiddlerTags = (tiddler.tags?tiddler.tags.join("|"):"")+"|" ;\n try { if ( eval( cond ) ) return true; }\n catch( e ) { displayMessage("Error in tag filter '" + e + "'" ); }\n return false;\n}\n//}}}\n// //===\n\n// // +++[output data formatting]>\n// // +++[exportHeader(format)]\n//{{{\nfunction exportHeader(format)\n{\n switch (format) {\n case "TW": return exportTWHeader();\n case "DIV": return exportDIVHeader();\n case "XML": return exportXMLHeader();\n }\n}\n//}}}\n// //===\n\n// // +++[exportFooter(format)]\n//{{{\nfunction exportFooter(format)\n{\n switch (format) {\n case "TW": return exportDIVFooter();\n case "DIV": return exportDIVFooter();\n case "XML": return exportXMLFooter();\n }\n}\n//}}}\n// //===\n\n// // +++[exportTWHeader()]\n//{{{\nfunction exportTWHeader()\n{\n // Get the URL of the document\n var originalPath = document.location.href;\n // Check we were loaded from a file URL\n if(originalPath.substr(0,5) != "file:")\n { alert(config.messages.notFileUrlError); return; }\n // Remove any location part of the URL\n var hashPos = originalPath.indexOf("#"); if(hashPos != -1) originalPath = originalPath.substr(0,hashPos);\n // Convert to a native file format assuming\n // "file:///x:/path/path/path..." - pc local file --> "x:\spath\spath\spath..."\n // "file://///server/share/path/path/path..." - FireFox pc network file --> "\s\sserver\sshare\spath\spath\spath..."\n // "file:///path/path/path..." - mac/unix local file --> "/path/path/path..."\n // "file://server/share/path/path/path..." - pc network file --> "\s\sserver\sshare\spath\spath\spath..."\n var localPath;\n if(originalPath.charAt(9) == ":") // pc local file\n localPath = unescape(originalPath.substr(8)).replace(new RegExp("/","g"),"\s\s");\n else if(originalPath.indexOf("file://///") == 0) // FireFox pc network file\n localPath = "\s\s\s\s" + unescape(originalPath.substr(10)).replace(new RegExp("/","g"),"\s\s");\n else if(originalPath.indexOf("file:///") == 0) // mac/unix local file\n localPath = unescape(originalPath.substr(7));\n else if(originalPath.indexOf("file:/") == 0) // mac/unix local file\n localPath = unescape(originalPath.substr(5));\n else // pc network file\n localPath = "\s\s\s\s" + unescape(originalPath.substr(7)).replace(new RegExp("/","g"),"\s\s");\n // Load the original file\n var original = loadFile(localPath);\n if(original == null)\n { alert(config.messages.cantSaveError); return; }\n // Locate the storeArea div's\n var posOpeningDiv = original.indexOf(startSaveArea);\n var posClosingDiv = original.lastIndexOf(endSaveArea);\n if((posOpeningDiv == -1) || (posClosingDiv == -1))\n { alert(config.messages.invalidFileError.format([localPath])); return; }\n return original.substr(0,posOpeningDiv+startSaveArea.length)\n}\n//}}}\n// //===\n\n// // +++[exportDIVHeader()]\n//{{{\nfunction exportDIVHeader()\n{\n var out=[];\n var now = new Date();\n var title = convertUnicodeToUTF8(wikifyPlain("SiteTitle").htmlEncode());\n var subtitle = convertUnicodeToUTF8(wikifyPlain("SiteSubtitle").htmlEncode());\n var user = convertUnicodeToUTF8(config.options.txtUserName.htmlEncode());\n var twver = version.major+"."+version.minor+"."+version.revision;\n var pver = version.extensions.exportTiddlers.major+"."\n +version.extensions.exportTiddlers.minor+"."+version.extensions.exportTiddlers.revision;\n out.push("<html><body>");\n out.push("<style type=\s"text/css\s">");\n out.push("#storeArea {display:block;margin:1em;}");\n out.push("#storeArea div");\n out.push("{padding:0.5em;margin:1em;border:2px solid black;height:10em;overflow:auto;}");\n out.push("#javascriptWarning");\n out.push("{width:100%;text-align:left;background-color:#eeeeee;padding:1em;}");\n out.push("</style>");\n out.push("<div id=\s"javascriptWarning\s">");\n out.push("TiddlyWiki export file<br>");\n out.push("Source: <b>"+convertUnicodeToUTF8(document.location.href)+"</b><br>");\n out.push("Title: <b>"+title+"</b><br>");\n out.push("Subtitle: <b>"+subtitle+"</b><br>");\n out.push("Created: <b>"+now.toLocaleString()+"</b> by <b>"+user+"</b><br>");\n out.push("TiddlyWiki "+twver+" / "+"ExportTiddlersPlugin "+pver+"<br>");\n out.push("Notes:<hr><pre>"+document.getElementById("exportNotes").value.replace(regexpNewLine,"<br>")+"</pre>");\n out.push("</div>");\n out.push("<div id=\s"storeArea\s">");\n return out;\n}\n//}}}\n// //===\n\n// // +++[exportDIVFooter()]\n//{{{\nfunction exportDIVFooter()\n{\n var out=[];\n out.push("</div><!--POST-BODY-START-->\sn<!--POST-BODY-END--></body></html>");\n return out;\n}\n//}}}\n// //===\n\n// // +++[exportXMLHeader()]\n//{{{\nfunction exportXMLHeader()\n{\n var out=[];\n var now = new Date();\n var u = store.getTiddlerText("SiteUrl",null);\n var title = convertUnicodeToUTF8(wikifyPlain("SiteTitle").htmlEncode());\n var subtitle = convertUnicodeToUTF8(wikifyPlain("SiteSubtitle").htmlEncode());\n var user = convertUnicodeToUTF8(config.options.txtUserName.htmlEncode());\n var twver = version.major+"."+version.minor+"."+version.revision;\n var pver = version.extensions.exportTiddlers.major+"."\n +version.extensions.exportTiddlers.minor+"."+version.extensions.exportTiddlers.revision;\n out.push("<" + "?xml version=\s"1.0\s"?" + ">");\n out.push("<rss version=\s"2.0\s">");\n out.push("<channel>");\n out.push("<title>" + title + "</title>");\n if(u) out.push("<link>" + convertUnicodeToUTF8(u.htmlEncode()) + "</link>");\n out.push("<description>" + subtitle + "</description>");\n out.push("<language>en-us</language>");\n out.push("<copyright>Copyright " + now.getFullYear() + " " + user + "</copyright>");\n out.push("<pubDate>" + now.toGMTString() + "</pubDate>");\n out.push("<lastBuildDate>" + now.toGMTString() + "</lastBuildDate>");\n out.push("<docs>http://blogs.law.harvard.edu/tech/rss</docs>");\n out.push("<generator>TiddlyWiki "+twver+" plus ExportTiddlersPlugin "+pver+"</generator>");\n return out;\n}\n//}}}\n// //===\n\n// // +++[exportXMLFooter()]\n//{{{\nfunction exportXMLFooter()\n{\n var out=[];\n out.push("</channel></rss>");\n return out;\n}\n//}}}\n// //===\n\n// // +++[exportData()]\n//{{{\nfunction exportData(theList,theFormat)\n{\n // scan export listbox and collect DIVs or XML for selected tiddler content\n var out=[];\n for (var i=0; i<theList.options.length; i++) {\n // get item, skip non-selected items and section headings\n var opt=theList.options[i]; if (!opt.selected||(opt.value=="")) continue;\n // get tiddler, skip missing tiddlers (this should NOT happen)\n var thisTiddler=store.getTiddler(opt.value); if (!thisTiddler) continue; \n if (theFormat=="TW") out.push(convertUnicodeToUTF8(thisTiddler.saveToDiv()));\n if (theFormat=="DIV") out.push(convertUnicodeToUTF8(thisTiddler.title+"\sn"+thisTiddler.saveToDiv()));\n if (theFormat=="XML") out.push(convertUnicodeToUTF8(thisTiddler.saveToRss()));\n }\n return out;\n}\n//}}}\n// //===\n// //===\n\n// // +++[exportTiddlers(): output selected data to local or server]\n//{{{\nfunction exportTiddlers()\n{\n var theList = document.getElementById("exportList"); if (!theList) return;\n\n // get the export settings\n var theProtocol = document.getElementById("exportTo").value;\n var theFormat = document.getElementById("exportFormat").value;\n\n // assemble output: header + tiddlers + footer\n var theData=exportData(theList,theFormat);\n var count=theData.length;\n var out=[]; var txt=out.concat(exportHeader(theFormat),theData,exportFooter(theFormat)).join("\sn");\n var msg="";\n switch (theProtocol) {\n case "file:":\n var theTarget = document.getElementById("exportFilename").value.trim();\n if (!theTarget.length) msg = "A local path/filename is required\sn";\n if (!msg && saveFile(theTarget,txt))\n msg=count+" tiddler"+((count!=1)?"s":"")+" exported to local file";\n else if (!msg)\n msg+="An error occurred while saving to "+theTarget;\n break;\n case "http:":\n case "https:":\n var theTarget = document.getElementById("exportHTTPServerURL").value.trim();\n if (!theTarget.length) msg = "A server URL is required\sn";\n if (document.getElementById('exportNotify').checked)\n theTarget+="&notify="+encodeURIComponent(document.getElementById('exportNotifyTo').value);\n if (document.getElementById('exportNotes').value.trim().length)\n theTarget+="&notes="+encodeURIComponent(document.getElementById('exportNotes').value);\n if (!msg && exportPost(theTarget+encodeURIComponent(txt)))\n msg=count+" tiddler"+((count!=1)?"s":"")+" exported to "+theProtocol+" server";\n else if (!msg)\n msg+="An error occurred while saving to "+theTarget;\n break;\n case "ftp:":\n default:\n msg="Sorry, export to "+theLocation+" is not yet available";\n break;\n }\n clearMessage(); displayMessage(msg,theTarget);\n}\n//}}}\n// //===\n\n// // +++[exportPost(url): cross-domain post] uses hidden iframe to submit url and capture responses\n//{{{\nfunction exportPost(url)\n{\n var f=document.getElementById("exportFrame"); if (f) document.body.removeChild(f);\n f=document.createElement("iframe"); f.id="exportFrame";\n f.style.width="0px"; f.style.height="0px"; f.style.border="0px";\n document.body.appendChild(f);\n var d=f.document;\n if (f.contentDocument) d=f.contentDocument; // For NS6\n else if (f.contentWindow) d=f.contentWindow.document; // For IE5.5 and IE6\n d.location.replace(url);\n return true;\n}\n//}}}\n// //===\n
\n<<formTiddler fichaPlantilla>>\n<data>{"tecnico":"José Luis González Castro","mes":"Mayo","año":"2007","lugar":"aula","notes":"Tascam HD-P2\snMicrófono Rode NT5\sn\snMucho ruido de fondo.","interprete":"Óscar Araújo"}</data>\n
\n|[img[fagot|materiales/fotografías/fagot.jpg]]|\n\n!Guía\n\n1.Notas preliminares:\n\nEl fagot es un instrumento de registro tenor con muchas posibilidades en el agudo; es muy adecuado para duetos (flauta, oboe) por su capacidad de empaste, reforzando el timbre y armónicos del otro instrumento.\n\nLa escritura de fagot alterna entre las claves de fa y do; no es conveniente escribir cambios bruscos de clave ni emplearlas fuera de su ámbito lógico (por ejemplo, no es conveniente emplear do por debajo de la segunda línea). \n\nAunque el fagot es un instrumento temperado, los fagotistas suelen preferir las tonalidades con bemoles (las obras de los primeros cursos suelen estar escritas en faM y sibM).\n\nLa homofonía con dos fagots no ofrece problemas particulares a los intérpretes.\n\n2.Tesitura:\n\nLa nota más grave es el sib (clave de fa, 2 líneas adicionales y un espacio); la nota más aguda está en torno a un re#- mi (clave de sol, cuarto espacio). Estas dos últimas notas no son tan seguras como el do (el do de la Consagración, en todo caso escrito pensando en un fagot francés, que normalmente tiene mayor facilidad en el registro agudo que el alemán, hoy día más extendido.\n\nNota sib, re#- mi, do\n+++[Ejemplo 1]...\n<<player id=1 quicktime materiales/grabaciones/fagot/fagot_1.wav 400 15>>\n===\n\n\nEl instrumento es en general bastante uniforme; en el registro grave es un poco más pesado y tosco, en particular entre el sib y do#, donde el mecanismo es bastante largo y pesado, lo que dificulta tocar pasajes muy ágiles. En este registro también es difícil tocar p; está todo el tubo cerrado y el ataque es duro.\n\nÁrea sib- do#; Ataque "normal"; ataque más suave posible. \n+++[Ejemplo 2]...\n<<player id=2 quicktime materiales/grabaciones/fagot/fagot_2.wav 400 15>>\n===\n\n\nHay algunas notas relativamente complicadas de afinar, como el fa#, que suena con un timbre más nasal, lo que hace que parezca que está alto. \n+++[Ejemplo 3]...\n<<player id=3 quicktime materiales/grabaciones/fagot/fagot_3.wav 400 15>>\n===\n\n\nEn el registro agudo es difícil atacar en piano; los pasajes en p y picado son muy difíciles.\n\nMotivo en p, legato y picado.\n+++[Ejemplo 4]...\n<<player id=4 quicktime materiales/grabaciones/fagot/fagot_4.wav 400 15>>\n===\n\n\n2.Dinámicas:\n\np<ff>p, dos ejemplos.\n+++[Ejemplo 5]...\n<<player id=5 quicktime materiales/grabaciones/fagot/fagot_5.wav 400 15>>\n===\n\n\nLa caña influye mucho en el instrumento; algunas cañas facilitan tocar f, mientras que otras facilitan el empaste y flexibilidad.\n\nTocar f no representa un problema e incluso es agradecido en el registro agudo, a excepción de las notas extremas, a partir del do (como en el Bolero, donde se ataca varias veces el reb).\n\nReb.\n+++[Ejemplo 6]...\n<<player id=6 quicktime materiales/grabaciones/fagot/fagot_6.wav 400 15>>\n===\n\n\n3.Velocidad:\n\nPrueba de velocidad en una escala y un arpegio.\n+++[Ejemplo 7]...\n<<player id= quicktime materiales/grabaciones/fagot/fagot_.wav 400 15>>\n===\n\n\n4.Resistencia:\n\nLa respiración circular puede hacerse, pero no es habitual. Al realizar la inspiración hay un cambio de presión que puede afectar al color y la altura de sonido, problema agravado por el gran caudal de aire que necesita el instrumento.\n\nPrueba de resistencia "natural" en registro medio, mp.\n+++[Ejemplo 8]...\n<<player id=8 quicktime materiales/grabaciones/fagot/fagot_8.wav 400 15>>\n===\n\n\nEl registro grave necesita mucho aire; en notas agudas basta con un hilo de aire para mantener la nota siempre y cuando se mantenga una presión constante.\n\nEn general es conveniente dar momentos de reposo al intérprete, aunque no es una cuestión crucial.\n\n5.Vibrato:\n\nEl empleo del vibrato queda a discreción del intérprete.\n\nNota sin vibrato; nota con vibrato; nota mixta, sin y con vibrato.\n+++[Ejemplo 9]...\n<<player id=9 quicktime materiales/grabaciones/fagot/fagot_9.wav 400 15>>\n===\n\n\n6.Trinos:\n\nEn el registro medio, los trinos entre fa y do so sencillos.\n+++[Ejemplo 10]...\n<<player id=10 quicktime materiales/grabaciones/fagot/fagot_10.wav 400 15>>\n===\n\n\nEn el registro agudo hay que recurrir en ocasiones a "notas falsas" (digitaciones alternativas que individualmente no producen notas tan buenas como las digitaciones "reales", pero que facilitan los trinos), lo que dificulta su ejecución. El mismo principio de las "posiciones falsas" se aplica a trémolos complicados.\n\nDos trémolos sencillos; un trémolo complicado.\n+++[Ejemplo 11]...\n<<player id=11 quicktime materiales/grabaciones/fagot/fagot_11.wav 400 15>>\n===\n\n\nTrino de color (efecto de embocadura).\n+++[Ejemplo 12]...\n<<player id=12 quicktime materiales/grabaciones/fagot/fagot_12.wav 400 15>>\n===\n\n\n7.Glissandos:\n\nTodo el registro medio y agudo del fagot se consigue con armónicos de las fundamentales del instrumento (a partir del fa); si se oscila mucho la presión de un armónico, se "cae" a otro. Por este motivo, el fagot permite hacer glissandos "deslizados" a corta distancia -mayor en el agudo que en el grave-. Los glissandos se hacen principalmente con la embocadura; en el clarinete, por ejemplo, se puede jugar con la apertura modificando la posición de los dedos, pero el fagot usa platos cerrados. En distancias largas se recurre a los glissandos cromáticos.\n\nFa; sol; fundamental del sol anterior; dos glissandos en el grave; glissando "roto".\n+++[Ejemplo 13]...\n<<player id=13 quicktime materiales/grabaciones/fagot/fagot_13.wav 400 15>>\n===\n\n\n8.Articulaciones:\n\nLegato; picado (staccato) corto, staccato largo; acentuado.\n+++[Ejemplo 14]...\n<<player id=14 quicktime materiales/grabaciones/fagot/fagot_14.wav 400 15>>\n===\n\n\nDoble picado, muy empleado en pasajes con notas repetidas (el triple picado no se emplea).\n+++[Ejemplo 15]...\n<<player id=15 quicktime materiales/grabaciones/fagot/fagot_15.wav 400 15>>\n===\n\n\nEl doble picado funciona bien en el registro medio; en el grave no se puede aplicar porque el instrumento ofrece demasiada resistencia (hay mucha cantidad de aire), y en el registro agudo tampoco: la emisión es mucho más precisa y, al hacerse un cambio de lengua y garganta para el doble picado, es muy probable que falle en el momento de articular de garganta. \n\n9.Frulato:\n\nSe puede hacer de lengua o de garganta. El de lengua funciona mejor; el de garganta suena más "cantado".\n\nFrulato de lengua y garganta.\n+++[Ejemplo 16]...\n<<player id=16 quicktime materiales/grabaciones/fagot/fagot_16.wav 400 15>>\n===\n\n\n10.Cantar y tocar a la vez:\n+++[Ejemplo 17]...\n<<player id=17 quicktime materiales/grabaciones/fagot/fagot_17.wav 400 15>>\n===\n\n\n11.Cuartos de tono:\n\nLos cuartos de tono se trabajan añadiendo llaves a una nota de partida. Suele haber varias posiciones para un mismo cuarto de tono. Son difíciles de conseguir con precisión.\n\nCuartos de tono en torno a sol.\n+++[Ejemplo 18]...\n<<player id=18 quicktime materiales/grabaciones/fagot/fagot_18.wav 400 15>>\n===\n\n\n12.Ruidos de llaves:\n+++[Ejemplo 19]...\n<<player id=19 quicktime materiales/grabaciones/fagot/fagot_19.wav 400 15>>\n===\n\n\n13.Efectos percusivos con la lengua (sólo funcionan en el registro grave; se hacen sin lengüeta).\n+++[Ejemplo 20]...\n<<player id=20 quicktime materiales/grabaciones/fagot/fagot_20.wav 400 15>>\n===\n\n\n14.Efectos con la caña:\n+++[Ejemplo 21]...\n<<player id=21 quicktime materiales/grabaciones/fagot/fagot_21.wav 400 15>>\n===\n\n\n15.Curioso efecto de armónicos:\n+++[Ejemplo 22]...\n<<player id=22 quicktime materiales/grabaciones/fagot/fagot_22.wav 400 15>>\n===\n\n\n\n\n\n\n\n
\n<<formTiddler fichaPlantilla>>\n<data>{"tecnico":"José Luis González Castro","mes":"Abril","año":"2007","lugar":"aula","notes":"Tascam HD-P2\snMicrófono AKG C414 B\sn\snAula 23, muy reverberante- Algunos finales cortados y fundidos para eliminar el solapamiento con la voz.","interprete":"Mateo Mena"}</data>\n
\n|[img[flauta travesera|materiales/fotografías/flauta.jpg]]|\n\n!Guía\n\n1.Notas preliminares:\n\nEl sonido se genera al soplar en la embocadura; en la flauta de pico el sonido pasa directamente de la boca al instrumento, mientras que en la flauta travesera el sonido tiene que "romper" en el bisel de la embocadura; no todo el aire que el intérprete emite se transforma en sonido, lo cual depende de la posición en la que toque.\n\nEjemplo con dos intensidades diferentes; en el segundo caso el intérprete mueve la flauta arriba y abajo con respecto a la posición de los labios.\n+++[Ejemplo 1]...\n<<player id=1 quicktime materiales/grabaciones/flauta/flauta_1.wav 400 15>>\n===\n\n\nLa flauta consta de tres partes: cabeza, cuerpo y la "pata de do". El sistema de llaves funciona aproximadamente como el de una flauta en re, y funcionando sin el último cuerpo es una flauta en re; el último cuerpo se añadió para conseguir la nota do. En 1836 Teobald Boehm modernizó la flauta barroca (traverso), construyéndola en metal (aleación), en vez de madera y añadiendo las llaves de trinos:\n\nLlaves de trinos: do- re; sol#- lab. \n+++[Ejemplo 2]...\n<<player id=2 quicktime materiales/grabaciones/flauta/flauta_2.wav 400 15>>\n===\n\n\nDe no disponer de dichas llaves, los trinos serían muy difíciles por la dificultad de las posiciones. Dado el sistema de llaves de la flauta, para tocar una nota superior (semitono a semitono), sólo es necesario mover un dedo; sin embargo, como el sistema está en re, al llegar a do hay que poner de nuevo todas las notas.\n\nTrino do- re ejecutado sin utilizar la llave de trino \n+++[Ejemplo 3]...\n<<player id=3 quicktime materiales/grabaciones/flauta/flauta_3.wav 400 15>>\n===\n\n\nLa llave do -re se utiliza también en la octava aguda.\n+++[Ejemplo 4]...\n<<player id=4 quicktime materiales/grabaciones/flauta/flauta_4.wav 400 15>>\n===\n\n\nLas dos llaves de trino se tilizan, pues, para facilitar posturas difíciles. Otras llaves apenas se utilizan, o se utilizan en posturas "extraordinarias", por ejemplo en el registro agudo.\n\nEn general todos los trinos son posibles en la flauta, sean de tono, de semitono o trémolos (No hay llaves para trémolos).\n\nTrinos: re- mib, re- mi, mib- mi, mi- fa, etc\n+++[Ejemplo 5]...\n<<player id=5 quicktime materiales/grabaciones/flauta/flauta_5.wav 400 15>>\n===\n \n\nTrémolos: mi- sol en la octava grave, en dos intensidades; fa#- la en el registro medio; do- mib en el registro sobreagudo.\n+++[Ejemplo 6]...\n<<player id=6 quicktime materiales/grabaciones/flauta/flauta_6.wav 400 15>>\n===\n\n\nTrinos no imposibles pero impracticables son los de do- do# y do#- re# \n+++[Ejemplo 7]...\n<<player id=7 quicktime materiales/grabaciones/flauta/flauta_7.wav 400 15>>\n===\n\n\n2.Afinación: \n\nLa flauta es un instrumento temperado, afinado en re sin la pata y en do con la pata. Técnicamente se puede tocar sin la pata, pero la afinación es muy mala y el instrumento se desbalancea porque pasa a pesar mucho en relación al tamaño.\n\nNota re, tocando sin la pata y con la pata.\n+++[Ejemplo 8]...\n<<player id=8 quicktime materiales/grabaciones/flauta/flauta_8.wav 400 15>>\n===\n\nCon la cabeza totalmente encajada en el cuerpo se consigue el la afinado, a 442. Para variar la afinación al tocar con otros instrumentos se modifica la posición de la cabeza (alejarla del cuerpo agranda el instrumento y sube la afinación, y viceversa).\n\nVariación de la nota la de referencia en función de la posición de la cabeza (un semitono, aproximadamente).\n+++[Ejemplo 9]...\n<<player id=9 quicktime materiales/grabaciones/flauta/flauta_9.wav 400 15>>\n===\n\n\nLa flauta tiene varias "notas lobo" (notas que, por la construcción del instrumento, no suenan con la misma calidad o afinación que el resto). \n\nDo# y mi no son notas muy fiables.\n+++[Ejemplo 10]...\n<<player id=10 quicktime materiales/grabaciones/flauta/flauta_10.wav 400 15>>\n===\n\n\nEl intérprete puede alterar ligeramente la afinación de notas puntuales variando la posición de la barbilla, la mandíbula y la embocadura.\n+++[Ejemplo 11]...\n<<player id=11 quicktime materiales/grabaciones/flauta/flauta_11.wav 400 15>>\n===\n\n\nTambién se puede bajar la afinación de una nota pulsando llaves situadas por detrás (más graves) de la última llave abierta. \n\nPor ejemplo, al hacer la nota la, la última llave es sol; se dejará pues la llave de sol abierta y se pulsarán las llaves de fa, mi, re, do...\n\nEjemplo pulsando la con fa, la con mi y la con re.\n+++[Ejemplo 12]...\n<<player id=12 quicktime materiales/grabaciones/flauta/flauta_12.wav 400 15>>\n===\n\n \nAl tocar con otros instrumentos normalmente se afina únicamente al principio; el caso del piano es más complejo (esto pasa con todos los instrumentos al tocar con el piano), porque durante la interpretación el flautista tiende a variar ligeramente la afinación (por ejemplo, tenderá a subir ligeramente la afinación en momentos de intensidad emotiva; simplemente basta con que varíe la posición de la cabeza para que cambie la afinación), y el pianista no tiene posibilidad de adaptar su propia afinación para compensar.\n\nOtro aspecto a tener en cuenta en los instrumentos de viento en general y en la flauta en concreto es que tras tocar durante un cierto tiempo (un cuarto de hora a treinta minutos), el instrumento "entra en calor" y la afinación sube. En todo caso, esto no es problema para un buen instrumentista, que automáticamente alejará ligeramente la cabeza (el primer cuerpo de la flauta, se entiende) para compensar.\n\n3.Registros:\n\nLa nota más grave es el do (línea adicional inferior en clave de sol), nota por otra parte harto difícil de atacar. La flauta tiene tres registros, todos cromáticos. El paso de un registro a otro se produce de forma gradual, sin "puntos de corte" como en el clarinete.\n\nEl sonido del registro grave es denso, pleno ("llena mucho"), y algo oscuro. Debe usarse con cuidado en la orquesta, porque es fácilmente cubierto por otros instrumentos, principalmente por armónicos del contrabajo; es por tanto un registro a evitar salvo en pasajes con muy poco acompañamiento y dinámica general piano. En contrapartida, resulta muy efectivo en los pasajes a solo. Para el intérprete es el más difícil de obtener, porque requiere gran cantidad de aire.\n\nEscala cromática, de do a do, del registro grave al medio y viceversa.\n+++[Ejemplo 13]...\n<<player id=13 quicktime materiales/grabaciones/flauta/flauta_13.wav 400 15>>\n===\n\nEl sonido del registro medio-agudo es el más brillante, y toma el color característico del instrumento. En música de cámara sobresale con facilidad; es también el más utilizado en música de orquesta.\n\nEscala cromática, de do a do, del registro medio al agudo.\n+++[Ejemplo 14]...\n<<player id=14 quicktime materiales/grabaciones/flauta/flauta_14.wav 400 15>>\n===\n\n\nRegistro agudo- sobreagudo.\n+++[Ejemplo 15]...\n<<player id=15 quicktime materiales/grabaciones/flauta/flauta_15.wav 400 15>>\n===\n\n\nLas notas agudas son las menos usadas y de posiciones más complicadas; además exigen apretar mucho los labios, lo que perjudica la calidad de sonido. Para este registro es mejor utilizar el [[flautín|Flautín: Guía]].\n\nEl do sobreagudo es poco utilizado por la dificultad del cambio de si a do.\n\nDo agudo, sobreagudo y transición si- do.\n+++[Ejemplo 16]...\n<<player id=16 quicktime materiales/grabaciones/flauta/flauta_16.wav 400 15>>\n===\n\n\n4.Vibrato:\n\nEl vibrato se utiliza para enfatizar el desarrollo de cada nota. Se distingue entre dos tipos de vibrato: de diafragma y de garganta.\n\nVibrato de diafragma y de garganta.\n+++[Ejemplo 17]...\n<<player id=17 quicktime materiales/grabaciones/flauta/flauta_17.wav 400 15>>\n===\n\n\nEl vibrato de garganta resulta útil para marcar acentuaciones rítmicas; en cierto sentido es equivalente al golpe de talón de los instrumentos de cuerda.\n\nEl vibrato "normal" se aplica a todas las notas, pero los buenos intérpretes hacen un semivibrato en las notas poco importantes y un vibrato más amplio en las notas principales. \n\n5.Dinámica:\n\nEl registro grave suele tocarse en la práctica en mf o f porque requiere de mucho aire para que las notas se emitan correctamente. De tocarse en una dinámica de p o menor, ocurre que los armónicos superiores se oyen tanto como la nota base.\n\nNota do# grave tocada en ppp, luego en p.\n+++[Ejemplo 18]...\n<<player id=18 quicktime materiales/grabaciones/flauta/flauta_18.wav 400 15>>\n===\n\n\nEn el registro medio, la flauta alcanza toda la gama de matices entre pp y f.\n\nNota re en el registro medio\n+++[Ejemplo 19]...\n<<player id=19 quicktime materiales/grabaciones/flauta/flauta_19.wav 400 15>>\n===\n\n\nDinámicas en el registro agudo: p, p a ff y p.\n+++[Ejemplo 20]...\n<<player id=20 quicktime materiales/grabaciones/flauta/flauta_20.wav 400 15>>\n===\n\n\nEn el registro agudo es muy difícil tocar p en las notas sobreagudas del la al do: al igual que sucede en el registro grave, estas notas requieren de mucho aire para emitirse correctamente.\n\n6.Velocidad:\n\nLa flauta es un instrumento muy ágil, muy útil para trinos, arpegios y pasajes de agilidad. Las notas agudas presentan ciertas complejidades de ejecución ya comentadas, lo que dificulta, pero no impide, la realización de pasajes rápidos en ese registro.\n\nPruebas de velocidad: escala de re dórico; arpegios mi- sol- la- do- mi, mib- solb- la- do- mi y re- fa- la- do- mi.\n+++[Ejemplo 21]...\n<<player id=21 quicktime materiales/grabaciones/flauta/flauta_21.wav 400 15>>\n===\n\n\n7.Glissandos:\n\nEl glissando en la flauta no se puede hacer deslizado; es más bien una escala diatónica entre las dos notas.\n\nGlissandos: mi- do (en do mayor), y mi- do (en mib mayor).\n+++[Ejemplo 22]...\n<<player id=22 quicktime materiales/grabaciones/flauta/flauta_22.wav 400 15>>\n===\n\n\n8.Armónicos:\n\nEn el do base se consigue toda la serie armónica. Desde esa nota se hace cada vez más complicado conseguir series.\n\nSeries de do y re (sin cambiar posturas).\n+++[Ejemplo 23]...\n<<player id=23 quicktime materiales/grabaciones/flauta/flauta_23.wav 400 15>>\n===\n\n\nSe puede hacer armónicos de octava en cualquier nota, levantando un poco la embocadura y soplando más.\n\nLos armónicos silbados salen únicamente en el registro grave, tocando en cuatro ó cinco p; son producidos por el quiebre del aire sobre el bisel de la embocadura. Normalmente se hacen entre do y mib grave. A medida que se asciende hacia la región media se van difuminando. Los más poderosos son los de do y do#.\n\nLos armónicos de do son sib sobreagudo, do, re y mi (suenan a mixolidio).\n+++[Ejemplo 24]...\n<<player id=24 quicktime materiales/grabaciones/flauta/flauta_24.wav 400 15>>\n===\n\n\nArmónicos de do#, re y mi: cada vez se escucha más el aire y menos los armónicos.\n+++[Ejemplo 25]...\n<<player id=25 quicktime materiales/grabaciones/flauta/flauta_25.wav 400 15>>\n===\n\n\n9.Frulato:\n\nEl frulato puede practicarse en todo el registro; se consigue pronunciando la rr sobre la nota. El efecto es particularmente eficaz en los registros agudo y sobreagudo.\n\nFrulato de rr; frulatos alternativos con g (de garganta), y gr.\n+++[Ejemplo 26]...\n<<player id=26 quicktime materiales/grabaciones/flauta/flauta_26.wav 400 15>>\n===\n\n\n10.Ataques y articulaciones:\n\nNormalmente las notas se atacan con "ta" o "cha".\n+++[Ejemplo 27]...\n<<player id=27 quicktime materiales/grabaciones/flauta/flauta_27.wav 400 15>>\n===\n\n\nAtaque con "p": notas- burbuja.\n+++[Ejemplo 28]...\n<<player id=28 quicktime materiales/grabaciones/flauta/flauta_28.wav 400 15>>\n===\n\n\nEl doble picado se consigue pronunciando "ta-ka".\n+++[Ejemplo 29]...\n<<player id=29 quicktime materiales/grabaciones/flauta/flauta_29.wav 400 15>>\n===\n\n\nEl triple picado se consigue pronunciando "ta-ta-ka"; no suele utilizarse.\n+++[Ejemplo 30]...\n<<player id=30 quicktime materiales/grabaciones/flauta/flauta_30.wav 400 15>>\n===\n\n\n11.Aire y llaves:\n\nSonido de las llaves.\n+++[Ejemplo 31]...\n<<player id=31 quicktime materiales/grabaciones/flauta/flauta_31.wav 400 15>>\n===\n\n\nEfecto de soplido al limpiar el agua. Es una bocanada de aire que se echa en la flauta tapando todas las teclas.\n+++[Ejemplo 32]...\n<<player id=32 quicktime materiales/grabaciones/flauta/flauta_32.wav 400 15>>\n===\n\n\nCombinación de ambos efectos.\n+++[Ejemplo 33]...\n<<player id=33 quicktime materiales/grabaciones/flauta/flauta_32.wav 400 15>>\n===\n\n\n12.Multifónicos:\n\nLas posturas son difíciles de atacar directamente en multifónico: suele ejecutarse la nota base primero.\n\nSib (registro grave)- la (registro medio); si- do (nótese el batido); dos ejemplos más.\n+++[Ejemplo 34]...\n<<player id=34 quicktime materiales/grabaciones/flauta/flauta_34.wav 400 15>>\n===\n\n\n13.Otros efectos:\n\nRespirar en el tubo.\n+++[Ejemplo 35]...\n<<player id=35 quicktime materiales/grabaciones/flauta/flauta_35.wav 400 15>>\n===\n\n\nHablar y tocar a la vez.\n+++[Ejemplo 36]...\n<<player id=36 quicktime materiales/grabaciones/flauta/flauta_36.wav 400 15>>\n===\n\n\nCantar y tocar a la vez. Al no transformarse todo el sonido en aire se puede entonar guturalmente una melodía.\n+++[Ejemplo 37]...\n<<player id=37 quicktime materiales/grabaciones/flauta/flauta_37.wav 400 15>>\n===\n\n\nSonido de trompeta, quitando la boquilla, poniendo el cuerpo de la flauta directamente en los labios y tocando cual un trompetista. Se consigue do, do# y re.\n+++[Ejemplo 38]...\n<<player id=38 quicktime materiales/grabaciones/flauta/flauta_38.wav 400 15>>\n===\n\n\n\n\n\n\n\n\n\n
\n<<formTiddler fichaPlantilla>>\n<data>{"tecnico":"José Luis González Castro","mes":"Abril","año":"2007","lugar":"aula","notes":"Tascam HD-P2\snMicrófono AKG C414 B\sn\snAula 23, muy reverberante- Algunos finales cortados y fundidos para eliminar el solapamiento con la voz.","interprete":"Mateo Mena"}</data>\n
\n|[img[flautín|materiales/fotografías/flautin.jpg]]|\n\n!Guía\n\nA propósito de la denominación, en los papeles para banda se utiliza el término español //flautín//; en los de orquesta se utiliza el italiano //piccolo//.\n\nSu estructura es similar a la de la flauta y tiene las mismas llaves. Su registro está octavado respecto de la flauta. No tiene pata de do, con lo que abarca desde re (nota real cuarta línea en clave de sol), hasta do, dos octavas por encima. Es un instrumento capaz de sobresalir entre toda la orquesta incluso en los tuttis si está en su registro agudo. \n\nEl registro grave del flautín es de madera y suena como el sakuhachi, la flauta japonesa.\n+++[Ejemplo 1]...\n<<player id=1 quicktime materiales/grabaciones/flautin/flautin_1.wav 400 15>>\n===\n\n\nEl flautín tiene las mismas capacidades y evanescencia que la flauta.\n+++[Ejemplo 2]...\n<<player id=2 quicktime materiales/grabaciones/flautin/flautin_2.wav 400 15>>\n===\n\n\nUna práctica recurrente es el incluir flauta y flautín en un único papel, cuando debería existir siempre un papel sólo para flautín. La embocadura del flautín es más cerrada porque toca siempre en el agudo y requiere de más presión de aire para sonar correctamente. En ocasiones se pide a la flauta primera que haga solos y cambie al flautín, lo cual causa una gran fatiga en el intérprete; es conveniente prevenir esto en la partitura dejando un tiempo de descanso y adaptación entre cambios. \n\n\n
Here are some examples that show the usage of the write action in the ForEachTiddlerMacro.\n\n//''Select and Sort Examples''//\n* InClauseExamples\n* WhereClauseExamples\n* SortClauseExamples\n* ScriptClauseExamples\n//''Action Examples''//\n* AddToListActionExamples\n* WriteActionExamples\n\n\nOf cause you may also combine the examples, e.g. taking the whereClause of one example, the sortClause of a second and the action of a third.
//~~(Part of the [[ForEachTiddlerPlugin]])~~//\n\nCreate customizable lists, tables etc. for your selections of tiddlers. Specify the tiddlers to include and their order through a powerful language.\n\n''Syntax:'' \n|>|{{{<<}}}''forEachTiddler'' [''in'' //tiddlyWikiPath//] [''where'' //whereCondition//] [''sortBy'' //sortExpression// [''ascending'' //or// ''descending'']] [''script'' //scriptText//] [//action// [//actionParameters//]]{{{>>}}}|\n|//tiddlyWikiPath//|The filepath to the TiddlyWiki the macro should work on. When missing the current TiddlyWiki is used.|\n|//whereCondition//|(quoted) JavaScript boolean expression. May refer to the build-in variables {{{tiddler}}} and {{{context}}}.|\n|//sortExpression//|(quoted) JavaScript expression returning "comparable" objects (using '{{{<}}}','{{{>}}}','{{{==}}}'. May refer to the build-in variables {{{tiddler}}} and {{{context}}}.|\n|//scriptText//|(quoted) JavaScript text. Typically defines JavaScript functions that are called by the various JavaScript expressions (whereClause, sortClause, action arguments,...)|\n|//action//|The action that should be performed on every selected tiddler, in the given order. By default the actions [[addToList|AddToListAction]] and [[write|WriteAction]] are supported. When no action is specified [[addToList|AddToListAction]] is used.|\n|//actionParameters//|(action specific) parameters the action may refer while processing the tiddlers (see action descriptions for details). <<tiddler [[JavaScript in actionParameters]]>>|\n|>|~~Syntax formatting: Keywords in ''bold'', optional parts in [...]. 'or' means that exactly one of the two alternatives must exist.~~|\n\n\n''Using JavaScript''\n\nTo give you a lot of flexibility the [[ForEachTiddlerMacro]] uses JavaScript in its arguments. Even if you are not that familiar with JavaScript you may find forEachTiddler useful. Just have a look at the various ready-to-use [[ForEachTiddlerExamples]] and adapt them to your needs.\n\n''The Elements of the Macro''\n\nThe arguments of the ForEachTiddlerMacro consist of multiple parts, each of them being optional.\n\n<<slider chkFETInClause [[inClause]] "inClause" "inClause">>\n<<slider chkFETWhereClause [[whereClause]] "whereClause" "whereClause">>\n<<slider chkFETSortClause [[sortClause]] "sortClause" "sortClause">>\n<<slider chkFETScriptClause [[scriptClause]] "scriptClause" "scriptClause">>\n<<slider chkFETActions [[Action Specification]] "Action Specification" "Action Specification">>\n\n''Using Macros and ">" inside the forEachTiddler Macro''\n\nYou may use other macro calls into the expression, especially in the actionParameters. To avoid that the {{{>>}}} of such a macro call is misinterpreted as the end of the {{{<<forEachTiddler...>>}}} macro you must escape the {{{>>}}} of the inner macro with {{{$))}}} E.g. if you want to use {{{<<tiddler ...>>}}} inside the {{{forEachTiddler}}} macro you have to write {{{<<tiddler ...$))}}}.\n\nIn addition it is necessary to escape single {{{>}}} with the text {{{$)}}}.\n\n\n\nSee also [[ForEachTiddlerExamples]].
/***\n|''Name:''|ForEachTiddlerPlugin|\n|''Version:''|1.0.6 (2006-09-16)|\n|''Source:''|http://tiddlywiki.abego-software.de/#ForEachTiddlerPlugin|\n|''Author:''|UdoBorkowski (ub [at] abego-software [dot] de)|\n|''Licence:''|[[BSD open source license (abego Software)|http://www.abego-software.de/legal/apl-v10.html]]|\n|''Copyright:''|&copy; 2005-2006 [[abego Software|http://www.abego-software.de]]|\n|''TiddlyWiki:''|1.2.38+, 2.0|\n|''Browser:''|Firefox 1.0.4+; Firefox 1.5; InternetExplorer 6.0|\n!Description\n\nCreate customizable lists, tables etc. for your selections of tiddlers. Specify the tiddlers to include and their order through a powerful language.\n\n''Syntax:'' \n|>|{{{<<}}}''forEachTiddler'' [''in'' //tiddlyWikiPath//] [''where'' //whereCondition//] [''sortBy'' //sortExpression// [''ascending'' //or// ''descending'']] [''script'' //scriptText//] [//action// [//actionParameters//]]{{{>>}}}|\n|//tiddlyWikiPath//|The filepath to the TiddlyWiki the macro should work on. When missing the current TiddlyWiki is used.|\n|//whereCondition//|(quoted) JavaScript boolean expression. May refer to the build-in variables {{{tiddler}}} and {{{context}}}.|\n|//sortExpression//|(quoted) JavaScript expression returning "comparable" objects (using '{{{<}}}','{{{>}}}','{{{==}}}'. May refer to the build-in variables {{{tiddler}}} and {{{context}}}.|\n|//scriptText//|(quoted) JavaScript text. Typically defines JavaScript functions that are called by the various JavaScript expressions (whereClause, sortClause, action arguments,...)|\n|//action//|The action that should be performed on every selected tiddler, in the given order. By default the actions [[addToList|AddToListAction]] and [[write|WriteAction]] are supported. When no action is specified [[addToList|AddToListAction]] is used.|\n|//actionParameters//|(action specific) parameters the action may refer while processing the tiddlers (see action descriptions for details). <<tiddler [[JavaScript in actionParameters]]>>|\n|>|~~Syntax formatting: Keywords in ''bold'', optional parts in [...]. 'or' means that exactly one of the two alternatives must exist.~~|\n\nSee details see [[ForEachTiddlerMacro]] and [[ForEachTiddlerExamples]].\n\n!Revision history\n* v1.0.6 (2006-09-16)\n** Context provides "viewerTiddler", i.e. the tiddler used to view the macro. Most times this is equal to the "inTiddler", but when using the "tiddler" macro both may be different.\n** Support "begin", "end" and "none" expressions in "write" action\n* v1.0.5 (2006-02-05)\n** Pass tiddler containing the macro with wikify, context object also holds reference to tiddler containing the macro ("inTiddler"). Thanks to SimonBaird.\n** Support Firefox\n** Internal\n*** Make "JSLint" conform\n*** "Only install once"\n* v1.0.4 (2006-01-06)\n** Support TiddlyWiki 2.0\n* v1.0.3 (2005-12-22)\n** Features: \n*** Write output to a file supports multi-byte environments (Thanks to Bram Chen) \n*** Provide API to access the forEachTiddler functionality directly through JavaScript (see getTiddlers and performMacro)\n** Enhancements:\n*** Improved error messages on InternetExplorer.\n* v1.0.2 (2005-12-10)\n** Features: \n*** context object also holds reference to store (TiddlyWiki)\n** Fixed Bugs: \n*** ForEachTiddler 1.0.1 has broken support on win32 Opera 8.51 (Thanks to BrunoSabin for reporting)\n* v1.0.1 (2005-12-08)\n** Features: \n*** Access tiddlers stored in separated TiddlyWikis through the "in" option. I.e. you are no longer limited to only work on the "current TiddlyWiki".\n*** Write output to an external file using the "toFile" option of the "write" action. With this option you may write your customized tiddler exports.\n*** Use the "script" section to define "helper" JavaScript functions etc. to be used in the various JavaScript expressions (whereClause, sortClause, action arguments,...).\n*** Access and store context information for the current forEachTiddler invocation (through the build-in "context" object) .\n*** Improved script evaluation (for where/sort clause and write scripts).\n* v1.0.0 (2005-11-20)\n** initial version\n\n!Code\n***/\n//{{{\n\n \n//============================================================================\n//============================================================================\n// ForEachTiddlerPlugin\n//============================================================================\n//============================================================================\n\n// Only install once\nif (!version.extensions.ForEachTiddlerPlugin) {\n\nif (!window.abego) window.abego = {};\n\nversion.extensions.ForEachTiddlerPlugin = {\n major: 1, minor: 0, revision: 6, \n date: new Date(2006,8,16), \n source: "http://tiddlywiki.abego-software.de/#ForEachTiddlerPlugin",\n licence: "[[BSD open source license (abego Software)|http://www.abego-software.de/legal/apl-v10.html]]",\n copyright: "Copyright (c) abego Software GmbH, 2005-2006 (www.abego-software.de)"\n};\n\n// For backward compatibility with TW 1.2.x\n//\nif (!TiddlyWiki.prototype.forEachTiddler) {\n TiddlyWiki.prototype.forEachTiddler = function(callback) {\n for(var t in this.tiddlers) {\n callback.call(this,t,this.tiddlers[t]);\n }\n };\n}\n\n//============================================================================\n// forEachTiddler Macro\n//============================================================================\n\nversion.extensions.forEachTiddler = {\n major: 1, minor: 0, revision: 5, date: new Date(2006,2,5), provider: "http://tiddlywiki.abego-software.de"};\n\n// ---------------------------------------------------------------------------\n// Configurations and constants \n// ---------------------------------------------------------------------------\n\nconfig.macros.forEachTiddler = {\n // Standard Properties\n label: "forEachTiddler",\n prompt: "Perform actions on a (sorted) selection of tiddlers",\n\n // actions\n actions: {\n addToList: {},\n write: {}\n }\n};\n\n// ---------------------------------------------------------------------------\n// The forEachTiddler Macro Handler \n// ---------------------------------------------------------------------------\n\nconfig.macros.forEachTiddler.getContainingTiddler = function(e) {\n while(e && !hasClass(e,"tiddler"))\n e = e.parentNode;\n var title = e ? e.getAttribute("tiddler") : null; \n return title ? store.getTiddler(title) : null;\n};\n\nconfig.macros.forEachTiddler.handler = function(place,macroName,params,wikifier,paramString,tiddler) {\n // config.macros.forEachTiddler.traceMacroCall(place,macroName,params,wikifier,paramString,tiddler);\n\n if (!tiddler) tiddler = config.macros.forEachTiddler.getContainingTiddler(place);\n // --- Parsing ------------------------------------------\n\n var i = 0; // index running over the params\n // Parse the "in" clause\n var tiddlyWikiPath = undefined;\n if ((i < params.length) && params[i] == "in") {\n i++;\n if (i >= params.length) {\n this.handleError(place, "TiddlyWiki path expected behind 'in'.");\n return;\n }\n tiddlyWikiPath = this.paramEncode((i < params.length) ? params[i] : "");\n i++;\n }\n\n // Parse the where clause\n var whereClause ="true";\n if ((i < params.length) && params[i] == "where") {\n i++;\n whereClause = this.paramEncode((i < params.length) ? params[i] : "");\n i++;\n }\n\n // Parse the sort stuff\n var sortClause = null;\n var sortAscending = true; \n if ((i < params.length) && params[i] == "sortBy") {\n i++;\n if (i >= params.length) {\n this.handleError(place, "sortClause missing behind 'sortBy'.");\n return;\n }\n sortClause = this.paramEncode(params[i]);\n i++;\n\n if ((i < params.length) && (params[i] == "ascending" || params[i] == "descending")) {\n sortAscending = params[i] == "ascending";\n i++;\n }\n }\n\n // Parse the script\n var scriptText = null;\n if ((i < params.length) && params[i] == "script") {\n i++;\n scriptText = this.paramEncode((i < params.length) ? params[i] : "");\n i++;\n }\n\n // Parse the action. \n // When we are already at the end use the default action\n var actionName = "addToList";\n if (i < params.length) {\n if (!config.macros.forEachTiddler.actions[params[i]]) {\n this.handleError(place, "Unknown action '"+params[i]+"'.");\n return;\n } else {\n actionName = params[i]; \n i++;\n }\n } \n \n // Get the action parameter\n // (the parsing is done inside the individual action implementation.)\n var actionParameter = params.slice(i);\n\n\n // --- Processing ------------------------------------------\n try {\n this.performMacro({\n place: place, \n inTiddler: tiddler,\n whereClause: whereClause, \n sortClause: sortClause, \n sortAscending: sortAscending, \n actionName: actionName, \n actionParameter: actionParameter, \n scriptText: scriptText, \n tiddlyWikiPath: tiddlyWikiPath});\n\n } catch (e) {\n this.handleError(place, e);\n }\n};\n\n// Returns an object with properties "tiddlers" and "context".\n// tiddlers holds the (sorted) tiddlers selected by the parameter,\n// context the context of the execution of the macro.\n//\n// The action is not yet performed.\n//\n// @parameter see performMacro\n//\nconfig.macros.forEachTiddler.getTiddlersAndContext = function(parameter) {\n\n var context = config.macros.forEachTiddler.createContext(parameter.place, parameter.whereClause, parameter.sortClause, parameter.sortAscending, parameter.actionName, parameter.actionParameter, parameter.scriptText, parameter.tiddlyWikiPath, parameter.inTiddler);\n\n var tiddlyWiki = parameter.tiddlyWikiPath ? this.loadTiddlyWiki(parameter.tiddlyWikiPath) : store;\n context["tiddlyWiki"] = tiddlyWiki;\n \n // Get the tiddlers, as defined by the whereClause\n var tiddlers = this.findTiddlers(parameter.whereClause, context, tiddlyWiki);\n context["tiddlers"] = tiddlers;\n\n // Sort the tiddlers, when sorting is required.\n if (parameter.sortClause) {\n this.sortTiddlers(tiddlers, parameter.sortClause, parameter.sortAscending, context);\n }\n\n return {tiddlers: tiddlers, context: context};\n};\n\n// Returns the (sorted) tiddlers selected by the parameter.\n//\n// The action is not yet performed.\n//\n// @parameter see performMacro\n//\nconfig.macros.forEachTiddler.getTiddlers = function(parameter) {\n return this.getTiddlersAndContext(parameter).tiddlers;\n};\n\n// Performs the macros with the given parameter.\n//\n// @param parameter holds the parameter of the macro as separate properties.\n// The following properties are supported:\n//\n// place\n// whereClause\n// sortClause\n// sortAscending\n// actionName\n// actionParameter\n// scriptText\n// tiddlyWikiPath\n//\n// All properties are optional. \n// For most actions the place property must be defined.\n//\nconfig.macros.forEachTiddler.performMacro = function(parameter) {\n var tiddlersAndContext = this.getTiddlersAndContext(parameter);\n\n // Perform the action\n var actionName = parameter.actionName ? parameter.actionName : "addToList";\n var action = config.macros.forEachTiddler.actions[actionName];\n if (!action) {\n this.handleError(parameter.place, "Unknown action '"+actionName+"'.");\n return;\n }\n\n var actionHandler = action.handler;\n actionHandler(parameter.place, tiddlersAndContext.tiddlers, parameter.actionParameter, tiddlersAndContext.context);\n};\n\n// ---------------------------------------------------------------------------\n// The actions \n// ---------------------------------------------------------------------------\n\n// Internal.\n//\n// --- The addToList Action -----------------------------------------------\n//\nconfig.macros.forEachTiddler.actions.addToList.handler = function(place, tiddlers, parameter, context) {\n // Parse the parameter\n var p = 0;\n\n // Check for extra parameters\n if (parameter.length > p) {\n config.macros.forEachTiddler.createExtraParameterErrorElement(place, "addToList", parameter, p);\n return;\n }\n\n // Perform the action.\n var list = document.createElement("ul");\n place.appendChild(list);\n for (var i = 0; i < tiddlers.length; i++) {\n var tiddler = tiddlers[i];\n var listItem = document.createElement("li");\n list.appendChild(listItem);\n createTiddlyLink(listItem, tiddler.title, true);\n }\n};\n\nabego.parseNamedParameter = function(name, parameter, i) {\n var beginExpression = null;\n if ((i < parameter.length) && parameter[i] == name) {\n i++;\n if (i >= parameter.length) {\n throw "Missing text behind '%0'".format([name]);\n }\n \n return config.macros.forEachTiddler.paramEncode(parameter[i]);\n }\n return null;\n}\n\n// Internal.\n//\n// --- The write Action ---------------------------------------------------\n//\nconfig.macros.forEachTiddler.actions.write.handler = function(place, tiddlers, parameter, context) {\n // Parse the parameter\n var p = 0;\n if (p >= parameter.length) {\n this.handleError(place, "Missing expression behind 'write'.");\n return;\n }\n\n var textExpression = config.macros.forEachTiddler.paramEncode(parameter[p]);\n p++;\n\n // Parse the "begin" option\n var beginExpression = abego.parseNamedParameter("begin", parameter, p);\n if (beginExpression !== null) \n p += 2;\n var endExpression = abego.parseNamedParameter("end", parameter, p);\n if (endExpression !== null) \n p += 2;\n var noneExpression = abego.parseNamedParameter("none", parameter, p);\n if (noneExpression !== null) \n p += 2;\n\n // Parse the "toFile" option\n var filename = null;\n var lineSeparator = undefined;\n if ((p < parameter.length) && parameter[p] == "toFile") {\n p++;\n if (p >= parameter.length) {\n this.handleError(place, "Filename expected behind 'toFile' of 'write' action.");\n return;\n }\n \n filename = config.macros.forEachTiddler.getLocalPath(config.macros.forEachTiddler.paramEncode(parameter[p]));\n p++;\n if ((p < parameter.length) && parameter[p] == "withLineSeparator") {\n p++;\n if (p >= parameter.length) {\n this.handleError(place, "Line separator text expected behind 'withLineSeparator' of 'write' action.");\n return;\n }\n lineSeparator = config.macros.forEachTiddler.paramEncode(parameter[p]);\n p++;\n }\n }\n \n // Check for extra parameters\n if (parameter.length > p) {\n config.macros.forEachTiddler.createExtraParameterErrorElement(place, "write", parameter, p);\n return;\n }\n\n // Perform the action.\n var func = config.macros.forEachTiddler.getEvalTiddlerFunction(textExpression, context);\n var count = tiddlers.length;\n var text = "";\n if (count > 0 && beginExpression)\n text += config.macros.forEachTiddler.getEvalTiddlerFunction(beginExpression, context)(undefined, context, count, undefined);\n \n for (var i = 0; i < count; i++) {\n var tiddler = tiddlers[i];\n text += func(tiddler, context, count, i);\n }\n \n if (count > 0 && endExpression)\n text += config.macros.forEachTiddler.getEvalTiddlerFunction(endExpression, context)(undefined, context, count, undefined);\n\n if (count == 0 && noneExpression) \n text += config.macros.forEachTiddler.getEvalTiddlerFunction(noneExpression, context)(undefined, context, count, undefined);\n \n\n if (filename) {\n if (lineSeparator !== undefined) {\n lineSeparator = lineSeparator.replace(/\s\sn/mg, "\sn").replace(/\s\sr/mg, "\sr");\n text = text.replace(/\sn/mg,lineSeparator);\n }\n saveFile(filename, convertUnicodeToUTF8(text));\n } else {\n var wrapper = createTiddlyElement(place, "span");\n wikify(text, wrapper, null/* highlightRegExp */, context.inTiddler);\n }\n};\n\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n// Internal.\n//\nconfig.macros.forEachTiddler.createContext = function(placeParam, whereClauseParam, sortClauseParam, sortAscendingParam, actionNameParam, actionParameterParam, scriptText, tiddlyWikiPathParam, inTiddlerParam) {\n return {\n place : placeParam, \n whereClause : whereClauseParam, \n sortClause : sortClauseParam, \n sortAscending : sortAscendingParam, \n script : scriptText,\n actionName : actionNameParam, \n actionParameter : actionParameterParam,\n tiddlyWikiPath : tiddlyWikiPathParam,\n inTiddler : inTiddlerParam, // the tiddler containing the <<forEachTiddler ...>> macro call.\n viewerTiddler : config.macros.forEachTiddler.getContainingTiddler(placeParam) // the tiddler showing the forEachTiddler result\n };\n};\n\n// Internal.\n//\n// Returns a TiddlyWiki with the tiddlers loaded from the TiddlyWiki of \n// the given path.\n//\nconfig.macros.forEachTiddler.loadTiddlyWiki = function(path, idPrefix) {\n if (!idPrefix) {\n idPrefix = "store";\n }\n var lenPrefix = idPrefix.length;\n \n // Read the content of the given file\n var content = loadFile(this.getLocalPath(path));\n if(content === null) {\n throw "TiddlyWiki '"+path+"' not found.";\n }\n \n // Locate the storeArea div's\n var posOpeningDiv = content.indexOf(startSaveArea);\n var posClosingDiv = content.lastIndexOf(endSaveArea);\n if((posOpeningDiv == -1) || (posClosingDiv == -1)) {\n throw "File '"+path+"' is not a TiddlyWiki.";\n }\n var storageText = content.substr(posOpeningDiv + startSaveArea.length, posClosingDiv);\n \n // Create a "div" element that contains the storage text\n var myStorageDiv = document.createElement("div");\n myStorageDiv.innerHTML = storageText;\n myStorageDiv.normalize();\n \n // Create all tiddlers in a new TiddlyWiki\n // (following code is modified copy of TiddlyWiki.prototype.loadFromDiv)\n var tiddlyWiki = new TiddlyWiki();\n var store = myStorageDiv.childNodes;\n for(var t = 0; t < store.length; t++) {\n var e = store[t];\n var title = null;\n if(e.getAttribute)\n title = e.getAttribute("tiddler");\n if(!title && e.id && e.id.substr(0,lenPrefix) == idPrefix)\n title = e.id.substr(lenPrefix);\n if(title && title !== "") {\n var tiddler = tiddlyWiki.createTiddler(title);\n tiddler.loadFromDiv(e,title);\n }\n }\n tiddlyWiki.dirty = false;\n\n return tiddlyWiki;\n};\n\n\n \n// Internal.\n//\n// Returns a function that has a function body returning the given javaScriptExpression.\n// The function has the parameters:\n// \n// (tiddler, context, count, index)\n//\nconfig.macros.forEachTiddler.getEvalTiddlerFunction = function (javaScriptExpression, context) {\n var script = context["script"];\n var functionText = "var theFunction = function(tiddler, context, count, index) { return "+javaScriptExpression+"}";\n var fullText = (script ? script+";" : "")+functionText+";theFunction;";\n return eval(fullText);\n};\n\n// Internal.\n//\nconfig.macros.forEachTiddler.findTiddlers = function(whereClause, context, tiddlyWiki) {\n var result = [];\n var func = config.macros.forEachTiddler.getEvalTiddlerFunction(whereClause, context);\n tiddlyWiki.forEachTiddler(function(title,tiddler) {\n if (func(tiddler, context, undefined, undefined)) {\n result.push(tiddler);\n }\n });\n return result;\n};\n\n// Internal.\n//\nconfig.macros.forEachTiddler.createExtraParameterErrorElement = function(place, actionName, parameter, firstUnusedIndex) {\n var message = "Extra parameter behind '"+actionName+"':";\n for (var i = firstUnusedIndex; i < parameter.length; i++) {\n message += " "+parameter[i];\n }\n this.handleError(place, message);\n};\n\n// Internal.\n//\nconfig.macros.forEachTiddler.sortAscending = function(tiddlerA, tiddlerB) {\n var result = \n (tiddlerA.forEachTiddlerSortValue == tiddlerB.forEachTiddlerSortValue) \n ? 0\n : (tiddlerA.forEachTiddlerSortValue < tiddlerB.forEachTiddlerSortValue)\n ? -1 \n : +1; \n return result;\n};\n\n// Internal.\n//\nconfig.macros.forEachTiddler.sortDescending = function(tiddlerA, tiddlerB) {\n var result = \n (tiddlerA.forEachTiddlerSortValue == tiddlerB.forEachTiddlerSortValue) \n ? 0\n : (tiddlerA.forEachTiddlerSortValue < tiddlerB.forEachTiddlerSortValue)\n ? +1 \n : -1; \n return result;\n};\n\n// Internal.\n//\nconfig.macros.forEachTiddler.sortTiddlers = function(tiddlers, sortClause, ascending, context) {\n // To avoid evaluating the sortClause whenever two items are compared \n // we pre-calculate the sortValue for every item in the array and store it in a \n // temporary property ("forEachTiddlerSortValue") of the tiddlers.\n var func = config.macros.forEachTiddler.getEvalTiddlerFunction(sortClause, context);\n var count = tiddlers.length;\n var i;\n for (i = 0; i < count; i++) {\n var tiddler = tiddlers[i];\n tiddler.forEachTiddlerSortValue = func(tiddler,context, undefined, undefined);\n }\n\n // Do the sorting\n tiddlers.sort(ascending ? this.sortAscending : this.sortDescending);\n\n // Delete the temporary property that holds the sortValue. \n for (i = 0; i < tiddlers.length; i++) {\n delete tiddlers[i].forEachTiddlerSortValue;\n }\n};\n\n\n// Internal.\n//\nconfig.macros.forEachTiddler.trace = function(message) {\n displayMessage(message);\n};\n\n// Internal.\n//\nconfig.macros.forEachTiddler.traceMacroCall = function(place,macroName,params) {\n var message ="<<"+macroName;\n for (var i = 0; i < params.length; i++) {\n message += " "+params[i];\n }\n message += ">>";\n displayMessage(message);\n};\n\n\n// Internal.\n//\n// Creates an element that holds an error message\n// \nconfig.macros.forEachTiddler.createErrorElement = function(place, exception) {\n var message = (exception.description) ? exception.description : exception.toString();\n return createTiddlyElement(place,"span",null,"forEachTiddlerError","<<forEachTiddler ...>>: "+message);\n};\n\n// Internal.\n//\n// @param place [may be null]\n//\nconfig.macros.forEachTiddler.handleError = function(place, exception) {\n if (place) {\n this.createErrorElement(place, exception);\n } else {\n throw exception;\n }\n};\n\n// Internal.\n//\n// Encodes the given string.\n//\n// Replaces \n// "$))" to ">>"\n// "$)" to ">"\n//\nconfig.macros.forEachTiddler.paramEncode = function(s) {\n var reGTGT = new RegExp("\s\s$\s\s)\s\s)","mg");\n var reGT = new RegExp("\s\s$\s\s)","mg");\n return s.replace(reGTGT, ">>").replace(reGT, ">");\n};\n\n// Internal.\n//\n// Returns the given original path (that is a file path, starting with "file:")\n// as a path to a local file, in the systems native file format.\n//\n// Location information in the originalPath (i.e. the "#" and stuff following)\n// is stripped.\n// \nconfig.macros.forEachTiddler.getLocalPath = function(originalPath) {\n // Remove any location part of the URL\n var hashPos = originalPath.indexOf("#");\n if(hashPos != -1)\n originalPath = originalPath.substr(0,hashPos);\n // Convert to a native file format assuming\n // "file:///x:/path/path/path..." - pc local file --> "x:\spath\spath\spath..."\n // "file://///server/share/path/path/path..." - FireFox pc network file --> "\s\sserver\sshare\spath\spath\spath..."\n // "file:///path/path/path..." - mac/unix local file --> "/path/path/path..."\n // "file://server/share/path/path/path..." - pc network file --> "\s\sserver\sshare\spath\spath\spath..."\n var localPath;\n if(originalPath.charAt(9) == ":") // pc local file\n localPath = unescape(originalPath.substr(8)).replace(new RegExp("/","g"),"\s\s");\n else if(originalPath.indexOf("file://///") === 0) // FireFox pc network file\n localPath = "\s\s\s\s" + unescape(originalPath.substr(10)).replace(new RegExp("/","g"),"\s\s");\n else if(originalPath.indexOf("file:///") === 0) // mac/unix local file\n localPath = unescape(originalPath.substr(7));\n else if(originalPath.indexOf("file:/") === 0) // mac/unix local file\n localPath = unescape(originalPath.substr(5));\n else // pc network file\n localPath = "\s\s\s\s" + unescape(originalPath.substr(7)).replace(new RegExp("/","g"),"\s\s"); \n return localPath;\n};\n\n// ---------------------------------------------------------------------------\n// Stylesheet Extensions (may be overridden by local StyleSheet)\n// ---------------------------------------------------------------------------\n//\nsetStylesheet(\n ".forEachTiddlerError{color: #ffffff;background-color: #880000;}",\n "forEachTiddler");\n\n//============================================================================\n// End of forEachTiddler Macro\n//============================================================================\n\n\n//============================================================================\n// String.startsWith Function\n//============================================================================\n//\n// Returns true if the string starts with the given prefix, false otherwise.\n//\nversion.extensions["String.startsWith"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};\n//\nString.prototype.startsWith = function(prefix) {\n var n = prefix.length;\n return (this.length >= n) && (this.slice(0, n) == prefix);\n};\n\n\n\n//============================================================================\n// String.endsWith Function\n//============================================================================\n//\n// Returns true if the string ends with the given suffix, false otherwise.\n//\nversion.extensions["String.endsWith"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};\n//\nString.prototype.endsWith = function(suffix) {\n var n = suffix.length;\n return (this.length >= n) && (this.right(n) == suffix);\n};\n\n\n//============================================================================\n// String.contains Function\n//============================================================================\n//\n// Returns true when the string contains the given substring, false otherwise.\n//\nversion.extensions["String.contains"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};\n//\nString.prototype.contains = function(substring) {\n return this.indexOf(substring) >= 0;\n};\n\n//============================================================================\n// Array.indexOf Function\n//============================================================================\n//\n// Returns the index of the first occurance of the given item in the array or \n// -1 when no such item exists.\n//\n// @param item [may be null]\n//\nversion.extensions["Array.indexOf"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};\n//\nArray.prototype.indexOf = function(item) {\n for (var i = 0; i < this.length; i++) {\n if (this[i] == item) {\n return i;\n }\n }\n return -1;\n};\n\n//============================================================================\n// Array.contains Function\n//============================================================================\n//\n// Returns true when the array contains the given item, otherwise false. \n//\n// @param item [may be null]\n//\nversion.extensions["Array.contains"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};\n//\nArray.prototype.contains = function(item) {\n return (this.indexOf(item) >= 0);\n};\n\n//============================================================================\n// Array.containsAny Function\n//============================================================================\n//\n// Returns true when the array contains at least one of the elements \n// of the item. Otherwise (or when items contains no elements) false is returned.\n//\nversion.extensions["Array.containsAny"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};\n//\nArray.prototype.containsAny = function(items) {\n for(var i = 0; i < items.length; i++) {\n if (this.contains(items[i])) {\n return true;\n }\n }\n return false;\n};\n\n\n//============================================================================\n// Array.containsAll Function\n//============================================================================\n//\n// Returns true when the array contains all the items, otherwise false.\n// \n// When items is null false is returned (even if the array contains a null).\n//\n// @param items [may be null] \n//\nversion.extensions["Array.containsAll"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};\n//\nArray.prototype.containsAll = function(items) {\n for(var i = 0; i < items.length; i++) {\n if (!this.contains(items[i])) {\n return false;\n }\n }\n return true;\n};\n\n\n} // of "install only once"\n\n// Used Globals (for JSLint) ==============\n// ... DOM\n/*global document */\n// ... TiddlyWiki Core\n/*global convertUnicodeToUTF8, createTiddlyElement, createTiddlyLink, \n displayMessage, endSaveArea, hasClass, loadFile, saveFile, \n startSaveArea, store, wikify */\n//}}}\n\n\n/***\n!Licence and Copyright\nCopyright (c) abego Software ~GmbH, 2005 ([[www.abego-software.de|http://www.abego-software.de]])\n\nRedistribution and use in source and binary forms, with or without modification,\nare permitted provided that the following conditions are met:\n\nRedistributions of source code must retain the above copyright notice, this\nlist of conditions and the following disclaimer.\n\nRedistributions in binary form must reproduce the above copyright notice, this\nlist of conditions and the following disclaimer in the documentation and/or other\nmaterials provided with the distribution.\n\nNeither the name of abego Software nor the names of its contributors may be\nused to endorse or promote products derived from this software without specific\nprior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\nOF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\nSHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\nINCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\nTO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR\nBUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\nANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH\nDAMAGE.\n***/\n\n
A FormTemplate is used with the [[FormTiddlerPlugin]]. It is a tiddler that contains one or more HTML INPUT elements and defines the layout of a form. \n\nOther tiddlers can reference a FormTemplate through the [[FormTiddlerMacro]].\n\n(See [[FormTiddler Introduction]])
|!Example|!Comment|\n|[[SimpleForm|SimpleForm (Card 1)]]|Three forms, using a simple template with "username" and "password" fields|\n|[[BiggerForm|BiggerForm (Card 1)]]|Three forms, using a template with all supported Form input elements|\n|[[Bugreports]]|Use forms and filtered lists to maintain bug reports|\n|[[Contacts|JoeBlock]]|Manage your contacts in forms|\n
The [[FormTiddlerPlugin]] allows you to enter your data in a form and store the form's data in your tiddlers.\n\n(For more information on tiddler data see the [[DataTiddlerPlugin]].)\n\n//''Define ~FormTemplate''//\n\nWhen you want to enter data in a form you first have to define a [[FormTemplate]] tiddler. A FormTemplate tiddler is a tiddler that contains named HTML INPUT elements (such as textfields, password fields, lists etc.) that define the stuff that should be edited in the form. E.g. you may have a FormTemplate that looks like this:\n\n<html>\n <b>Name:</b><br/>\n <input name=userName type=text /><br/>\n <b>Password:</b><br/>\n <input name=pwd type=password /><br/>\n</html>\n\nThe correspond HTML text looks like this\n{{{\n<html>\n <b>Name:</b><br/>\n <input name=userName type=text /><br/>\n <b>Password:</b><br/>\n <input name=pwd type=password /><br/>\n</html>\n}}}\n\nThe name of the INPUT element is also the name of the data field it is editing. E.g. a text field defined like this: \n{{{\n<input name=userName type=text />\n}}}\nwill edit the data field "userName" of the tiddler.\n\n\nYou are free to layout the INPUT elements as you like, but don't add a "form" element around them and don't define 'onchange' handlers, since this will be done automatically by the {{{<<formTiddler ...>>}}} macro.\n\n\n//''Use ~FormTemplates (through the {{{<<formTiddler ...>>}}} macro)''//\n\nIn a second step you add the {{{<<formTiddler ...>>}}} macro to tiddlers that should be edited. In the macro you are referencing the [[FormTemplate]] that should be used to edit the tiddler's data. You may refer to the same FormTemplate tiddler in as many tiddlers as you like. Every such tiddler displays the same INPUT elements as the FormTemplate, but with the "data" of each individual tiddler.\n\nIn addition you may more than one {{{<<formTiddler...>>}}} macro call in one tiddler. Just make sure that the names of the elements in the referenced FormTemplate tiddlers do not collide. This feature may be useful if you want to construct a larger input form from a set of smaller FormTemplates.\n\nYou can easily create tiddlers with an embedded {{{<<formTiddler...>>}}} macro call using the [[<<newTiddlerWithForm...>>|NewTiddlerWithFormMacro]] macro. The macro shows a button similar to the "new tiddler" button and creates the requested tiddler, ready to enter data. For details see NewTiddlerWithFormMacro.\n\n\n//''"Structured" and "Free" Data''//\n\nTypically you will edit a tiddler that uses the {{{<<formTiddler...>>}}} macro through the form. But you are free to also edit the tiddler "as usual", through the build-in edit feature. I.e. you may mix "structured data" (as entered through the form) with "free data". I.e. on a "Contact" tiddler you may add an image to the tiddler, or add extra links to related persons. Or you add more tags. Just make sure that you don't modify the {{{<data>...</data>}}} section of the tiddler, since this contains the data maintained by the form.\n\nAlso notice that since the data entered in the forms is stored in the tiddler's text (in the {{{<data>...</data>}}} section) using the "search" feature will also find the texts you entered in the forms (even though it will not hilite the texts in the fields).\n\n\n//''Applications''//\n\nUsing the [[FormTiddlerPlugin]] it is easy to manage things like:\n* [[Contacts]]\n* [[Bugreports]]\n* ~ToDo Lists\n* and many more.\n\nSince a FormTemplate is typically used for many tiddlers of the same kind you may also consider using the ForEachTiddlerMacro to collect data across multiple tiddlers (e.g. to get a list of all contacts, a summary page for the bug reports etc.)\n\n(See also [[FormTiddler Examples]])\n\n\n//''HTML Elements''//\n\nFor those not that familiar with the HTML INPUT elements here a short overview with HTML snippets. \n|!Type|!HTML Example|!Comment|\n|button|{{{<input name=btn type=button value="Just a button" />}}}|no data|\n|checkbox|{{{<input name=isVIP type=checkbox />is VIP}}}||\n|file|{{{<input name=attachment type=file />}}}|The "file" input element typically does not restore the path of the previously selected file. Nevertheless the path of the file is stored in the tiddler.|\n|hidden|{{{<input name=hiddenValue type=hidden value="This is a hidden value" />}}}||\n|password|{{{<input name=pwd type=password />}}}|The data entered in a "password" field is stored as clear text in the tiddler.|\n|radio|{{{<input name=level type=radio value="Beginner" />Beginner<input name=level type=radio value="Expert" />Expert<input name=level type=radio value="Guru" />Guru}}}||\n|reset|{{{<input name=btnReset type=reset />}}}|no data|\n|select-one|{{{<select name=browser ><option>Firefox<option>Internet Explorer<option>Opera<option>Other</select >}}}||\n|select-multiple|{{{<select name=music MULTIPLE ><option> R&B <option> Jazz <option> Blues <option> New Age</select >}}}||\n|submit|{{{<input name=btnSubmit type=submit />}}}|no data|\n|text|{{{<input name=userName type=text/>}}}||\n|textarea|{{{<TEXTAREA name=notes rows=4 cols=80 ></TEXTAREA>}}}||\n\nFor details consult the Web or a textbook on HTML editing.
The {{{<<formTiddler ...>>}}} macro defined by the FormTiddlerPlugin. \n\nWhen a tiddler T1 references the (FormTemplate) tiddler T2 in the FormTiddlerMacro, the data of T1 can be edited through the INPUT elements defined by T2.
/***\n<<checkForDataTiddlerPlugin>>\n|''Name:''|FormTiddlerPlugin|\n|''Version:''|1.0.5 (2006-02-24)|\n|''Source:''|http://tiddlywiki.abego-software.de/#FormTiddlerPlugin|\n|''Author:''|UdoBorkowski (ub [at] abego-software [dot] de)|\n|''Licence:''|[[BSD open source license]]|\n|''Macros:''|formTiddler, checkForDataTiddlerPlugin, newTiddlerWithForm|\n|''Requires:''|DataTiddlerPlugin|\n|''TiddlyWiki:''|1.2.38+, 2.0|\n|''Browser:''|Firefox 1.0.4+; InternetExplorer 6.0|\n!Description\nUse form-based tiddlers to enter your tiddler data using text fields, listboxes, checkboxes etc. (All standard HTML Form input elements supported).\n\n''Syntax:'' \n|>|{{{<<}}}''formTiddler'' //tiddlerName//{{{>>}}}|\n|//tiddlerName//|The name of the FormTemplate tiddler to be used to edit the data of the tiddler containing the macro.|\n\n|>|{{{<<}}}''newTiddlerWithForm'' //formTemplateName// //buttonLabel// [//titleExpression// [''askUser'']] {{{>>}}}|\n|//formTemplateName//|The name of the tiddler that defines the form the new tiddler should use.|\n|//buttonLabel//|The label of the button|\n|//titleExpression//|A (quoted) JavaScript String expression that defines the title (/name) of the new tiddler.|\n|''askUser''|Typically the user is not asked for the title when a title is specified (and not yet used). When ''askUser'' is given the user will be asked in any case. This may be used when the calculated title is just a suggestion that must be confirmed by the user|\n|>|~~Syntax formatting: Keywords in ''bold'', optional parts in [...]. 'or' means that exactly one of the two alternatives must exist.~~|\n\nFor details and how to use the macros see the [[introduction|FormTiddler Introduction]] and the [[examples|FormTiddler Examples]].\n\n!Revision history\n* v1.0.5 (2006-02-24)\n** Removed "debugger;" instruction\n* v1.0.4 (2006-02-07)\n** Bug: On IE no data is written to data section when field values changed (thanks to KenGirard for reporting)\n* v1.0.3 (2006-02-05)\n** Bug: {{{"No form template specified in <<formTiddler>>"}}} when using formTiddler macro on InternetExplorer (thanks to KenGirard for reporting)\n* v1.0.2 (2006-01-06)\n** Support TiddlyWiki 2.0\n* v1.0.1 (2005-12-22)\n** Features: \n*** Support InternetExplorer\n*** Added newTiddlerWithForm Macro\n* v1.0.0 (2005-12-14)\n** initial version\n\n!Code\n***/\n//{{{\n\n//============================================================================\n//============================================================================\n// FormTiddlerPlugin\n//============================================================================\n//============================================================================\n\n\nversion.extensions.FormTiddlerPlugin = {\n major: 1, minor: 0, revision: 5,\n date: new Date(2006, 2, 24), \n type: 'plugin',\n source: "http://tiddlywiki.abego-software.de/#FormTiddlerPlugin"\n};\n\n// For backward compatibility with v1.2.x\n//\nif (!window.story) window.story=window; \nif (!TiddlyWiki.prototype.getTiddler) TiddlyWiki.prototype.getTiddler = function(title) { return t = this.tiddlers[title]; return (t != undefined && t instanceof Tiddler) ? t : null; } \n\n//============================================================================\n// formTiddler Macro\n//============================================================================\n\n// -------------------------------------------------------------------------------\n// Configurations and constants \n// -------------------------------------------------------------------------------\n\nconfig.macros.formTiddler = {\n // Standard Properties\n label: "formTiddler",\n version: {major: 1, minor: 0, revision: 4, date: new Date(2006, 2, 7)},\n prompt: "Edit tiddler data using forms",\n\n // Define the "setters" that set the values of INPUT elements of a given type\n // (must match the corresponding "getter")\n setter: { \n button: function(e, value) {/*contains no data */ },\n checkbox: function(e, value) {e.checked = value;},\n file: function(e, value) {try {e.value = value;} catch(e) {/* ignore, possibly security error*/}},\n hidden: function(e, value) {e.value = value;},\n password: function(e, value) {e.value = value;},\n radio: function(e, value) {e.checked = (e.value == value);},\n reset: function(e, value) {/*contains no data */ },\n "select-one": function(e, value) {config.macros.formTiddler.setSelectOneValue(e,value);},\n "select-multiple": function(e, value) {config.macros.formTiddler.setSelectMultipleValue(e,value);},\n submit: function(e, value) {/*contains no data */},\n text: function(e, value) {e.value = value;},\n textarea: function(e, value) {e.value = value;}\n },\n\n // Define the "getters" that return the value of INPUT elements of a given type\n // Return undefined to not store any data.\n getter: { \n button: function(e, value) {return undefined;},\n checkbox: function(e, value) {return e.checked;},\n file: function(e, value) {return e.value;},\n hidden: function(e, value) {return e.value;},\n password: function(e, value) {return e.value;},\n radio: function(e, value) {return e.checked ? e.value : undefined;},\n reset: function(e, value) {return undefined;},\n "select-one": function(e, value) {return config.macros.formTiddler.getSelectOneValue(e);},\n "select-multiple": function(e, value) {return config.macros.formTiddler.getSelectMultipleValue(e);},\n submit: function(e, value) {return undefined;},\n text: function(e, value) {return e.value;},\n textarea: function(e, value) {return e.value;}\n }\n};\n\n\n// -------------------------------------------------------------------------------\n// The formTiddler Macro Handler \n// -------------------------------------------------------------------------------\n\nconfig.macros.formTiddler.handler = function(place,macroName,params,wikifier,paramString,tiddler) {\n if (!config.macros.formTiddler.checkForExtensions(place, macroName)) {\n return;\n }\n \n // --- Parsing ------------------------------------------\n\n var i = 0; // index running over the params\n\n // get the name of the form template tiddler\n var formTemplateName = undefined;\n if (i < params.length) {\n formTemplateName = params[i];\n i++;\n }\n\n if (!formTemplateName) {\n config.macros.formTiddler.createErrorElement(place, "No form template specified in <<" + macroName + ">>.");\n return;\n }\n\n\n // --- Processing ------------------------------------------\n\n // Get the form template text. \n // (This contains the INPUT elements for the form.)\n var formTemplateTiddler = store.getTiddler(formTemplateName);\n if (!formTemplateTiddler) {\n config.macros.formTiddler.createErrorElement(place, "Form template '" + formTemplateName + "' not found.");\n return;\n }\n var templateText = formTemplateTiddler.text;\n if(!templateText) {\n // Shortcut: when template text is empty we do nothing.\n return;\n }\n\n // Get the name of the tiddler containing this "formTiddler" macro\n // (i.e. the tiddler, that will be edited and that contains the data)\n var tiddlerName = config.macros.formTiddler.getContainingTiddlerName(place);\n\n // Append a "form" element. \n var formName = "form"+formTemplateName+"__"+tiddlerName;\n var e = document.createElement("form");\n e.setAttribute("name", formName);\n place.appendChild(e);\n\n // "Embed" the elements defined by the templateText (i.e. the INPUT elements) \n // into the "form" element we just created\n wikify(templateText, e);\n\n // Initialize the INPUT elements.\n config.macros.formTiddler.initValuesAndHandlersInFormElements(formName, DataTiddler.getDataObject(tiddlerName));\n}\n\n\n// -------------------------------------------------------------------------------\n// Form Data Access \n// -------------------------------------------------------------------------------\n\n// Internal.\n//\n// Initialize the INPUT elements of the form with the values of their "matching"\n// data fields in the tiddler. Also setup the onChange handler to ensure that\n// changes in the INPUT elements are stored in the tiddler's data.\n//\nconfig.macros.formTiddler.initValuesAndHandlersInFormElements = function(formName, data) {\n // config.macros.formTiddler.trace("initValuesAndHandlersInFormElements(formName="+formName+", data="+data+")");\n\n // find the form\n var form = config.macros.formTiddler.findForm(formName);\n if (!form) {\n return;\n }\n\n try {\n var elems = form.elements;\n for (var i = 0; i < elems.length; i++) {\n var c = elems[i];\n \n var setter = config.macros.formTiddler.setter[c.type];\n if (setter) {\n var value = data[c.name];\n if (value != null) {\n setter(c, value);\n }\n c.onchange = onFormTiddlerChange;\n } else {\n config.macros.formTiddler.displayFormTiddlerError("No setter defined for INPUT element of type '"+c.type+"'. (Element '"+c.name+"' in form '"+formName+"')");\n }\n }\n } catch(e) {\n config.macros.formTiddler.displayFormTiddlerError("Error when updating elements with new formData. "+e);\n }\n}\n\n\n// Internal.\n//\n// @return [may be null]\n//\nconfig.macros.formTiddler.findForm = function(formName) {\n // We must manually iterate through the document's forms, since\n // IE does not support the "document[formName]" approach\n\n var forms = window.document.forms;\n for (var i = 0; i < forms.length; i++) {\n var form = forms[i];\n if (form.name == formName) {\n return form;\n }\n }\n\n return null;\n}\n\n\n// Internal.\n//\nconfig.macros.formTiddler.setSelectOneValue = function(element,value) {\n var n = element.options.length;\n for (var i = 0; i < n; i++) {\n element.options[i].selected = element.options[i].value == value;\n }\n}\n\n// Internal.\n//\nconfig.macros.formTiddler.setSelectMultipleValue = function(element,value) {\n var values = {};\n for (var i = 0; i < value.length; i++) {\n values[value[i]] = true;\n }\n \n var n = element.length;\n for (var i = 0; i < n; i++) {\n element.options[i].selected = !(!values[element.options[i].value]);\n }\n}\n\n// Internal.\n//\nconfig.macros.formTiddler.getSelectOneValue = function(element) {\n var i = element.selectedIndex;\n return (i >= 0) ? element.options[i].value : null;\n}\n\n// Internal.\n//\nconfig.macros.formTiddler.getSelectMultipleValue = function(element) {\n var values = [];\n var n = element.length;\n for (var i = 0; i < n; i++) {\n if (element.options[i].selected) {\n values.push(element.options[i].value);\n }\n }\n return values;\n}\n\n\n\n// -------------------------------------------------------------------------------\n// Helpers \n// -------------------------------------------------------------------------------\n\n// Internal.\n//\nconfig.macros.formTiddler.checkForExtensions = function(place,macroName) {\n if (!version.extensions.DataTiddlerPlugin) {\n config.macros.formTiddler.createErrorElement(place, "<<" + macroName + ">> requires the DataTiddlerPlugin. (You can get it from http://tiddlywiki.abego-software.de/#DataTiddlerPlugin)");\n return false;\n }\n return true;\n}\n\n// Internal.\n//\n// Displays a trace message in the "TiddlyWiki" message pane.\n// (used for debugging)\n//\nconfig.macros.formTiddler.trace = function(s) {\n displayMessage("Trace: "+s);\n}\n\n// Internal.\n//\n// Display some error message in the "TiddlyWiki" message pane.\n//\nconfig.macros.formTiddler.displayFormTiddlerError = function(s) {\n alert("FormTiddlerPlugin Error: "+s);\n}\n\n// Internal.\n//\n// Creates an element that holds an error message\n// \nconfig.macros.formTiddler.createErrorElement = function(place, message) {\n return createTiddlyElement(place,"span",null,"formTiddlerError",message);\n}\n\n// Internal.\n//\n// Returns the name of the tiddler containing the given element.\n// \nconfig.macros.formTiddler.getContainingTiddlerName = function(element) {\n return story.findContainingTiddler(element).id.substr(7);\n}\n\n// -------------------------------------------------------------------------------\n// Event Handlers \n// -------------------------------------------------------------------------------\n\n// This function must be called by the INPUT elements whenever their\n// data changes. Typically this is done through an "onChange" handler.\n//\nfunction onFormTiddlerChange (e) {\n // config.macros.formTiddler.trace("onFormTiddlerChange "+e);\n\n if (!e) var e = window.event;\n\n var target = resolveTarget(e);\n var tiddlerName = config.macros.formTiddler.getContainingTiddlerName(target);\n var getter = config.macros.formTiddler.getter[target.type];\n if (getter) {\n var value = getter(target);\n DataTiddler.setData(tiddlerName, target.name, value);\n } else {\n config.macros.formTiddler.displayFormTiddlerError("No getter defined for INPUT element of type '"+target.type+"'. (Element '"+target.name+"' used in tiddler '"+tiddlerName+"')");\n }\n}\n\n// ensure that the function can be used in HTML event handler\nwindow.onFormTiddlerChange = onFormTiddlerChange;\n\n\n// -------------------------------------------------------------------------------\n// Stylesheet Extensions (may be overridden by local StyleSheet)\n// -------------------------------------------------------------------------------\n\nsetStylesheet(\n ".formTiddlerError{color: #ffffff;background-color: #880000;}",\n "formTiddler");\n\n\n//============================================================================\n// checkForDataTiddlerPlugin Macro\n//============================================================================\n\nconfig.macros.checkForDataTiddlerPlugin = {\n // Standard Properties\n label: "checkForDataTiddlerPlugin",\n version: {major: 1, minor: 0, revision: 0, date: new Date(2005, 12, 14)},\n prompt: "Check if the DataTiddlerPlugin exists"\n}\n\nconfig.macros.checkForDataTiddlerPlugin.handler = function(place,macroName,params) {\n config.macros.formTiddler.checkForExtensions(place, config.macros.formTiddler.label);\n}\n\n\n\n//============================================================================\n// newTiddlerWithForm Macro\n//============================================================================\n\nconfig.macros.newTiddlerWithForm = {\n // Standard Properties\n label: "newTiddlerWithForm",\n version: {major: 1, minor: 0, revision: 1, date: new Date(2006, 1, 6)},\n prompt: "Creates a new Tiddler with a <<formTiddler ...>> macro"\n}\n\nconfig.macros.newTiddlerWithForm.handler = function(place,macroName,params) {\n // --- Parsing ------------------------------------------\n\n var i = 0; // index running over the params\n\n // get the name of the form template tiddler\n var formTemplateName = undefined;\n if (i < params.length) {\n formTemplateName = params[i];\n i++;\n }\n\n if (!formTemplateName) {\n config.macros.formTiddler.createErrorElement(place, "No form template specified in <<" + macroName + ">>.");\n return;\n }\n\n // get the button label\n var buttonLabel = undefined;\n if (i < params.length) {\n buttonLabel = params[i];\n i++;\n }\n\n if (!buttonLabel) {\n config.macros.formTiddler.createErrorElement(place, "No button label specified in <<" + macroName + ">>.");\n return;\n }\n\n // get the (optional) tiddlerName script and "askUser"\n var tiddlerNameScript = undefined;\n var askUser = false;\n if (i < params.length) {\n tiddlerNameScript = params[i];\n i++;\n\n if (i < params.length && params[i] == "askUser") {\n askUser = true;\n i++;\n }\n }\n\n // --- Processing ------------------------------------------\n\n if(!readOnly) {\n var onClick = function() {\n var tiddlerName;\n if (tiddlerNameScript) {\n try {\n tiddlerName = eval(tiddlerNameScript);\n } catch (ex) {\n }\n }\n if (!tiddlerName || askUser) {\n tiddlerName = prompt("Please specify a tiddler name.", askUser ? tiddlerName : "");\n }\n while (tiddlerName && store.getTiddler(tiddlerName)) {\n tiddlerName = prompt("A tiddler named '"+tiddlerName+"' already exists.\sn\sn"+"Please specify a tiddler name.", tiddlerName);\n }\n\n // tiddlerName is either null (user canceled) or a name that is not yet in the store.\n if (tiddlerName) {\n var body = "<<formTiddler [["+formTemplateName+"]]>>";\n var tags = [];\n store.saveTiddler(tiddlerName,tiddlerName,body,config.options.txtUserName,new Date(),tags);\n story.displayTiddler(null,tiddlerName,1);\n }\n }\n\n createTiddlyButton(place,buttonLabel,buttonLabel,onClick);\n }\n}\n\n//}}}\n\n\n/***\n!Licence and Copyright\nCopyright (c) abego Software ~GmbH, 2005 ([[www.abego-software.de|http://www.abego-software.de]])\n\nRedistribution and use in source and binary forms, with or without modification,\nare permitted provided that the following conditions are met:\n\nRedistributions of source code must retain the above copyright notice, this\nlist of conditions and the following disclaimer.\n\nRedistributions in binary form must reproduce the above copyright notice, this\nlist of conditions and the following disclaimer in the documentation and/or other\nmaterials provided with the distribution.\n\nNeither the name of abego Software nor the names of its contributors may be\nused to endorse or promote products derived from this software without specific\nprior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\nOF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\nSHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\nINCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\nTO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR\nBUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\nANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH\nDAMAGE.\n***/\n
/***\n|''Name:''|GenerateRssHijack|\n|''Description:''|Generate an RSSFeed with plaintext, html and TiddlyWiki content|\n|''Version:''|0.1.2|\n|''Date:''|Aug 16, 2006|\n|''Source:''|http://tiddlywiki.bidix.info/#GenerateRssHijack|\n|''Documentation:''|http://tiddlywiki.bidix.info/#GenerateRssHijackDoc|\n|''Author:''|BidiX (BidiX (at) bidix (dot) info)|\n|''License:''|[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D ]]|\n|''~CoreVersion:''|2.0.0|\n|''Browser:''|Firefox 1.5; InternetExplorer 6.0; Safari|\n|''Include:''|none|\n|''Require:''|none|\n***/\n//{{{\nversion.extensions.GenerateRssHijack= {\n major: 0, minor: 1, revision: 1, \n date: new Date(2006,7,6),\n source: 'http://tiddlywiki.bidix.info/#GenerateRssHijack',\n documentation: 'http://tiddlywiki.bidix.info/#GenerateRssHijackDoc',\n author: 'BidiX (BidiX (at) bidix (dot) info',\n license: '[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D]]',\n coreVersion: '2.0.0',\n browser: 'Firefox 1.5; InternetExplorer 6.0; Safari' \n};\n\n// Return the tiddlers as a sorted array\nTiddlyWiki.prototype.getTiddlersTaggedWith = function(field,includeTag)\n{\n var results = [];\n this.forEachTiddler(function(title,tiddler) {\n if(tiddler.tags.find(includeTag) != null)\n results.push(tiddler);\n });\n if(field)\n results.sort(function (a,b) {if(a[field] == b[field]) return(0); else return (a[field] < b[field]) ? -1 : +1; });\n return results;\n}\n\n// generate RSS file with tiddlers tagged with toRSS\nwindow.generateRss_ori = window.generateRss;\nwindow.generateRss = function ()\n{\n var s = [];\n var d = new Date();\n var u = store.getTiddlerText("SiteUrl",null);\n // Assemble the header \n s.push("<" + "?xml version=\s"1.0\s"" + " encoding='UTF-8'" + "?>");\n s.push("<rss version=\s"2.0\s" xmlns:tiddlywiki=\s"http://tiddlywiki.bidix.info/#TiddlyWikiNamespace\s" xmlns:content=\s"http://purl.org/rss/1.0/modules/content/\s">");\n s.push("<channel>");\n s.push("<title>" + wikifyPlain("SiteTitle").htmlEncode() + "</title>");\n if(u)\n s.push("<link>" + u.htmlEncode() + "</link>");\n s.push("<description>" + wikifyPlain("SiteSubtitle").htmlEncode() + "</description>");\n s.push("<language>en-us</language>");\n s.push("<copyright>Copyright " + d.getFullYear() + " " + config.options.txtUserName.htmlEncode() + "</copyright>");\n s.push("<pubDate>" + d.toGMTString() + "</pubDate>");\n s.push("<lastBuildDate>" + d.toGMTString() + "</lastBuildDate>");\n s.push("<docs>http://blogs.law.harvard.edu/tech/rss</docs>");\n s.push("<generator>TiddlyWiki " + version.major + "." + version.minor + "." + version.revision + "</generator>");\n // The body\n var tiddlers = store.getTiddlersTaggedWith("modified","toRSS");\n var n = config.numRssItems > tiddlers.length ? 0 : tiddlers.length-config.numRssItems;\n for (var t=tiddlers.length-1; t>=n; t--)\n s.push(tiddlers[t].saveToRss(u));\n // And footer\n s.push("</channel>");\n s.push("</rss>");\n // Save it all\n return s.join("\sn");\n}\n\nTiddler.prototype.getAsInnerHTML = function() {\n var wrapper = createTiddlyElement(document.body,"span",null,null);\n wikify(this.text,wrapper ,null,this);\n var text = wrapper.innerHTML;\n wrapper.parentNode.removeChild(wrapper);\n //replace tddlylink with externallink\n var u = store.getTiddlerText("SiteUrl",null);\nvar pattern;\nvar substitution;\n if ((version.major = 2) && (version.minor > 0)) {\n pattern = /<a\ss+title=\s"([^"]+)\s"\ss+tiddlylink="([^"]+)"\ss+refresh="link"\ss+class=\s"([^"]+)\s"\ss+href="([^"]+)"/mg;\n substitution = "<a title=\s"$1\s" tiddlylink=\s"$2\s" refresh=\s"link\s" class=\s"$3\s" href=\s""+u+"#$2\s"";\n }\n else {\n pattern = /<a\ss+tiddlylink="([^"]+)"\ss+refresh="link"\ss+title="([^"]+)"\ss+href="([^"]+)"/mg;\n substitution = "<a tiddlylink=\s"$1\s" refresh=\s"link\s" title=\s"$2\s" href=\s""+u+"#$1\s"";\n }\n text = text.replace(pattern, substitution);\n return text;\n};\n\nTiddler.prototype.saveToRss = function(url)\n{\n var s = [];\n s.push("<item>");\n s.push("<title>" + this.title.htmlEncode() + "</title>");\n //plain text\n s.push("<description>" + this.text.replace(regexpNewLine,"<br />").htmlEncode() + "</description>");\n // html text\n s.push("<content:encoded><![CDATA[ " + this.getAsInnerHTML() +"]]></content:encoded>");\n // tiddler\n s.push("<tiddlywiki:title>" + this.title.htmlEncode() + "</tiddlywiki:title>");\n s.push("<tiddlywiki:wikitext>" + this.text.htmlEncode() + "</tiddlywiki:wikitext>");\n s.push("<tiddlywiki:modifier>" + this.modifier.htmlEncode() + "</tiddlywiki:modifier>");\n s.push("<tiddlywiki:modified>" + this.modified.convertToYYYYMMDDHHMM() + "</tiddlywiki:modified>");\n s.push("<tiddlywiki:created>" + this.created.convertToYYYYMMDDHHMM() + "</tiddlywiki:created>");\n //s.push("<tiddlywiki:links>" + this.text.htmlEncode() + "</tiddlywiki:links>");\n s.push("<tiddlywiki:tags>" + this.getTags().htmlEncode() + "</tiddlywiki:tags>");\n for(var t=0; t<this.tags.length; t++)\n s.push("<category>" + this.tags[t] + "</category>");\n s.push("<link>" + url + "#" + encodeURIComponent(String.encodeTiddlyLink(this.title)) + "</link>");\n s.push("<pubDate>" + this.modified.toGMTString() + "</pubDate>");\n s.push("</item>");\n return(s.join("\sn"));\n}\n//}}}
//last update: GenerateRssHijack v 0.1.2//\n\n\n!Description\n* This plugin hijacks the core generateRSS() function.\n* It uses a specific tag (toRSS) to select tiddlers to export to the RSSFeed\n* It extends the generated {{{item}}} element with : \n**{{{content:encoded}}}: the wikified text of the tiddler. All TiddlyLink {{{href}}} are replaced by absolute external {{{href}}} (siteUrl/#[[tiddlerTitle]] for example http://TiddlyWiki.bidix.info/#GenerateRssHijackDoc).\n**{{{tiddlywiki:XXX}}}: tiddler Attributes in a tiddlywiki name space. See http://tiddlywiki.bidix.info/#TiddlyWikiNamespace for details.\n\n!Usage\n*the generated xml file has been tested with :\n**RSSReaderMacro: a internal RSS Reader based on BramChen's RssNewsMacro\n**[[news.php]]: http://news.bidix.info/ a php rss reader with TiddlyWiki stylesheet\n**Netvibes : http://www.netvibes.com/\n**GoogleRssReader: http://www.google.com/reader/view/feed/http://tiddlywiki.bidix.info/BidiXTW.xml\n**Sage FireFox extension: http://sage.mozdev.org/\n*It could be used to export/import tiddlers on a RSSFeed base.\n\n!Revision history\n* V0.1.2 (16/08/2006)\n** TiddlyLink format has changed in TiddliWiki 2.1\n* v0.1.1 (06/08/2006)\n** small compatibility issue with TiddliWiki 2.1 (4th parameter in call to wikify)\n* v0.1.0 (20/04/2006)\n** initial release\n\n\n\n\n
|>|>| !Guía de Instrumentos |\n|<<tiddlerList tags: documentación,-etiquetasusuales format:"table" header:"Documentación" >>|<<tiddlerList tags: clasificación,-etiquetasusuales format:"table" header:"Instrumentos" >>|
* StyleSheet\n* StyleSheetColors\n* StyleSheetLayout\n* StyleSheetPrint
/***\n|''Name:''|ImportTiddlersPlugin|\n|''Source:''|http://www.TiddlyTools.com/#ImportTiddlersPlugin|\n|''Author:''|Eric Shulman - ELS Design Studios|\n|''License:''|[[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|\n|''~CoreVersion:''|2.0.10|\n\nWhen many people share and edit copies of the same TiddlyWiki document, the ability to quickly collect all these changes back into a single, updated document that can then be redistributed to the entire group is very important. It can also be very extremely helpful when moving your own tiddlers from document to document (e.g., when upgrading to the latest version of TiddlyWiki, or 'pre-loading' your favorite stylesheets into a new 'empty' TiddlyWiki document.)\n\nThis plugin lets you selectively combine tiddlers from any two TiddlyWiki documents. An interactive control panel lets you pick a document to import from, and then select which tiddlers to import, with prompting for skip, rename, merge or replace actions when importing tiddlers that match existing titles. Automatically add tags to imported tiddlers so they are easy to find later on. Generates a detailed report of import 'history' in ImportedTiddlers.\n!!!!!Interactive interface\n<<<\n{{{<<importTiddlers>>}}}\ncreates "import tiddlers" link. click to show/hide import control panel\n\n{{{<<importTiddlers inline>>}}}\ncreates import control panel directly in tiddler content\n\n<<importTiddlers inline>>\n\nPress ''[browse]'' to select a TiddlyWiki document file to import. You can also type in the path/filename or a remote document URL (starting with http://)and press ''[open]''. //Note: There may be some delay to permit the browser time to access and load the document before updating the listbox with the titles of all tiddlers that are available to be imported.//\n\nSelect one or more titles from the listbox (hold CTRL or SHIFT while clicking to add/remove the highlight from individual list items). You can press ''[select all]'' to quickly highlight all tiddler titles in the list. Use the ''[-]'', ''[+]'', or ''[=]'' links to adjust the listbox size so you can view more (or less) tiddler titles at one time. When you have chosen the tiddlers you want to import and entered any extra tags, press ''[import]'' to begin copying them to the current TiddlyWiki document.\n\n''select: all, new, changes, or differences''\n\nYou can click on ''all'', ''new'', ''changes'', or ''differences'' to automatically select a subset of tiddlers from the list. This makes it very quick and easy to find and import just the updated tiddlers you are interested in:\n>''"all"'' selects ALL tiddlers from the import source document, even if they have not been changed.\n>''"new"'' selects only tiddlers that are found in the import source document, but do not yet exist in the destination document\n>''"changes"'' selects only tiddlers that exist in both documents but that are newer in the source document\n>''"differences"'' selects all new and existing tiddlers that are different from the destination document (even if destination tiddler is newer)\n\n''Import Tagging:''\n\nTiddlers that have been imported can be automatically tagged, so they will be easier to find later on, after they have been added to your document. New tags are entered into the "add tags" input field, and then //added// to the existing tags for each tiddler as it is imported.\n\n''Skip, Rename, Merge, or Replace:''\n\nWhen importing a tiddler whose title is identical to one that already exists, the import process pauses and the tiddler title is displayed in an input field, along with four push buttons: ''[skip]'', ''[rename]'', ''[merge]'' and ''[replace]''.\n\nTo bypass importing this tiddler, press ''[skip]''. To import the tiddler with a different name (so that both the tiddlers will exist when the import is done), enter a new title in the input field and then press ''[rename]''. Press ''[merge]'' to combine the content from both tiddlers into a single tiddler. Press ''[replace]'' to overwrite the existing tiddler with the imported one, discarding the previous tiddler content.\n\n//Note: if both the title ''and'' modification date/////time match, the imported tiddler is assumed to be identical to the existing one, and will be automatically skipped (i.e., not imported) without asking.//\n\n''Import Report History''\n\nWhen tiddlers are imported, a report is generated into ImportedTiddlers, indicating when the latest import was performed, the number of tiddlers successfully imported, from what location, and by whom. It also includes a list with the title, date and author of each tiddler that was imported.\n\nWhen the import process is completed, the ImportedTiddlers report is automatically displayed for your review. If more tiddlers are subsequently imported, a new report is //added// to ImportedTiddlers, above the previous report (i.e., at the top of the tiddler), so that a reverse-chronological history of imports is maintained.\n\nIf a cumulative record is not desired, the ImportedTiddlers report may be deleted at any time. A new ImportedTiddlers report will be created the next time tiddlers are imported.\n\nNote: You can prevent the ImportedTiddlers report from being generated for any given import activity by clearing the "create a report" checkbox before beginning the import processing.\n\n<<<\n!!!!!non-interactive 'load tiddlers' macro\n<<<\nUseful for automated installation/update of plugins and other tiddler content.\n\n{{{<<loadTiddlers "label:load tiddlers from %0" http://www.tiddlytools.com/example.html confirm>>}}}\n<<loadTiddlers "label:load tiddlers from %0" http://www.tiddlytools.com/example.html confirm>>\n\nSyntax:\n{{{<<loadTiddlers label:text prompt:text filter source quiet confirm>>}}}\n\n''label:text'' and ''prompt:text''\n>defines link text and tooltip (prompt) that can be clicked to trigger the load tiddler processing. If a label is NOT provided, then no link is created and loadTiddlers() is executed whenever the containing tiddler is rendered.\n''filter'' (optional) determines which tiddlers will be automatically selected for importing. Use one of the following keywords:\n>''"all"'' retrieves ALL tiddlers from the import source document, even if they have not been changed.\n>''"new"'' retrieves only tiddlers that are found in the import source document, but do not yet exist in the destination document\n>''"changes"'' retrieves only tiddlers that exist in both documents for which the import source tiddler is newer than the existing tiddler\n>''"updates"'' retrieves both ''new'' and ''changed'' tiddlers (this is the default action when none is specified)\n>''"tiddler:~TiddlerName"'' retrieves only the specific tiddler named in the parameter.\n>''"tag:text"'' retrieves only the tiddlers tagged with the indicated text.\n''source'' (required) is the location of the imported document. It can be either a local document path/filename in whatever format your system requires, or a remote web location (starting with "http://" or "https://")\n>use the keyword ''ask'' to prompt for a source location whenever the macro is invoked\n''"quiet"'' (optional)\n>supresses all status message during the import processing (e.g., "opening local file...", "found NN tiddlers..." etc). Note that if ANY tiddlers are actualy imported, a final information message will still be displayed (along with the ImportedTiddlers report), even when 'quiet' is specified. This ensures that changes to your document cannot occur without any visible indication at all.\n''"confirm"'' (optional)\n>adds interactive confirmation. A browser message box (OK/Cancel) is displayed for each tiddler that will be imported, so that you can manually bypass any tiddlers that you do not want to import.\n<<<\n!!!!!Installation\n<<<\ncopy/paste the following tiddlers into your document:\n''ImportTiddlersPlugin'' (tagged with <<tag systemConfig>>)\n\ncreate/edit ''SideBarOptions'': (sidebar menu items) \n^^Add "< < ImportTiddlers > >" macro^^\n\n''Quick Installation Tip #1:''\nIf you are using an unmodified version of TiddlyWiki (core release version <<version>>), you can get a new, empty TiddlyWiki with the Import Tiddlers plugin pre-installed (''[[download from here|TW+ImportExport.html]]''), and then simply import all your content from your old document into this new, empty document.\n<<<\n!!!!!Revision History\n<<<\n''2006.10.12 [3.0.8]'' in readTiddlersFromHTML(), fallback to find end of store area by matching "/body" when POST-BODY-START is not present (backward compatibility for older documents)\n''2006.09.10 [3.0.7]'' in readTiddlersFromHTML(), find end of store area by matching "POST-BODY-START" instead of "/body" \n''2006.08.16 [3.0.6]'' Use higher-level store.saveTiddler() instead of store.addTiddler() to avoid conflicts with ZW and other adaptations that hijack low-level tiddler handling. Also, in CreateImportPanel(), no longer register notify to "refresh listbox after every tiddler change" (left over from old 'auto-filtered' list handling). Thanks to Bob McElrath for report/solution.\n''2006.07.29 [3.0.5]'' added noChangeMsg to loadTiddlers processing. if not 'quiet' mode, reports skipped tiddlers.\n''2006.04.18 [3.0.4]'' in loadTiddlers.handler, fixed parsing of "prompt:" param. Also, corrected parameters mismatch in loadTiddlers() callback function definition (order of params was wrong, resulting in filters NOT being applied)\n''2006.04.12 [3.0.3]'' moved many display messages to macro properties for easier L10N translations via 'lingo' definitions.\n''2006.04.12 [3.0.2]'' additional refactoring of 'core candidate' code. Proposed API now defines "loadRemoteFile()" for XMLHttpRequest processing with built in fallback for handling local filesystem access, and readTiddlersFromHTML() to process the resulting source HTML content.\n''2006.04.04 [3.0.1]'' in refreshImportList(), when using [by tags], tiddlers without tags are now included in a new "untagged" psuedo-tag list section\n''2006.04.04 [3.0.0]'' Separate non-interactive {{{<<importTiddlers...>>}}} macro functionality for incorporation into TW2.1 core and renamed as {{{<<loadTiddlers>>}}} macro. New parameters for loadTiddlers: ''label:text'' and ''prompt:text'' for link creation, ''ask'' for filename/URL, ''tag:text'' for filtering, "confirm" for accept/reject of individual inbound tiddlers. Also, ImportedTiddlers report generator output has been simplified and "importReplace/importPublic" tags and associated "force" param (which were rarely, if ever, used) has been dropped.\n''2006.03.30 [2.9.1]'' when extracting store area from remote URL, look for "</body>" instead of "</body>\sn</html>" so it will match even if the "\sn" is absent from the source.\n''2006.03.30 [2.9.0]'' added optional 'force' macro param. When present, autoImportTiddlers() bypasses the checks for importPublic and importReplace. Based on a request from Tom Otvos.\n''2006.03.28 [2.8.1]'' in loadImportFile(), added checks to see if 'netscape' and 'x.overrideMimeType()' are defined (IE does *not* define these values, so we bypass this code)\nAlso, when extracting store area from remote URL, explicitly look for "</body>\sn</html>" to exclude any extra content that may have been added to the end of the file by hosting environments such as GeoCities. Thanks to Tom Otvos for finding these bugs and suggesting some fixes.\n''2006.02.21 [2.8.0]'' added support for "tiddler:TiddlerName" filtering parameter in auto-import processing\n''2006.02.21 [2.7.1]'' Clean up layout problems with IE. (Use tables for alignment instead of SPANs styled with float:left and float:right)\n''2006.02.21 [2.7.0]'' Added "local file" and "web server" radio buttons for selecting dynamic import source controls in ImportPanel. Default file control is replaced with URL text input field when "web server" is selected. Default remote document URL is defined in SiteURL tiddler. Also, added option for prepending SiteProxy URL as prefix to remote URL to mask cross-domain document access (requires compatible server-side script)\n''2006.02.17 [2.6.0]'' Removed "differences only" listbox display mode, replaced with selection filter 'presets': all/new/changes/differences. Also fixed initialization handling for "add new tags" so that checkbox state is correctly tracked when panel is first displayed.\n''2006.02.16 [2.5.4]'' added checkbox options to control "import remote tags" and "keep existing tags" behavior, in addition to existing "add new tags" functionality.\n''2006.02.14 [2.5.3]'' FF1501 corrected unintended global 't' (loop index) in importReport() and autoImportTiddlers()\n''2006.02.10 [2.5.2]'' corrected unintended global variable in importReport().\n''2006.02.05 [2.5.1]'' moved globals from window.* to config.macros.importTiddlers.* to avoid FireFox crash bug when referencing globals\n''2006.01.18 [2.5.0]'' added checkbox for "create a report". Default is to create/update the ImportedTiddlers report. Clear the checkbox to skip this step.\n''2006.01.15 [2.4.1]'' added "importPublic" tag and inverted default so that auto sharing is NOT done unless tagged with importPublic\n''2006.01.15 [2.4.0]'' Added support for tagging individual tiddlers with importSkip, importReplace, and/or importPrivate to control which tiddlers can be overwritten or shared with others when using auto-import macro syntax. Defaults are to SKIP overwriting existing tiddlers with imported tiddlers, and ALLOW your tiddlers to be auto-imported by others.\n''2006.01.15 [2.3.2]'' Added "ask" parameter to confirm each tiddler before importing (for use with auto-importing)\n''2006.01.15 [2.3.1]'' Strip TW core scripts from import source content and load just the storeArea into the hidden IFRAME. Makes loading more efficient by reducing the document size and by preventing the import document from executing its TW initialization (including plugins). Seems to resolve the "Found 0 tiddlers" problem. Also, when importing local documents, use convertUTF8ToUnicode() to convert the file contents so support international characters sets.\n''2006.01.12 [2.3.0]'' Reorganized code to use callback function for loading import files to support event-driven I/O via an ASYNCHRONOUS XMLHttpRequest. Let's processing continue while waiting for remote hosts to respond to URL requests. Added non-interactive 'batch' macro mode, using parameters to specify which tiddlers to import, and from what document source. Improved error messages and diagnostics, plus an optional 'quiet' switch for batch mode to eliminate //most// feedback.\n''2006.01.11 [2.2.0]'' Added "[by tags]" to list of tiddlers, based on code submitted by BradleyMeck\n''2006.01.09 [2.1.1]'' When a URL is typed in, and then the "open" button is pressed, it generates both an onChange event for the file input and a click event for open button. This results in multiple XMLHttpRequest()'s which seem to jam things up quite a bit. I removed the onChange handling for file input field. To open a file (local or URL), you must now explicitly press the "open" button in the control panel.\n''2006.01.08 [2.1.0]'' IMPORT FROM ANYWHERE!!! re-write getImportedTiddlers() logic to either read a local file (using local I/O), OR... read a remote file, using a combination of XML and an iframe to permit cross-domain reading of DOM elements. Adapted from example code and techniques courtesy of Jonny LeRoy.\n''2006.01.06 [2.0.2]'' When refreshing list contents, fixed check for tiddlerExists() when "show differences only" is selected, so that imported tiddlers that don't exist in the current file will be recognized as differences and included in the list.\n''2006.01.04 [2.0.1]'' When "show differences only" is NOT checked, import all tiddlers that have been selected even when they have a matching title and date.\n''2005.12.27 [2.0.0]'' Update for TW2.0\nDefer initial panel creation and only register a notification function when panel first is created\n''2005.12.22 [1.3.1]'' tweak formatting in importReport() and add 'discard report' link to output\n''2005.12.03 [1.3.0]'' Dynamically create/remove importPanel as needed to ensure only one instance of interface elements exists, even if there are multiple instances of macro embedding. Also, dynamically create/recreate importFrame each time an external TW document is loaded for importation (reduces DOM overhead and ensures a 'fresh' frame for each document)\n''2005.11.29 [1.2.1]'' fixed formatting of 'detail info' in importReport()\n''2005.11.11 [1.2.0]'' added 'inline' param to embed controls in a tiddler\n''2005.11.09 [1.1.0]'' only load HTML and CSS the first time the macro handler is called. Allows for redundant placement of the macro without creating multiple instances of controls with the same ID's.\n''2005.10.25 [1.0.5]'' fixed typo in importReport() that prevented reports from being generated\n''2005.10.09 [1.0.4]'' combined documentation with plugin code instead of using separate tiddlers\n''2005.08.05 [1.0.3]'' moved CSS and HTML definitions into plugin code instead of using separate tiddlers\n''2005.07.27 [1.0.2]'' core update 1.2.29: custom overlayStyleSheet() replaced with new core setStylesheet()\n''2005.07.23 [1.0.1]'' added parameter checks and corrected addNotification() usage\n''2005.07.20 [1.0.0]'' Initial Release\n<<<\n!!!!!Credits\n<<<\nThis feature was developed by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]]\n<<<\n!!!!!Code\n***/\n// // ''MACRO DEFINITION''\n//{{{\n// Version\nversion.extensions.importTiddlers = {major: 3, minor: 0, revision: 8, date: new Date(2006,10,12)};\n\n// IE needs explicit global scoping for functions/vars called from browser events\nwindow.onClickImportButton=onClickImportButton;\nwindow.refreshImportList=refreshImportList;\n\n// default cookie/option values\nif (!config.options.chkImportReport) config.options.chkImportReport=true;\n\nconfig.macros.importTiddlers = { };\nconfig.macros.importTiddlers = {\n label: "import tiddlers",\n prompt: "Copy tiddlers from another document",\n foundMsg: "Found %0 tiddlers in %1",\n countMsg: "%0 tiddlers selected for import",\n importedMsg: "Imported %0 of %1 tiddlers from %2",\n src: "", // path/filename or URL of document to import (retrieved from SiteUrl tiddler)\n proxy: "", // URL for remote proxy script (retrieved from SiteProxy tiddler)\n useProxy: false, // use specific proxy script in front of remote URL\n inbound: null, // hash-indexed array of tiddlers from other document\n newTags: "", // text of tags added to imported tiddlers\n addTags: true, // add new tags to imported tiddlers\n listsize: 8, // # of lines to show in imported tiddler list\n importTags: true, // include tags from remote source document when importing a tiddler\n keepTags: true, // retain existing tags when replacing a tiddler\n index: 0, // current processing index in import list\n sort: "" // sort order for imported tiddler listbox\n};\n\nconfig.macros.importTiddlers.handler = function(place,macroName,params) {\n if (!config.macros.loadTiddlers.handler)\n { alert("importTiddlers error: this plugin requires LoadTiddlersPlugin or TiddlyWiki 2.1+"); return; }\n if (!params[0]) // LINK TO FLOATING PANEL\n createTiddlyButton(place,this.label,this.prompt,onClickImportMenu);\n else if (params[0]=="inline") {// // INLINE TIDDLER CONTENT\n createImportPanel(place);\n document.getElementById("importPanel").style.position="static";\n document.getElementById("importPanel").style.display="block";\n }\n else config.macros.loadTiddlers.handler(place,macroName,params); // FALLBACK: PASS TO LOADTIDDLERS\n}\n//}}}\n\n// // ''INTERFACE DEFINITION''\n\n// // Handle link click to create/show/hide control panel\n//{{{\nfunction onClickImportMenu(e)\n{\n if (!e) var e = window.event;\n var parent=resolveTarget(e).parentNode;\n var panel = document.getElementById("importPanel");\n if (panel==undefined || panel.parentNode!=parent)\n panel=createImportPanel(parent);\n var isOpen = panel.style.display=="block";\n if(config.options.chkAnimate)\n anim.startAnimating(new Slider(panel,!isOpen,e.shiftKey || e.altKey,"none"));\n else\n panel.style.display = isOpen ? "none" : "block" ;\n e.cancelBubble = true;\n if (e.stopPropagation) e.stopPropagation();\n return(false);\n}\n//}}}\n\n// // Create control panel: HTML, CSS\n//{{{\nfunction createImportPanel(place) {\n var panel=document.getElementById("importPanel");\n if (panel) { panel.parentNode.removeChild(panel); }\n setStylesheet(config.macros.importTiddlers.css,"importTiddlers");\n panel=createTiddlyElement(place,"span","importPanel",null,null)\n panel.innerHTML=config.macros.importTiddlers.html;\n refreshImportList();\n var siteURL=store.getTiddlerText("SiteUrl"); if (!siteURL) siteURL="";\n document.getElementById("importSourceURL").value=siteURL;\n config.macros.importTiddlers.src=siteURL;\n var siteProxy=store.getTiddlerText("SiteProxy"); if (!siteProxy) siteProxy="SiteProxy";\n document.getElementById("importSiteProxy").value=siteProxy;\n config.macros.importTiddlers.proxy=siteProxy;\n return panel;\n}\n//}}}\n\n// // CSS\n//{{{\nconfig.macros.importTiddlers.css = '\s\n#importPanel {\s\n display: none; position:absolute; z-index:11; width:35em; right:105%; top:3em;\s\n background-color: #eee; color:#000; font-size: 8pt; line-height:110%;\s\n border:1px solid black; border-bottom-width: 3px; border-right-width: 3px;\s\n padding: 0.5em; margin:0em; -moz-border-radius:1em;\s\n}\s\n#importPanel a, #importPanel td a { color:#009; display:inline; margin:0px; padding:1px; }\s\n#importPanel table { width:100%; border:0px; padding:0px; margin:0px; font-size:8pt; line-height:110%; background:transparent; }\s\n#importPanel tr { border:0px;padding:0px;margin:0px; background:transparent; }\s\n#importPanel td { color:#000; border:0px;padding:0px;margin:0px; background:transparent; }\s\n#importPanel select { width:98%;margin:0px;font-size:8pt;line-height:110%;}\s\n#importPanel input { width:98%;padding:0px;margin:0px;font-size:8pt;line-height:110%}\s\n#importPanel .box { border:1px solid black; padding:3px; margin-bottom:5px; background:#f8f8f8; -moz-border-radius:5px;}\s\n#importPanel .topline { border-top:2px solid black; padding-top:3px; margin-bottom:5px; }\s\n#importPanel .rad { width:auto; }\s\n#importPanel .chk { width:auto; margin:1px;border:0; }\s\n#importPanel .btn { width:auto; }\s\n#importPanel .btn1 { width:98%; }\s\n#importPanel .btn2 { width:48%; }\s\n#importPanel .btn3 { width:32%; }\s\n#importPanel .btn4 { width:24%; }\s\n#importPanel .btn5 { width:19%; }\s\n#importPanel .importButton { padding: 0em; margin: 0px; font-size:8pt; }\s\n#importPanel .importListButton { padding:0em 0.25em 0em 0.25em; color: #000000; display:inline }\s\n#importCollisionPanel { display:none; margin:0.5em 0em 0em 0em; }\s\n';\n//}}}\n\n// // HTML \n//{{{\nconfig.macros.importTiddlers.html = '\s\n<!-- source and report -->\s\n<table><tr><td align=left>\s\n import from\s\n <input type="radio" class="rad" name="importFrom" value="file" CHECKED\s\n onClick="document.getElementById(\s'importLocalPanel\s').style.display=this.checked?\s'block\s':\s'none\s';\s\n document.getElementById(\s'importHTTPPanel\s').style.display=!this.checked?\s'block\s':\s'none\s'"> local file\s\n <input type="radio" class="rad" name="importFrom" value="http"\s\n onClick="document.getElementById(\s'importLocalPanel\s').style.display=!this.checked?\s'block\s':\s'none\s';\s\n document.getElementById(\s'importHTTPPanel\s').style.display=this.checked?\s'block\s':\s'none\s'"> web server\s\n</td><td align=right>\s\n <input type=checkbox class="chk" id="chkImportReport" checked\s\n onClick="config.options[\s'chkImportReport\s']=this.checked;"> create a report\s\n</td></tr></table>\s\n<!-- import from local file -->\s\n<div id="importLocalPanel" style="display:block;margin-bottom:5px;margin-top:5px;padding-top:3px;border-top:1px solid #999">\s\nlocal document path/filename:<br>\s\n<input type="file" id="fileImportSource" size=57 style="width:100%"\s\n onKeyUp="config.macros.importTiddlers.src=this.value"\s\n onChange="config.macros.importTiddlers.src=this.value;">\s\n</div><!--panel-->\s\n\s\n<!-- import from http server -->\s\n<div id="importHTTPPanel" style="display:none;margin-bottom:5px;margin-top:5px;padding-top:3px;border-top:1px solid #999">\s\n<table><tr><td align=left>\s\n remote document URL:<br>\s\n</td><td align=right>\s\n <input type="checkbox" class="chk" id="importUseProxy"\s\n onClick="config.macros.importTiddlers.useProxy=this.checked;\s\n document.getElementById(\s'importSiteProxy\s').style.display=this.checked?\s'block\s':\s'none\s'"> use a proxy script\s\n</td></tr></table>\s\n<input type="text" id="importSiteProxy" style="display:none;margin-bottom:1px" onfocus="this.select()" value="SiteProxy"\s\n onKeyUp="config.macros.importTiddlers.proxy=this.value"\s\n onChange="config.macros.importTiddlers.proxy=this.value;">\s\n<input type="text" id="importSourceURL" onfocus="this.select()" value="SiteUrl"\s\n onKeyUp="config.macros.importTiddlers.src=this.value"\s\n onChange="config.macros.importTiddlers.src=this.value;">\s\n</div><!--panel-->\s\n\s\n<table><tr><td align=left>\s\n select:\s\n <a href="JavaScript:;" id="importSelectAll"\s\n onclick="onClickImportButton(this)" title="select all tiddlers">\s\n &nbsp;all&nbsp;</a>\s\n <a href="JavaScript:;" id="importSelectNew"\s\n onclick="onClickImportButton(this)" title="select tiddlers not already in destination document">\s\n &nbsp;added&nbsp;</a> \s\n <a href="JavaScript:;" id="importSelectChanges"\s\n onclick="onClickImportButton(this)" title="select tiddlers that have been updated in source document">\s\n &nbsp;changes&nbsp;</a> \s\n <a href="JavaScript:;" id="importSelectDifferences"\s\n onclick="onClickImportButton(this)" title="select tiddlers that have been added or are different from existing tiddlers">\s\n &nbsp;differences&nbsp;</a> \s\n <a href="JavaScript:;" id="importToggleFilter"\s\n onclick="onClickImportButton(this)" title="show/hide selection filter">\s\n &nbsp;filter&nbsp;</a> \s\n</td><td align=right>\s\n <a href="JavaScript:;" id="importListSmaller"\s\n onclick="onClickImportButton(this)" title="reduce list size">\s\n &nbsp;&#150;&nbsp;</a>\s\n <a href="JavaScript:;" id="importListLarger"\s\n onclick="onClickImportButton(this)" title="increase list size">\s\n &nbsp;+&nbsp;</a>\s\n <a href="JavaScript:;" id="importListMaximize"\s\n onclick="onClickImportButton(this)" title="maximize/restore list size">\s\n &nbsp;=&nbsp;</a>\s\n</td></tr></table>\s\n<select id="importList" size=8 multiple\s\n onchange="setTimeout(\s'refreshImportList(\s'+this.selectedIndex+\s')\s',1)">\s\n <!-- NOTE: delay refresh so list is updated AFTER onchange event is handled -->\s\n</select>\s\n<input type=checkbox class="chk" id="chkAddTags" checked\s\n onClick="config.macros.importTiddlers.addTags=this.checked;">add new tags &nbsp;\s\n<input type=checkbox class="chk" id="chkImportTags" checked\s\n onClick="config.macros.importTiddlers.importTags=this.checked;">import source tags &nbsp;\s\n<input type=checkbox class="chk" id="chkKeepTags" checked\s\n onClick="config.macros.importTiddlers.keepTags=this.checked;">keep existing tags<br>\s\n<input type=text id="txtNewTags" size=15 onKeyUp="config.macros.importTiddlers.newTags=this.value" autocomplete=off>\s\n<div align=center>\s\n <input type=button id="importOpen" class="importButton" style="width:32%" value="open"\s\n onclick="onClickImportButton(this)">\s\n <input type=button id="importStart" class="importButton" style="width:32%" value="import"\s\n onclick="onClickImportButton(this)">\s\n <input type=button id="importClose" class="importButton" style="width:32%" value="close"\s\n onclick="onClickImportButton(this)">\s\n</div>\s\n<div id="importCollisionPanel">\s\n tiddler already exists:\s\n <input type=text id="importNewTitle" size=15 autocomplete=off">\s\n <div align=center>\s\n <input type=button id="importSkip" class="importButton" style="width:23%" value="skip"\s\n onclick="onClickImportButton(this)">\s\n <input type=button id="importRename" class="importButton" style="width:23%" value="rename"\s\n onclick="onClickImportButton(this)">\s\n <input type=button id="importMerge" class="importButton" style="width:23%" value="merge"\s\n onclick="onClickImportButton(this)">\s\n <input type=button id="importReplace" class="importButton" style="width:23%" value="replace"\s\n onclick="onClickImportButton(this)">\s\n </div>\s\n</div>\s\n';\n//}}}\n\n// // Control interactions\n//{{{\nfunction onClickImportButton(which)\n{\n // DEBUG alert(which.id);\n var theList = document.getElementById('importList');\n if (!theList) return;\n var thePanel = document.getElementById('importPanel');\n var theCollisionPanel = document.getElementById('importCollisionPanel');\n var theNewTitle = document.getElementById('importNewTitle');\n var count=0;\n switch (which.id)\n {\n case 'fileImportSource':\n case 'importOpen': // load import source into hidden frame\n importReport(); // if an import was in progress, generate a report\n config.macros.importTiddlers.inbound=null; // clear the imported tiddler buffer\n refreshImportList(); // reset/resize the listbox\n if (config.macros.importTiddlers.src=="") break;\n // Load document into hidden iframe so we can read it's DOM and fill the list\n loadRemoteFile(config.macros.importTiddlers.src, function(src,txt) {\n var tiddlers = readTiddlersFromHTML(txt);\n var count=tiddlers?tiddlers.length:0;\n displayMessage(config.macros.importTiddlers.foundMsg.format([count,src]));\n config.macros.importTiddlers.inbound=tiddlers;\n window.refreshImportList(0);\n });\n break;\n case 'importSelectAll': // select all tiddler list items (i.e., not headings)\n importReport(); // if an import was in progress, generate a report\n for (var t=0,count=0; t < theList.options.length; t++) {\n if (theList.options[t].value=="") continue;\n theList.options[t].selected=true;\n count++;\n }\n clearMessage(); displayMessage(config.macros.importTiddlers.countMsg.format([count]));\n break;\n case 'importSelectNew': // select tiddlers not in current document\n importReport(); // if an import was in progress, generate a report\n for (var t=0,count=0; t < theList.options.length; t++) {\n theList.options[t].selected=false;\n if (theList.options[t].value=="") continue;\n theList.options[t].selected=!store.tiddlerExists(theList.options[t].value);\n count+=theList.options[t].selected?1:0;\n }\n clearMessage(); displayMessage(config.macros.importTiddlers.countMsg.format([count]));\n break;\n case 'importSelectChanges': // select tiddlers that are updated from existing tiddlers\n importReport(); // if an import was in progress, generate a report\n for (var t=0,count=0; t < theList.options.length; t++) {\n theList.options[t].selected=false;\n if (theList.options[t].value==""||!store.tiddlerExists(theList.options[t].value)) continue;\n for (var i=0; i<config.macros.importTiddlers.inbound.length; i++) // find matching inbound tiddler\n { var inbound=config.macros.importTiddlers.inbound[i]; if (inbound.title==theList.options[t].value) break; }\n theList.options[t].selected=(inbound.modified-store.getTiddler(theList.options[t].value).modified>0); // updated tiddler\n count+=theList.options[t].selected?1:0;\n }\n clearMessage(); displayMessage(config.macros.importTiddlers.countMsg.format([count]));\n break;\n case 'importSelectDifferences': // select tiddlers that are new or different from existing tiddlers\n importReport(); // if an import was in progress, generate a report\n for (var t=0,count=0; t < theList.options.length; t++) {\n theList.options[t].selected=false;\n if (theList.options[t].value=="") continue;\n if (!store.tiddlerExists(theList.options[t].value)) { theList.options[t].selected=true; count++; continue; }\n for (var i=0; i<config.macros.importTiddlers.inbound.length; i++) // find matching inbound tiddler\n { var inbound=config.macros.importTiddlers.inbound[i]; if (inbound.title==theList.options[t].value) break; }\n theList.options[t].selected=(inbound.modified-store.getTiddler(theList.options[t].value).modified!=0); // changed tiddler\n count+=theList.options[t].selected?1:0;\n }\n clearMessage(); displayMessage(config.macros.importTiddlers.countMsg.format([count]));\n break;\n case 'importToggleFilter': // show/hide filter\n case 'importFilter': // apply filter\n alert("coming soon!");\n break;\n case 'importStart': // initiate the import processing\n importReport(); // if an import was in progress, generate a report\n config.macros.importTiddlers.index=0;\n config.macros.importTiddlers.index=importTiddlers(0);\n importStopped();\n break;\n case 'importClose': // unload imported tiddlers or hide the import control panel\n // if imported tiddlers not loaded, close the import control panel\n if (!config.macros.importTiddlers.inbound) { thePanel.style.display='none'; break; }\n importReport(); // if an import was in progress, generate a report\n config.macros.importTiddlers.inbound=null; // clear the imported tiddler buffer\n refreshImportList(); // reset/resize the listbox\n break;\n case 'importSkip': // don't import the tiddler\n var theItem = theList.options[config.macros.importTiddlers.index];\n for (var j=0;j<config.macros.importTiddlers.inbound.length;j++)\n if (config.macros.importTiddlers.inbound[j].title==theItem.value) break;\n var theImported = config.macros.importTiddlers.inbound[j];\n theImported.status='skipped after asking'; // mark item as skipped\n theCollisionPanel.style.display='none';\n config.macros.importTiddlers.index=importTiddlers(config.macros.importTiddlers.index+1); // resume with NEXT item\n importStopped();\n break;\n case 'importRename': // change name of imported tiddler\n var theItem = theList.options[config.macros.importTiddlers.index];\n for (var j=0;j<config.macros.importTiddlers.inbound.length;j++)\n if (config.macros.importTiddlers.inbound[j].title==theItem.value) break;\n var theImported = config.macros.importTiddlers.inbound[j];\n theImported.status = 'renamed from '+theImported.title; // mark item as renamed\n theImported.set(theNewTitle.value,null,null,null,null); // change the tiddler title\n theItem.value = theNewTitle.value; // change the listbox item text\n theItem.text = theNewTitle.value; // change the listbox item text\n theCollisionPanel.style.display='none';\n config.macros.importTiddlers.index=importTiddlers(config.macros.importTiddlers.index); // resume with THIS item\n importStopped();\n break;\n case 'importMerge': // join existing and imported tiddler content\n var theItem = theList.options[config.macros.importTiddlers.index];\n for (var j=0;j<config.macros.importTiddlers.inbound.length;j++)\n if (config.macros.importTiddlers.inbound[j].title==theItem.value) break;\n var theImported = config.macros.importTiddlers.inbound[j];\n var theExisting = store.getTiddler(theItem.value);\n var theText = theExisting.text+'\sn----\sn^^merged from: ';\n theText +='[['+config.macros.importTiddlers.src+'#'+theItem.value+'|'+config.macros.importTiddlers.src+'#'+theItem.value+']]^^\sn';\n theText +='^^'+theImported.modified.toLocaleString()+' by '+theImported.modifier+'^^\sn'+theImported.text;\n var theDate = new Date();\n var theTags = theExisting.getTags()+' '+theImported.getTags();\n theImported.set(null,theText,null,theDate,theTags);\n theImported.status = 'merged with '+theExisting.title; // mark item as merged\n theImported.status += ' - '+theExisting.modified.formatString("MM/DD/YYYY 0hh:0mm:0ss");\n theImported.status += ' by '+theExisting.modifier;\n theCollisionPanel.style.display='none';\n config.macros.importTiddlers.index=importTiddlers(config.macros.importTiddlers.index); // resume with this item\n importStopped();\n break;\n case 'importReplace': // substitute imported tiddler for existing tiddler\n var theItem = theList.options[config.macros.importTiddlers.index];\n for (var j=0;j<config.macros.importTiddlers.inbound.length;j++)\n if (config.macros.importTiddlers.inbound[j].title==theItem.value) break;\n var theImported = config.macros.importTiddlers.inbound[j];\n var theExisting = store.getTiddler(theItem.value);\n theImported.status = 'replaces '+theExisting.title; // mark item for replace\n theImported.status += ' - '+theExisting.modified.formatString("MM/DD/YYYY 0hh:0mm:0ss");\n theImported.status += ' by '+theExisting.modifier;\n theCollisionPanel.style.display='none';\n config.macros.importTiddlers.index=importTiddlers(config.macros.importTiddlers.index); // resume with THIS item\n importStopped();\n break;\n case 'importListSmaller': // decrease current listbox size, minimum=5\n if (theList.options.length==1) break;\n theList.size-=(theList.size>5)?1:0;\n config.macros.importTiddlers.listsize=theList.size;\n break;\n case 'importListLarger': // increase current listbox size, maximum=number of items in list\n if (theList.options.length==1) break;\n theList.size+=(theList.size<theList.options.length)?1:0;\n config.macros.importTiddlers.listsize=theList.size;\n break;\n case 'importListMaximize': // toggle listbox size between current and maximum\n if (theList.options.length==1) break;\n theList.size=(theList.size==theList.options.length)?config.macros.importTiddlers.listsize:theList.options.length;\n break;\n }\n}\n//}}}\n\n// // refresh listbox\n//{{{\nfunction refreshImportList(selectedIndex)\n{\n var theList = document.getElementById("importList");\n if (!theList) return;\n // if nothing to show, reset list content and size\n if (!config.macros.importTiddlers.inbound) \n {\n while (theList.length > 0) { theList.options[0] = null; }\n theList.options[0]=new Option('please open a document...',"",false,false);\n theList.size=config.macros.importTiddlers.listsize;\n return;\n }\n // get the sort order\n if (!selectedIndex) selectedIndex=0;\n if (selectedIndex==0) config.macros.importTiddlers.sort='title'; // heading\n if (selectedIndex==1) config.macros.importTiddlers.sort='title';\n if (selectedIndex==2) config.macros.importTiddlers.sort='modified';\n if (selectedIndex==3) config.macros.importTiddlers.sort='tags';\n if (selectedIndex>3) {\n // display selected tiddler count\n for (var t=0,count=0; t < theList.options.length; t++) count+=(theList.options[t].selected&&theList.options[t].value!="")?1:0;\n clearMessage(); displayMessage(config.macros.importTiddlers.countMsg.format([count]));\n return; // no refresh needed\n }\n\n // get the alphasorted list of tiddlers (optionally, filter out unchanged tiddlers)\n var tiddlers=config.macros.importTiddlers.inbound;\n tiddlers.sort(function (a,b) {if(a['title'] == b['title']) return(0); else return (a['title'] < b['title']) ? -1 : +1; });\n // clear current list contents\n while (theList.length > 0) { theList.options[0] = null; }\n // add heading and control items to list\n var i=0;\n var indent=String.fromCharCode(160)+String.fromCharCode(160);\n theList.options[i++]=new Option(tiddlers.length+' tiddler'+((tiddlers.length!=1)?'s are':' is')+' in the document',"",false,false);\n theList.options[i++]=new Option(((config.macros.importTiddlers.sort=="title" )?">":indent)+' [by title]',"",false,false);\n theList.options[i++]=new Option(((config.macros.importTiddlers.sort=="modified")?">":indent)+' [by date]',"",false,false);\n theList.options[i++]=new Option(((config.macros.importTiddlers.sort=="tags")?">":indent)+' [by tags]',"",false,false);\n // output the tiddler list\n switch(config.macros.importTiddlers.sort)\n {\n case "title":\n for(var t = 0; t < tiddlers.length; t++)\n theList.options[i++] = new Option(tiddlers[t].title,tiddlers[t].title,false,false);\n break;\n case "modified":\n // sort descending for newest date first\n tiddlers.sort(function (a,b) {if(a['modified'] == b['modified']) return(0); else return (a['modified'] > b['modified']) ? -1 : +1; });\n var lastSection = "";\n for(var t = 0; t < tiddlers.length; t++) {\n var tiddler = tiddlers[t];\n var theSection = tiddler.modified.toLocaleDateString();\n if (theSection != lastSection) {\n theList.options[i++] = new Option(theSection,"",false,false);\n lastSection = theSection;\n }\n theList.options[i++] = new Option(indent+indent+tiddler.title,tiddler.title,false,false);\n }\n break;\n case "tags":\n var theTitles = {}; // all tiddler titles, hash indexed by tag value\n var theTags = new Array();\n for(var t=0; t<tiddlers.length; t++) {\n var title=tiddlers[t].title;\n var tags=tiddlers[t].tags;\n if (!tags || !tags.length) {\n if (theTitles["untagged"]==undefined) { theTags.push("untagged"); theTitles["untagged"]=new Array(); }\n theTitles["untagged"].push(title);\n }\n else for(var s=0; s<tags.length; s++) {\n if (theTitles[tags[s]]==undefined) { theTags.push(tags[s]); theTitles[tags[s]]=new Array(); }\n theTitles[tags[s]].push(title);\n }\n }\n theTags.sort();\n for(var tagindex=0; tagindex<theTags.length; tagindex++) {\n var theTag=theTags[tagindex];\n theList.options[i++]=new Option(theTag,"",false,false);\n for(var t=0; t<theTitles[theTag].length; t++)\n theList.options[i++]=new Option(indent+indent+theTitles[theTag][t],theTitles[theTag][t],false,false);\n }\n break;\n }\n theList.selectedIndex=selectedIndex; // select current control item\n if (theList.size<config.macros.importTiddlers.listsize) theList.size=config.macros.importTiddlers.listsize;\n if (theList.size>theList.options.length) theList.size=theList.options.length;\n}\n//}}}\n\n// // re-entrant processing for handling import with interactive collision prompting\n//{{{\nfunction importTiddlers(startIndex)\n{\n if (!config.macros.importTiddlers.inbound) return -1;\n\n var theList = document.getElementById('importList');\n if (!theList) return;\n var t;\n // if starting new import, reset import status flags\n if (startIndex==0)\n for (var t=0;t<config.macros.importTiddlers.inbound.length;t++)\n config.macros.importTiddlers.inbound[t].status="";\n for (var i=startIndex; i<theList.options.length; i++)\n {\n // if list item is not selected or is a heading (i.e., has no value), skip it\n if ((!theList.options[i].selected) || ((t=theList.options[i].value)==""))\n continue;\n for (var j=0;j<config.macros.importTiddlers.inbound.length;j++)\n if (config.macros.importTiddlers.inbound[j].title==t) break;\n var inbound = config.macros.importTiddlers.inbound[j];\n var theExisting = store.getTiddler(inbound.title);\n // avoid redundant import for tiddlers that are listed multiple times (when 'by tags')\n if (inbound.status=="added")\n continue;\n // don't import the "ImportedTiddlers" history from the other document...\n if (inbound.title=='ImportedTiddlers')\n continue;\n // if tiddler exists and import not marked for replace or merge, stop importing\n if (theExisting && (inbound.status.substr(0,7)!="replace") && (inbound.status.substr(0,5)!="merge"))\n return i;\n // assemble tags (remote + existing + added)\n var newTags = "";\n if (config.macros.importTiddlers.importTags)\n newTags+=inbound.getTags() // import remote tags\n if (config.macros.importTiddlers.keepTags && theExisting)\n newTags+=" "+theExisting.getTags(); // keep existing tags\n if (config.macros.importTiddlers.addTags && config.macros.importTiddlers.newTags.trim().length)\n newTags+=" "+config.macros.importTiddlers.newTags; // add new tags\n inbound.set(null,null,null,null,newTags.trim());\n // set the status to 'added' (if not already set by the 'ask the user' UI)\n inbound.status=(inbound.status=="")?'added':inbound.status;\n // do the import!\n // OLD: store.addTiddler(in); store.setDirty(true);\n store.saveTiddler(inbound.title, inbound.title, inbound.text, inbound.modifier, inbound.modified, inbound.tags);\n store.fetchTiddler(inbound.title).created = inbound.created; // force creation date to imported value\n }\n return(-1); // signals that we really finished the entire list\n}\n//}}}\n\n//{{{\nfunction importStopped()\n{\n var theList = document.getElementById('importList');\n var theNewTitle = document.getElementById('importNewTitle');\n if (!theList) return;\n if (config.macros.importTiddlers.index==-1)\n importReport(); // import finished... generate the report\n else\n {\n // DEBUG alert('import stopped at: '+config.macros.importTiddlers.index);\n // import collision... show the collision panel and set the title edit field\n document.getElementById('importCollisionPanel').style.display='block';\n theNewTitle.value=theList.options[config.macros.importTiddlers.index].value;\n }\n}\n//}}}\n\n// // ''REPORT GENERATOR''\n//{{{\nfunction importReport(quiet)\n{\n if (!config.macros.importTiddlers.inbound) return;\n // DEBUG alert('importReport: start');\n\n // if import was not completed, the collision panel will still be open... close it now.\n var panel=document.getElementById('importCollisionPanel'); if (panel) panel.style.display='none';\n\n // get the alphasorted list of tiddlers\n var tiddlers = config.macros.importTiddlers.inbound;\n // gather the statistics\n var count=0;\n for (var t=0; t<tiddlers.length; t++)\n if (tiddlers[t].status && tiddlers[t].status.trim().length && tiddlers[t].status.substr(0,7)!="skipped") count++;\n\n // generate a report\n if (count && config.options.chkImportReport) {\n // get/create the report tiddler\n var theReport = store.getTiddler('ImportedTiddlers');\n if (!theReport) { theReport= new Tiddler(); theReport.title = 'ImportedTiddlers'; theReport.text = ""; }\n // format the report content\n var now = new Date();\n var newText = "On "+now.toLocaleString()+", "+config.options.txtUserName\n newText +=" imported "+count+" tiddler"+(count==1?"":"s")+" from\sn[["+config.macros.importTiddlers.src+"|"+config.macros.importTiddlers.src+"]]:\sn";\n if (config.macros.importTiddlers.addTags && config.macros.importTiddlers.newTags.trim().length)\n newText += "imported tiddlers were tagged with: \s""+config.macros.importTiddlers.newTags+"\s"\sn";\n newText += "<<<\sn";\n for (var t=0; t<tiddlers.length; t++) if (tiddlers[t].status) newText += "#[["+tiddlers[t].title+"]] - "+tiddlers[t].status+"\sn";\n newText += "<<<\sn";\n// 20060918 ELS: DON'T ADD "discard" BUTTON TO REPORT\n// newText += "<html><input type=\s"button\s" href=\s"javascript:;\s" ";\n// newText += "onclick=\s"story.closeTiddler('"+theReport.title+"'); store.deleteTiddler('"+theReport.title+"');\s" ";\n// newText += "value=\s"discard report\s"></html>";\n // update the ImportedTiddlers content and show the tiddler\n theReport.text = newText+((theReport.text!="")?'\sn----\sn':"")+theReport.text;\n theReport.modifier = config.options.txtUserName;\n theReport.modified = new Date();\n // OLD: store.addTiddler(theReport);\n store.saveTiddler(theReport.title, theReport.title, theReport.text, theReport.modifier, theReport.modified, theReport.tags);\n if (!quiet) { story.displayTiddler(null,theReport.title,1,null,null,false); story.refreshTiddler(theReport.title,1,true); }\n }\n\n // reset status flags\n for (var t=0; t<config.macros.importTiddlers.inbound.length; t++) config.macros.importTiddlers.inbound[t].status="";\n\n // refresh display if tiddlers have been loaded\n if (count) { store.setDirty(true); store.notifyAll(); }\n\n // always show final message when tiddlers were actually loaded\n if (count) displayMessage(config.macros.importTiddlers.importedMsg.format([count,tiddlers.length,config.macros.importTiddlers.src]));\n}\n//}}}\n\n/***\n!!!!!TW 2.1beta Core Code Candidate\n//The following section is a preliminary 'code candidate' for incorporation of non-interactive 'load tiddlers' functionality into TW2.1beta. //\n***/\n//{{{\n// default cookie/option values\nif (!config.options.chkImportReport) config.options.chkImportReport=true;\n\nconfig.macros.loadTiddlers = {\n label: "",\n prompt: "add/update tiddlers from '%0'",\n askMsg: "Please enter a local path/filename or a remote URL",\n openMsg: "Opening %0",\n openErrMsg: "Could not open %0 - error=%1",\n readMsg: "Read %0 bytes from %1",\n foundMsg: "Found %0 tiddlers in %1",\n nochangeMsg: "'%0' is up-to-date... skipped.",\n loadedMsg: "Loaded %0 of %1 tiddlers from %2"\n};\n\nconfig.macros.loadTiddlers.handler = function(place,macroName,params) {\n var label=(params[0] && params[0].substr(0,6)=='label:')?params.shift().substr(6):this.label;\n var prompt=(params[0] && params[0].substr(0,7)=='prompt:')?params.shift().substr(7):this.prompt;\n var filter="updates";\n if (params[0] && (params[0]=='all' || params[0]=='new' || params[0]=='changes' || params[0]=='updates'\n || params[0].substr(0,8)=='tiddler:' || params[0].substr(0,4)=='tag:'))\n filter=params.shift();\n var src=params.shift(); if (!src || !src.length) return; // filename is required\n var quiet=(params[0]=="quiet"); if (quiet) params.shift();\n var ask=(params[0]=="confirm"); if (ask) params.shift();\n var force=(params[0]=="force"); if (force) params.shift();\n if (label.trim().length) {\n // link triggers load tiddlers from another file/URL and then applies filtering rules to add/replace tiddlers in the store\n createTiddlyButton(place,label.format([src]),prompt.format([src]), function() {\n if (src=="ask") src=prompt(config.macros.loadTiddlers.askMsg);\n loadRemoteFile(src,loadTiddlers,quiet,ask,filter,force);\n })\n }\n else {\n // load tiddlers from another file/URL and then apply filtering rules to add/replace tiddlers in the store\n if (src=="ask") src=prompt(config.macros.loadTiddlers.askMsg);\n loadRemoteFile(src,loadTiddlers,quiet,ask,filter,force);\n }\n}\n\nfunction loadTiddlers(src,html,quiet,ask,filter,force)\n{\n var tiddlers = readTiddlersFromHTML(html);\n var count=tiddlers?tiddlers.length:0;\n if (!quiet) displayMessage(config.macros.loadTiddlers.foundMsg.format([count,src]));\n var count=0;\n if (tiddlers) for (var t=0;t<tiddlers.length;t++) {\n var inbound = tiddlers[t];\n var theExisting = store.getTiddler(inbound.title);\n if (inbound.title=='ImportedTiddlers')\n continue; // skip "ImportedTiddlers" history from the other document...\n\n // apply the all/new/changes/updates filter (if any)\n if (filter && filter!="all") {\n if ((filter=="new") && theExisting) // skip existing tiddlers\n continue;\n if ((filter=="changes") && !theExisting) // skip new tiddlers\n continue;\n if ((filter.substr(0,4)=="tag:") && inbound.tags.find(filter.substr(4))==null) // must match specific tag value\n continue;\n if ((filter.substr(0,8)=="tiddler:") && inbound.title!=filter.substr(8)) // must match specific tiddler name\n continue;\n if (!force && store.tiddlerExists(inbound.title) && ((theExisting.modified.getTime()-inbound.modified.getTime())>=0))\n { if (!quiet) displayMessage(config.macros.loadTiddlers.nochangeMsg.format([inbound.title])); continue; }\n }\n // get confirmation if required\n if (ask && !confirm((theExisting?"Update":"Add")+" tiddler '"+inbound.title+"'\snfrom "+src))\n { tiddlers[t].status="skipped - cancelled by user"; continue; }\n // DO IT!\n // OLD: store.addTiddler(in);\n store.saveTiddler(inbound.title, inbound.title, inbound.text, inbound.modifier, inbound.modified, inbound.tags);\n store.fetchTiddler(inbound.title).created = inbound.created; // force creation date to imported value\n tiddlers[t].status=theExisting?"updated":"added"\n count++;\n }\n if (count) {\n // refresh display\n store.setDirty(true);\n store.notifyAll();\n // generate a report\n if (config.options.chkImportReport) {\n // get/create the report tiddler\n var theReport = store.getTiddler('ImportedTiddlers');\n if (!theReport) { theReport= new Tiddler(); theReport.title = 'ImportedTiddlers'; theReport.text = ""; }\n // format the report content\n var now = new Date();\n var newText = "On "+now.toLocaleString()+", "+config.options.txtUserName+" loaded "+count+" tiddlers from\sn[["+src+"|"+src+"]]:\sn";\n newText += "<<<\sn";\n for (var t=0; t<tiddlers.length; t++) if (tiddlers[t].status) newText += "#[["+tiddlers[t].title+"]] - "+tiddlers[t].status+"\sn";\n newText += "<<<\sn";\n// 20060918 ELS: DON'T ADD "discard" BUTTON TO REPORT\n// newText += "<html><input type=\s"button\s" href=\s"javascript:;\s" ";\n// newText += "onclick=\s"story.closeTiddler('"+theReport.title+"'); store.deleteTiddler('"+theReport.title+"');\s" ";\n// newText += "value=\s"discard report\s"></html>";\n // update the ImportedTiddlers content and show the tiddler\n theReport.text = newText+((theReport.text!="")?'\sn----\sn':"")+theReport.text;\n theReport.modifier = config.options.txtUserName;\n theReport.modified = new Date();\n // OLD: store.addTiddler(theReport);\n store.saveTiddler(theReport.title, theReport.title, theReport.text, theReport.modifier, theReport.modified, theReport.tags);\n if (!quiet) { story.displayTiddler(null,theReport.title,1,null,null,false); story.refreshTiddler(theReport.title,1,true); }\n }\n }\n // always show final message when tiddlers were actually loaded\n if (!quiet||count) displayMessage(config.macros.loadTiddlers.loadedMsg.format([count,tiddlers.length,src]));\n}\n\nfunction loadRemoteFile(src,callback,quiet,ask,filter,force) {\n if (src==undefined || !src.length) return null; // filename is required\n if (!quiet) clearMessage();\n if (!quiet) displayMessage(config.macros.loadTiddlers.openMsg.format([src]));\n if (src.substr(0,4)!="http" && src.substr(0,4)!="file") { // if not a URL, fallback to read from local filesystem\n var txt=loadFile(src);\n if ((txt==null)||(txt==false)) // file didn't load\n { if (!quiet) displayMessage(config.macros.loadTiddlers.openErrMsg.format([src,"(unknown)"])); }\n else {\n if (!quiet) displayMessage(config.macros.loadTiddlers.readMsg.format([txt.length,src]));\n if (callback) callback(src,convertUTF8ToUnicode(txt),quiet,ask,filter,force);\n }\n }\n else {\n var x; // get an request object\n try {x = new XMLHttpRequest()} // moz\n catch(e) {\n try {x = new ActiveXObject("Msxml2.XMLHTTP")} // IE 6\n catch (e) {\n try {x = new ActiveXObject("Microsoft.XMLHTTP")} // IE 5\n catch (e) { return }\n }\n }\n // setup callback function to handle server response(s)\n x.onreadystatechange = function() {\n if (x.readyState == 4) {\n if (x.status==0 || x.status == 200) {\n if (!quiet) displayMessage(config.macros.loadTiddlers.readMsg.format([x.responseText.length,src]));\n if (callback) callback(src,x.responseText,quiet,ask,filter,force);\n }\n else {\n if (!quiet) displayMessage(config.macros.loadTiddlers.openErrMsg.format([src,x.status]));\n }\n }\n }\n // get privileges to read another document's DOM via http:// or file:// (moz-only)\n if (typeof(netscape)!="undefined") {\n try { netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead"); }\n catch (e) { if (!quiet) displayMessage(e.description?e.description:e.toString()); }\n }\n // send the HTTP request\n try {\n var url=src+(src.indexOf('?')<0?'?':'&')+'nocache='+Math.random();\n x.open("GET",src,true);\n if (x.overrideMimeType) x.overrideMimeType('text/html');\n x.send(null);\n }\n catch (e) {\n if (!quiet) {\n displayMessage(config.macros.loadTiddlers.openErrMsg.format([src,"(unknown)"]));\n displayMessage(e.description?e.description:e.toString());\n }\n }\n }\n}\n\nfunction readTiddlersFromHTML(html)\n{\n // extract store area from html \n var start=html.indexOf('<div id="storeArea">');\n var end=html.indexOf("<!--POST-BODY-START--"+">",start);\n if (end==-1) var end=html.indexOf("</body"+">",start); // backward-compatibility for older documents\n var sa="<html><body>"+html.substring(start,end)+"</body></html>";\n\n // load html into iframe document\n var f=document.getElementById("loaderFrame"); if (f) document.body.removeChild(f);\n f=document.createElement("iframe"); f.id="loaderFrame";\n f.style.width="0px"; f.style.height="0px"; f.style.border="0px";\n document.body.appendChild(f);\n var d=f.document;\n if (f.contentDocument) d=f.contentDocument; // For NS6\n else if (f.contentWindow) d=f.contentWindow.document; // For IE5.5 and IE6\n d.open(); d.writeln(sa); d.close();\n\n // read tiddler DIVs from storeArea DOM element \n var sa = d.getElementById("storeArea");\n if (!sa) return null;\n sa.normalize();\n var nodes = sa.childNodes;\n if (!nodes || !nodes.length) return null;\n var tiddlers = [];\n for(var t = 0; t < nodes.length; t++) {\n var title = null;\n if(nodes[t].getAttribute)\n title = nodes[t].getAttribute("tiddler");\n if(!title && nodes[t].id && (nodes[t].id.substr(0,5) == "store"))\n title = nodes[t].id.substr(5);\n if(title && title != "")\n tiddlers.push((new Tiddler()).loadFromDiv(nodes[t],title));\n }\n return tiddlers;\n}\n//}}}
On jueves, 11 de enero de 2007 14:45:35, JosG imported 2 tiddlers from\n[[http://tiddlywiki.abego-software.de/#FormTiddlerPlugin|http://tiddlywiki.abego-software.de/#FormTiddlerPlugin]]:\n<<<\n#[[BlogTemplate]] - added\n#[[BugReportTemplate]] - added\n<<<\n\n----\nOn domingo, 03 de diciembre de 2006 22:27:21, YourName imported 1 tiddler from\n[[http://www.tiddlytools.com/|http://www.tiddlytools.com/]]:\n<<<\n#[[NestedSlidersPlugin]] - added\n<<<\n\n----\nOn domingo, 03 de diciembre de 2006 21:50:06, YourName imported 1 tiddler from\n[[http://www.tiddlytools.com/|http://www.tiddlytools.com/]]:\n<<<\n#[[PlayerPlugin]] - added\n<<<\n\n----\nOn sábado, 11 de noviembre de 2006 22:33:43, JosG imported 6 tiddlers from\n[[http://www.tiddlytools.com/#AttachFilePlugin/|http://www.tiddlytools.com/#AttachFilePlugin/]]:\n<<<\n#[[AttachFileMIMETypes]] - added\n#[[AttachFilePlugin]] - added\n#[[AttachFilePluginFormatters]] - added\n#[[AttachFileSample]] - added\n#[[AttachFileSample2]] - added\n#[[AttachFileServerScripts]] - added\n<<<\n\n----\nOn viernes, 10 de noviembre de 2006 13:50:02, JosG imported 1 tiddler from\n[[http://tiddlywiki.bidix.info/BidiXTW.html|http://tiddlywiki.bidix.info/BidiXTW.html]]:\n<<<\n#[[RunMacroIfTagged]] - added\n<<<\n\n----\nOn viernes, 10 de noviembre de 2006 13:29:15, JosG imported 13 tiddlers from\n[[http://tiddlywiki.bidix.info/BidiXTW.html|http://tiddlywiki.bidix.info/BidiXTW.html]]:\n<<<\n#[[.BidiX.Ajax]] - added\n#[[AllowedSiteList]] - added\n#[[LoadRemoteFileHijack]] - added\n#[[ProxyService]] - added\n#[[SiteProxy]] - added\n#[[allowedsites]] - added\n#[[download.cgi]] - added\n#[[lock.cgi]] - added\n#[[lock.rb]] - added\n#[[proxy.cgi]] - added\n#[[proxy.php]] - added\n#[[store.cgi]] - added\n#[[store.php]] - added\n<<<\n\n----\nOn viernes, 10 de noviembre de 2006 13:22:11, JosG imported 2 tiddlers from\n[[http://tiddlywiki.bidix.info/BidiXTW.html|http://tiddlywiki.bidix.info/BidiXTW.html]]:\n<<<\n#[[UploadToFileMacro]] - added\n#[[UploadToFileMacroDoc]] - added\n<<<\n\n----\nOn miércoles, 08 de noviembre de 2006 2:32:32, JosG imported 1 tiddler from\n[[http://tiddlywiki.abego-software.de/#PartTiddlerPlugin|http://tiddlywiki.abego-software.de/#PartTiddlerPlugin]]:\n<<<\n#[[PartTiddlerPlugin]] - replaces PartTiddlerPlugin - 3/2/2006 19:31:00 by PauloSoares\n<<<\n\n----\nOn miércoles, 08 de noviembre de 2006 2:27:30, JosG imported 81 tiddlers from\n[[C:\sDocuments and Settings\sjose\sEscritorio\strabajo\sInteraccion.html|C:\sDocuments and Settings\sjose\sEscritorio\strabajo\sInteraccion.html]]:\n<<<\n#[[06/11/2006]] - added\n#[[13/11/2006]] - added\n#[[20/11/2006]] - added\n#[[23/10/2006]] - added\n#[[23/11/2006]] - added\n#[[30/10/2006]] - added\n#[[A Enruga ó Poder]] - added\n#[[Ayuda]] - skipped after asking\n#[[BiggerForm (Card 1)]] - skipped after asking\n#[[BiggerForm (Card 2)]] - skipped after asking\n#[[BiggerForm (Card 3)]] - skipped after asking\n#[[BiggerFormTemplate]] - skipped after asking\n#[[Bug: A script following a data section is deleted when data is changed]] - skipped after asking\n#[[Bug: ForEachTiddler 1.0.1 has broken support on win32 Opera 8.51]] - skipped after asking\n#[[BugReportTemplate]] - skipped after asking\n#[[Bugreports]] - skipped after asking\n#[[Calendario]] - skipped after asking\n#[[CheckboxPlugin]] - skipped after asking\n#[[Comenzaremos a utilizar el Wiki como herramienta de desarrollo]] - added\n#[[Configuración]] - skipped after asking\n#[[ContactsFormTemplate]] - skipped after asking\n#[[Crear Enlaces]] - skipped after asking\n#[[Crear Recordatorios]] - skipped after asking\n#[[DataTiddlerExamples]] - skipped after asking\n#[[DataTiddlerPlugin]] - skipped after asking\n#[[Decidir nombres definitivos para los dos juegos]] - added\n#[[DefaultTiddlers]] - skipped after asking\n#[[Definir Tareas]] - skipped after asking\n#[[Definir Tareas (listados sencillos)]] - skipped after asking\n#[[Definir el juego en el formato original]] - added\n#[[Definir la versión Multijugador]] - added\n#[[Definir plan B]] - added\n#[[DiseñoSistema]] - skipped after asking\n#[[DropTaggingMacro]] - skipped after asking\n#[[DropTagsMacro]] - skipped after asking\n#[[DropTagsMacroDocumentation]] - skipped after asking\n#[[Dudas - Notas]] - added\n#[[EditTemplate]] - skipped after asking\n#[[Entregar material gráfico a los estudios de programación]] - added\n#[[Equipos Externos]] - added\n#[[Establecer similitudes entre las opciones b y c para poder reutilizar o mantener el mismo contenido en ambos supuestos]] - added\n#[[Establecer un calendario]] - added\n#[[Establecer un calendario: grandes fechas, en los tres supuestos]] - added\n#[[EtiquetasUsuales]] - skipped after asking\n#[[Export My Tiddlers As Text]] - skipped after asking\n#[[ExportTiddlersPlugin]] - skipped after asking\n#[[ForEachTiddlerExamples]] - skipped after asking\n#[[ForEachTiddlerMacro]] - skipped after asking\n#[[ForEachTiddlerPlugin]] - skipped after asking\n#[[FormTemplate]] - skipped after asking\n#[[FormTiddler Examples]] - skipped after asking\n#[[FormTiddler Introduction]] - skipped after asking\n#[[FormTiddlerMacro]] - skipped after asking\n#[[FormTiddlerPlugin]] - skipped after asking\n#[[Formatear Texto]] - skipped after asking\n#[[Formularios]] - skipped after asking\n#[[Generar listas de artículos de forma automática]] - skipped after asking\n#[[GenerateRssHijack]] - skipped after asking\n#[[GenerateRssHijackDoc]] - skipped after asking\n#[[Gestión]] - added\n#[[GestordePlugins]] - skipped after asking\n#[[Guión Nocturna: Starcatcher]] - added\n#[[Guión Nocturna: Tim´s Adventure]] - added\n#[[HojasEstilo]] - skipped after asking\n#[[ImportTiddlersPlugin]] - skipped after asking\n#[[Incorporar logotipo de la xunta en los diseños de pantallas]] - added\n#[[InlineJavascriptPlugin]] - skipped after asking\n#[[Interacción-Tareas]] - added\n#[[Interacción-Tareas:Enruga]] - added\n#[[Interacción-Tareas:Nocturna]] - added\n#[[Interacción-Tareas:Xogofindomundo]] - added\n#[[Interacción-Tareas:XogosTradicionais]] - added\n#[[Javier]] - added\n#[[Javier: Grabar en un DVD / DC todo el proyecto 3 copias e incorporar logotipo en la web]] - added\n#[[Javier: preparar el documento final, sacar una copia impresa y encuadernarlo]] - added\n#[[JoeBlock]] - skipped after asking\n#[[Jose y Beatriz]] - added\n#[[Jose y Beatriz: preparar documentación administrativa Enruga]] - added\n#[[Jose y Beatriz: preparar documentación administrativa Xogos Tradicionais]] - added\n#[[Jose y Javier]] - added\n#[[Jose y Javier: elaborar plan de producción y propuesta de equipo técnico artístico, con nombres y apellidos y cartas de interés]] - added\n#[[Juegos]] - added\n#[[LegacyStrikeThroughPlugin]] - skipped after asking\n#[[Loroestudio]] - added\n#[[Loroestudio Tareas Nocturna]] - added\n#[[Loroestudio-Tareas]] - added\n#[[MainMenu]] - skipped after asking\n#[[Memoria Contactos Enruga (es)]] - added\n#[[Memoria Contactos Enruga (ga)]] - added\n#[[Memoria Explicativa Nocturna]] - added\n#[[Naty Games]] - added\n#[[NatyGames Tareas Nocturna]] - added\n#[[NatyGames-Tareas]] - added\n#[[Nocturna]] - added\n#[[Nomenclaturas]] - skipped after asking\n#[[OpcionesAvanzadas]] - skipped after asking\n#[[OpcionesSistema]] - skipped after asking\n#[[OptionsPanel]] - skipped after asking\n#[[Organizar documentación Starcatcher]] - added\n#[[PageTemplate]] - skipped after asking\n#[[PaneldeOpciones]] - skipped after asking\n#[[PanelesLateralesSistema]] - skipped after asking\n#[[PartTiddlerPlugin]] - skipped after asking\n#[[PilgrimAge]] - added\n#[[PlasticCalendarPlugin]] - skipped after asking\n#[[PluginsSistema]] - skipped after asking\n#[[Preparar un presupuesto en los tres supuestos]] - added\n#[[Primeras Ideas Puzzles Pilgrim ]] - added\n#[[ReminderMacros]] - skipped after asking\n#[[ReminderSyntax]] - skipped after asking\n#[[RenameTagsPlugin]] - skipped after asking\n#[[ShadowPages]] - skipped after asking\n#[[SideBarOptions]] - skipped after asking\n#[[SideBarTabs]] - skipped after asking\n#[[SimpleForm (Card 1)]] - skipped after asking\n#[[SimpleForm (Card 2)]] - skipped after asking\n#[[SimpleForm (Card 3)]] - skipped after asking\n#[[SimpleFormTemplate]] - skipped after asking\n#[[SinglePageModePlugin]] - skipped after asking\n#[[SiteSubtitle]] - skipped after asking\n#[[SiteTitle]] - skipped after asking\n#[[Solicitar aplazamiento de entrega para julio de 2007]] - added\n#[[SpanishLingo]] - skipped after asking\n#[[StyleSheetLayout]] - skipped after asking\n#[[TabContents]] - skipped after asking\n#[[TableOfContentsPlugin]] - skipped after asking\n#[[TaggerPlugin]] - skipped after asking\n#[[TaggerPluginDocumentation]] - skipped after asking\n#[[TagglyTaggingPlugin]] - skipped after asking\n#[[TagglyTaggingStyles]] - skipped after asking\n#[[Tangaraño]] - added\n#[[Tangaraño Tareas Nocturna]] - added\n#[[Tangaraño-Tareas]] - added\n#[[Tareas]] - skipped after asking\n#[[Tareasfácil]] - skipped after asking\n#[[TaskMacro]] - skipped after asking\n#[[TaskMacroPlugin]] - skipped after asking\n#[[TaskMacroTutorial]] - skipped after asking\n#[[TaskOrganizerPlugin]] - skipped after asking\n#[[TaskSummaryViewTemplate]] - skipped after asking\n#[[TiddlerListMacro]] - skipped after asking\n#[[TiddlerListMacroDocumentation]] - skipped after asking\n#[[TiddlersSistema]] - skipped after asking\n#[[ToggleSideBarMacro version 1.0]] - skipped after asking\n#[[TopMenu]] - skipped after asking\n#[[ViewTemplate]] - skipped after asking\n#[[WikiBar]] - skipped after asking\n#[[WikiBarCss]] - skipped after asking\n#[[YourSearchPlugin]] - skipped after asking\n#[[a.- Estrelas TA]] - added\n#[[a.- Sinopsis SC]] - added\n#[[a.- Sinopsis TA]] - added\n#[[a.- Tim TA]] - added\n#[[b.- Gatos TA]] - added\n#[[b.- Luminosos TA]] - added\n#[[b.- Personaxes SC]] - added\n#[[b.- Personaxes TA]] - added\n#[[c.- Mr Pee TA]] - added\n#[[c.- Obxectos SC]] - added\n#[[c.- Obxectos TA]] - added\n#[[d.- Interface SC]] - added\n#[[d.- Interface TA]] - added\n#[[e.- Son SC]] - added\n#[[e.- Son TA]] - added\n#[[f.- Xogabilidade SC]] - added\n#[[f.- Xogabilidade TA]] - added\n#[[g.- Esquema de navegación SC]] - added\n#[[g.- Esquema de navegación TA]] - added\n#[[h.- Descripción de Pantallas SC]] - added\n#[[h.- Descripción de Pantallas TA]] - added\n#[[i.- Textos SC]] - added\n#[[i.- Textos TA]] - added\n#[[pendientes de Tangaraño]] - added\n#[[pendientes de Tangaraño: presupuesto y planificación]] - added\n#[[preparar justificación Enruga]] - added\n#[[preparar justificación Xogos Tradicionais]] - added\n#[[showReminders]] - skipped after asking\n#[[showRemindersSyntax]] - skipped after asking\n#[[versiónWiki]] - skipped after asking\n<<<\n\n----\nOn lunes, 06 de noviembre de 2006 1:42:14, JosG imported 1 tiddler from\n[[http://wiki.interaccion.info/produccion/Bidi.html|http://wiki.interaccion.info/produccion/Bidi.html]]:\n<<<\n#[[LockControlPanel]] - added\n<<<\n\n----\nOn lunes, 06 de noviembre de 2006 0:52:51, JosG imported 5 tiddlers from\n[[http://tiddlywiki.bidix.info/|http://tiddlywiki.bidix.info/]]:\n<<<\n#[[GroupAuthoring]] - added\n#[[GroupAuthoringFAQ]] - added\n#[[GroupAuthoringPlugin]] - added\n#[[GroupAuthoringTodo]] - added\n#[[GroupAuthoringUseCase]] - added\n<<<\n\n----\nOn lunes, 06 de noviembre de 2006 0:03:35, JosG imported 9 tiddlers from\n[[http://www.tiddlywiki.bidix.info/|http://www.tiddlywiki.bidix.info/]]:\n<<<\n#[[HowToUpload]] - added\n#[[UploadDoc]] - added\n#[[UploadForm]] - added\n#[[UploadLog]] - added\n#[[UploadOptions]] - added\n#[[UploadPlugin]] - added\n#[[UploadPluginDoc]] - added\n#[[UploadPluginMsgEN]] - added\n#[[UploadPluginMsgFR]] - added\n<<<\n\n----\nOn jueves, 02 de noviembre de 2006 5:14:49, JosG imported 2 tiddlers from\n[[http://aiddlywiki.sourceforge.net/wikibar_demo_2.html|http://aiddlywiki.sourceforge.net/wikibar_demo_2.html]]:\n<<<\n#[[WikiBar]] - added\n#[[WikiBarCss]] - added\n<<<\n\n----\nOn jueves, 02 de noviembre de 2006 2:14:01, JosG imported 1 tiddler from\n[[http://tiddlywiki.abego-software.de/|http://tiddlywiki.abego-software.de/]]:\n<<<\n#[[YourSearchPlugin]] - added\n<<<\n\n----\nOn domingo, 29 de octubre de 2006 18:15:09, JosG imported 5 tiddlers from\n[[http://lewcid.googlepages.com/lewcid.html#DropTagsMacro|http://lewcid.googlepages.com/lewcid.html#DropTagsMacro]]:\n<<<\n#[[DropTaggingMacro]] - added\n#[[DropTagsMacro]] - added\n#[[DropTagsMacroDocumentation]] - added\n#[[TagAdderMacro]] - skipped after asking\n#[[TaggerPlugin]] - added\n#[[TaggerPluginDocumentation]] - added\n<<<\n\n----\nOn domingo, 29 de octubre de 2006 17:19:42, JosG imported 1 tiddler from\n[[http://lewcid.googlepages.com/lewcid.html#ToggleSideBarMacro|http://lewcid.googlepages.com/lewcid.html#ToggleSideBarMacro]]:\n<<<\n#[[ToggleSideBarMacro version 1.0]] - added\n<<<\n
/***\n|''Name:''|InlineJavascriptPlugin|\n|''Source:''|http://www.TiddlyTools.com/#InlineJavascriptPlugin|\n|''Author:''|Eric Shulman - ELS Design Studios|\n|''License:''|[[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|\n|''~CoreVersion:''|2.0.10|\n\nInsert Javascript executable code directly into your tiddler content. Lets you ''call directly into TW core utility routines, define new functions, calculate values, add dynamically-generated TiddlyWiki-formatted output'' into tiddler content, or perform any other programmatic actions each time the tiddler is rendered.\n!!!!!Usage\n<<<\nWhen installed, this plugin adds new wiki syntax for surrounding tiddler content with {{{<script>}}} and {{{</script>}}} markers, so that it can be treated as embedded javascript and executed each time the tiddler is rendered.\n\n''Deferred execution from an 'onClick' link''\nBy including a label="..." parameter in the initial {{{<script>}}} marker, the plugin will create a link to an 'onclick' script that will only be executed when that specific link is clicked, rather than running the script each time the tiddler is rendered.\n\n''External script source files:''\nYou can also load javascript from an external source URL, by including a src="..." parameter in the initial {{{<script>}}} marker (e.g., {{{<script src="demo.js"></script>}}}). This is particularly useful when incorporating third-party javascript libraries for use in custom extensions and plugins. The 'foreign' javascript code remains isolated in a separate file that can be easily replaced whenever an updated library file becomes available.\n\n''Display script source in tiddler output''\nBy including the keyword parameter "show", in the initial {{{<script>}}} marker, the plugin will include the script source code in the output that it displays in the tiddler.\n\n''Defining javascript functions and libraries:''\nAlthough the external javascript file is loaded while the tiddler content is being rendered, any functions it defines will not be available for use until //after// the rendering has been completed. Thus, you cannot load a library and //immediately// use it's functions within the same tiddler. However, once that tiddler has been loaded, the library functions can be freely used in any tiddler (even the one in which it was initially loaded).\n\nTo ensure that your javascript functions are always available when needed, you should load the libraries from a tiddler that will be rendered as soon as your TiddlyWiki document is opened. For example, you could put your {{{<script src="..."></script>}}} syntax into a tiddler called LoadScripts, and then add {{{<<tiddler LoadScripts>>}}} in your MainMenu tiddler.\n\nSince the MainMenu is always rendered immediately upon opening your document, the library will always be loaded before any other tiddlers that rely upon the functions it defines. Loading an external javascript library does not produce any direct output in the tiddler, so these definitions should have no impact on the appearance of your MainMenu.\n\n''Creating dynamic tiddler content''\nAn important difference between this implementation of embedded scripting and conventional embedded javascript techniques for web pages is the method used to produce output that is dynamically inserted into the document:\n* In a typical web document, you use the document.write() function to output text sequences (often containing HTML tags) that are then rendered when the entire document is first loaded into the browser window.\n* However, in a ~TiddlyWiki document, tiddlers (and other DOM elements) are created, deleted, and rendered "on-the-fly", so writing directly to the global 'document' object does not produce the results you want (i.e., replacing the embedded script within the tiddler content), and completely replaces the entire ~TiddlyWiki document in your browser window.\n* To allow these scripts to work unmodified, the plugin automatically converts all occurences of document.write() so that the output is inserted into the tiddler content instead of replacing the entire ~TiddlyWiki document.\n\nIf your script does not use document.write() to create dynamically embedded content within a tiddler, your javascript can, as an alternative, explicitly return a text value that the plugin can then pass through the wikify() rendering engine to insert into the tiddler display. For example, using {{{return "thistext"}}} will produce the same output as {{{document.write("thistext")}}}.\n\n//Note: your script code is automatically 'wrapped' inside a function, {{{_out()}}}, so that any return value you provide can be correctly handled by the plugin and inserted into the tiddler. To avoid unpredictable results (and possibly fatal execution errors), this function should never be redefined or called from ''within'' your script code.//\n\n''Accessing the ~TiddlyWiki DOM''\nThe plugin provides one pre-defined variable, 'place', that is passed in to your javascript code so that it can have direct access to the containing DOM element into which the tiddler output is currently being rendered.\n\nAccess to this DOM element allows you to create scripts that can:\n* vary their actions based upon the specific location in which they are embedded\n* access 'tiddler-relative' information (use findContainingTiddler(place))\n* perform direct DOM manipulations (when returning wikified text is not enough)\n<<<\n!!!!!Examples\n<<<\nan "alert" message box:\n><script show>\n alert('InlineJavascriptPlugin: this is a demonstration message');\n</script>\ndynamic output:\n><script show>\n return (new Date()).toString();\n</script>\nwikified dynamic output:\n><script show>\n return "link to current user: [["+config.options.txtUserName+"]]";\n</script>\ndynamic output using 'place' to get size information for current tiddler:\n><script show>\n if (!window.story) window.story=window;\n var title=story.findContainingTiddler(place).id.substr(7);\n return title+" is using "+store.getTiddlerText(title).length+" bytes";\n</script>\ncreating an 'onclick' button/link that runs a script:\n><script label="click here" show>\n if (!window.story) window.story=window;\n alert("Hello World!\snlinktext='"+place.firstChild.data+"'\sntiddler='"+story.findContainingTiddler(place).id.substr(7)+"'");\n</script>\nloading a script from a source url:\n>http://www.TiddlyTools.com/demo.js contains:\n>>{{{function demo() { alert('this output is from demo(), defined in demo.js') } }}}\n>>{{{alert('InlineJavascriptPlugin: demo.js has been loaded'); }}}\n><script src="demo.js" show>\n return "loading demo.js..."\n</script>\n><script label="click to execute demo() function" show>\n demo()\n</script>\n<<<\n!!!!!Installation\n<<<\nimport (or copy/paste) the following tiddlers into your document:\n''InlineJavascriptPlugin'' (tagged with <<tag systemConfig>>)\n<<<\n!!!!!Revision History\n<<<\n''2006.06.01 [1.5.1]'' when calling wikify() on script return value, pass hightlightRegExp and tiddler params so macros that rely on these values can render properly\n''2006.04.19 [1.5.0]'' added 'show' parameter to force display of javascript source code in tiddler output\n''2006.01.05 [1.4.0]'' added support 'onclick' scripts. When label="..." param is present, a button/link is created using the indicated label text, and the script is only executed when the button/link is clicked. 'place' value is set to match the clicked button/link element.\n''2005.12.13 [1.3.1]'' when catching eval error in IE, e.description contains the error text, instead of e.toString(). Fixed error reporting so IE shows the correct response text. Based on a suggestion by UdoBorkowski\n''2005.11.09 [1.3.0]'' for 'inline' scripts (i.e., not scripts loaded with src="..."), automatically replace calls to 'document.write()' with 'place.innerHTML+=' so script output is directed into tiddler content. Based on a suggestion by BradleyMeck\n''2005.11.08 [1.2.0]'' handle loading of javascript from an external URL via src="..." syntax\n''2005.11.08 [1.1.0]'' pass 'place' param into scripts to provide direct DOM access \n''2005.11.08 [1.0.0]'' initial release\n<<<\n!!!!!Credits\n<<<\nThis feature was developed by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]]\n<<<\n!!!!!Code\n***/\n//{{{\nversion.extensions.inlineJavascript= {major: 1, minor: 5, revision: 1, date: new Date(2006,6,1)};\n\nconfig.formatters.push( {\n name: "inlineJavascript",\n match: "\s\s<script",\n lookahead: "\s\s<script(?: src=\s\s\s"((?:.|\s\sn)*?)\s\s\s")?(?: label=\s\s\s"((?:.|\s\sn)*?)\s\s\s")?( show)?\s\s>((?:.|\s\sn)*?)\s\s</script\s\s>",\n\n handler: function(w) {\n var lookaheadRegExp = new RegExp(this.lookahead,"mg");\n lookaheadRegExp.lastIndex = w.matchStart;\n var lookaheadMatch = lookaheadRegExp.exec(w.source)\n if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {\n if (lookaheadMatch[1]) { // load a script library\n // make script tag, set src, add to body to execute, then remove for cleanup\n var script = document.createElement("script"); script.src = lookaheadMatch[1];\n document.body.appendChild(script); document.body.removeChild(script);\n }\n if (lookaheadMatch[4]) { // there is script code\n if (lookaheadMatch[3]) // show inline script code in tiddler output\n wikify("{{{\sn"+lookaheadMatch[0]+"\sn}}}\sn",w.output);\n if (lookaheadMatch[2]) { // create a link to an 'onclick' script\n // add a link, define click handler, save code in link (pass 'place'), set link attributes\n var link=createTiddlyElement(w.output,"a",null,"tiddlyLinkExisting",lookaheadMatch[2]);\n link.onclick=function(){try{return(eval(this.code))}catch(e){alert(e.description?e.description:e.toString())}}\n link.code="function _out(place){"+lookaheadMatch[4]+"};_out(this);"\n link.setAttribute("href","javascript:;"); link.setAttribute("title",""); link.style.cursor="pointer";\n }\n else { // run inline script code\n var code="function _out(place){"+lookaheadMatch[4]+"};_out(w.output);"\n code=code.replace(/document.write\s(/gi,'place.innerHTML+=(');\n try { var out = eval(code); } catch(e) { out = e.description?e.description:e.toString(); }\n if (out && out.length) wikify(out,w.output,w.highlightRegExp,w.tiddler);\n }\n }\n w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;\n }\n }\n} )\n//}}}
<<formTiddler ContactsFormTemplate>>\n<data>{"firstname":"Joe","lastname":"Block","email":"jb@example.org","phone":"555-1234567","city":"Boston","state":"MA","notes":"works as a designer, \snmay help with logo.","webpage":"www.example.org","country":"US"}</data>
/***\n|''Name:''|LegacyStrikeThroughPlugin|\n|''Description:''|Support for legacy (pre 2.1) strike through formatting|\n|''Version:''|1.0.1|\n|''Date:''|Jul 21, 2006|\n|''Source:''|http://www.tiddlywiki.com/#LegacyStrikeThroughPlugin|\n|''Author:''|MartinBudden (mjbudden (at) gmail (dot) com)|\n|''License:''|[[BSD open source license]]|\n|''CoreVersion:''|2.1.0|\n|''Browser:''|Firefox 1.0.4+; Firefox 1.5; InternetExplorer 6.0|\n\n***/\n\n//{{{\n\n// Ensure that the LegacyStrikeThrough Plugin is only installed once.\nif(!version.extensions.LegacyStrikeThroughPlugin)\n {\n version.extensions.LegacyStrikeThroughPlugin = true;\n\nconfig.formatters.push(\n{\n name: "legacyStrikeByChar",\n match: "==",\n termRegExp: /(==)/mg,\n element: "strike",\n handler: config.formatterHelpers.createElementAndWikify\n});\n\n} // end of "install only once"\n//}}}\n
<<tiddlerList tags: viento,madera,bisel,-etiquetasusuales format:"table" header:"Bisel" >>
<<tiddlerList tags: viento,madera,lengüeta,doble,-etiquetasusuales format:"table" header:"Lengüeta Doble" >>
<<tiddlerList tags: viento,madera,lengüeta,simple,-etiquetasusuales format:"table" header:"Lengüeta Simple" >>
[[Guía de Instrumentos]]\n----\n[[Foro|http://www.envelooponline.com/guia]]\n----\n[[Acerca de]]\n----\n\n\n^^Diseñado para [[Firefox|http://www.mozilla-europe.org/es/products/firefox/]]\n^^TiddlyWiki <<version>>^^\n
<<tiddlerList tags: viento,metal,-etiquetasusuales format:"table" header:"Metal" >>
/***\n|''Name:''|NestedSlidersPlugin|\n|''Source:''|http://www.TiddlyTools.com/#NestedSlidersPlugin|\n|''Author:''|Eric Shulman - ELS Design Studios|\n|''License:''|[[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|\n|''~CoreVersion:''|2.0.10|\n\nQuickly make any tiddler content into an expandable 'slider' panel, without needing to create a separate tiddler to contain the slider content. Optional syntax allows ''default to open'', ''custom button label/tooltip'' and ''automatic blockquote formatting.''\n\nYou can also 'nest' these sliders as deep as you like (see complex nesting example below), so that expandable 'tree-like' hierarchical displays can be created. This is most useful when converting existing in-line text content to create in-line annotations, footnotes, context-sensitive help, or other subordinate information displays.\n\nFor more details, please click on a section headline below:\n++++!!!!![Configuration]>\nDebugging messages for 'lazy sliders' deferred rendering:\n<<option chkDebugLazySliderDefer>> show debugging alert when deferring slider rendering\n<<option chkDebugLazySliderRender>> show debugging alert when deferred slider is actually rendered\n===\n++++!!!!![Usage]>\nWhen installed, this plugin adds new wiki syntax for embedding 'slider' panels directly into tiddler content. Use {{{+++}}} and {{{===}}} to delimit the slider content. Additional optional syntax elements let you specify\n*default to open\n*cookiename\n*heading level\n*floater (with optional CSS width value)\n*mouse auto rollover\n*custom class/label/tooltip/accesskey\n*automatic blockquote\n*deferred rendering\nThe complete syntax, using all options, is:\n//{{{\n++++(cookiename)!!!!!^width^*{{class{[label=key|tooltip]}}}>...\ncontent goes here\n===\n//}}}\nwhere:\n* {{{+++}}} (or {{{++++}}}) and {{{===}}}^^\nmarks the start and end of the slider definition, respectively. When the extra {{{+}}} is used, the slider will be open when initially displayed.^^\n* {{{(cookiename)}}}^^\nsaves the slider opened/closed state, and restores this state whenever the slider is re-rendered.^^\n* {{{!}}} through {{{!!!!!}}}^^\ndisplays the slider label using a formatted headline (Hn) style instead of a button/link style^^\n* {{{^width^}}} (or just {{{^}}})^^\nmakes the slider 'float' on top of other content rather than shifting that content downward. 'width' must be a valid CSS value (e.g., "30em", "180px", "50%", etc.). If omitted, the default width is "auto" (i.e., fit to content)^^\n* {{{*}}}^^\nautomatically opens/closes slider on "rollover" as well as when clicked^^\n* {{{{{class{[label=key|tooltip]}}}}}}^^\nuses custom label/tooltip/accesskey. {{{{{class{...}}}}}}, {{{=key}}} and {{{|tooltip}}} are optional. 'class' is any valid CSS class name, used to style the slider label text. 'key' must be a ''single letter only''. Default labels/tootips are: ">" (more) and "<" (less), with no default access key assignment.^^\n* {{{">"}}} //(without the quotes)//^^\nautomatically adds blockquote formatting to slider content^^\n* {{{"..."}}} //(without the quotes)//^^\ndefers rendering of closed sliders until the first time they are opened. //Note: deferred rendering may produce unexpected results in some cases. Use with care.//^^\n\n//Note: to make slider definitions easier to read and recognize when editing a tiddler, newlines immediately following the {{{+++}}} 'start slider' or preceding the {{{===}}} 'end slider' sequence are automatically supressed so that excess whitespace is eliminated from the output.//\n===\n++++!!!!![Examples]>\nsimple in-line slider: \n{{{\n+++\n content\n===\n}}}\n+++\n content\n===\n----\nuse a custom label and tooltip: \n{{{\n+++[label|tooltip]\n content\n===\n}}}\n+++[label|tooltip]\n content\n===\n----\ncontent automatically blockquoted: \n{{{\n+++>\n content\n===\n}}}\n+++>\n content\n===\n----\nall options combined //(default open, cookie, heading, sized floater, rollover, class, label/tooltip/key, blockquoted, deferred)//\n{{{\n++++(testcookie)!!!^30em^*{{big{[label=Z|click or press Alt-Z to open]}}}>...\n content\n===\n}}}\n++++(testcookie)!!!^30em^*{{big{[label=Z|click or press Alt-Z to open]}}}>...\n content\n===\n----\ncomplex nesting example:\n{{{\n+++^[get info...=I|click for information or press Alt-I]\n put some general information here, plus a floating slider with more specific info:\n +++^10em^[view details...|click for details]\n put some detail here, which could include a rollover with a +++^25em^*[glossary definition]explaining technical terms===\n ===\n===\n}}}\n+++^[get info...=I|click for information or press Alt-I]\n put some general information here, plus a floating slider with more specific info:\n +++^10em^[view details...|click for details]\n put some detail here, which could include a rollover with a +++^25em^*[glossary definition]explaining technical terms===\n ===\n===\n===\n!!!!!Installation\n<<<\nimport (or copy/paste) the following tiddlers into your document:\n''NestedSlidersPlugin'' (tagged with <<tag systemConfig>>)\n<<<\n!!!!!Revision History\n<<<\n''2006.07.28 - 2.0.0'' added custom class syntax around label/tip/key syntax: {{{{{classname{[label=key|tip]}}}}}}\n''2006.07.25 - 1.9.3'' when parsing slider, save default open/closed state in button element, then in onClickNestedSlider(), if slider state matches saved default, instead of saving cookie, delete it. Significantly reduces the 'cookie overhead' when default slider states are used.\n''2006.06.29 - 1.9.2'' in onClickNestedSlider(), when setting focus to first control, skip over type="hidden"\n''2006.06.22 - 1.9.1'' added panel.defaultPanelWidth to save requested panel width, even after resizing has changed the style value\n''2006.05.11 - 1.9.0'' added optional '^width^' syntax for floating sliders and '=key' syntax for setting an access key on a slider label\n''2006.05.09 - 1.8.0'' in onClickNestedSlider(), when showing panel, set focus to first child input/textarea/select element\n''2006.04.24 - 1.7.8'' in adjustSliderPos(), if floating panel is contained inside another floating panel, subtract offset of containing panel to find correct position\n''2006.02.16 - 1.7.7'' corrected deferred rendering to account for use-case where show/hide state is tracked in a cookie\n''2006.02.15 - 1.7.6'' in adjustSliderPos(), ensure that floating panel is positioned completely within the browser window (i.e., does not go beyond the right edge of the browser window)\n''2006.02.04 - 1.7.5'' add 'var' to unintended global variable declarations to avoid FireFox crash bug when assigning to globals\n''2006.01.18 - 1.7.4'' only define adjustSliderPos() function if it has not already been provided by another plugin. This lets other plugins 'hijack' the function even when they are loaded first.\n''2006.01.16 - 1.7.3'' added adjustSliderPos(place,btn,panel,panelClass) function to permit specialized logic for placement of floating panels. While it provides improved placement for many uses of floating panels, it exhibits a relative offset positioning error when used within *nested* floating panels. Short-term workaround is to only adjust the position for 'top-level' floaters.\n''2006.01.16 - 1.7.2'' added button property to slider panel elements so that slider panel can tell which button it belongs to. Also, re-activated and corrected animation handling so that nested sliders aren't clipped by hijacking Slider.prototype.stop so that "overflow:hidden" can be reset to "overflow:visible" after animation ends\n''2006.01.14 - 1.7.1'' added optional "^" syntax for floating panels. Defines new CSS class, ".floatingPanel", as an alternative for standard in-line ".sliderPanel" styles.\n''2006.01.14 - 1.7.0'' added optional "*" syntax for rollover handling to show/hide slider without requiring a click (Based on a suggestion by tw4efl)\n''2006.01.03 - 1.6.2'' When using optional "!" heading style, instead of creating a clickable "Hn" element, create an "A" element inside the "Hn" element. (allows click-through in SlideShowPlugin, which captures nearly all click events, except for hyperlinks)\n''2005.12.15 - 1.6.1'' added optional "..." syntax to invoke deferred ('lazy') rendering for initially hidden sliders\nremoved checkbox option for 'global' application of lazy sliders\n''2005.11.25 - 1.6.0'' added optional handling for 'lazy sliders' (deferred rendering for initially hidden sliders)\n''2005.11.21 - 1.5.1'' revised regular expressions: if present, a single newline //preceding// and/or //following// a slider definition will be suppressed so start/end syntax can be place on separate lines in the tiddler 'source' for improved readability. Similarly, any whitespace (newlines, tabs, spaces, etc.) trailing the 'start slider' syntax or preceding the 'end slider' syntax is also suppressed.\n''2005.11.20 - 1.5.0'' added (cookiename) syntax for optional tracking and restoring of slider open/close state\n''2005.11.11 - 1.4.0'' added !!!!! syntax to render slider label as a header (Hn) style instead of a button/link style\n''2005.11.07 - 1.3.0'' removed alternative syntax {{{(((}}} and {{{)))}}} (so they can be used by other\nformatting extensions) and simplified/improved regular expressions to trim multiple excess newlines\n''2005.11.05 - 1.2.1'' changed name to NestedSlidersPlugin\nmore documentation\n''2005.11.04 - 1.2.0'' added alternative character-mode syntax {{{(((}}} and {{{)))}}}\ntweaked "eat newlines" logic for line-mode {{{+++}}} and {{{===}}} syntax\n''2005.11.03 - 1.1.1'' fixed toggling of default tooltips ("more..." and "less...") when a non-default button label is used\ncode cleanup, added documentation\n''2005.11.03 - 1.1.0'' changed delimiter syntax from {{{(((}}} and {{{)))}}} to {{{+++}}} and {{{===}}}\nchanged name to EasySlidersPlugin\n''2005.11.03 - 1.0.0'' initial public release\n<<<\n!!!!!Credits\n<<<\nThis feature was implemented by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]] with initial research and suggestions from RodneyGomes, GeoffSlocock, and PaulPetterson.\n<<<\n!!!!!Code\n***/\n//{{{\nversion.extensions.nestedSliders = {major: 2, minor: 0, revision: 0, date: new Date(2006,7,28)};\n//}}}\n\n//{{{\n// options for deferred rendering of sliders that are not initially displayed\nif (config.options.chkDebugLazySliderDefer==undefined) config.options.chkDebugLazySliderDefer=false;\nif (config.options.chkDebugLazySliderRender==undefined) config.options.chkDebugLazySliderRender=false;\n\n// default styles for 'floating' class\nsetStylesheet(".floatingPanel { position:absolute; z-index:10; padding:0.5em; margin:0em; \s\n background-color:#eee; color:#000; border:1px solid #000; text-align:left; }","floatingPanelStylesheet");\n//}}}\n\n//{{{\nconfig.formatters.push( {\n name: "nestedSliders",\n match: "\s\sn?\s\s+{3}",\n terminator: "\s\ss*\s\s={3}\s\sn?",\n lookahead: "\s\sn?\s\s+{3}(\s\s+)?(\s\s([^\s\s)]*\s\s))?(\s\s!*)?(\s\s^(?:[^\s\s^\s\s*\s\s[\s\s>]*\s\s^)?)?(\s\s*)?(?:\s\s{\s\s{([\s\sw]+[\s\ss\s\sw]*)\s\s{)?(\s\s[[^\s\s]]*\s\s])?(?:\s\s}{3})?(\s\s>)?(\s\s.\s\s.\s\s.)?\s\ss*",\n handler: function(w)\n {\n // defopen=lookaheadMatch[1]\n // cookiename=lookaheadMatch[2]\n // header=lookaheadMatch[3]\n // panelwidth=lookaheadMatch[4]\n // rollover=lookaheadMatch[5]\n // class=lookaheadMatch[6]\n // label=lookaheadMatch[7]\n // blockquote=lookaheadMatch[8]\n // deferred=lookaheadMatch[9]\n\n lookaheadRegExp = new RegExp(this.lookahead,"mg");\n lookaheadRegExp.lastIndex = w.matchStart;\n var lookaheadMatch = lookaheadRegExp.exec(w.source)\n if(lookaheadMatch && lookaheadMatch.index == w.matchStart)\n {\n // location for rendering button and panel\n var place=w.output;\n\n // default to closed, no cookie, no accesskey\n var show="none"; var title=">"; var tooltip="show"; var cookie=""; var key="";\n\n // extra "+", default to open\n if (lookaheadMatch[1])\n { show="block"; title="<"; tooltip="hide"; }\n\n // cookie, use saved open/closed state\n if (lookaheadMatch[2]) {\n cookie=lookaheadMatch[2].trim().slice(1,-1);\n cookie="chkSlider"+cookie;\n if (config.options[cookie]==undefined)\n { config.options[cookie] = (show=="block") }\n if (config.options[cookie])\n { show="block"; title="<"; tooltip="hide"; }\n else\n { show="none"; title=">"; tooltip="show"; }\n }\n\n // parse custom label/tooltip/accesskey: [label=X|tooltip]\n if (lookaheadMatch[7]) {\n title = lookaheadMatch[7].trim().slice(1,-1);\n var pos=title.indexOf("|");\n if (pos!=-1) { tooltip = title.substr(pos+1,title.length); title=title.substr(0,pos); }\n if (title.substr(title.length-2,1)=="=") { key=title.substr(title.length-1,1); title=title.slice(0,-2); }\n if (pos==-1) tooltip += " "+title; // default tooltip: "show/hide <title>"\n }\n\n // create the button\n if (lookaheadMatch[3]) { // use "Hn" header format instead of button/link\n var lvl=(lookaheadMatch[3].length>6)?6:lookaheadMatch[3].length;\n var btn = createTiddlyElement(createTiddlyElement(place,"h"+lvl,null,null,null),"a",null,lookaheadMatch[6],title);\n btn.onclick=onClickNestedSlider;\n btn.setAttribute("href","javascript:;");\n btn.setAttribute("title",tooltip);\n }\n else\n var btn = createTiddlyButton(place,title,tooltip,onClickNestedSlider,lookaheadMatch[6]);\n\n // set extra button attributes\n btn.sliderCookie = cookie; // save the cookiename (if any) in the button object\n btn.defOpen=lookaheadMatch[1]!=null; // save default open/closed state (boolean)\n btn.keyparam=key; // save the access key letter ("" if none)\n if (key.length) {\n btn.setAttribute("accessKey",key); // init access key\n btn.onfocus=function(){this.setAttribute("accessKey",this.keyparam);}; // **reclaim** access key on focus\n }\n\n // "non-click" MouseOver open/close slider\n if (lookaheadMatch[5]) btn.onmouseover=onClickNestedSlider;\n\n // create slider panel\n var panelClass=lookaheadMatch[4]?"floatingPanel":"sliderPanel";\n var panel=createTiddlyElement(place,"div",null,panelClass,null);\n panel.button = btn; // so the slider panel know which button it belongs to\n panel.defaultPanelWidth=(lookaheadMatch[4] && lookaheadMatch[4].length>2)?lookaheadMatch[4].slice(1,-1):""; // save requested panel size\n btn.sliderPanel=panel;\n panel.style.display = show;\n panel.style.width=panel.defaultPanelWidth;\n\n // render slider (or defer until shown) \n w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;\n if ((show=="block")||!lookaheadMatch[9]) {\n // render now if panel is supposed to be shown or NOT deferred rendering\n w.subWikify(lookaheadMatch[8]?createTiddlyElement(panel,"blockquote"):panel,this.terminator);\n // align slider/floater position with button\n adjustSliderPos(place,btn,panel,panelClass);\n }\n else {\n var src = w.source.substr(w.nextMatch);\n var endpos=findMatchingDelimiter(src,"+++","===");\n panel.setAttribute("raw",src.substr(0,endpos));\n panel.setAttribute("blockquote",lookaheadMatch[8]?"true":"false");\n panel.setAttribute("rendered","false");\n w.nextMatch += endpos+3;\n if (w.source.substr(w.nextMatch,1)=="\sn") w.nextMatch++;\n if (config.options.chkDebugLazySliderDefer) alert("deferred '"+title+"':\sn\sn"+panel.getAttribute("raw"));\n }\n }\n }\n }\n)\n\n// TBD: ignore 'quoted' delimiters (e.g., "{{{+++foo===}}}" isn't really a slider)\nfunction findMatchingDelimiter(src,starttext,endtext) {\n var startpos = 0;\n var endpos = src.indexOf(endtext);\n // check for nested delimiters\n while (src.substring(startpos,endpos-1).indexOf(starttext)!=-1) {\n // count number of nested 'starts'\n var startcount=0;\n var temp = src.substring(startpos,endpos-1);\n var pos=temp.indexOf(starttext);\n while (pos!=-1) { startcount++; pos=temp.indexOf(starttext,pos+starttext.length); }\n // set up to check for additional 'starts' after adjusting endpos\n startpos=endpos+endtext.length;\n // find endpos for corresponding number of matching 'ends'\n while (startcount && endpos!=-1) {\n endpos = src.indexOf(endtext,endpos+endtext.length);\n startcount--;\n }\n }\n return (endpos==-1)?src.length:endpos;\n}\n//}}}\n\n//{{{\nwindow.onClickNestedSlider=function(e)\n{\n if (!e) var e = window.event;\n var theTarget = resolveTarget(e);\n var theLabel = theTarget.firstChild.data;\n var theSlider = theTarget.sliderPanel\n var isOpen = theSlider.style.display!="none";\n // if using default button labels, toggle labels\n if (theLabel==">") theTarget.firstChild.data = "<";\n else if (theLabel=="<") theTarget.firstChild.data = ">";\n // if using default tooltips, toggle tooltips\n if (theTarget.getAttribute("title")=="show")\n theTarget.setAttribute("title","hide");\n else if (theTarget.getAttribute("title")=="hide")\n theTarget.setAttribute("title","show");\n if (theTarget.getAttribute("title")=="show "+theLabel)\n theTarget.setAttribute("title","hide "+theLabel);\n else if (theTarget.getAttribute("title")=="hide "+theLabel)\n theTarget.setAttribute("title","show "+theLabel);\n // deferred rendering (if needed)\n if (theSlider.getAttribute("rendered")=="false") {\n if (config.options.chkDebugLazySliderRender)\n alert("rendering '"+theLabel+"':\sn\sn"+theSlider.getAttribute("raw"));\n var place=theSlider;\n if (theSlider.getAttribute("blockquote")=="true")\n place=createTiddlyElement(place,"blockquote");\n wikify(theSlider.getAttribute("raw"),place);\n theSlider.setAttribute("rendered","true");\n }\n // show/hide the slider\n if(config.options.chkAnimate)\n anim.startAnimating(new Slider(theSlider,!isOpen,e.shiftKey || e.altKey,"none"));\n else\n theSlider.style.display = isOpen ? "none" : "block";\n // reset to default width (might have been changed via plugin code)\n theSlider.style.width=theSlider.defaultPanelWidth;\n // align slider/floater position with target button\n if (!isOpen) adjustSliderPos(theSlider.parentNode,theTarget,theSlider,theSlider.className);\n // if showing panel, set focus to first 'focus-able' element in panel\n if (theSlider.style.display!="none") {\n var ctrls=theSlider.getElementsByTagName("*");\n for (var c=0; c<ctrls.length; c++) {\n var t=ctrls[c].tagName.toLowerCase();\n if ((t=="input" && ctrls[c].type!="hidden") || t=="textarea" || t=="select")\n { ctrls[c].focus(); break; }\n }\n }\n if (this.sliderCookie && this.sliderCookie.length) {\n config.options[this.sliderCookie]=!isOpen;\n if (config.options[this.sliderCookie]!=this.defOpen)\n saveOptionCookie(this.sliderCookie);\n else { // remove cookie if slider is in default display state\n var ex=new Date(); ex.setTime(ex.getTime()-1000);\n document.cookie = this.sliderCookie+"=novalue; path=/; expires="+ex.toGMTString();\n }\n }\n return false;\n}\n\n// hijack animation handler 'stop' handler so overflow is visible after animation has completed\nSlider.prototype.coreStop = Slider.prototype.stop;\nSlider.prototype.stop = function() { this.coreStop(); this.element.style.overflow = "visible"; }\n\n// adjust panel position based on button position\nif (window.adjustSliderPos==undefined) window.adjustSliderPos=function(place,btn,panel,panelClass) {\n if (panelClass=="floatingPanel") {\n var left=0;\n var top=btn.offsetHeight; \n if (place.style.position!="relative") {\n var left=findPosX(btn);\n var top=findPosY(btn)+btn.offsetHeight;\n var p=place; while (p && p.className!='floatingPanel') p=p.parentNode;\n if (p) { left-=findPosX(p); top-=findPosY(p); }\n }\n if (left+panel.offsetWidth > getWindowWidth()) left=getWindowWidth()-panel.offsetWidth-10;\n panel.style.left=left+"px"; panel.style.top=top+"px";\n }\n}\n\nfunction getWindowWidth() {\n if(document.width!=undefined)\n return document.width; // moz (FF)\n if(document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) )\n return document.documentElement.clientWidth; // IE6\n if(document.body && ( document.body.clientWidth || document.body.clientHeight ) )\n return document.body.clientWidth; // IE4\n if(window.innerWidth!=undefined)\n return window.innerWidth; // IE - general\n return 0; // unknown\n}\n//}}}
\n<<formTiddler fichaPlantilla>>\n<data>{"tecnico":"José Luis González Castro","mes":"Mayo","año":"2007","lugar":"aula","notes":"Tascam HD-P2\snMicrófono Rode NT5\sn\snMucho ruido de fondo. Algunos finales cortados y fundidos para apagar el ruido.","interprete":"Ricardo Pazo García"}</data>\n
\n|[img[oboe|materiales/fotografías/oboe.jpg]]|\n\n!Guía\n\n1.Registro:\n\nLa tesitura del oboe abarca desde un sib grave hasta un sol sobreagudo.\n\nSib grave; sol (primera octava); sol (segunda octava); sol (tercera octava).\n+++[Ejemplo 1]...\n<<player id=1 quicktime materiales/grabaciones/oboe/oboe_1.wav 400 15>>\n===\n\n\nRegistros: grave : sexta sib-sol; primera octava sol- sol; segunda octava sol- sol sobreagudo.\n+++[Ejemplo 2]...\n<<player id=2 quicktime materiales/grabaciones/oboe/oboe_2.wav 400 15>>\n===\n\n\nSe puede llegar hasta un lab agudo, aunque no se utiliza.\n+++[Ejemplo 3]...\n<<player id=3 quicktime materiales/grabaciones/oboe/oboe_3.wav 400 15>>\n===\n\n\nHay una parte del registro en la que se puede hacer armónicos simplemente cambiando la posición; el efecto es un poco más atenuado.\n\nNotas en posición normal y como armónicos: la, sib.\n+++[Ejemplo 4]...\n<<player id=4 quicktime materiales/grabaciones/oboe/oboe_4.wav 400 15>>\n===\n\n\nEl registro grave presenta dificultades para la emisión y afinación. Normalmente los oboes tienden a quedarse bajos en el registro grave; la emisión es mucho más complicada que los registros medio agudo. \n\nUna caña ancha facilita los graves pero dificulta los agudos. Los oboístas modifican la forma, el corte de la caña, utilizando diferentes moldes, para encontrar una compensación entre el grave y el agudo.\n\nDe preferencia, los oboístas tocan tonalidades con bemoles; lo más habitual es tocar en tonalidades con hasta tres o cuatro alteraciones. El oboe es un instrumento temperado; do# suena igual que reb. Se puede modificar ligeramente la entonación, pero la posición es la misma.\n\nDo#; reb.\n+++[Ejemplo 5]...\n<<player id=5 quicktime materiales/grabaciones/oboe/oboe_5.wav 400 15>>\n===\n\n\nTocar al unísono con otro oboe es complicado por las diferencias tímbricas, de construcción de los instrumentos, de construcción de las cañas... Ambos deben estar muy igualados, y hay quien prefiere que los instrumentos de la misma cuerda sean del mismo fabricante. \n\n2.Dinámicas:\n\nEl registro agudo está sometido a una mayor presión de la columna de aire que el grave; no obstante, a partir del sol hacia abajo (registro grave), el p se hace más complicado, por una cuestión de longitud y anchura del tubo -el oboe es un instrumento cónico-. \n\nNotas en p, registro grave.\n+++[Ejemplo 6]...\n<<player id=6 quicktime materiales/grabaciones/oboe/oboe_6.wav 400 15>>\n===\n\n\nSe puede conseguir un efecto p con sordina. La sordina no se fabrica aparte; cada oboísta se hace la suya con un pedazo de tela.\n\nSerie de notas con y sin sordina.\n+++[Ejemplo 7]...\n<<player id=7 quicktime materiales/grabaciones/oboe/oboe_7.wav 400 15>>\n===\n\n\nLas sordinas se utilizan bastante en sinfonías de Mahler y similares para no arriesgar las entradas en el registro grave.\n\np<ff>p\n+++[Ejemplo 8]...\n<<player id=8 quicktime materiales/grabaciones/oboe/oboe_8.wav 400 15>>\n===\n\n\n3.Vibrato:\n\nSe puede incrementar ligeramente la intensidad ayudándose con el vibrato. Se puede tocar con mucho o poco vibrato, con vibrato de garganta, de diafragma o con una combinación de los dos; la finalidad es siempre ayudar a la expresión, a la melodía y al propio sonido.\n\nNota con vibrato; nota sin vibrato; nota combinada, sin y con vibrato.\n+++[Ejemplo 9]...\n<<player id=9 quicktime materiales/grabaciones/oboe/oboe_9.wav 400 15>>\n===\n\n\nEl vibrato se puede aplicar en todo el registro.\n+++[Ejemplo 10]...\n<<player id=10 quicktime materiales/grabaciones/oboe/oboe_10.wav 400 15>>\n===\n\n\nEl vibrato se puede hacer a mayor o menor velocidad según el objetivo que se busque.\n+++[Ejemplo 11]...\n<<player id=11 quicktime materiales/grabaciones/oboe/oboe_11.wav 400 15>>\n=== \n\n\nEl vibrato suele quedar a juicio del intérprete; es una cualidad que enriquece el sonido pero no es una propiedad del sonido, por lo que su uso no es obligado ni debe ser mecánico.\n\nEjemplo del II Mov., concierto de Strauss; idéntico pasaje con vibrato aplicado de forma sistemática.\n+++[Ejemplo 12]...\n<<player id=12 quicktime materiales/grabaciones/oboe/oboe_12.wav 400 15>>\n===\n\n\nOtro ejemplo, con vibrato "sistemático"; idéntico pasaje con vibrato "juicioso".\n+++[Ejemplo 13]...\n<<player id=13 quicktime materiales/grabaciones/oboe/oboe_13.wav 400 15>>\n===\n\n\n4.Velocidad:\n\nEl instrumento es aproximadamente igual de ágil en todo el registro, con algunas dificultades en el agudo y el grave; do mayor es curiosamente una tonalidad complicada.\n\nPrueba de velocidad.\n+++[Ejemplo 14]...\n<<player id=14 quicktime materiales/grabaciones/oboe/oboe_14.wav 400 15>>\n===\n\n\nEscalas y arpegios a diferentes velocidades.\n+++[Ejemplo 15]...\n<<player id=15 quicktime materiales/grabaciones/oboe/oboe_15.wav 400 15>>\n===\n\n\n5.Articulaciones:\n\nStaccato seco.\n+++[Ejemplo 16]...\n<<player id=16 quicktime materiales/grabaciones/oboe/oboe_16.wav 400 15>>\n===\n\n\nMás tenuto.\n+++[Ejemplo 17]...\n<<player id=17 quicktime materiales/grabaciones/oboe/oboe_17.wav 400 15>>\n===\n\n\nMás agresivo.\n+++[Ejemplo 18]...\n<<player id=18 quicktime materiales/grabaciones/oboe/oboe_18.wav 400 15>>\n===\n\n\nMás dolce.\n+++[Ejemplo 19]...\n<<player id=19 quicktime materiales/grabaciones/oboe/oboe_19.wav 400 15>>\n===\n\n\nSoplado.\n+++[Ejemplo 20]...\n<<player id=20 quicktime materiales/grabaciones/oboe/oboe_20.wav 400 15>>\n===\n\n\nDoble Staccato (doble picado).\n+++[Ejemplo 21]...\n<<player id=21 quicktime materiales/grabaciones/oboe/oboe_21.wav 400 15>>\n===\n\n\nTriple picado.\n+++[Ejemplo 22]...\n<<player id=22 quicktime materiales/grabaciones/oboe/oboe_22.wav 400 15>>\n===\n\n\nLos dobles y triples picados son cómodos en el registro medio, difíciles en el agudo y muy difíciles en el grave.\n\n6.Frulato:\n\nCasi no se trabaja; se ejecuta más bien como un vibrato muy rápido.\n+++[Ejemplo 23]...\n<<player id=23 quicktime materiales/grabaciones/oboe/oboe_23.wav 400 15>>\n===\n\n\n7.Resistencia:\n\nSe puede utilizar la respiración circular -no es fácil de hacer-; algunos intérpretes la utilizan por mantener la frase mientras que otros prefieren no hacerlo porque dicen que agobia al público.\n\nNota mantenida en mp, una sola respiración.\n+++[Ejemplo 24]...\n<<player id=24 quicktime materiales/grabaciones/oboe/oboe_24.wav 400 15>>\n===\n\n\nTras pasajes intensos o notas particularmente largas se agradece unos compases de descanso (Bizet y su segundo tiempo de la Sinfonía en Do son un buen ejemplo de lo contrario). Un recurso extremo es que se turnen los dos oboes en los solos, aunque tienen que estar muy bien conjuntados.\n\n8.Trinos:\n\nTrinos sencillos.\n+++[Ejemplo 25]...\n<<player id=25 quicktime materiales/grabaciones/oboe/oboe_25.wav 400 15>>\n===\n\n\nTrinos complicados por la posición en la afinación: do- re; si- do#\n+++[Ejemplo 26]...\n<<player id=26 quicktime materiales/grabaciones/oboe/oboe_26.wav 400 15>>\n===\n\n\nTambién son complicados los trinos en el registro agudo.\n+++[Ejemplo 27]...\n<<player id=27 quicktime materiales/grabaciones/oboe/oboe_27.wav 400 15>>\n===\n\n\nDobles trinos (efecto).\n\nSi- do; do- re; sol- sol#; mi- fa (más complicado).\n+++[Ejemplo 28]...\n<<player id=28 quicktime materiales/grabaciones/oboe/oboe_28.wav 400 15>>\n===\n\n\n9.Glissandos:\n\nNo se utilizan mucho. La dificultad está en combinar notas que requieren platos cerrados y abiertos; se suelen hacer en el ámbito sol- do de los registros medio y agudo. En las últimas notas del agudo puede bajarse la nota por la falta de compresión.\n\n+++[Ejemplo 29]...\n<<player id=29 quicktime materiales/grabaciones/oboe/oboe_29.wav 400 15>>\n===\n\n\nRegistros medio y agudo, con la última nota bajándose; \n+++[Ejemplo 30]...\n<<player id=30 quicktime materiales/grabaciones/oboe/oboe_30.wav 400 15>>\n===\n\n\n10.Multifónicos:\n\nLos multifónicos se trabajan normalmente con un oboe de madera ligera, que tiene más flexibilidad para hacerlos (marca Rigoutat). El oboe empleado aquí tiene una construcción más gruesa tanto en la campana como en la cámara.\n+++[Ejemplo 31]...\n<<player id=31 quicktime materiales/grabaciones/oboe/oboe_31.wav 400 15>>\n===\n\n\n11.Sonidos en eco, utilizando armónicos:\n+++[Ejemplo 32]...\n<<player id=32 quicktime materiales/grabaciones/oboe/oboe_32.wav 400 15>>\n===\n\n\n\n
<<option chkGenerateAnRssFeed>> GenerarRssFeed\n<<option chkOpenInNewWindow>> AbrirEnlacesEnNuevaVentana\n<<option chkSaveEmptyTemplate>> GuardarPlantillaVacía\n<<option chkToggleLinks>> Cierra los tiddlers abiertos pulsando en el enlace\n^^(desactiva con Control u otra tecla modificadora)^^\n<<option chkHttpReadOnly>> OcultarOpcionesDeEdición cuando se acceda por HTTP\n<<option chkForceMinorUpdate>> Tratar las edicións como CambiosMenores conservado la fecha y hora\n^^(desactiva con la tecla Mayús cando pulses 'listo' o pulsando Ctrl+Mayús+Enter^^\n<<option chkConfirmDelete>> ConfirmarAntesDeBorrar\nNúmero máximo de líneas en el campo de edición del tiddler: <<option txtMaxEditRows>>\nNombre de la carpeta para los ficheiros de copia de seguridad: <<option txtBackupFolder>>\n<<option chkInsertTabs>> Usar tecla tab key para insertar tabulaciones en lugar de saltar al siguiente campo\n<<option chkSinglePageMode>> Mostrar un solo tiddler a la vez\n<<option chkTopOfPageMode>> Abrir siempre los tiddlers en la parte superior de la página\n<<option chkTOCIncludeHidden>> Incluir tiddlers ocultos en TableOfContents
* AdvancedOptions\n* OptionsPanel
Nombre:\n\n<<option txtUserName>>\n\nEstas opciones de personalización del TiddlyWiki se guardan en tu navegador\n\n<<option chkSaveBackups>> GuardarCopiaSeguridad\n<<option chkAutoSave>> AutoGuardar\n<<option chkRegExpSearch>> RegExpSearch\n<<option chkCaseSensitiveSearch>> BúsquedaSensibMayúsc\n<<option chkAnimate>> Animaciones al abrir tiddlers\n\n----\nOpcionesAvanzadas\nGestordePlugins\n<<exportTiddlers>>\n<<importTiddlers>>\n<<attach>>
<!--{{{-->\n<div class='header' macro='gradient vert [[ColorPalette::PrimaryLight]] [[ColorPalette::PrimaryMid]]'>\n<div class='headerShadow'>\n<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;\n<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>\n</div>\n<div class='headerForeground'>\n<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;\n<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>\n</div>\n<div id='topMenu' refresh='content' tiddler='TopMenu'></div>\n</div>\n</div>\n<div id='mainMenu' refresh='content' tiddler='MainMenu'></div>\n<div id='sidebar'>\n<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>\n<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>\n</div>\n<div id='displayArea'>\n<div id='messageArea'></div>\n<div id='tiddlerDisplay'></div>\n</div>\n<!--}}}-->
Estas opciones de personalización de TiddlyWiki se guardan en tu navegador\n\nTu nombre de usuario para firmar cuanto edites. Escríbelo como una PalabraWiki (p.e. FulanodeTal)\n\n<<option txtUserName>>\n<<option chkSaveBackups>> GuardarCopiaSeguridad\n<<option chkAutoSave>> AutoGuardar\n<<option chkRegExpSearch>> RegExpSearch\n<<option chkCaseSensitiveSearch>> BúsquedaSensibMayús\n<<option chkAnimate>> ActivarAnimaciones\n\n----\nOpcionesAvanzadas\nGestordePlugins\nImportarTiddlers
* SideBarOptions\n* SideBarTabs\n* TabAll\n* TabMore\n* TabMoreMissing\n* TabMoreOrphans\n* TabTags\n* TabTimeline
/***\n|<html><a name="Top"/></html>''Name:''|PartTiddlerPlugin|\n|''Version:''|1.0.6 (2006-11-07)|\n|''Source:''|http://tiddlywiki.abego-software.de/#PartTiddlerPlugin|\n|''Author:''|UdoBorkowski (ub [at] abego-software [dot] de)|\n|''Licence:''|[[BSD open source license]]|\n|''TiddlyWiki:''|2.0|\n|''Browser:''|Firefox 1.0.4+; InternetExplorer 6.0|\n!Table of Content<html><a name="TOC"/></html>\n* <html><a href="javascript:;" onclick="window.scrollAnchorVisible('Description',null, event)">Description, Syntax</a></html>\n* <html><a href="javascript:;" onclick="window.scrollAnchorVisible('Applications',null, event)">Applications</a></html>\n** <html><a href="javascript:;" onclick="window.scrollAnchorVisible('LongTiddler',null, event)">Refering to Paragraphs of a Longer Tiddler</a></html>\n** <html><a href="javascript:;" onclick="window.scrollAnchorVisible('Citation',null, event)">Citation Index</a></html>\n** <html><a href="javascript:;" onclick="window.scrollAnchorVisible('TableCells',null, event)">Creating "multi-line" Table Cells</a></html>\n** <html><a href="javascript:;" onclick="window.scrollAnchorVisible('Tabs',null, event)">Creating Tabs</a></html>\n** <html><a href="javascript:;" onclick="window.scrollAnchorVisible('Sliders',null, event)">Using Sliders</a></html>\n* <html><a href="javascript:;" onclick="window.scrollAnchorVisible('Revisions',null, event)">Revision History</a></html>\n* <html><a href="javascript:;" onclick="window.scrollAnchorVisible('Code',null, event)">Code</a></html>\n!Description<html><a name="Description"/></html>\nWith the {{{<part aPartName> ... </part>}}} feature you can structure your tiddler text into separate (named) parts. \nEach part can be referenced as a "normal" tiddler, using the "//tiddlerName//''/''//partName//" syntax (e.g. "About/Features"). E.g. you may create links to the parts, use it in {{{<<tiddler...>>}}} or {{{<<tabs...>>}}} macros etc.\n\n''Syntax:'' \n|>|''<part'' //partName// [''hidden''] ''>'' //any tiddler content// ''</part>''|\n|//partName//|The name of the part. You may reference a part tiddler with the combined tiddler name "//nameOfContainerTidder//''/''//partName//.|\n|''hidden''|When defined the content of the part is not displayed in the container tiddler. But when the part is explicitly referenced (e.g. in a {{{<<tiddler...>>}}} macro or in a link) the part's content is displayed.|\n|<html><i>any&nbsp;tiddler&nbsp;content</i></html>|<html>The content of the part.<br>A part can have any content that a "normal" tiddler may have, e.g. you may use all the formattings and macros defined.</html>|\n|>|~~Syntax formatting: Keywords in ''bold'', optional parts in [...]. 'or' means that exactly one of the two alternatives must exist.~~|\n<html><sub><a href="javascript:;" onclick="window.scrollAnchorVisible('Top',null, event)">[Top]</sub></a></html>\n\n!Applications<html><a name="Applications"/></html>\n!!Refering to Paragraphs of a Longer Tiddler<html><a name="LongTiddler"/></html>\nAssume you have written a long description in a tiddler and now you want to refer to the content of a certain paragraph in that tiddler (e.g. some definition.) Just wrap the text with a ''part'' block, give it a nice name, create a "pretty link" (like {{{[[Discussion Groups|Introduction/DiscussionGroups]]}}}) and you are done.\n\nNotice this complements the approach to first writing a lot of small tiddlers and combine these tiddlers to one larger tiddler in a second step (e.g. using the {{{<<tiddler...>>}}} macro). Using the ''part'' feature you can first write a "classic" (longer) text that can be read "from top to bottom" and later "reuse" parts of this text for some more "non-linear" reading.\n\n<html><sub><a href="javascript:;" onclick="window.scrollAnchorVisible('Top',null, event)">[Top]</sub></a></html>\n\n!!Citation Index<html><a name="Citation"/></html>\nCreate a tiddler "Citations" that contains your "citations". \nWrap every citation with a part and a proper name. \n\n''Example''\n{{{\n<part BAX98>Baxter, Ira D. et al: //Clone Detection Using Abstract Syntax Trees.// \nin //Proc. ICSM//, 1998.</part>\n\n<part BEL02>Bellon, Stefan: //Vergleich von Techniken zur Erkennung duplizierten Quellcodes.// \nThesis, Uni Stuttgart, 2002.</part>\n\n<part DUC99>Ducasse, Stéfane et al: //A Language Independent Approach for Detecting Duplicated Code.// \nin //Proc. ICSM//, 1999.</part>\n}}}\n\nYou may now "cite" them just by using a pretty link like {{{[[Citations/BAX98]]}}} or even more pretty, like this {{{[[BAX98|Citations/BAX98]]}}}.\n\n<html><sub><a href="javascript:;" onclick="window.scrollAnchorVisible('Top',null, event)">[Top]</sub></a></html>\n\n!!Creating "multi-line" Table Cells<html><a name="TableCells"/></html>\nYou may have noticed that it is hard to create table cells with "multi-line" content. E.g. if you want to create a bullet list inside a table cell you cannot just write the bullet list\n{{{\n* Item 1\n* Item 2\n* Item 3\n}}}\ninto a table cell (i.e. between the | ... | bars) because every bullet item must start in a new line but all cells of a table row must be in one line.\n\nUsing the ''part'' feature this problem can be solved. Just create a hidden part that contains the cells content and use a {{{<<tiddler >>}}} macro to include its content in the table's cell.\n\n''Example''\n{{{\n|!Subject|!Items|\n|subject1|<<tiddler ./Cell1>>|\n|subject2|<<tiddler ./Cell2>>|\n\n<part Cell1 hidden>\n* Item 1\n* Item 2\n* Item 3\n</part>\n...\n}}}\n\nNotice that inside the {{{<<tiddler ...>>}}} macro you may refer to the "current tiddler" using the ".".\n\nBTW: The same approach can be used to create bullet lists with items that contain more than one line.\n\n<html><sub><a href="javascript:;" onclick="window.scrollAnchorVisible('Top',null, event)">[Top]</sub></a></html>\n\n!!Creating Tabs<html><a name="Tabs"/></html>\nThe build-in {{{<<tabs ...>>}}} macro requires that you defined an additional tiddler for every tab it displays. When you want to have "nested" tabs you need to define a tiddler for the "main tab" and one for every tab it contains. I.e. the definition of a set of tabs that is visually displayed at one place is distributed across multiple tiddlers.\n\nWith the ''part'' feature you can put the complete definition in one tiddler, making it easier to keep an overview and maintain the tab sets.\n\n''Example''\nThe standard tabs at the sidebar are defined by the following eight tiddlers:\n* SideBarTabs\n* TabAll\n* TabMore\n* TabMoreMissing\n* TabMoreOrphans\n* TabMoreShadowed\n* TabTags\n* TabTimeline\n\nInstead of these eight tiddlers one could define the following SideBarTabs tiddler that uses the ''part'' feature:\n{{{\n<<tabs txtMainTab \n Timeline Timeline SideBarTabs/Timeline \n All 'All tiddlers' SideBarTabs/All \n Tags 'All tags' SideBarTabs/Tags \n More 'More lists' SideBarTabs/More>>\n<part Timeline hidden><<timeline>></part>\n<part All hidden><<list all>></part>\n<part Tags hidden><<allTags>></part>\n<part More hidden><<tabs txtMoreTab \n Missing 'Missing tiddlers' SideBarTabs/Missing \n Orphans 'Orphaned tiddlers' SideBarTabs/Orphans \n Shadowed 'Shadowed tiddlers' SideBarTabs/Shadowed>></part>\n<part Missing hidden><<list missing>></part>\n<part Orphans hidden><<list orphans>></part>\n<part Shadowed hidden><<list shadowed>></part>\n}}}\n\nNotice that you can easily "overwrite" individual parts in separate tiddlers that have the full name of the part.\n\nE.g. if you don't like the classic timeline tab but only want to see the 100 most recent tiddlers you could create a tiddler "~SideBarTabs/Timeline" with the following content:\n{{{\n<<forEachTiddler \n sortBy 'tiddler.modified' descending \n write '(index < 100) ? "* [["+tiddler.title+"]]\sn":""'>>\n}}}\n<html><sub><a href="javascript:;" onclick="window.scrollAnchorVisible('Top',null, event)">[Top]</sub></a></html>\n\n!!Using Sliders<html><a name="Sliders"/></html>\nVery similar to the build-in {{{<<tabs ...>>}}} macro (see above) the {{{<<slider ...>>}}} macro requires that you defined an additional tiddler that holds the content "to be slid". You can avoid creating this extra tiddler by using the ''part'' feature\n\n''Example''\nIn a tiddler "About" we may use the slider to show some details that are documented in the tiddler's "Details" part.\n{{{\n...\n<<slider chkAboutDetails About/Details details "Click here to see more details">>\n<part Details hidden>\nTo give you a better overview ...\n</part>\n...\n}}}\n\nNotice that putting the content of the slider into the slider's tiddler also has an extra benefit: When you decide you need to edit the content of the slider you can just doubleclick the content, the tiddler opens for editing and you can directly start editing the content (in the part section). In the "old" approach you would doubleclick the tiddler, see that the slider is using tiddler X, have to look for the tiddler X and can finally open it for editing. So using the ''part'' approach results in a much short workflow.\n\n<html><sub><a href="javascript:;" onclick="window.scrollAnchorVisible('Top',null, event)">[Top]</sub></a></html>\n\n!Revision history<html><a name="Revisions"/></html>\n* v1.0.6 (2006-11-07)\n** Bugfix: cannot edit tiddler when UploadPlugin by Bidix is installed. Thanks to José Luis González Castro for reporting the bug.\n* v1.0.5 (2006-03-02)\n** Bugfix: Example with multi-line table cells does not work in IE6. Thanks to Paulo Soares for reporting the bug.\n* v1.0.4 (2006-02-28)\n** Bugfix: Shadow tiddlers cannot be edited (in TW 2.0.6). Thanks to Torsten Vanek for reporting the bug.\n* v1.0.3 (2006-02-26)\n** Adapt code to newly introduced Tiddler.prototype.isReadOnly() function (in TW 2.0.6). Thanks to Paulo Soares for reporting the problem.\n* v1.0.2 (2006-02-05)\n** Also allow other macros than the "tiddler" macro use the "." in the part reference (to refer to "this" tiddler)\n* v1.0.1 (2006-01-27)\n** Added Table of Content for plugin documentation. Thanks to RichCarrillo for suggesting.\n** Bugfix: newReminder plugin does not work when PartTiddler is installed. Thanks to PauloSoares for reporting.\n* v1.0.0 (2006-01-25)\n** initial version\n<html><sub><a href="javascript:;" onclick="window.scrollAnchorVisible('Top',null, event)">[Top]</sub></a></html>\n\n!Code<html><a name="Code"/></html>\n<html><sub><a href="javascript:;" onclick="window.scrollAnchorVisible('Top',null, event)">[Top]</sub></a></html>\n***/\n//{{{\n//============================================================================\n// PartTiddlerPlugin\n\n// Ensure that the PartTiddler Plugin is only installed once.\n//\nif (!version.extensions.PartTiddlerPlugin) {\n\n\n\nversion.extensions.PartTiddlerPlugin = {\n major: 1, minor: 0, revision: 6,\n date: new Date(2006, 10, 7), \n type: 'plugin',\n source: "http://tiddlywiki.abego-software.de/#PartTiddlerPlugin"\n};\n\nif (!window.abego) window.abego = {};\nif (version.major < 2) alertAndThrow("PartTiddlerPlugin requires TiddlyWiki 2.0 or newer.");\n\n//============================================================================\n// Common Helpers\n\n// Looks for the next newline, starting at the index-th char of text. \n//\n// If there are only whitespaces between index and the newline \n// the index behind the newline is returned, \n// otherwise (or when no newline is found) index is returned.\n//\nvar skipEmptyEndOfLine = function(text, index) {\n var re = /(\sn|[^\ss])/g;\n re.lastIndex = index;\n var result = re.exec(text);\n return (result && text.charAt(result.index) == '\sn') \n ? result.index+1\n : index;\n}\n\n\n//============================================================================\n// Constants\n\nvar partEndOrStartTagRE = /(<\s/part>)|(<part(?:\ss+)((?:[^>])+)>)/mg;\nvar partEndTagREString = "<\s\s/part>";\nvar partEndTagString = "</part>";\n\n//============================================================================\n// Plugin Specific Helpers\n\n// Parse the parameters inside a <part ...> tag and return the result.\n//\n// @return [may be null] {partName: ..., isHidden: ...}\n//\nvar parseStartTagParams = function(paramText) {\n var params = paramText.readMacroParams();\n if (params.length == 0 || params[0].length == 0) return null;\n \n var name = params[0];\n var paramsIndex = 1;\n var hidden = false;\n if (paramsIndex < params.length) {\n hidden = params[paramsIndex] == "hidden";\n paramsIndex++;\n }\n \n return {\n partName: name, \n isHidden: hidden\n };\n}\n\n// Returns the match to the next (end or start) part tag in the text, \n// starting the search at startIndex.\n// \n// When no such tag is found null is returned, otherwise a "Match" is returned:\n// [0]: full match\n// [1]: matched "end" tag (or null when no end tag match)\n// [2]: matched "start" tag (or null when no start tag match)\n// [3]: content of start tag (or null if no start tag match)\n//\nvar findNextPartEndOrStartTagMatch = function(text, startIndex) {\n var re = new RegExp(partEndOrStartTagRE);\n re.lastIndex = startIndex;\n var match = re.exec(text);\n return match;\n}\n\n//============================================================================\n// Formatter\n\n// Process the <part ...> ... </part> starting at (w.source, w.matchStart) for formatting.\n//\n// @return true if a complete part section (including the end tag) could be processed, false otherwise.\n//\nvar handlePartSection = function(w) {\n var tagMatch = findNextPartEndOrStartTagMatch(w.source, w.matchStart);\n if (!tagMatch) return false;\n if (tagMatch.index != w.matchStart || !tagMatch[2]) return false;\n\n // Parse the start tag parameters\n var arguments = parseStartTagParams(tagMatch[3]);\n if (!arguments) return false;\n \n // Continue processing\n var startTagEndIndex = skipEmptyEndOfLine(w.source, tagMatch.index + tagMatch[0].length);\n var endMatch = findNextPartEndOrStartTagMatch(w.source, startTagEndIndex);\n if (endMatch && endMatch[1]) {\n if (!arguments.isHidden) {\n w.nextMatch = startTagEndIndex;\n w.subWikify(w.output,partEndTagREString);\n }\n w.nextMatch = skipEmptyEndOfLine(w.source, endMatch.index + endMatch[0].length);\n \n return true;\n }\n return false;\n}\n\nconfig.formatters.push( {\n name: "part",\n match: "<part\s\ss+[^>]+>",\n \n handler: function(w) {\n if (!handlePartSection(w)) {\n w.outputText(w.output,w.matchStart,w.matchStart+w.matchLength);\n }\n }\n} )\n\n//============================================================================\n// Extend "fetchTiddler" functionality to also recognize "part"s of tiddlers \n// as tiddlers.\n\nvar currentParent = null; // used for the "." parent (e.g. in the "tiddler" macro)\n\n// Return the match to the first <part ...> tag of the text that has the\n// requrest partName.\n//\n// @return [may be null]\n//\nvar findPartStartTagByName = function(text, partName) {\n var i = 0;\n \n while (true) {\n var tagMatch = findNextPartEndOrStartTagMatch(text, i);\n if (!tagMatch) return null;\n\n if (tagMatch[2]) {\n // Is start tag\n \n // Check the name\n var arguments = parseStartTagParams(tagMatch[3]);\n if (arguments && arguments.partName == partName) {\n return tagMatch;\n }\n }\n i += tagMatch[0].length;\n }\n}\n\n// Return the part "partName" of the given parentTiddler as a "readOnly" Tiddler \n// object, using fullName as the Tiddler's title. \n//\n// All remaining properties of the new Tiddler (tags etc.) are inherited from \n// the parentTiddler.\n// \n// @return [may be null]\n//\nvar getPart = function(parentTiddler, partName, fullName) {\n var text = parentTiddler.text;\n var startTag = findPartStartTagByName(text, partName);\n if (!startTag) return null;\n \n var endIndexOfStartTag = skipEmptyEndOfLine(text, startTag.index+startTag[0].length);\n var indexOfEndTag = text.indexOf(partEndTagString, endIndexOfStartTag);\n\n if (indexOfEndTag >= 0) {\n var partTiddlerText = text.substring(endIndexOfStartTag,indexOfEndTag);\n var partTiddler = new Tiddler();\n partTiddler.set(\n fullName,\n partTiddlerText,\n parentTiddler.modifier,\n parentTiddler.modified,\n parentTiddler.tags,\n parentTiddler.created);\n partTiddler.abegoIsPartTiddler = true;\n return partTiddler;\n }\n \n return null;\n}\n\n// Hijack the store.fetchTiddler to recognize the "part" addresses.\n//\n\nvar oldFetchTiddler = store.fetchTiddler ;\nstore.fetchTiddler = function(title) {\n var result = oldFetchTiddler.apply(this, arguments);\n if (!result && title) {\n var i = title.lastIndexOf('/');\n if (i > 0) {\n var parentName = title.substring(0, i);\n var partName = title.substring(i+1);\n var parent = (parentName == ".") \n ? currentParent \n : oldFetchTiddler.apply(this, [parentName]);\n if (parent) {\n return getPart(parent, partName, parent.title+"/"+partName);\n }\n }\n }\n return result; \n};\n\n\n// The user must not edit a readOnly/partTiddler\n//\n\nconfig.commands.editTiddler.oldIsReadOnlyFunction = Tiddler.prototype.isReadOnly;\n\nTiddler.prototype.isReadOnly = function() {\n // Tiddler.isReadOnly was introduced with TW 2.0.6.\n // For older version we explicitly check the global readOnly flag\n if (config.commands.editTiddler.oldIsReadOnlyFunction) {\n if (config.commands.editTiddler.oldIsReadOnlyFunction.apply(this, arguments)) return true;\n } else {\n if (readOnly) return true;\n }\n\n return this.abegoIsPartTiddler;\n}\n\nconfig.commands.editTiddler.handler = function(event,src,title)\n{\n var t = store.getTiddler(title);\n // Edit the tiddler if it either is not a tiddler (but a shadowTiddler)\n // or the tiddler is not readOnly\n if(!t || !t.abegoIsPartTiddler)\n {\n clearMessage();\n story.displayTiddler(null,title,DEFAULT_EDIT_TEMPLATE);\n story.focusTiddler(title,"text");\n return false;\n }\n}\n\n// To allow the "./partName" syntax in macros we need to hijack \n// the invokeMacro to define the "currentParent" while it is running.\n// \nvar oldInvokeMacro = window.invokeMacro;\nfunction myInvokeMacro(place,macro,params,wikifier,tiddler) {\n var oldCurrentParent = currentParent;\n if (tiddler) currentParent = tiddler;\n try {\n oldInvokeMacro.apply(this, arguments);\n } finally {\n currentParent = oldCurrentParent;\n }\n}\nwindow.invokeMacro = myInvokeMacro;\n\n// Scroll the anchor anchorName in the viewer of the given tiddler visible.\n// When no tiddler is defined use the tiddler of the target given event is used.\nwindow.scrollAnchorVisible = function(anchorName, tiddler, evt) {\n var tiddlerElem = null;\n if (tiddler) {\n tiddlerElem = document.getElementById(story.idPrefix + tiddler);\n }\n if (!tiddlerElem && evt) {\n var target = resolveTarget(evt);\n tiddlerElem = story.findContainingTiddler(target);\n }\n if (!tiddlerElem) return;\n\n var children = tiddlerElem.getElementsByTagName("a");\n for (var i = 0; i < children.length; i++) {\n var child = children[i];\n var name = child.getAttribute("name");\n if (name == anchorName) {\n var y = findPosY(child);\n window.scrollTo(0,y);\n return;\n }\n }\n}\n\n} // of "install only once"\n//}}}\n\n/***\n<html><sub><a href="javascript:;" onclick="scrollAnchorVisible('Top',null, event)">[Top]</sub></a></html>\n\n!Licence and Copyright\nCopyright (c) abego Software ~GmbH, 2006 ([[www.abego-software.de|http://www.abego-software.de]])\n\nRedistribution and use in source and binary forms, with or without modification,\nare permitted provided that the following conditions are met:\n\nRedistributions of source code must retain the above copyright notice, this\nlist of conditions and the following disclaimer.\n\nRedistributions in binary form must reproduce the above copyright notice, this\nlist of conditions and the following disclaimer in the documentation and/or other\nmaterials provided with the distribution.\n\nNeither the name of abego Software nor the names of its contributors may be\nused to endorse or promote products derived from this software without specific\nprior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\nOF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\nSHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\nINCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\nTO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR\nBUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\nANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH\nDAMAGE.\n\n<html><sub><a href="javascript:;" onclick="scrollAnchorVisible('Top',null, event)">[Top]</sub></a></html>\n***/\n
<<tiddlerList tags: percusión,-etiquetasusuales format:"table" header:"Percusión" >>
\n<<formTiddler fichaPlantilla>>\n<data>{"tecnico":"José Luis González Castro","mes":"Octubre","año":"2006","lugar":"aula","notes":"ibook G3/600 con Protools\snMbox (modelo 2005)\snMicrófono AKG C414 B\sn\sn","interprete":"Carlos Castro"}</data>\n
\n!Guía\n\n!!Cajas\n\n|[img[caja|materiales/fotografías/caja.jpg]]|\n\n1.Caja estándar, 14x5 pulgadas\n\nGolpe simple en el parche.\n+++[Ejemplo 1]...\n<<player id=1 quicktime materiales/grabaciones/percusion/percusion_1.wav 400 15>>\n===\n\n\nGolpes por zonas, con baquetas:\n\nEn el centro.\n+++[Ejemplo 2]...\n<<player id=2 quicktime materiales/grabaciones/percusion/percusion_2.wav 400 15>>\n===\n\n\nEn el medio.\n+++[Ejemplo 3]...\n<<player id=3 quicktime materiales/grabaciones/percusion/percusion_3.wav 400 15>>\n===\n\n\nEl "centro" se refiere al centro geométrico: es el punto en el que vibra menos. Se utiliza para golpes secos. El "medio" está entre el borde y el centro; la zona exacta depende de cada caja. \n\nEn el borde.\n+++[Ejemplo 4]...\n<<player id=4 quicktime materiales/grabaciones/percusion/percusion_4.wav 400 15>>\n===\n\n\nRedoble.\n+++[Ejemplo 5]...\n<<player id=5 quicktime materiales/grabaciones/percusion/percusion_5.wav 400 15>>\n===\n\n\nGolpe de Aro (Rimshot).\n+++[Ejemplo 6]...\n<<player id=6 quicktime materiales/grabaciones/percusion/percusion_6.wav 400 15>>\n===\n\n\nOtro.\n+++[Ejemplo 7]...\n<<player id=7 quicktime materiales/grabaciones/percusion/percusion_7.wav 400 15>>\n===\n\n\nGolpe de Aro con la baqueta apoyada (baqueta contra baqueta y la baqueta apoyada).\n+++[Ejemplo 8]...\n<<player id=8 quicktime materiales/grabaciones/percusion/percusion_8.wav 400 15>>\n===\n\n\nEscobillas:\n\nGolpe simple.\n+++[Ejemplo 9]...\n<<player id=9 quicktime materiales/grabaciones/percusion/percusion_9.wav 400 15>>\n===\n\n\nGolpe con la escobilla presionada a modo de acento.\n+++[Ejemplo 10]...\n<<player id=10 quicktime materiales/grabaciones/percusion/percusion_10.wav 400 15>>\n===\n\n\nEscobilla arrastrada.\n+++[Ejemplo 11]...\n<<player id=11 quicktime materiales/grabaciones/percusion/percusion_11.wav 400 15>>\n===\n\n\n"Redoble" con las dos escobillas a la vez.\n+++[Ejemplo 12]...\n<<player id=12 quicktime materiales/grabaciones/percusion/percusion_12.wav 400 15>>\n===\n\n\n2.Caja de 14x6.5 (más ancha)\n\nGolpe simple.\n+++[Ejemplo 13]...\n<<player id=13 quicktime materiales/grabaciones/percusion/percusion_13.wav 400 15>>\n===\n\n\nRedoble.\n+++[Ejemplo 14]...\n<<player id=14 quicktime materiales/grabaciones/percusion/percusion_14.wav 400 15>>\n===\n\n\n3.Caja piccolo, 13x3\n\nGolpe simple.\n+++[Ejemplo 15]...\n<<player id=15 quicktime materiales/grabaciones/percusion/percusion_15.wav 400 15>>\n===\n\n\nRedoble.\n+++[Ejemplo 16]...\n<<player id=16 quicktime materiales/grabaciones/percusion/percusion_16.wav 400 15>>\n===\n\n\n4.Tambor Militar, 14x12\n\nGolpe simple.\n+++[Ejemplo 17]...\n<<player id=17 quicktime materiales/grabaciones/percusion/percusion_17.wav 400 15>>\n===\n\n\nRedoble.\n+++[Ejemplo 18]...\n<<player id=18 quicktime materiales/grabaciones/percusion/percusion_18.wav 400 15>>\n===\n\n\n5. Dinámicas (ejemplos en caja estándar):\n\nGolpe en el centro, piano.\n+++[Ejemplo 19]...\n<<player id=19 quicktime materiales/grabaciones/percusion/percusion_19.wav 400 15>>\n===\n\n\nGolpe en el medio, piano.\n+++[Ejemplo 20]...\n<<player id=20 quicktime materiales/grabaciones/percusion/percusion_20.wav 400 15>>\n===\n\n\nGolpe en el borde, piano.\n+++[Ejemplo 21]...\n<<player id=21 quicktime materiales/grabaciones/percusion/percusion_21.wav 400 15>>\n===\n\n\nRedoble en el borde, piano.\n+++[Ejemplo 22]...\n<<player id=22 quicktime materiales/grabaciones/percusion/percusion_22.wav 400 15>>\n===\n\n\nRedoble en el medio, piano.\n+++[Ejemplo 23]...\n<<player id=23 quicktime materiales/grabaciones/percusion/percusion_23.wav 400 15>>\n===\n\n\nCrescendo con redoble en el medio.\n+++[Ejemplo 24]...\n<<player id=24 quicktime materiales/grabaciones/percusion/percusion_24.wav 400 15>>\n===\n\n\nCrescendo con redoble en el borde.\n+++[Ejemplo 25]...\n<<player id=25 quicktime materiales/grabaciones/percusion/percusion_25.wav 400 15>>\n===\n\n\n!!Xilófono\n\n|[img[xiolófono|materiales/fotografías/xilófono.jpg]]|\n\n6.Xilófono de cuatro octavas, de do a do:\n\nNota más grave. \n+++[Ejemplo 26]...\n<<player id=26 quicktime materiales/grabaciones/percusion/percusion_26.wav 400 15>>\n===\n\n\nNota más aguda.\n+++[Ejemplo 27]...\n<<player id=27 quicktime materiales/grabaciones/percusion/percusion_27.wav 400 15>>\n===\n\n\nTrémolos con gradación de intensidad en el grave y el agudo.\n+++[Ejemplo 28]...\n<<player id=28 quicktime materiales/grabaciones/percusion/percusion_28.wav 400 15>>\n===\n\n\nDos glissandos a diferente velocidad.\n+++[Ejemplo 29]...\n<<player id=29 quicktime materiales/grabaciones/percusion/percusion_29.wav 400 15>>\n===\n\n\nTrémolos con dos baquetas.\n+++[Ejemplo 30]...\n<<player id=30 quicktime materiales/grabaciones/percusion/percusion_30.wav 400 15>>\n===\n\n\nAcordes con cuatro baquetas.\n+++[Ejemplo 31]...\n<<player id=31 quicktime materiales/grabaciones/percusion/percusion_31.wav 400 15>>\n===\n\n\nTrémolos con cuatro baquetas.\n+++[Ejemplo 32]...\n<<player id=32 quicktime materiales/grabaciones/percusion/percusion_32.wav 400 15>>\n===\n\n\n!!Vibráfono\n\n|[img[vibráfono|materiales/fotografías/vibráfono.jpg]]|\n\n7.La tesitura del vibráfono es de tres octavas, de fa a fa.\n\nNota más aguda (pedal abierto).\n+++[Ejemplo 33]...\n<<player id=33 quicktime materiales/grabaciones/percusion/percusion_33.wav 400 15>>\n===\n\n\nNota más grave (pedal abierto).\n+++[Ejemplo 34]...\n<<player id=34 quicktime materiales/grabaciones/percusion/percusion_34.wav 400 15>>\n===\n\n\nNotas más aguda y más grave, con pedal cerrado.\n+++[Ejemplo 35]...\n<<player id=35 quicktime materiales/grabaciones/percusion/percusion_35.wav 400 15>>\n===\n\n\nMismas notas utilizando el motor a velocidad media.\n+++[Ejemplo 36]...\n<<player id=36 quicktime materiales/grabaciones/percusion/percusion_36.wav 400 15>>\n===\n\n\nAcorde y glissando, con motor.\n+++[Ejemplo 37]...\n<<player id=37 quicktime materiales/grabaciones/percusion/percusion_37.wav 400 15>>\n===\n\n\nBaquetas en los bordes.\n+++[Ejemplo 38]...\n<<player id=38 quicktime materiales/grabaciones/percusion/percusion_38.wav 400 15>>\n===\n\n\nBaquetas en los centros de las láminas, de punta.\n+++[Ejemplo 39]...\n<<player id=39 quicktime materiales/grabaciones/percusion/percusion_39.wav 400 15>>\n===\n\n\nTrémolo con pedal abierto y cerrado.\n+++[Ejemplo 40]...\n<<player id=40 quicktime materiales/grabaciones/percusion/percusion_40.wav 400 15>>\n===\n\n\nTocar con arco.\n+++[Ejemplo 41]...\n<<player id=41 quicktime materiales/grabaciones/percusion/percusion_41.wav 400 15>>\n===\n\n\nGlissandos sobre una nota (son difíciles de conseguir).\n+++[Ejemplo 42]...\n<<player id=42 quicktime materiales/grabaciones/percusion/percusion_42.wav 400 15>>\n===\n\n\n!!Lira\n\n|[img[lira|materiales/fotografías/lira.jpg]]|\n\n-Con baquetas de pasta-\n\n8.Nota más aguda (do).\n+++[Ejemplo 43]...\n<<player id=43 quicktime materiales/grabaciones/percusion/percusion_43.wav 400 15>>\n===\n\n\nNota más grave (sol).\n+++[Ejemplo 44]...\n<<player id=44 quicktime materiales/grabaciones/percusion/percusion_44.wav 400 15>>\n===\n\n\nTrémolos:\n+++[Ejemplo 45]...\n<<player id=45 quicktime materiales/grabaciones/percusion/percusion_45.wav 400 15>>\n===\n\n\nEn todos estos instrumentos se puede tocar bastante rápido con dos baquetas (con cuatro es, evidentemente, más difícil).\n\n\n!!Timbales\n\n|[img[timbales|materiales/fotografías/timbales.jpg]]|\n\n9.Diferentes tipos de baquetas en un timbal tocado en la zona que se percute a menos que se especifique una zona en concreto:\n\nTimbal de 30 pulgadas, en do. Los timbales suelen ser de 32, 29, 26 y 23 pulgadas. La marca Premier los hace un poco más grandes y van de 2 en 2, es decir, 32, 30, 28 y 26.\n\nBaqueta blanda. \n+++[Ejemplo 46]...\n<<player id=46 quicktime materiales/grabaciones/percusion/percusion_46.wav 400 15>>\n===\n\n\nBaqueta medio dura.\n+++[Ejemplo 47]...\n<<player id=47 quicktime materiales/grabaciones/percusion/percusion_47.wav 400 15>>\n===\n\n\nBaqueta dura.\n+++[Ejemplo 48]...\n<<player id=48 quicktime materiales/grabaciones/percusion/percusion_48.wav 400 15>>\n===\n\n\nRedoble con baquetas blandas.\n+++[Ejemplo 49]...\n<<player id=49 quicktime materiales/grabaciones/percusion/percusion_49.wav 400 15>>\n===\n\n\nRedoble con baquetas medias.\n+++[Ejemplo 50]...\n<<player id=50 quicktime materiales/grabaciones/percusion/percusion_50.wav 400 15>>\n===\n\n\nRedoble con baquetas duras.\n+++[Ejemplo 51]...\n<<player id=51 quicktime materiales/grabaciones/percusion/percusion_51.wav 400 15>>\n===\n\n\nGolpe y Redoble con baqueta(s) de madera.\n+++[Ejemplo 52]...\n<<player id=52 quicktime materiales/grabaciones/percusion/percusion_52.wav 400 15>>\n===\n\n\nTocar con la parte de atrás de una baqueta viene a sonar igual.\n\nGolpe en el centro.\n+++[Ejemplo 53]...\n<<player id=53 quicktime materiales/grabaciones/percusion/percusion_53.wav 400 15>>\n===\n\n\nGolpe en el borde.\n+++[Ejemplo 54]...\n<<player id=54 quicktime materiales/grabaciones/percusion/percusion_54.wav 400 15>>\n===\n\n\nGolpe coperto (es decir, cubierto, poniendo un paño sobre la membrana a modo de sordina).\n+++[Ejemplo 55]...\n<<player id=55 quicktime materiales/grabaciones/percusion/percusion_55.wav 400 15>>\n===\n\n\n10.La tesitura de un timbal depende de la calidad del instrumento: en un timbal potente se alcanza la octava y todas las notas tienen buena calidad. Timbales de menor calidad aseguran aproximadamente una sexta.\n\nTesituras aproximadas: mi(re)-si; fa-re; la-fa; sib-sol. \n\nEn los timbales también se puede hacer armónicos: armónico de re.\n+++[Ejemplo 56]...\n<<player id=56 quicktime materiales/grabaciones/percusion/percusion_56.wav 400 15>>\n===\n\n\nGlissandos ascendente y descendente.\n+++[Ejemplo 57]...\n<<player id=57 quicktime materiales/grabaciones/percusion/percusion_57.wav 400 15>>\n===\n\n\nGlissando con redoble.\n+++[Ejemplo 58]...\n<<player id=58 quicktime materiales/grabaciones/percusion/percusion_58.wav 400 15>>\n===\n\n\n11.Redoble con efecto p<f>p.\n+++[Ejemplo 59]...\n<<player id=59 quicktime materiales/grabaciones/percusion/percusion_59.wav 400 15>>\n===\n\n\n12.Sonido de la cacerola.\n+++[Ejemplo 60]...\n<<player id=60 quicktime materiales/grabaciones/percusion/percusion_60.wav 400 15>>\n===\n\n\n13.Plato en el timbal, haciendo redoble sobre el plato y glissando con el pedal.\n+++[Ejemplo 61]...\n<<player id=61 quicktime materiales/grabaciones/percusion/percusion_61.wav 400 15>>\n===\n\n\n!!Tams, Gongs.\n\n|[img[tam|materiales/fotografías/tam.jpg]]|\n\n|[img[gong|materiales/fotografías/gong.jpg]]|\n\n14.Tam medio.\n+++[Ejemplo 62]...\n<<player id=62 quicktime materiales/grabaciones/percusion/percusion_62.wav 400 15>>\n===\n\n\n15.Gong medio.\n+++[Ejemplo 63]...\n<<player id=63 quicktime materiales/grabaciones/percusion/percusion_63.wav 400 15>>\n===\n\n\n16.Gong pequeño.\n+++[Ejemplo 64]...\n<<player id=64 quicktime materiales/grabaciones/percusion/percusion_64.wav 400 15>>\n===\n\n\n17.Tam grande.\n+++[Ejemplo 65]...\n<<player id=65 quicktime materiales/grabaciones/percusion/percusion_65.wav 400 15>>\n===\n\n\n18.Crescendo cortado.\n+++[Ejemplo 66]...\n<<player id=66 quicktime materiales/grabaciones/percusion/percusion_66.wav 400 15>>\n===\n\n\n19.Rascado en el Tam.\n+++[Ejemplo 67]...\n<<player id=67 quicktime materiales/grabaciones/percusion/percusion_67.wav 400 15>>\n===\n\n\nHay un célebre efecto que se hace en un tam grande pasando el arco por un agujero; en Star Trek los ruidos de las naves se hacen en un tam (el más grande).\n\n20.Efectos con el arco (amplificado 6db sobre el volumen de la grabación).\n+++[Ejemplo 68]...\n<<player id=68 quicktime materiales/grabaciones/percusion/percusion_68.wav 400 15>>\n===\n\n\n!!Platos\n\n|[img[aula de percusión|materiales/fotografías/plato.jpg]]|\n\n21.Plato Chino.\n+++[Ejemplo 69]...\n<<player id=69 quicktime materiales/grabaciones/percusion/percusion_69.wav 400 15>>\n===\n\n\n22.Varilla sobre plato chino.\n+++[Ejemplo 70]...\n<<player id=70 quicktime materiales/grabaciones/percusion/percusion_70.wav 400 15>>\n===\n\n\n23.Crash de 16:\n\nCon maza.\n+++[Ejemplo 71]...\n<<player id=71 quicktime materiales/grabaciones/percusion/percusion_71.wav 400 15>>\n===\n\n\nCon varilla.\n+++[Ejemplo 72]...\n<<player id=72 quicktime materiales/grabaciones/percusion/percusion_72.wav 400 15>>\n===\n\n\nGolpe Simple.\n+++[Ejemplo 73]...\n<<player id=73 quicktime materiales/grabaciones/percusion/percusion_73.wav 400 15>>\n===\n\n\nCon baqueta, Estallido.\n+++[Ejemplo 74]...\n<<player id=74 quicktime materiales/grabaciones/percusion/percusion_74.wav 400 15>>\n===\n\n\n24.Redoble en plato.\n+++[Ejemplo 75]...\n<<player id=75 quicktime materiales/grabaciones/percusion/percusion_75.wav 400 15>>\n===\n\n\n25.Splash de 12.\n+++[Ejemplo 76]...\n<<player id=76 quicktime materiales/grabaciones/percusion/percusion_76.wav 400 15>>\n===\n\n\nCon baqueta.\n+++[Ejemplo 77]...\n<<player id=77 quicktime materiales/grabaciones/percusion/percusion_77.wav 400 15>>\n===\n\n\n26.Platos de 19 "modelo vienés" (ni muy pesados ni muy finos): \n\nCrash.\n+++[Ejemplo 78]...\n<<player id=78 quicktime materiales/grabaciones/percusion/percusion_78.wav 400 15>>\n===\n\n\nMás golpes.\n+++[Ejemplo 79]...\n<<player id=79 quicktime materiales/grabaciones/percusion/percusion_79.wav 400 15>>\n===\n\n\n\n\n\n\n\n\n
/***\n|''Name:''|PlayerPlugin|\n|''Source:''|http://www.TiddlyTools.com/#PlayerPlugin|\n|''Author:''|Eric Shulman - ELS Design Studios|\n|''License:''|[[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|\n|''~CoreVersion:''|2.0.10|\n\nEmbed a media player in a tiddler. \n\n!!!!!Usage\n<<<\n{{{<<player [type] [URL] [width] [height] [hidecontrols]>>}}}\n\nwhere ''type'' is optional, and is one of the following: ''windows'', ''realone'', ''quicktime'', ''flash'' or ''image''. If the media type is not specified, the plugin automatically detects Windows, Real, QuickTime, Flash video or JPG/GIF images by matching known file extensions and/or specialized streaming-media transfer protocols (such as RTSP:). For unrecognized media types, the plugin assumes WindowsMedia (the player with the most users... *sigh*)\n\n''If you use [[AttachFilePlugin]] to encode and store a media file within your document, you can play embedded media content by using the title of the //attachment tiddler//'' as a parameter in place of the usual reference to an external URL. When playing an attached media content, you should always explicitly specify the media type parameter, because the name used for the attachment tiddler may not contain a known file extension from which a default media type can be readily determined.\n<<<\n!!!!!Configuration\n<<<\nDefault player size:\nwidth: <<option txtPlayerDefaultWidth>> height: <<option txtPlayerDefaultHeight>>\n<<<\n!!!!!Examples\n<<<\n+++[Windows Media]...\nTimes Square Live Webcam\n{{{<<player id=1 http://www.earthcam.com/usa/newyork/timessquare/asx/tsq_stream.asx>>}}}\n<<player id=1 http://www.earthcam.com/usa/newyork/timessquare/asx/tsq_stream.asx>>\n===\n+++[RealOne]...\nBBC London: Live and Recorded news\n{{{<<player id=2 http://www.bbc.co.uk/london/realmedia/news/tvnews.ram>>}}}\n<<player id=2 http://www.bbc.co.uk/london/realmedia/news/tvnews.ram>>\n===\n+++[Quicktime]...\nAmerica Free TV: Classic Comedy\n{{{<<player id=3 http://www.americafree.tv/unicast_mov/AmericaFreeTVComedy.mov>>}}}\n<<player id=3 http://www.americafree.tv/unicast_mov/AmericaFreeTVComedy.mov>>\n===\n+++[Flash]...\nAsteroids arcade game\n{{{<<player id=4 http://www.80smusiclyrics.com/games/asteroids/asteroids.swf 400 300>>}}}\n<<player id=4 http://www.80smusiclyrics.com/games/asteroids/asteroids.swf 400 300>>\nGoogle Video\n{{{<<player id=5 flash http://video.google.com/googleplayer.swf?videoUrl=http%3A%2F%2Fvp.video.google.com%2Fvideodownload%3Fversion%3D0%26secureurl%3DoQAAAIVnUNP6GYRY8YnIRNPe4Uk5-j1q1MVpJIW4uyEFpq5Si0hcSDuig_JZcB9nNpAhbScm9W_8y_vDJQBw1DRdCVbXl-wwm5dyUiiStl_rXt0ATlstVzrUNC4fkgK_j7nmse7kxojRj1M3eo3jXKm2V8pQjWk97GcksMFFwg7BRAXmRSERexR210Amar5LYzlo9_k2AGUWPLyRhMJS4v5KtDSvNK0neL83ZjlHlSECYXyk%26sigh%3Dmpt2EOr86OAUNnPQ3b9Tr0wnDms%26begin%3D0%26len%3D429700%26docid%3D-914679554478687740&thumbnailUrl=http%3A%2F%2Fvideo.google.com%2FThumbnailServer%3Fcontentid%3De7e77162deb04c42%26second%3D5%26itag%3Dw320%26urlcreated%3D1144620753%26sigh%3DC3fqXPPS1tFiUqLzmkX3pdgYc2Y&playerId=-91467955447868774 400 326>>}}}\n<<player id=5 flash http://video.google.com/googleplayer.swf?videoUrl=http%3A%2F%2Fvp.video.google.com%2Fvideodownload%3Fversion%3D0%26secureurl%3DoQAAAIVnUNP6GYRY8YnIRNPe4Uk5-j1q1MVpJIW4uyEFpq5Si0hcSDuig_JZcB9nNpAhbScm9W_8y_vDJQBw1DRdCVbXl-wwm5dyUiiStl_rXt0ATlstVzrUNC4fkgK_j7nmse7kxojRj1M3eo3jXKm2V8pQjWk97GcksMFFwg7BRAXmRSERexR210Amar5LYzlo9_k2AGUWPLyRhMJS4v5KtDSvNK0neL83ZjlHlSECYXyk%26sigh%3Dmpt2EOr86OAUNnPQ3b9Tr0wnDms%26begin%3D0%26len%3D429700%26docid%3D-914679554478687740&thumbnailUrl=http%3A%2F%2Fvideo.google.com%2FThumbnailServer%3Fcontentid%3De7e77162deb04c42%26second%3D5%26itag%3Dw320%26urlcreated%3D1144620753%26sigh%3DC3fqXPPS1tFiUqLzmkX3pdgYc2Y&playerId=-91467955447868774 400 326>>\nYouTube Video\n{{{<<player id=6 flash http://www.youtube.com/v/OdT9z-JjtJk 400 300>>}}}\n<<player id=6 flash http://www.youtube.com/v/OdT9z-JjtJk 400 300>>\n===\n+++[Still Images]...\nGIF (best for illustrations, animations, diagrams, etc.)\n{{{<<player id=7 image images/meow.gif auto auto>>}}}\n<<player id=7 image images/meow.gif auto auto>>\nJPG (best for photographs, scanned images, etc.)\n{{{<<player id=8 image images/meow2.jpg 200 150>>}}}\n<<player id=8 image images/meow2.jpg 200 150>>\n===\n<<<\n!!!!!Installation\n<<<\nimport (or copy/paste) the following tiddlers into your document:\n''PlayerPlugin '' (tagged with <<tag systemConfig>>)\n^^documentation and javascript for macro handling^^\n<<<\n!!!!!Revision History\n<<<\n''2006.11.30 [1.0.0]'' support embedded media content using getAttachment() API defined by AttachFilePlugin or AttachFilePluginFormatters. Also added support for 'image' type to render JPG/GIF still images\n''2006.02.26 [0.7.0]'' major re-write. handles default params better. create/recreate player objects via loadURL() API for use with interactive forms and scripts.\n''2006.01.27 [0.6.0]'' added support for 'extra' macro params to pass through to object parameters\n''2006.01.19 [0.5.0]'' Initial ALPHA release\n''2005.12.23 [0.0.0]'' Started\n<<<\n!!!!!Credits\n<<<\nThis feature was developed by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]].\n<<<\n!!!!!Code\n***/\n\n// // macro definition\n\n//{{{\nversion.extensions.player = {major: 1, minor: 0, revision: 0, date: new Date(2006,11,30)};\n\nconfig.macros.player = {};\nconfig.macros.player.html = {};\nconfig.macros.player.handler= function(place,macroName,params) {\n var id=null;\n if (params[0].substr(0,3)=="id=") id=params.shift().substr(3);\n var type="";\n if ((params[0]=="windows")||(params[0]=="realone")||(params[0]=="quicktime")||(params[0]=="flash")||(params[0]=="image"))\n type=params.shift();\n var url=params.shift(); if (!url || !url.trim().length) url="";\n if (url.length && config.macros.attach.getAttachment!=undefined) // if AttachFilePlugin is installed\n if ((tid=store.getTiddler(url))!=null && tid.isTagged("attachment")) // if URL is attachment tiddler title\n url=config.macros.attach.getAttachment(url); // replace TiddlerTitle with attachment-expanded URL\n var width=params.shift();\n var height=params.shift();\n var show=(params.shift()=='hidecontrols')?"0":"1"; \n var extras=""; while (params[0]!=undefined) extras+="<param name='"+params.shift()+"' value='"+params.shift()+"'> ";\n this.loadURL(place,id,type,url,width,height,show,extras);\n}\n\nif (config.options.txtPlayerDefaultWidth==undefined) config.options.txtPlayerDefaultWidth="100%";\nif (config.options.txtPlayerDefaultHeight==undefined) config.options.txtPlayerDefaultHeight="480"; // can't use "100%"... player height doesn't stretch right :-(\n\nconfig.macros.player.loadURL=function(place,id,type,url,width,height,show,extras) {\n\n if (id==undefined) id="tiddlyPlayer";\n if (!width) var width=config.options.txtPlayerDefaultWidth;\n if (!height) var height=config.options.txtPlayerDefaultHeight;\n if (url && (!type || !type.length)) { // determine type from URL\n u=url.toLowerCase();\n if ((u.indexOf('mms')!=-1)||(u.indexOf('.asx')!=-1)||(u.indexOf('.wvx')!=-1)||(u.indexOf('.wmv')!=-1)||(u.indexOf('.mp3')!=-1))\n var type="windows";\n else if ((u.indexOf('rtsp')!=-1)||(u.indexOf('.ram')!=-1)||(u.indexOf('.rpm')!=-1)||(u.indexOf('.rm' )!=-1)||(u.indexOf('.ra' )!=-1))\n var type="realone";\n else if ((u.indexOf('.mov')!=-1)||(u.indexOf('.qt' )!=-1))\n var type="quicktime";\n else if ((u.indexOf('.swf')!=-1)||(u.indexOf('.flv')!=-1))\n var type="flash";\n else if ((u.indexOf('.jpg')!=-1)||(u.indexOf('.gif')!=-1))\n var type="image";\n }\n if (!type) var type="none";\n if (!url) var url="";\n if (show===undefined) var show=true;\n if (!extras) var extras="";\n if (type=="none" && url.trim().length) url="<br>unrecognized media type:<br>"+url;\n if (type=="realone") height-=show?60:0; // leave room for controls\n if (type=="windows") show=show?"1":"0"; // player-specific param value\n if (type=="realone") show=show?"block":"none";\n if (type=="quicktime") show=show?"true":"false";\n if (type=="image") show=show?"block":"none";\n\n // create containing div for player HTML\n // and add or replace player in TW DOM structure\n var newplayer = document.createElement("div");\n newplayer.playerType=type;\n newplayer.setAttribute("id",id+"_div");\n var existing = document.getElementById(id+"_div");\n if (existing && !place) place=existing.parentNode;\n if (!existing)\n place.appendChild(newplayer);\n else {\n if (place==existing.parentNode) place.replaceChild(newplayer,existing)\n else { existing.parentNode.removeChild(existing); place.appendChild(newplayer); }\n }\n\n var html=config.macros.player.html[type];\n html=html.replace(/%i%/mg,id);\n html=html.replace(/%w%/mg,width);\n html=html.replace(/%h%/mg,height);\n html=html.replace(/%u%/mg,url);\n html=html.replace(/%s%/mg,show);\n html=html.replace(/%x%/mg,extras);\n newplayer.innerHTML=html;\n}\n//}}}\n\n// // Player-specific API functions: isReady(id), isPlaying(id), toggleControls(id), showControls(id,flag)\n\n//{{{\n// status values:\n// Windows: 0=Undefined, 1=Stopped, 2=Paused, 3=Playing, 4=ScanForward, 5=ScanReverse\n// 6=Buffering, 7=Waiting, 8=MediaEnded, 9=Transitioning, 10=Ready, 11=Reconnecting\n// RealOne: 0=Stopped, 1=Contacting, 2=Buffering, 3=Playing, 4=Paused, 5=Seeking\n// QuickTime: 'Waiting', 'Loading', 'Playable', 'Complete', 'Error:###'\n// Flash: 0=Loading, 1=Uninitialized, 2=Loaded, 3=Interactive, 4=Complete\nconfig.macros.player.isReady=function(id)\n{\n var d=document.getElementById(id+"_div"); if (!d) return false;\n var p=document.getElementById(id); if (!p) return false;\n if (d.playerType=='windows') return !((p.playState==0)||(p.playState==7)||(p.playState==9)||(p.playState==11));\n if (d.playerType=='realone') return (p.GetPlayState()>1);\n if (d.playerType=='quicktime') return !((p.getPluginStatus()=='Waiting')||(p.getPluginStatus()=='Loading'));\n if (d.playerType=='flash') return (p.ReadyState>2);\n return true;\n}\nconfig.macros.player.isPlaying=function(id)\n{\n var d=document.getElementById(id+"_div"); if (!d) return false;\n var p=document.getElementById(id); if (!p) return false;\n if (d.playerType=='windows') return (p.playState==3);\n if (d.playerType=='realone') return (p.GetPlayState()==3);\n if (d.playerType=='quicktime') return (p.getPluginStatus()=='Complete');\n if (d.playerType=='flash') return (p.ReadyState<4);\n return false;\n}\nconfig.macros.player.showControls=function(id,flag) {\n var d=document.getElementById(id+"_div"); if (!d) return false;\n var p=document.getElementById(id); if (!p) return false;\n if (d.playerType=='windows') { p.ShowControls=flag; p.ShowStatusBar=flag; }\n if (d.playerType=='realone') { alert('show/hide controls not available'); }\n if (d.playerType=='quicktime') // if player not ready, retry in one second\n { if (this.isReady(id)) p.setControllerVisible(flag); else setTimeout('config.macros.player.showControls("'+id+'",'+flag+')',1000); }\n if (d.playerType=='flash') { alert('show/hide controls not available'); }\n}\nconfig.macros.player.toggleControls=function(id) {\n var d=document.getElementById(id+"_div"); if (!d) return false;\n var p=document.getElementById(id); if (!p) return false;\n if (d.playerType=='windows') var flag=!p.ShowControls;\n if (d.playerType=='realone') var flag=true; // TBD\n if (d.playerType=='quicktime') var flag=!p.getControllerVisible();\n if (d.playerType=='flash') var flag=true; // TBD\n this.showControls(id,flag);\n}\nconfig.macros.player.fullScreen=function(id) {\n var d=document.getElementById(id+"_div"); if (!d) return false;\n var p=document.getElementById(id); if (!p) return false;\n if (d.playerType=='windows') p.DisplaySize=3;\n if (d.playerType=='realone') p.SetFullScreen();\n if (d.playerType=='quicktime') { alert('full screen not available'); }\n if (d.playerType=='flash') { alert('full screen not available'); }\n}\n//}}}\n\n// // Player HTML\n\n//{{{\n// placeholder (no player)\nconfig.macros.player.html.none=' \s\n <table id="%i%" width="%w%" height="%h%" style="background-color:#111;border:0;margin:0;padding:0;"> \s\n <tr style="background-color:#111;border:0;margin:0;padding:0;"> \s\n <td width="%w%" height="%h%" style="background-color:#111;color:#ccc;border:0;margin:0;padding:0;text-align:center;"> \s\n &nbsp; \s\n %u% \s\n &nbsp; \s\n </td></tr></table>';\n//}}}\n\n//{{{\n// JPG/GIF still images\nconfig.macros.player.html.image='\s\n <img width="%w%" height="%h%" style="display:%s%;" src="%u%">';\n//}}}\n\n//{{{\n// Windows Media Player\n// v7.1 ID: classid=CLSID:6BF52A52-394A-11d3-B153-00C04F79FAA6\n// v9 ID: classid=CLSID:22d6f312-b0f6-11d0-94ab-0080c74c7e95\nconfig.macros.player.html.windows=' \s\n <object id="%i%" width="%w%" height="%h%" style="margin:0;padding:0;" \s\n classid="CLSID:22d6f312-b0f6-11d0-94ab-0080c74c7e95" \s\n codebase="http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=6,4,5,715" \s\n align="baseline" border="0" \s\n standby="Loading Microsoft Windows Media Player components..." \s\n type="application/x-oleobject"> \s\n <param name="FileName" value="%u%"> <param name="ShowControls" value="%s%"> \s\n <param name="ShowPositionControls" value="1"> <param name="ShowAudioControls" value="1"> \s\n <param name="ShowTracker" value="1"> <param name="ShowDisplay" value="0"> \s\n <param name="ShowStatusBar" value="1"> <param name="AutoSize" value="1"> \s\n <param name="ShowGotoBar" value="0"> <param name="ShowCaptioning" value="0"> \s\n <param name="AutoStart" value="1"> <param name="AnimationAtStart" value="1"> \s\n <param name="TransparentAtStart" value="0"> <param name="AllowScan" value="1"> \s\n <param name="EnableContextMenu" value="1"> <param name="ClickToPlay" value="1"> \s\n <param name="InvokeURLs" value="1"> <param name="DefaultFrame" value="datawindow"> \s\n %x% \s\n <embed src="%u%" style="margin:0;padding:0;" \s\n align="baseline" border="0" width="%w%" height="%h%" \s\n type="application/x-mplayer2" \s\n pluginspage="http://www.microsoft.com/windows/windowsmedia/download/default.asp" \s\n name="%i%" showcontrols="%s%" showpositioncontrols="1" \s\n showaudiocontrols="1" showtracker="1" showdisplay="0" \s\n showstatusbar="%s%" autosize="1" showgotobar="0" showcaptioning="0" \s\n autostart="1" autorewind="0" animationatstart="1" transparentatstart="0" \s\n allowscan="1" enablecontextmenu="1" clicktoplay="0" invokeurls="1" \s\n defaultframe="datawindow"> \s\n </embed> \s\n </object>';\n//}}}\n\n//{{{\n// RealNetworks' RealOne Player\nconfig.macros.player.html.realone=' \s\n <table width="%w%" style="border:0;margin:0;padding:0;"><tr style="border:0;margin:0;padding:0;"><td style="border:0;margin:0;padding:0;"> \s\n <object id="%i%" width="%w%" height="%h%" style="margin:0;padding:0;" \s\n CLASSID="clsid:CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA"> \s\n <PARAM NAME="CONSOLE" VALUE="player"> \s\n <PARAM NAME="CONTROLS" VALUE="ImageWindow"> \s\n <PARAM NAME="AUTOSTART" Value="true"> \s\n <PARAM NAME="MAINTAINASPECT" Value="true"> \s\n <PARAM NAME="NOLOGO" Value="true"> \s\n <PARAM name="BACKGROUNDCOLOR" VALUE="#333333"> \s\n <PARAM NAME="SRC" VALUE="%u%"> \s\n %x% \s\n <EMBED width="%w%" height="%h%" controls="ImageWindow" type="audio/x-pn-realaudio-plugin" style="margin:0;padding:0;" \s\n name="%i%" \s\n src="%u%" \s\n console=player \s\n maintainaspect=true \s\n nologo=true \s\n backgroundcolor=#333333 \s\n autostart=true> \s\n </OBJECT> \s\n </td></tr><tr style="border:0;margin:0;padding:0;"><td style="border:0;margin:0;padding:0;"> \s\n <object id="%i%_controls" width="%w%" height="60" style="margin:0;padding:0;display:%s%" \s\n CLASSID="clsid:CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA"> \s\n <PARAM NAME="CONSOLE" VALUE="player"> \s\n <PARAM NAME="CONTROLS" VALUE="All"> \s\n <PARAM NAME="NOJAVA" Value="true"> \s\n <PARAM NAME="MAINTAINASPECT" Value="true"> \s\n <PARAM NAME="NOLOGO" Value="true"> \s\n <PARAM name="BACKGROUNDCOLOR" VALUE="#333333"> \s\n <PARAM NAME="SRC" VALUE="%u%"> \s\n %x% \s\n <EMBED WIDTH="%w%" HEIGHT="60" NOJAVA="true" type="audio/x-pn-realaudio-plugin" style="margin:0;padding:0;display:%s%" \s\n controls="All" \s\n name="%i%_controls" \s\n src="%u%" \s\n console=player \s\n maintainaspect=true \s\n nologo=true \s\n backgroundcolor=#333333> \s\n </OBJECT> \s\n </td></tr></table>';\n//}}}\n\n//{{{\n// QuickTime Player\nconfig.macros.player.html.quicktime=' \s\n <OBJECT ID="%i%" WIDTH="%w%" HEIGHT="%h%" style="margin:0;padding:0;" \s\n CLASSID="clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B" \s\n CODEBASE="http://www.apple.com/qtactivex/qtplugin.cab"> \s\n <PARAM name="SRC" VALUE="%u%"> \s\n <PARAM name="AUTOPLAY" VALUE="true"> \s\n <PARAM name="CONTROLLER" VALUE="%s%"> \s\n <PARAM name="BGCOLOR" VALUE="#333333"> \s\n <PARAM name="SCALE" VALUE="aspect"> \s\n <PARAM name="SAVEEMBEDTAGS" VALUE="true"> \s\n %x% \s\n <EMBED name="%i%" WIDTH="%w%" HEIGHT="%h%" style="margin:0;padding:0;" \s\n SRC="%u%" \s\n AUTOPLAY="true" \s\n SCALE="aspect" \s\n CONTROLLER="%s%" \s\n BGCOLOR="#333333" \s\n EnableJavaSript="true" \s\n PLUGINSPAGE="http://www.apple.com/quicktime/download/"> \s\n </EMBED> \s\n </OBJECT>';\n//}}}\n\n//{{{\n// Flash Player\nconfig.macros.player.html.flash='\s\n <object id="%i%" width="%w%" height="%h%" style="margin:0;padding:0;" \s\n classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" \s\n codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,29,0"> \s\n <param name="movie" value="%u%"> \s\n <param name="quality" value="high"> \s\n <param name="SCALE" value="exactfit"> \s\n <param name="bgcolor" value="333333"> \s\n %x% \s\n <embed name="%i%" src="%u%" style="margin:0;padding:0;" \s\n height="%h%" width="%w%" quality="high" \s\n pluginspage="http://www.macromedia.com/go/getflashplayer" \s\n type="application/x-shockwave-flash" scale="exactfit"> \s\n </embed> \s\n </object>';\n//}}}
<<tiddlerList tags:"systemConfig,-Template"$>$> >>
The reminder macro can take the following arguments.\n\n!!!!date syntax\n* @@{{{year:NUMBER}}}@@ - The four digit representation of the year (for example {{{year:2046}}} or {{{year:1999}}}\n* @@{{{month:NUMBER}}}@@ - The numerical representation of the month (for example {{{month:1}}} for January, {{{month:12}}} for December)\n* @@{{{day:NUMBER}}}@@ - The numerical representation of the day of the month (for example {{{day:15}}} will match the 15th day of the month)\n* @@{{{dayofweek:NUMBER}}}@@ - The numerical representation of the day of the week. Valid values are in the range of 0-6. {{{dayofweek:0}}} will match Sunday, and {{{dayofweek:6}}} will match Saturday.\n\n!!!!offsets\n* @@{{{offsetdayofweek:NUMBER}}}@@ - The numerical representation of a day of the week. Valid values are in the range of 0-6. 0 will match Sunday, and 6 will match Saturday. If offsetdayofweek is specified, the year, month, day and dayofweek will be matched as usual, and the reminder will be set to the next occurence of the day of the week specified by offsetdayofweek. For example, the first Thursday of the month can be specified as {{{day:1 offsetdayofweek:4}}} and the second Thursday can be specified as {{{day:8 offsetdayofweek4}}} If offsetdayofweek is negative, the search will be performed backward. For example, the last Thursday in August can be found by {{{month:8 day:31 offsetdayofweek:-4}}}\n* @@{{{recurdays:NUMBER}}}@@ - If recurdays is set, then the reminder will fire on the base date specified by year, month, day, and dayofweek and also every N days afterward. For example, if the reminder is specified with {{{year:2005 month:8 day:16 recurdays:2}}} it will match August 16, 18, 20, etc. Please make sure that you fully specify year, month and day in any recurring reminder.\n\n!!!!leadtime\n* @@{{{leadtime:NUMBER}}}@@ - Use this to specify when this reminder will appear in [[showReminders]]. If a reminder has a leadtime of 2, it will only show up in showReminders if it will be matched in the next two days. Likewise, a reminder with a leadtime of 60 will show up in showReminders even if showReminders has a lower leadtime. showReminders can override this behavior with the limit argument.\n\n!!!!Reminder display options\n* @@{{{title:"STRING"}}}@@ - A string used to identify this reminder when it is shown in a list of reminders. For example, {{{title:"New Year's Day"}}} or {{{title:"Elvis' Birthday"}}}. You can put standard TiddlyWiki formatting in the title.\n* @@{{{format:"STRING"}}}@@ - Use this argument to override the default string used for display. You can put standard TiddlyWiki formatting in the format. The following substitutions will be made in the string before it is displayed.\n** DIFF will be replaced with the one of the strings "Today", "Tommorrow", or "N days", where N is the number of days between now and the date of the reminder. \n** TITLE will be replaced with the title of the reminder\n** DATE will be replaced with the matched date of the reminder.\n** ANNIVERSARY will be replaced with the number of years since between the matched date and firstyear\nThe default string is "DIFF: TITLE on DATE ANNIVERSARY"\n* @@{{{firstyear:NUMBER}}}@@ - The first year that a reminder occurred, in four digit format. For example {{{firstyear:2001}}}. This is used when calculating the number of years that a reminder has happened.\n* @@{{{hidden}}}@@ - If this option is present, the reminder will not be displayed in the regular view of the tiddler. You can use this to have reminders for [[displayTiddlersWithReminders]] to find, without having the countdown appear. See [[Season's Greetings example]] for an example.\n\n
/***\n| Name:|RenameTagsPlugin|\n| Description:|Allows you to easily rename or delete tags across multiple tiddlers|\n| Version:|6.9.3|\n| Date:|30-Sep-2006|\n| Source:|http://mptw.tiddlyspot.com/#RenameTagsPlugin|\n| Author:|Simon Baird <simon.baird@gmail.com>|\n| CoreVersion:|2.1.x|\nRename a tag and you will be prompted to rename it in all its tagged tiddlers.\n***/\n//{{{\nconfig.renameTags = {\n\n prompts: {\n rename: "Rename the tag '%0' to '%1' in %2 tidder%3?",\n remove: "Remove the tag '%0' from %1 tidder%2?"\n },\n\n removeTag: function(tag,tiddlers) {\n for (var i=0;i<tiddlers.length;i++) {\n store.setTiddlerTag(tiddlers[i].title,false,tag);\n }\n },\n\n renameTag: function(oldTag,newTag,tiddlers) {\n for (var i=0;i<tiddlers.length;i++) {\n store.setTiddlerTag(tiddlers[i].title,false,oldTag); // remove old\n store.setTiddlerTag(tiddlers[i].title,true,newTag); // add new\n }\n },\n\n storeMethods: {\n\n saveTiddler_orig_renameTags: TiddlyWiki.prototype.saveTiddler,\n\n saveTiddler: function(title,newTitle,newBody,modifier,modified,tags,fields) {\n if (title != newTitle) {\n var tagged = this.getTaggedTiddlers(title);\n if (tagged.length > 0) {\n // then we are renaming a tag\n if (confirm(config.renameTags.prompts.rename.format([title,newTitle,tagged.length,tagged.length>1?"s":""])))\n config.renameTags.renameTag(title,newTitle,tagged);\n\n if (!this.tiddlerExists(title) && newBody == "")\n // dont create unwanted tiddler\n return null;\n }\n }\n return this.saveTiddler_orig_renameTags(title,newTitle,newBody,modifier,modified,tags,fields);\n },\n\n removeTiddler_orig_renameTags: TiddlyWiki.prototype.removeTiddler,\n\n removeTiddler: function(title) {\n var tagged = this.getTaggedTiddlers(title);\n if (tagged.length > 0)\n if (confirm(config.renameTags.prompts.remove.format([title,tagged.length,tagged.length>1?"s":""])))\n config.renameTags.removeTag(title,tagged);\n return this.removeTiddler_orig_renameTags(title);\n }\n\n },\n\n init: function() {\n merge(TiddlyWiki.prototype,this.storeMethods);\n }\n}\n\nconfig.renameTags.init();\n\n//}}}\n\n
\n<<formTiddler fichaPlantilla>>\n<data>{"tecnico":"José Luis González Castro","mes":"Mayo","año":"2006","lugar":"aula","notes":"ibook G3/600 con Protools\snMbox (modelo 2005)\snMicrófono AKG C414 B\sn","interprete":"Francisco Pérez"}</data>
\n|[img[requinto en mib|materiales/fotografías/requinto.jpg]]|\n\n!Guía\n\nInstrumento más agudo de la familia de los clarinetes. Normalmente está afinado en mib o en re; tradicionalmente estaba en re.\nNormalmente se ha usado para efectos sonoros (muy adecuado para representar un carácter burlón).\nSu sonido es muy penetrante en el registro agudo aunque puede sonar muy dulce (Mahler, Ravel, Stravinsky, Strauss, Berlioz, Schostakovitch).\nSe puede conseguir un staccato muy corto y puede ser muy ágil. La articulación se puede hacer muy clara.\nLo más difícil a la hora de tocar son los ataques, dado que al ser agudo necesita de una presión determinada para mantener las notas.\nEs más exigente que un clarinete normal, aunque al principio parezca muy fácil.\nLa afinación es muy delicada. Tiene algunas notas donde hay que tener cuidado, en particular en los agudos.\nPuede funcionar muy bien en p si el registro es medio o grave; en el agudo es muy difícil.\nAl pasar al segundo registro, las notas no son tan homogéneas como en el grave (igual que en el clarinete normal).\nSe puede hacer multifónicos con él.\nNecesita de un especialista. (En teoría puede tocarlo cualquier clarinetista). En las orquestas hay un clarinete principal y un asistente de principal; el asistente tiene que ser especialista en requinto.\nEl repertorio es complejo, difícil.\nEl tamaño del instrumento requiere que la persona que lo toque no tenga los dedos muy grandes, porque si no no se puede tapar los orificios (se puede adaptar el instrumento).\nLas llaves y técnica son iguales que en el clarinete normal, sólo que el instrumento es mucho más pequeño.\n\n1.Registro:\n\nSe puede hacer tres octavas, casi cuatro; los agudos son bastante difíciles y excesivamente penetrantes.\nLa nota más grave es un mi; la nota más aguda (de trabajo), un la sobreagudo. (el extremo es un do sobreagudo).\n+++[Ejemplo 1]...\n<<player id=1 quicktime materiales/grabaciones/requinto/requinto_1.wav 400 15>>\n===\n\n\nSerie de notas "malas". Como no tienen mucho tubo para vibrar, se hacen más con la boca. Es difícil garantizar su homogeneidad, hay que trabajarlas mucho. \n+++[Ejemplo 2]...\n<<player id=2 quicktime materiales/grabaciones/requinto/requinto_2.wav 400 15>>\n===\n\n\n2.Dinámica: crescendo hasta el máximo posible en tres notas diferentes del registro.\n+++[Ejemplo 3]...\n<<player id=3 quicktime materiales/grabaciones/requinto/requinto_3.wav 400 15>>\n===\n\n\n3.Escalas y arpegios:\n\nEscala cromática.\nArpegio\nEscala picada.\nEscala con un picado algo más largo. \n+++[Ejemplo 4]...\n<<player id=4 quicktime materiales/grabaciones/requinto/requinto_4.wav 400 15>>\n===\n\n\n4.Agilidad (escalas y arpegios). Es un instrumento muy veloz. (Se utiliza en momentos muy rápidos).\n+++[Ejemplo 5]...\n<<player id=5 quicktime materiales/grabaciones/requinto/requinto_5.wav 400 15>>\n===\n\n\n5.Glissandos:\n \nEjemplos generales.\nEl efecto es mucho más fácil de utilizar en el registro medio que en grave: ejemplo en el grave.\nGlissando en el registro medio-agudo.\n+++[Ejemplo 6]...\n<<player id=6 quicktime materiales/grabaciones/requinto/requinto_6.wav 400 15>>\n===\n\n\n6.Trinos.\n+++[Ejemplo 7]...\n<<player id=7 quicktime materiales/grabaciones/requinto/requinto_7.wav 400 15>>\n===\n\n\n7.Multifónicos: No se suelen pedir pero se pueden hacer (varios ejemplos).\n+++[Ejemplo 8]...\n<<player id=8 quicktime materiales/grabaciones/requinto/requinto_8.wav 400 15>>\n===\n\n\n8.Ejemplos de repertorio:\n\nRavel (Bolero) (dos tomas). Al pasar de la a si se nota el cambio de timbre.\n+++[Ejemplo 9]...\n<<player id=9 quicktime materiales/grabaciones/requinto/requinto_9.wav 400 15>>\n===\n\n\nBerlioz (Sinfonía Fantástica). Carácter danzarín, penetrante, punzante. Solo obligado en las pruebas de orquesta.\n+++[Ejemplo 10]...\n<<player id=10 quicktime materiales/grabaciones/requinto/requinto_10.wav 400 15>>\n===\n\n\nSchostakovitch (Danza). Parte central del 2º movimiento de la 5ª sinfonía (solo). No es tan penetrante como el anterior, pero sigue manteniendo ese carácter.\n+++[Ejemplo 11]...\n<<player id=11 quicktime materiales/grabaciones/requinto/requinto_11.wav 400 15>>\n===\n\n\nStravinsky (Consagración de la Primavera). Tiempo lento-Introducción.\n+++[Ejemplo 12]...\n<<player id=12 quicktime materiales/grabaciones/requinto/requinto_12.wav 400 15>>\n===\n\n\nStrauss (Till Eulenspiegel).\nMotivo.\nMotivo en otro tono más alto.\nVariantes.\nFinal.\n+++[Ejemplo 13]...\n<<player id=13 quicktime materiales/grabaciones/requinto/requinto_13.wav 400 15>>\n===\n\n\nEl requinto puede ser a la vez muy dulce y agresivo.\n\nStravinsky (Consagración- ronda).\n+++[Ejemplo 14]...\n<<player id=14 quicktime materiales/grabaciones/requinto/requinto_14.wav 400 15>>\n===\n\nEl requinto hace octavas con el fagot: tiene que sonar dolce, está en agudo y tiene adornos. Es difícil (también para el fagot).\n\n\n\n\n
/***\nIntended for use in ViewTemplate\n!Examples\n|{{{<<runMacroIfTagged [[Groceries]] toggleTag Buy>>}}}|<<runMacroIfTagged [[Groceries]] toggleTag Buy>>|\n|{{{<<runMacroIfTagged Plugins toggleTag systemConfig>>}}}|<<runMacroIfTagged Plugins toggleTag systemConfig>>|\n***/\n//{{{\n\n// This function contributed by Eric Shulman\nfunction toggleTag(title,tag) {\n var t=store.getTiddler(title); if (!t || !t.tags) return;\n if (t.tags.find(tag)==null) t.tags.push(tag)\n else t.tags.splice(t.tags.find(tag),1)\n}\n\n// This function contributed by Eric Shulman\nfunction isTagged(title,tag) {\n var t=store.getTiddler(title); if (!t) return false;\n return (t.tags.find(tag)!=null);\n}\n\nconfig.macros.runMacroIfTagged = {};\nconfig.macros.runMacroIfTagged.handler = function(place,macroName,params,wikifier,paramString,tiddler) {\n if (isTagged(tiddler.title,params[0]))\n config.macros[params[1]].handler(place,params[1],params.slice(2),wikifier,paramString/*fixme*/,tiddler);\n}\n\n//}}}\n/***\n!Todo\n* paramString needs to have the first word removed from the front of it at fixme above\n\n\n***/\n\n
\n<<formTiddler fichaPlantilla>>\n<data>{"tecnico":"José Luis González Castro","mes":"Agosto","año":"2005","lugar":"aula","notes":"ibook G3/600 con Protools\snMbox (modelo 2005)\snMicrófono Rode NT5 (mono)\snAlgunos ejemplos están normalizados por separado","interprete":"Rafael Yebra"}</data>
\n|[img[saxofón barítono|materiales/fotografías/saxo_baritono.jpg]]|\n\n!Guía\n\n1.Nota más grave.\n+++[Ejemplo 1]...\n<<player id=1 quicktime materiales/grabaciones/saxofon_baritono/saxofon_baritono_1.wav 400 15>>\n===\n\n\n2.Nota más aguda.\n+++[Ejemplo 2]...\n<<player id=2 quicktime materiales/grabaciones/saxofon_baritono/saxofon_baritono_2.wav 400 15>>\n===\n\n\n3.Efectos en notas agudas.\n+++[Ejemplo 3]...\n<<player id=3 quicktime materiales/grabaciones/saxofon_baritono/saxofon_baritono_3.wav 400 15>>\n===\n\n\n4.Escala y arpegio despacio.\n+++[Ejemplo 4]...\n<<player id=4 quicktime materiales/grabaciones/saxofon_baritono/saxofon_baritono_4.wav 400 15>>\n===\n\n\n5.Escalas, arpegios, rápido.\n+++[Ejemplo 5]...\n<<player id=5 quicktime materiales/grabaciones/saxofon_baritono/saxofon_baritono_5.wav 400 15>>\n===\n\n\n6.Sonidos de Llaves.\n+++[Ejemplo 6]...\n<<player id=6 quicktime materiales/grabaciones/saxofon_baritono/saxofon_baritono_6.wav 400 15>>\n===\n\n\n7.Voz y saxofón.\n+++[Ejemplo 7]...\n<<player id=7 quicktime materiales/grabaciones/saxofon_baritono/saxofon_baritono_7.wav 400 15>>\n===\n\n\n8.Flutter (frulato).\n+++[Ejemplo 8]...\n<<player id=8 quicktime materiales/grabaciones/saxofon_baritono/saxofon_baritono_8.wav 400 15>>\n===\n\n\n9.Más flutter.\n+++[Ejemplo 9]...\n<<player id=9 quicktime materiales/grabaciones/saxofon_baritono/saxofon_baritono_9.wav 400 15>>\n===\n\n\n10.Multifónico abriéndose.\n+++[Ejemplo 10]...\n<<player id=10 quicktime materiales/grabaciones/saxofon_baritono/saxofon_baritono_10.wav 400 15>>\n===\n\n\n11.Tongue-round, efectos con la lengua.\n+++[Ejemplo 11]...\n<<player id=11 quicktime materiales/grabaciones/saxofon_baritono/saxofon_baritono_11.wav 400 15>>\n===\n\n\n12.Sonidos-trompeta.\n+++[Ejemplo 12]...\n<<player id=12 quicktime materiales/grabaciones/saxofon_baritono/saxofon_baritono_12.wav 400 15>>\n===\n\n\n13. Efectos de percusiones.\n+++[Ejemplo 13]...\n<<player id=13 quicktime materiales/grabaciones/saxofon_baritono/saxofon_baritono_13.wav 400 15>>\n===\n\n\n14. Efecto de Waveshaping.\n+++[Ejemplo 14]...\n<<player id=14 quicktime materiales/grabaciones/saxofon_baritono/saxofon_baritono_14.wav 400 15>>\n===\n\n\n15. Efectos de espectro.\n+++[Ejemplo 15]...\n<<player id=15 quicktime materiales/grabaciones/saxofon_baritono/saxofon_baritono_15.wav 400 15>>\n===\n\n\n16.Efectos de armónicos.\n+++[Ejemplo 16]...\n<<player id=16 quicktime materiales/grabaciones/saxofon_baritono/saxofon_baritono_16.wav 400 15>>\n===\n\n\n\n
\n<<formTiddler fichaPlantilla>>\n<data>{"tecnico":"José Luis González Castro","mes":"Agosto","año":"2005","lugar":"aula","notes":"ibook G3/600 con Protools\snMbox (modelo 2005)\snMicrófono Rode NT5\snAlgunos ejemplos están normalizados por separado","interprete":"Rafael Yebra"}</data>
\n|[img[saxofón soprano|materiales/fotografías/saxo_soprano.jpg]]|\n\n!Guía\n\n1. Nota más grave.\n+++[Ejemplo 1]...\n<<player id=1 quicktime materiales/grabaciones/saxofon_soprano/saxofon_soprano_1.wav 400 15>>\n===\n\n\n2. Notas más agudas (la última es un re). \n+++[Ejemplo 2]...\n<<player id=2 quicktime materiales/grabaciones/saxofon_soprano/saxofon_soprano_2.wav 400 15>>\n===\n\n\n3. Escala y arpegio despacio.\n+++[Ejemplo 3]...\n<<player id=3 quicktime materiales/grabaciones/saxofon_soprano/saxofon_soprano_3.wav 400 15>>\n===\n\n\n4. Escalas, arpegios, rápido; glissandos; los glissandos "arrastrados" se cortan si son demasiado amplios.\n+++[Ejemplo 4]...\n<<player id=4 quicktime materiales/grabaciones/saxofon_soprano/saxofon_soprano_4.wav 400 15>>\n===\n\n\n5. Llaves.\n+++[Ejemplo 5]...\n<<player id=5 quicktime materiales/grabaciones/saxofon_soprano/saxofon_soprano_5.wav 400 15>>\n===\n\n\n6. Mulifónicos.\n+++[Ejemplo 6]...\n<<player id=6 quicktime materiales/grabaciones/saxofon_soprano/saxofon_soprano_6.wav 400 15>>\n===\n\n\n7. Más multifónicos.\n+++[Ejemplo 7]...\n<<player id=7 quicktime materiales/grabaciones/saxofon_soprano/saxofon_soprano_7.wav 400 15>>\n===\n\n\n8. Efectos con la lengua.\n+++[Ejemplo 8]...\n<<player id=8 quicktime materiales/grabaciones/saxofon_soprano/saxofon_soprano_8.wav 400 15>>\n===\n\n\n9. Vibratos.\n+++[Ejemplo 9]...\n<<player id=9 quicktime materiales/grabaciones/saxofon_soprano/saxofon_soprano_9.wav 400 15>>\n===\n\n\n\n
<<list shadowed>>
<html>\n <sub><b>Name:</b></sub><br/>\n <input name=userName type=text /><br/>\n <sub><b>Password:</b></sub><br/>\n <input name=pwd type=password /><br/>\n</html>\n[[Card 1|SimpleForm (Card 1)]] - [[Card 2|SimpleForm (Card 2)]] - [[Card 3|SimpleForm (Card 3)]]\n\n~~(This is an example form, using the form template SimpleFormTemplate and the FormTiddlerPlugin.)~~
/***\n|''Name:''|SinglePageModePlugin|\n|''Source:''|http://www.TiddlyTools.com/#SinglePageModePlugin|\n|''Author:''|Eric Shulman - ELS Design Studios|\n|''License:''|[[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|\n|''~CoreVersion:''|2.0.10|\n\nNormally, as you click on the links in TiddlyWiki, more and more tiddlers are displayed on the page. The order of this tiddler display depends upon when and where you have clicked. Some people like this non-linear method of reading the document, while others have reported that when many tiddlers have been opened, it can get somewhat confusing.\n\n!!!!!Usage\n<<<\nSinglePageMode allows you to configure TiddlyWiki to navigate more like a traditional multipage web site with only one item displayed at a time. When SinglePageMode is enabled, the title of the current tiddler is automatically displayed in the browser window's titlebar and the browser's location URL is updated with a 'permalink' for the current tiddler so that it is easier to create a browser 'bookmark' for the current tiddler.\n\nEven when SinglePageMode is disabled (i.e., displaying multiple tiddlers is permitted), you can reduce the potential for confusion by enable TopOfPageMode, which forces tiddlers to always open at the top of the page instead of being displayed following the tiddler containing the link that was clicked.\n<<<\n!!!!!Configuration\n<<<\nWhen installed, this plugin automatically adds checkboxes in the AdvancedOptions tiddler so you can enable/disable the plugin behavior. For convenience, these checkboxes are also included here:\n\n<<option chkSinglePageMode>> Display one tiddler at a time\n<<option chkTopOfPageMode>> Always open tiddlers at the top of the page\n<<<\n!!!!!Installation\n<<<\nimport (or copy/paste) the following tiddlers into your document:\n''SinglePageModePlugin'' (tagged with <<tag systemConfig>>)\n^^documentation and javascript for SinglePageMode handling^^\n\nWhen installed, this plugin automatically adds checkboxes in the ''shadow'' AdvancedOptions tiddler so you can enable/disable this behavior. However, if you have customized your AdvancedOptions, you will need to ''manually add these checkboxes to your customized tiddler.''\n<<<\n!!!!!Revision History\n<<<\n''2006.07.04 [2.2.1]'' in hijack for displayTiddlers(), suspend TPM as well as SPM so that DefaultTiddlers displays in the correct order.\n''2006.06.01 [2.2.0]'' added chkTopOfPageMode (TPM) handling\n''2006.02.04 [2.1.1]'' moved global variable declarations to config.* to avoid FireFox crash bug when assigning to globals\n''2005.12.27 [2.1.0]'' hijack displayTiddlers() so that SPM can be suspended during startup while displaying the DefaultTiddlers (or #hash list). Also, corrected initialization for undefined SPM flag to "false", so default behavior is to display multiple tiddlers\n''2005.12.27 [2.0.0]'' Update for TW2.0\n''2005.11.24 [1.1.2]'' When the back and forward buttons are used, the page now changes to match the URL. Based on code added by Clint Checketts\n''2005.10.14 [1.1.1]'' permalink creation now calls encodeTiddlyLink() to handle tiddler titles with spaces in them\n''2005.10.14 [1.1.0]'' added automatic setting of window title and location bar ('auto-permalink'). feature suggestion by David Dickens.\n''2005.10.09 [1.0.1]'' combined documentation and code in a single tiddler\n''2005.08.15 [1.0.0]'' Initial Release\n<<<\n!!!!!Credits\n<<<\nThis feature was developed by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]].\nSupport for BACK/FORWARD buttons adapted from code developed by Clint Checketts\n<<<\n!!!!!Code\n***/\n//{{{\nversion.extensions.SinglePageMode= {major: 2, minor: 2, revision: 1, date: new Date(2006,7,3)};\n\nif (config.options.chkSinglePageMode==undefined) config.options.chkSinglePageMode=false;\nconfig.shadowTiddlers.AdvancedOptions += "\sn<<option chkSinglePageMode>> Display one tiddler at a time";\n\nif (config.options.chkTopOfPageMode==undefined) config.options.chkTopOfPageMode=false;\nconfig.shadowTiddlers.AdvancedOptions += "\sn<<option chkTopOfPageMode>> Always open tiddlers at the top of the page";\n\nconfig.SPMTimer = 0;\nconfig.lastURL = window.location.hash;\nfunction checkLastURL()\n{\n if (!config.options.chkSinglePageMode)\n { window.clearInterval(config.SPMTimer); config.SPMTimer=0; return; }\n if (config.lastURL == window.location.hash)\n return;\n var tiddlerName = convertUTF8ToUnicode(decodeURI(window.location.hash.substr(1)));\n tiddlerName=tiddlerName.replace(/\s[\s[/,"").replace(/\s]\s]/,""); // strip any [[ ]] bracketing\n if (tiddlerName.length) story.displayTiddler(null,tiddlerName,1,null,null);\n}\n\nif (Story.prototype.SPM_coreDisplayTiddler==undefined) Story.prototype.SPM_coreDisplayTiddler=Story.prototype.displayTiddler;\nStory.prototype.displayTiddler = function(srcElement,title,template,animate,slowly)\n{\n if (config.options.chkSinglePageMode) {\n window.location.hash = encodeURIComponent(String.encodeTiddlyLink(title));\n config.lastURL = window.location.hash;\n document.title = wikifyPlain("SiteTitle") + " - " + title;\n story.closeAllTiddlers();\n if (!config.SPMTimer) config.SPMTimer=window.setInterval(function() {checkLastURL();},1000);\n }\n if (config.options.chkTopOfPageMode) { story.closeTiddler(title); window.scrollTo(0,0); srcElement=null; }\n this.SPM_coreDisplayTiddler(srcElement,title,template,animate,slowly)\n}\n\nif (Story.prototype.SPM_coreDisplayTiddlers==undefined) Story.prototype.SPM_coreDisplayTiddlers=Story.prototype.displayTiddlers;\nStory.prototype.displayTiddlers = function(srcElement,titles,template,unused1,unused2,animate,slowly)\n{\n // suspend single-page mode when displaying multiple tiddlers\n var saveSPM=config.options.chkSinglePageMode; config.options.chkSinglePageMode=false;\n var saveTPM=config.options.chkTopOfPageMode; config.options.chkTopOfPageMode=false;\n this.SPM_coreDisplayTiddlers(srcElement,titles,template,unused1,unused2,animate,slowly);\n config.options.chkSinglePageMode=saveSPM; config.options.chkTopOfPageMode=saveTPM;\n}\n//}}}
Conservatorio Superior de Música de Vigo
Guía de Instrumentos
/*{{{*/\n#page { \n border-left: 2px solid #eee;\n border-right: 2px solid #aaa;\n border-bottom: 2px solid #aaa;\n padding: 0pt;\n margin-left: auto;\n margin-right: auto;\n margin-top: 0px;\n width: 70em;\n position: relative;\n text-align: justify;\n background-color: [[ColorPalette::TertiaryLight]];\n color: [[ColorPalette::Foreground]];\n}\n\n#topMenu {\n font-size: 1.4em;\n font-family: 'Trebuchet MS' Arial sans-serif;\n text-decoration: none;\n background: [[ColorPalette::PrimaryDark]];\n color: [[ColorPalette::PrimaryPale]]; \n height: 26px;\n padding-top: 5px;\n padding-left: 5px;\n}\n\n#topMenu .button, #topMenu .tiddlyLink, #topMenu a {\n color: [[ColorPalette::PrimaryPale]]; \n border: 0;\n text-decoration: none;\n}\n\n#topMenu .button:hover, #topMenu .tiddlyLink:hover { \n color: [[ColorPalette::Background]]; \n text-decoration: none; \n background: [[ColorPalette::PrimaryDark]];\n}\n\n#topMenu a:hover { \n color: [[ColorPalette::Background]]; \n text-decoration: underline; \n background: [[ColorPalette::PrimaryDark]];\n}\n\n#topMenu strong a {\n color: [[ColorPalette::Background]];\n}\n\n#sidebar { \n background-color: [[ColorPalette::Background]];\n}\n\n\n#displayArea {\n margin: 1em 1em 0em 14em;\n}\n\n\n.tiddler {\n \n \n margin: 1em 1em 2em 1em;\n width: 75%;\n background-color: [[ColorPalette::Background]];\n -moz-border-radius: 1.0em;\n}\n\nh1 {border-bottom: solid [[ColorPalette::Foreground]] 1px;}\n\n.title,h1,h2,h3,h4,h5 { \n font-family: 'Trebuchet MS' Arial sans-serif;\n}\n\n\n\nh1,h2,h3,h4,h5 {\n color: [[ColorPalette::Foreground]];\n background:[[ColorPalette::Background]];\n}\n\n\n.subtitle {\n padding-left: 2em;\n font-size: .8em;\n}\n\n\n@media print {\n .header { display: none;}\n #page { background: #fff; border: 0;}\n #topMenu { display: none;}\n #pageFooter { display: none;}\n\n}\n\n\n/*}}}*/\n
/*{{{*/\n* html .tiddler {\n height: 1%;\n}\n.viewer {\n text-align: justify;\n}\nbody {\n font-size: .75em;\n font-family: arial,helvetica;\n margin: 0;\n padding: 0;\n \n}\n\nh1,h2,h3,h4,h5 {\n font-weight: bold;\n text-decoration: none;\n padding-left: 0.4em;\n}\n\nh1 {font-size: 1.35em;}\nh2 {font-size: 1.25em;}\nh3 {font-size: 1.1em;}\nh4 {font-size: 1em;}\nh5 {font-size: .9em;}\n\nhr {\n height: 1px;\n}\n\na{\n text-decoration: none;\n}\n\ndt {font-weight: bold;}\n\nol { list-style-type: decimal }\nol ol { list-style-type: lower-alpha }\nol ol ol { list-style-type: lower-roman }\nol ol ol ol { list-style-type: decimal }\nol ol ol ol ol { list-style-type: lower-alpha }\nol ol ol ol ol ol { list-style-type: lower-roman }\nol ol ol ol ol ol ol { list-style-type: decimal }\n\n.txtOptionInput {\n width: 11em;\n}\n\n#contentWrapper .chkOptionInput {\n border: 0;\n}\n\n.externalLink {\n text-decoration: underline;\n}\n\n.indent {margin-left:3em;}\n.outdent {margin-left:3em; text-indent:-3em;}\ncode.escaped {white-space:nowrap;}\n\n.tiddlyLinkExisting {\n font-weight: bold;\n}\n\n.tiddlyLinkNonExisting {\n font-style: italic;\n}\n\n/* the 'a' is required for IE, otherwise it renders the whole tiddler a bold */\na.tiddlyLinkNonExisting.shadow {\n font-weight: bold;\n}\n\n#mainMenu .tiddlyLinkExisting, \n#mainMenu .tiddlyLinkNonExisting,\n#sidebarTabs .tiddlyLinkNonExisting{\n font-weight: normal;\n font-style: normal;\n}\n\n#sidebarTabs .tiddlyLinkExisting {\n font-weight: bold;\n font-style: normal;\n}\n\n.header {\n position: relative;\n}\n\n.header a:hover {\n background: transparent;\n}\n\n.headerShadow {\n position: relative;\n padding: 4.5em 0em 1em 1em;\n left: -1px;\n top: -1px;\n}\n\n.headerForeground {\n position: absolute;\n padding: 4.5em 0em 1em 1em;\n left: 0px;\n top: 0px;\n}\n\n.siteTitle {\n font-size: 3em;\n}\n\n.siteSubtitle {\n font-size: 1.2em;\n}\n\n#mainMenu {\n position: absolute;\n left: 0;\n width: 10em;\n text-align: right;\n line-height: 1.6em;\n padding: 1.5em 0.5em 0.5em 0.5em;\n font-size: 1.1em; \n border: 1px solid #aaa;\n}\n\n#sidebar {\n position: absolute;\n right: 3px;\n width: 16em;\n font-size: .9em;\n border: 1px solid #aaa;\n}\n\n#sidebarOptions {\n padding-top: 0.3em;\n}\n\n#sidebarOptions a {\n margin: 0em 0.2em;\n padding: 0.2em 0.3em;\n display: block;\n}\n\n#sidebarOptions input {\n margin: 0.4em 0.5em;\n}\n\n#sidebarOptions .sliderPanel {\n margin-left: 1em;\n padding: 0.5em;\n font-size: .85em;\n}\n\n#sidebarOptions .sliderPanel a {\n font-weight: bold;\n display: inline;\n padding: 0;\n}\n\n#sidebarOptions .sliderPanel input {\n margin: 0 0 .3em 0;\n}\n\n#sidebarTabs .tabContents {\n width: 15em;\n overflow: hidden;\n}\n\n.wizard {\n padding: 0.1em 0em 0em 2em;\n}\n\n.wizard h1 {\n font-size: 2em;\n font-weight: bold;\n background: none;\n padding: 0em 0em 0em 0em;\n margin: 0.4em 0em 0.2em 0em;\n}\n\n.wizard h2 {\n font-size: 1.2em;\n font-weight: bold;\n background: none;\n padding: 0em 0em 0em 0em;\n margin: 0.2em 0em 0.2em 0em;\n}\n\n.wizardStep {\n padding: 1em 1em 1em 1em;\n}\n\n.wizard .button {\n margin: 0.5em 0em 0em 0em;\n font-size: 1.2em;\n}\n\n#messageArea {\nposition:absolute; top:0; right:0; margin: 0.5em; padding: 0.5em;\n}\n\n*[id='messageArea'] {\nposition:fixed !important; z-index:99;}\n\n.messageToolbar {\ndisplay: block;\ntext-align: right;\n}\n\n#messageArea a{\n text-decoration: underline;\n}\n\n.popup {\n font-size: .9em;\n padding: 0.2em;\n list-style: none;\n margin: 0;\n}\n\n.popup hr {\n display: block;\n height: 1px;\n width: auto;\n padding: 0;\n margin: 0.2em 0em;\n}\n\n.listBreak {\n font-size: 1px;\n line-height: 1px;\n}\n\n.listBreak div {\n margin: 2px 0;\n}\n\n.popup li.disabled {\n padding: 0.2em;\n}\n\n.popup li a{\n display: block;\n padding: 0.2em;\n}\n\n.tabset {\n padding: 1em 0em 0em 0.5em;\n}\n\n.tab {\n margin: 0em 0em 0em 0.25em;\n padding: 2px;\n}\n\n.tabContents {\n padding: 0.5em;\n}\n\n.tabContents ul, .tabContents ol {\n margin: 0;\n padding: 0;\n}\n\n.txtMainTab .tabContents li {\n list-style: none;\n}\n\n.tabContents li.listLink {\n margin-left: .75em;\n}\n\n#displayArea {\n margin: 1em 17em 0em 14em;\n}\n\n\n.toolbar {\n text-align: right;\n font-size: .9em;\n visibility: hidden;\n}\n\n.selected .toolbar {\n visibility: visible;\n}\n\n.tiddler {\n border: 1px solid #fff;\n padding: 1em 1em 0em 1em;\n}\n\n.tiddler:hover {\n padding: 1em 1em 0em 1em;\n border: 1px solid #ccc;\n}\n.missing .viewer,.missing .title {\n font-style: italic;\n}\n\n.title {\n font-size: 1.6em;\n font-weight: bold;\n}\n\n.missing .subtitle {\n display: none;\n}\n\n.subtitle {\n font-size: 1.1em;\n}\n\n.tiddler .button {\n padding: 0.2em 0.4em;\n}\n\n.tagging {\nmargin: 0.5em 0.5em 0.5em 0;\nfloat: left;\ndisplay: none;\n}\n\n.isTag .tagging {\ndisplay: block;\n}\n\n.tagged {\nmargin: 0.5em;\nfloat: right;\n}\n\n.tagging, .tagged {\nfont-size: 0.9em;\npadding: 0.25em;\n}\n\n.tagging ul, .tagged ul {\nlist-style: none;margin: 0.25em;\npadding: 0;\n}\n\n.tagClear {\nclear: both;\n}\n\n.footer {\n font-size: .9em;\n}\n\n.footer li {\ndisplay: inline;\n}\n\n* html .viewer pre {\n width: 99%;\n padding: 0 0 1em 0;\n}\n\n.viewer {\n line-height: 1.4em;\n padding-top: 0.5em;\n}\n\n.viewer .button {\n margin: 0em 0.25em;\n padding: 0em 0.25em;\n}\n\n.viewer blockquote {\n line-height: 1.5em;\n padding-left: 0.8em;\n margin-left: 2.5em;\n}\n\n.viewer ul, .viewer ol{\n margin-left: 0.5em;\n padding-left: 1.5em;\n}\n\n.viewer table {\n border-collapse: collapse;\n margin: 0.8em 1.0em;\n}\n\n.viewer th, .viewer td, .viewer tr,.viewer caption{\n padding: 3px;\n}\n\n.viewer table.listView {\n font-size: 0.85em;\n margin: 0.8em 1.0em;\n}\n\n.viewer table.listView th, .viewer table.listView td, .viewer table.listView tr {\n padding: 0px 3px 0px 3px;\n}\n\n.viewer pre {\n padding: 0.5em;\n margin-left: 0.5em;\n font-size: 1.2em;\n line-height: 1.4em;\n overflow: auto;\n}\n\n.viewer code {\n font-size: 1.2em;\n line-height: 1.4em;\n}\n\n.editor {\nfont-size: 1.1em;\n}\n\n.editor input, .editor textarea {\n display: block;\n width: 100%;\n font: inherit;\n}\n\n.editorFooter {\n padding: 0.25em 0em;\n font-size: .9em;\n}\n\n.editorFooter .button {\npadding-top: 0px; padding-bottom: 0px;}\n\n.fieldsetFix {border: 0;\npadding: 0;\nmargin: 1px 0px 1px 0px;\n}\n\n.sparkline {\n line-height: 1em;\n}\n\n.sparktick {\n outline: 0;\n}\n\n.zoomer {\n font-size: 1.1em;\n position: absolute;\n padding: 1em;\n}\n\n.cascade {\n font-size: 1.1em;\n position: absolute;\n overflow: hidden;\n}\n/*}}}*/
<<tabs txtMainTab 'Fecha' 'Tiddlers por orden cronológico' TabTimeline 'Todos' 'Todos los tiddlers por orden alfabético' TabAll 'Etiquetas' 'Todas las etiquetas' TabTags 'Más' 'Más listas' TabMore>>
/***\n|''Name:''|~TaggerPlugin|\n|''Version:''|1.0.1 (2006-06-01)|\n|''Source:''|http://lewcid.googlepages.com/lewcid.html/#TaggerPlugin|\n|''Author:''|SaqImtiaz|\n|''Description:''|Provides a drop down listing current tiddler tags, and allowing toggling of tags.|\n|''Documentation:''|[[TaggerPluginDocumentation]]|\n|''Source Code:''|[[TaggerPluginSource]]|\n|''~TiddlyWiki:''|Version 2.0.8 or better|\n***/\n// /%\nconfig.tagger={defaults:{label:"Etiquetas: ",tooltip:"Gestión de etiquetas del tiddler",taglist:"true",excludeTags:"",notags:"El tiddler no tiene etiquetas",aretags:"Etiquetas del tiddler:",toggletext:"añadir etiquetas:"}};config.macros.tagger={};config.macros.tagger.arrow=(document.all?"▼":"▾");config.macros.tagger.handler=function(_1,_2,_3,_4,_5,_6){var _7=config.tagger.defaults;var _8=_5.parseParams("tagman",null,true);var _9=((_8[0].label)&&(_8[0].label[0])!=".")?_8[0].label[0]+this.arrow:_7.label+this.arrow;var _a=((_8[0].tooltip)&&(_8[0].tooltip[0])!=".")?_8[0].tooltip[0]:_7.tooltip;var _b=((_8[0].taglist)&&(_8[0].taglist[0])!=".")?_8[0].taglist[0]:_7.taglist;var _c=((_8[0].exclude)&&(_8[0].exclude[0])!=".")?(_8[0].exclude[0]).readBracketedList():_7.excludeTags.readBracketedList();if((_8[0].source)&&(_8[0].source[0])!="."){var _d=_8[0].source[0];}if(_d&&!store.getTiddler(_d)){return false;}var _e=function(e){if(!e){var e=window.event;}var _11=Popup.create(this);var _12=store.getTags();var _13=new Array();for(var i=0;i<_12.length;i++){_13.push(_12[i][0]);}if(_d){var _15=store.getTiddler(_d);_13=_15.tags.sort();}var _16=_6.tags.sort();var _17=function(_18,_19,_1a){var sp=createTiddlyElement(createTiddlyElement(_11,"li"),"span",null,"tagger");var _1c=createTiddlyButton(sp,_18,_1a+" '"+_19+"'",taggerOnToggle,"button","toggleButton");_1c.setAttribute("tiddler",_6.title);_1c.setAttribute("tag",_19);insertSpacer(sp);if(window.createTagButton_orig_mptw){createTagButton_orig_mptw(sp,_19)}else{createTagButton(sp,_19);}};createTiddlyElement(_11,"li",null,"listTitle",(_6.tags.length==0?_7.notags:_7.aretags));for(var t=0;t<_16.length;t++){_17("[x]",_16[t],"remove tag ");}createTiddlyElement(createTiddlyElement(_11,"li"),"hr");if(_b!="false"){createTiddlyElement(_11,"li",null,"listTitle",_7.toggletext);for(var i=0;i<_13.length;i++){if(!_6.tags.contains(_13[i])&&!_c.contains(_13[i])){_17("[ ]",_13[i],"add tag ");}}createTiddlyElement(createTiddlyElement(_11,"li"),"hr");}var _1f=createTiddlyButton(createTiddlyElement(_11,"li"),("Create new tag"),null,taggerOnToggle);_1f.setAttribute("tiddler",_6.title);if(_d){_1f.setAttribute("source",_d);}Popup.show(_11,false);e.cancelBubble=true;if(e.stopPropagation){e.stopPropagation();}return (false);};createTiddlyButton(_1,_9,_a,_e,"button","taggerDrpBtn");};window.taggerOnToggle=function(e){var tag=this.getAttribute("tag");var _22=this.getAttribute("tiddler");var _23=store.getTiddler(_22);if(!tag){var _24=prompt("Enter new tag:","");if(_24!=""&&_24!=null){var tag=_24;if(this.getAttribute("source")){var _26=store.getTiddler(this.getAttribute("source"));_26.tags.pushUnique(_24);}}else{return false;}}if(!_23||!_23.tags){store.saveTiddler(_22,_22,"",config.options.txtUserName,new Date(),tag);}else{if(_23.tags.find(tag)==null){_23.tags.push(tag);}else{if(!_24){_23.tags.splice(_23.tags.find(tag),1);}}store.saveTiddler(_23.title,_23.title,_23.text,_23.modifier,_23.modified,_23.tags);}story.refreshTiddler(_22,null,true);if(config.options.chkAutoSave){saveChanges();}return false;};setStylesheet(".tagger a.button {font-weight: bold;display:inline; padding:0px;}\sn"+".tagger #toggleButton {padding-left:2px; padding-right:2px; margin-right:1px; font-size:110%;}\sn"+"#nestedtagger {background:#2E5ADF; border: 1px solid #0331BF;}\sn"+".popup .listTitle {color:#000;}\sn"+"","TaggerStyles");window.lewcidTiddlerSwapTag=function(_27,_28,_29){for(var i=0;i<_27.tags.length;i++){if(_27.tags[i]==_28){_27.tags[i]=_29;return true;}}return false;};window.lewcidRenameTag=function(e){var tag=this.getAttribute("tag");var _2d=prompt("Rename tag '"+tag+"' to:",tag);if((_2d==tag)||(_2d==null)){return false;}if(store.tiddlerExists(_2d)){if(confirm(config.messages.overwriteWarning.format([_2d.toString()]))){story.closeTiddler(_2d,false,false);}else{return null;}}tagged=store.getTaggedTiddlers(tag);if(tagged.length!=0){for(var j=0;j<tagged.length;j++){lewcidTiddlerSwapTag(tagged[j],tag,_2d);}}if(store.tiddlerExists(tag)){store.saveTiddler(tag,_2d);}if(document.getElementById("tiddler"+tag)){var _2f=document.getElementById(story.idPrefix+tag);var _30=story.positionTiddler(_2f);var _31=document.getElementById(story.container);story.closeTiddler(tag,false,false);story.createTiddler(_31,_30,_2d,null);story.saveTiddler(_2d);}if(config.options.chkAutoSave){saveChanges();}return false;};window.onClickTag=function(e){if(!e){var e=window.event;}var _34=resolveTarget(e);var _35=(!isNested(_34));if((Popup.stack.length>1)&&(_35==true)){Popup.removeFrom(1);}else{if(Popup.stack.length>0&&_35==false){Popup.removeFrom(0);}}var _36=(_35==false)?"popup":"nestedtagger";var _37=createTiddlyElement(document.body,"ol",_36,"popup",null);Popup.stack.push({root:this,popup:_37});var tag=this.getAttribute("tag");var _39=this.getAttribute("tiddler");if(_37&&tag){var _3a=store.getTaggedTiddlers(tag);var _3b=[];var li,r;for(r=0;r<_3a.length;r++){if(_3a[r].title!=_39){_3b.push(_3a[r].title);}}var _3d=config.views.wikified.tag;if(_3b.length>0){var _3e=createTiddlyButton(createTiddlyElement(_37,"li"),_3d.openAllText.format([tag]),_3d.openAllTooltip,onClickTagOpenAll);_3e.setAttribute("tag",tag);createTiddlyElement(createTiddlyElement(_37,"li"),"hr");for(r=0;r<_3b.length;r++){createTiddlyLink(createTiddlyElement(_37,"li"),_3b[r],true);}}else{createTiddlyText(createTiddlyElement(_37,"li",null,"disabled"),_3d.popupNone.format([tag]));}createTiddlyElement(createTiddlyElement(_37,"li"),"hr");var h=createTiddlyLink(createTiddlyElement(_37,"li"),tag,false);createTiddlyText(h,_3d.openTag.format([tag]));createTiddlyElement(createTiddlyElement(_37,"li"),"hr");var _40=createTiddlyButton(createTiddlyElement(_37,"li"),("Rename tag '"+tag+"'"),null,lewcidRenameTag);_40.setAttribute("tag",tag);}Popup.show(_37,false);e.cancelBubble=true;if(e.stopPropagation){e.stopPropagation();}return (false);};if(!window.isNested){window.isNested=function(e){while(e!=null){var _42=document.getElementById("contentWrapper");if(_42==e){return true;}e=e.parentNode;}return false;};}config.shadowTiddlers.TaggerPluginDocumentation="The documentation is available [[here.|http://lewcid.googlepages.com/lewcid.html#TaggerPluginDocumentation]]";config.shadowTiddlers.TaggerPluginSource="The uncompressed source code is available [[here.|http://lewcid.googlepages.com/lewcid.html#TaggerPluginSource]]";\n// %/
''If you want this documentation available offline, copy this tiddler to your TW.''\n\n!Description:\nThe tagger plugin is a result of combining key features from the dropTags and tagAdder macro's. However, since it departs somewhat from the interface tagAdder users will be familiar with, I'm making this available as a new plugin alongside tagAdder.\n\nTagger provides a dropdown list of the current tiddler tags, along with the ability to toggle them. Further it can optionally display a list of tags in the dropdown, which can be addded to the tiddler.\n\n*Clicking on ''[x]'' and ''[ ]'' removes and adds the tag respectively.\n*Clicking on the tag text displays the tag dropdown for that tag, listing tiddlers tagged with it.\n*The ''Create new tag'' lets you quickly type in a new tag not in the list.\n*Click on this button to see the dropdown: <<tagger>>\n\nFurther note that each tag dropdown has a ''Rename tag'' option. This can be used to quickly rename a tag in the entire TW, also rename it's tiddler if it exists.\n\n//''tagAdder, dropTags and the future''\n- tagAdder will no longer will be developed, but will remain available. I encourage all tagAdder users to upgrade to tagger.\n- dropTags will still be developed for those users that dont want the 'tag editing' features.//\n\n!Examples & Usage:\n*At it's simplest, using tagger is as simple as {{{<<tagger>>}}} <<tagger>>\n**This gives a dropdown with the current tiddler tags, followed by all the tags in the TW.\n*You can also use a list of specified tags instead of all tags in the TW, by specifying a source tiddler.\n**{{{<<tagger source:TagsDB>>}}} <<tagger source:TagDataBase>>\n*You can also display ONLY the current tiddler tags\n**{{{<<tagger taglist:false>>}}} <<tagger taglist:false>>\n\n*To exclude tags from the list: {{{<<tagger exclude:"excludeLists Tag2 [[Tag with spaces]]">>}}} <<tagger exclude:"excludeLists Tag2 [[Tag with spaces]]">>\n\n*For a custom button label: {{{<<tagger label:"custom label">>}}} <<tagger label:"custom label">>\n*For a custom tooltip: {{{<<tagger tooltip:"custom tooltip">>}}} <<tagger tooltip:"custom tooltip">>\n\n!CSS and Styling:\nFor those wishing to customize the popup appearance:\n*the main popup has a class and id of popup has with all other popups.\n*the nested tag popups have an id of nestedpopup\n\n!Advanced Users:\nYou can change the global defaults for tagger, like the button label, the tags to exclude or whether to display the taglist or not, by editing the ''config.tagger.defaults'' section in the code.\n\n!To Do:\n*code optimization\n*possibly a 'delete this tag' option.\n\n!History\n*version 1.0.1 (2006-06-01): fixed conflicts with QuickOpenTag (TagglyTagging) and AutoTagger.
/***\n| Name:|TagglyTaggingPlugin|\n| Description:|tagglyTagging macro is a replacement for the builtin tagging macro in your ViewTemplate|\n| Version:|6.1.5|\n| Date:|05-Oct-2006|\n| Source:|http://mptw.tiddlyspot.com/#TagglyTaggingPlugin|\n| Author:|Simon Baird <simon.baird@gmail.com>|\n| CoreVersion:|2.1.x|\n!Notes\nSee http://mptw.tiddlyspot.com/#TagglyTagging\n***/\n//{{{\nconfig.taggly = {\n\n // for translations\n lingo: {\n labels: {\n asc: "\su2191", // down arrow\n desc: "\su2193", // up arrow\n title: "title",\n modified: "modified",\n created: "created",\n show: "+",\n hide: "-",\n normal: "normal",\n group: "group",\n commas: "commas",\n sitemap: "sitemap",\n numCols: "cols\su00b1", // plus minus sign\n label: "Tagged as '%0':"\n },\n\n tooltips: {\n title: "Click to sort by title",\n modified: "Click to sort by modified date",\n created: "Click to sort by created date",\n show: "Click to show tagging list",\n hide: "Click to hide tagging list",\n normal: "Click to show a normal ungrouped list",\n group: "Click to show list grouped by tag",\n sitemap: "Click to show a sitemap style list",\n commas: "Click to show a comma separated list",\n numCols: "Click to change number of columns"\n }\n },\n\n config: {\n showTaggingCounts: true,\n listOpts: {\n // the first one will be the default\n sortBy: ["title","modified","created"],\n sortOrder: ["asc","desc"],\n hideState: ["show","hide"],\n listMode: ["normal","group","sitemap","commas"],\n numCols: ["1","2","3","4","5","6"]\n },\n valuePrefix: "taggly."\n },\n\n getTagglyOpt: function(title,opt) {\n var val = store.getValue(title,this.config.valuePrefix+opt);\n return val ? val : this.config.listOpts[opt][0];\n },\n\n setTagglyOpt: function(title,opt,value) {\n if (!store.tiddlerExists(title))\n // create it silently\n store.saveTiddler(title,title,config.views.editor.defaultText.format([title]),config.options.txtUserName,new Date(),null);\n // if value is default then remove it to save space\n return store.setValue(title,\n this.config.valuePrefix+opt,\n value == this.config.listOpts[opt][0] ? null : value);\n },\n\n getNextValue: function(title,opt) {\n var current = this.getTagglyOpt(title,opt);\n var pos = this.config.listOpts[opt].indexOf(current);\n // a little usability enhancement. actually it doesn't work right for grouped or sitemap\n var limit = (opt == "numCols" ? store.getTaggedTiddlers(title).length : this.config.listOpts[opt].length);\n var newPos = (pos + 1) % limit;\n return this.config.listOpts[opt][newPos];\n },\n\n toggleTagglyOpt: function(title,opt) {\n var newVal = this.getNextValue(title,opt);\n this.setTagglyOpt(title,opt,newVal);\n }, \n\n createListControl: function(place,title,type) {\n var lingo = config.taggly.lingo;\n var label;\n var tooltip;\n var onclick;\n\n if ((type == "title" || type == "modified" || type == "created")) {\n // "special" controls. a little tricky. derived from sortOrder and sortBy\n label = lingo.labels[type];\n tooltip = lingo.tooltips[type];\n\n if (this.getTagglyOpt(title,"sortBy") == type) {\n label += lingo.labels[this.getTagglyOpt(title,"sortOrder")];\n onclick = function() {\n config.taggly.toggleTagglyOpt(title,"sortOrder");\n return false;\n }\n }\n else {\n onclick = function() {\n config.taggly.setTagglyOpt(title,"sortBy",type);\n config.taggly.setTagglyOpt(title,"sortOrder",config.taggly.config.listOpts.sortOrder[0]);\n return false;\n }\n }\n }\n else {\n // "regular" controls, nice and simple\n label = lingo.labels[type == "numCols" ? type : this.getNextValue(title,type)];\n tooltip = lingo.tooltips[type == "numCols" ? type : this.getNextValue(title,type)];\n onclick = function() {\n config.taggly.toggleTagglyOpt(title,type);\n return false;\n }\n }\n\n // hide button because commas don't have columns\n if (!(this.getTagglyOpt(title,"listMode") == "commas" && type == "numCols"))\n createTiddlyButton(place,label,tooltip,onclick,type == "hideState" ? "hidebutton" : "button");\n },\n\n makeColumns: function(orig,numCols) {\n var listSize = orig.length;\n var colSize = listSize/numCols;\n var remainder = listSize % numCols;\n\n var upperColsize = colSize;\n var lowerColsize = colSize;\n\n if (colSize != Math.floor(colSize)) {\n // it's not an exact fit so..\n upperColsize = Math.floor(colSize) + 1;\n lowerColsize = Math.floor(colSize);\n }\n\n var output = [];\n var c = 0;\n for (var j=0;j<numCols;j++) {\n var singleCol = [];\n var thisSize = j < remainder ? upperColsize : lowerColsize;\n for (var i=0;i<thisSize;i++) \n singleCol.push(orig[c++]);\n output.push(singleCol);\n }\n\n return output;\n },\n\n drawTable: function(place,columns,theClass) {\n var newTable = createTiddlyElement(place,"table",null,theClass);\n var newTbody = createTiddlyElement(newTable,"tbody");\n var newTr = createTiddlyElement(newTbody,"tr");\n for (var j=0;j<columns.length;j++) {\n var colOutput = "";\n for (var i=0;i<columns[j].length;i++) \n colOutput += columns[j][i];\n var newTd = createTiddlyElement(newTr,"td",null,"tagglyTagging"); // todo should not need this class\n wikify(colOutput,newTd);\n }\n return newTable;\n },\n\n createTagglyList: function(place,title) {\n switch(this.getTagglyOpt(title,"listMode")) {\n case "group": return this.createTagglyListGrouped(place,title); break;\n case "normal": return this.createTagglyListNormal(place,title,false); break;\n case "commas": return this.createTagglyListNormal(place,title,true); break;\n case "sitemap":return this.createTagglyListSiteMap(place,title); break;\n }\n },\n\n getTaggingCount: function(title) {\n // thanks to Doug Edmunds\n if (this.config.showTaggingCounts) {\n var tagCount = store.getTaggedTiddlers(title).length;\n if (tagCount > 0)\n return " ("+tagCount+")";\n }\n return "";\n },\n\n // this is for normal and commas mode\n createTagglyListNormal: function(place,title,useCommas) {\n\n var list = store.getTaggedTiddlers(title,this.getTagglyOpt(title,"sortBy"));\n\n if (this.getTagglyOpt(title,"sortOrder") == "desc")\n list = list.reverse();\n\n var output = [];\n for (var i=0;i<list.length;i++) {\n var countString = this.getTaggingCount(list[i].title);\n if (useCommas)\n output.push((i > 0 ? ", " : "") + "[[" + list[i].title + "]]" + countString);\n else\n output.push("*[[" + list[i].title + "]]" + countString + "\sn");\n }\n\n return this.drawTable(place,\n this.makeColumns(output,useCommas ? 1 : parseInt(this.getTagglyOpt(title,"numCols"))),\n useCommas ? "commas" : "normal");\n },\n\n // this is for the "grouped" mode\n createTagglyListGrouped: function(place,title) {\n var sortBy = this.getTagglyOpt(title,"sortBy");\n var sortOrder = this.getTagglyOpt(title,"sortOrder");\n\n var list = store.getTaggedTiddlers(title,sortBy);\n\n if (sortOrder == "desc")\n list = list.reverse();\n\n var leftOvers = []\n for (var i=0;i<list.length;i++)\n leftOvers.push(list[i].title);\n\n var allTagsHolder = {};\n for (var i=0;i<list.length;i++) {\n for (var j=0;j<list[i].tags.length;j++) {\n\n if (list[i].tags[j] != title) { // not this tiddler\n\n if (!allTagsHolder[list[i].tags[j]])\n allTagsHolder[list[i].tags[j]] = "";\n\n allTagsHolder[list[i].tags[j]] += "**[["+list[i].title+"]]"\n + this.getTaggingCount(list[i].title) + "\sn";\n leftOvers.setItem(list[i].title,-1); // remove from leftovers. at the end it will contain the leftovers\n }\n }\n }\n\n var allTags = [];\n for (var t in allTagsHolder)\n allTags.push(t);\n\n var sortHelper = function(a,b) {\n if (a == b) return 0;\n if (a < b) return -1;\n return 1;\n };\n\n allTags.sort(function(a,b) {\n var tidA = store.getTiddler(a);\n var tidB = store.getTiddler(b);\n if (sortBy == "title") return sortHelper(a,b);\n else if (!tidA && !tidB) return 0;\n else if (!tidA) return -1;\n else if (!tidB) return +1;\n else return sortHelper(tidA[sortBy],tidB[sortBy]);\n });\n\n var leftOverOutput = "";\n for (var i=0;i<leftOvers.length;i++)\n leftOverOutput += "*[["+leftOvers[i]+"]]" + this.getTaggingCount(leftOvers[i]) + "\sn";\n\n var output = [];\n\n if (sortOrder == "desc")\n allTags.reverse();\n else if (leftOverOutput != "")\n // leftovers first...\n output.push(leftOverOutput);\n\n for (var i=0;i<allTags.length;i++)\n output.push("*[["+allTags[i]+"]]" + this.getTaggingCount(leftOvers[i]) + "\sn" + allTagsHolder[allTags[i]]);\n\n if (sortOrder == "desc" && leftOverOutput != "")\n // leftovers last...\n output.push(leftOverOutput);\n\n return this.drawTable(place,\n this.makeColumns(output,parseInt(this.getTagglyOpt(title,"numCols"))),\n "grouped");\n\n },\n\n // used to build site map\n treeTraverse: function(title,depth,sortBy,sortOrder) {\n\n var list = store.getTaggedTiddlers(title,sortBy);\n if (sortOrder == "desc")\n list.reverse();\n\n var indent = "";\n for (var j=0;j<depth;j++)\n indent += "*"\n\n var childOutput = "";\n for (var i=0;i<list.length;i++)\n if (list[i].title != title)\n childOutput += this.treeTraverse(list[i].title,depth+1,sortBy,sortOrder);\n\n if (depth == 0)\n return childOutput;\n else\n return indent + "[["+title+"]]" + this.getTaggingCount(title) + "\sn"+childOutput;\n },\n\n // this if for the site map mode\n createTagglyListSiteMap: function(place,title) {\n var output = this.treeTraverse(title,0,this.getTagglyOpt(title,"sortBy"),this.getTagglyOpt(title,"sortOrder"));\n return this.drawTable(place,\n this.makeColumns(output.split(/(?=^\s*\s[)/m),parseInt(this.getTagglyOpt(title,"numCols"))), // regexp magic\n "sitemap"\n );\n },\n\n macros: {\n tagglyTagging: {\n handler: function (place,macroName,params,wikifier,paramString,tiddler) {\n var refreshContainer = createTiddlyElement(place,"div");\n // do some refresh magic to make it keep the list fresh - thanks Saq\n refreshContainer.setAttribute("refresh","macro");\n refreshContainer.setAttribute("macroName",macroName);\n refreshContainer.setAttribute("title",tiddler.title);\n this.refresh(refreshContainer);\n },\n\n refresh: function(place) {\n var title = place.getAttribute("title");\n removeChildren(place);\n if (store.getTaggedTiddlers(title).length > 0) {\n var lingo = config.taggly.lingo;\n config.taggly.createListControl(place,title,"hideState");\n if (config.taggly.getTagglyOpt(title,"hideState") == "show") {\n createTiddlyElement(place,"span",null,"tagglyLabel",lingo.labels.label.format([title]));\n config.taggly.createListControl(place,title,"title");\n config.taggly.createListControl(place,title,"modified");\n config.taggly.createListControl(place,title,"created");\n config.taggly.createListControl(place,title,"listMode");\n config.taggly.createListControl(place,title,"numCols");\n config.taggly.createTagglyList(place,title);\n }\n }\n }\n }\n },\n\n // todo fix these up a bit\n styles: \n"/*{{{*/\sn"+\n"/* created by TagglyTaggingPlugin */\sn"+\n".tagglyTagging { padding-top:0.5em; }\sn"+\n".tagglyTagging li.listTitle { display:none; }\sn"+\n".tagglyTagging ul {\sn"+\n" margin-top:0px; padding-top:0.5em; padding-left:2em;\sn"+\n" margin-bottom:0px; padding-bottom:0px;\sn"+\n"}\sn"+\n".tagglyTagging { vertical-align: top; margin:0px; padding:0px; }\sn"+\n".tagglyTagging table { margin:0px; padding:0px; }\sn"+\n".tagglyTagging .button { display:none; margin-left:3px; margin-right:3px; }\sn"+\n".tagglyTagging .button, .tagglyTagging .hidebutton {\sn"+\n" color:[[ColorPalette::TertiaryLight]]; font-size:90%;\sn"+\n" border:0px; padding-left:0.3em;padding-right:0.3em;\sn"+\n"}\sn"+\n".tagglyTagging .button:hover, .hidebutton:hover {\sn"+\n" background:[[ColorPalette::TertiaryPale]]; color:[[ColorPalette::TertiaryDark]];\sn"+\n"}\sn"+\n".selected .tagglyTagging .button {\sn"+\n" display:inline;\sn"+\n"}\sn"+\n".tagglyTagging .hidebutton { color:[[ColorPalette::Background]]; }\sn"+\n".selected .tagglyTagging .hidebutton { color:[[ColorPalette::TertiaryLight]] }\sn"+\n".tagglyLabel { color:[[ColorPalette::TertiaryMid]]; font-size:90%; }\sn"+\n".tagglyTagging ul {padding-top:0px; padding-bottom:0.5em; margin-left:1em; }\sn"+\n".tagglyTagging ul ul {list-style-type:disc; margin-left:-1em;}\sn"+\n".tagglyTagging ul ul li {margin-left:0.5em; }\sn"+\n".editLabel { font-size:90%; padding-top:0.5em; }\sn"+\n".tagglyTagging .commas { padding-left:1.8em; }\sn"+\n"/*}}}*/\sn"+\n "",\n\n init: function() {\n merge(config.macros,this.macros);\n config.shadowTiddlers["TagglyTaggingStyles"] = this.styles;\n if (store)\n store.addNotification("TagglyTaggingStyles",refreshStyles);\n else\n config.notifyTiddlers.push({name:"TagglyTaggingStyles", notify: refreshStyles});\n }\n};\n\nconfig.taggly.init();\n\n//}}}\n\n
/***\nTo use, add {{{[[TagglyTaggingStyles]]}}} to your StyleSheet tiddler, or you can just paste the CSS in directly. See also ViewTemplate, EditTemplate and TagglyTagging.\n***/\n/*{{{*/\n.tagglyTagged li.listTitle { display:none;}\n.tagglyTagged li { display: inline; font-size:90%; }\n.tagglyTagged ul { margin:0px; padding:0px; }\n.tagglyTagging { padding-top:0.5em; }\n.tagglyTagging li.listTitle { display:none;}\n.tagglyTagging ul { margin-top:0px; padding-top:0.5em; padding-left:2em; margin-bottom:0px; padding-bottom:0px; }\n\n/* .tagglyTagging .tghide { display:inline; } */\n\n.tagglyTagging {vertical-align: left; margin:0px; padding:0px; }\n.tagglyTagging table { margin:0px; padding:0px; }\n\n\n.tagglyTagging .button { display:none; margin-left:3px; margin-right:3px; }\n.tagglyTagging .button, .tagglyTagging .hidebutton { color:#aaa; font-size:90%; border:0px; padding-left:0.3em;padding-right:0.3em;}\n.tagglyTagging .button:hover, .hidebutton:hover { background:#eee; color:#888; }\n.selected .tagglyTagging .button { display:inline; }\n\n.tagglyTagging .hidebutton { color:white; } /* has to be there so it takes up space. tweak if you're not using a white tiddler bg */\n.selected .tagglyTagging .hidebutton { color:#aaa }\n\n.tagglyLabel { color:#aaa; font-size:90%; }\n\n.tagglyTagging ul {padding-top:0px; padding-bottom:0.5em; margin-left:1em; }\n.tagglyTagging ul ul {list-style-type:disc; margin-left:-1em;}\n.tagglyTagging ul ul li {margin-left:0.5em; }\n\n.editLabel { font-size:90%; padding-top:0.5em; }\n/*}}}*/\n
| source file|//none//|\n| attached on|13 noviembre 2006 by JosG|\n| embedded data|//none//|\n| local link|//none//|\n| remote link|/%REMOTE_LINK%/[[http://wiki.interaccion.info/produccion/imagenes/nocturna/tim_movimientos.gif|http://wiki.interaccion.info/produccion/imagenes/nocturna/tim_movimientos.gif]]|\nimage\n<<<\nusage: {{{[img[tooltip|Test_attach]] or [img[tooltip|Test_attach][link]]}}}\n[img[tooltip|Test_attach]]\n<<<\n
/***\n|''Name:''|TiddlerListMacro|\n|''Version:''|2.0.10 (01-May-2006)|\n|''Source''|http://jackparke.googlepages.com/jtw.html#TiddlerListMacro ([[del.icio.us|http://del.icio.us/post?url=http://jackparke.googlepages.com/jtw.html%23TiddlerListMacro]])|\n|''Author:''|[[Jack]]|\n|''Type:''|Macro|\n|''Documentation:''|[[TiddlerListMacroDocumentation]]|\n!Usage\n{{{<<tiddlerList parameter1:"value1" parameter2:"value2" ...>>}}}\nSee TiddlerListMacroDocumentation and TiddlerListMacroExamples\n!Code\n***/\n//{{{\nversion.extensions.tiddlerList = {major: 2, minor: 0, revision: 10, date: new Date("May 2, 2006")};\n// template = [header, item, seperator, group, footer]\nconfig.macros.tiddlerList={\n formats : {list:true, nlist:true, span:true, stack:true, csv:true, table:true},\n templates : {\n list : [ "%0\sn", "* %0\sn", "", "%group\sn", "%0\sn"],\n nlist : [ "%0", "# %0\sn", "", "%group\sn", "%0\sn"],\n span : [ "%0", "%0", " ", "%group", "%0"],\n stack : [ "%0", "%0", "\sn", "%group", "%0"],\n csv : [ "%0", "%0", ", ", "%0", "%0\sn"],\n table : ["|!%0|\sn", "|%0|\sn", "", "|%group|\sn", "|%0|\sn"]\n },\n dateFormat : "DD MMM YYYY"\n}\n\nif (!gCurrentTiddler)\n var gCurrentTiddler;\n\nconfig.macros.tiddlerList.handler = function(place,macroName,params,wikifier,paramString,tiddler)\n{\n // Some globals\n var count=0, groupCount=0, theGroup="", lastGroup="";\n var currentTiddler = tiddler;\n gCurrentTiddler = tiddler;\n var listWikiText="";\n var formats = this.formats;\n \n // SQL-Like parameters\n var parameters = paramString.parseParams("name",null,true);\n var pTags = parameters[0]["tags"]?parameters[0]["tags"][0].split(","):[];\n var pOrder = parameters[0]["order"]?parameters[0]["order"][0]:"title";\n var pTop = parameters[0]["top"]?parameters[0]["top"][0]:-1;\n var pText = parameters[0]["text"]?parameters[0]["text"][0]:"";\n var pTitle = parameters[0]["title"]?parameters[0]["title"][0]:"";\n var pSearch = parameters[0]["search"]?parameters[0]["search"][0]:"";\n var pFilter = parameters[0]["filter"]?parameters[0]["filter"][0]:"";\n var pHeader = parameters[0]["header"]?paramFormat(parameters[0]["header"][0]):"";\n var pFooter = parameters[0]["footer"]?paramFormat(parameters[0]["footer"][0]):"";\n var pGroup = parameters[0]["group"]?parameters[0]["group"][0]:"";\n var pDateFormat = parameters[0]["dateFormat"]?parameters[0]["dateFormat"][0]:this.dateFormat;\n var pCustomParameter = parameters[0]["customParameter"]?parameters[0]["customParameter"][0]:"";\n var pFormat = parameters[0]["format"]?parameters[0]["format"][0]:"list";\n pFormat = formats[pFormat]?pFormat:"list"\n \n // Seperator\n var pSeperator = parameters[0]["seperator"]?paramFormat(parameters[0]["seperator"][0]):this.templates[pFormat][2]\n\n // Template for group\n var pGroupTemplate = this.templates[pFormat][3];\n if (parameters[0]["groupTemplate"])\n pGroupTemplate = paramFormat(parameters[0]["groupTemplate"][0])\n pGroupTemplate = pGroupTemplate.replace("$))", ">>")\n \n // Template for group footer\n var pGroupFooterTemplate = "";\n if (parameters[0]["groupFooterTemplate"])\n pGroupFooterTemplate = paramFormat(parameters[0]["groupFooterTemplate"][0])\n pGroupFooterTemplate = pGroupFooterTemplate.replace("$))", ">>")\n \n // Template for item\n var pItemTemplate = this.templates[pFormat][1];\n if (parameters[0]["itemTemplate"])\n pItemTemplate = paramFormat(parameters[0]["itemTemplate"][0])\n pItemTemplate = pItemTemplate.replace("$))", ">>").replace("%link", "%0").replace("%item", "%1").replace("%abstract", "%2").replace("%text", "%3").replace("%created", "%4").replace("%modified", "%5").replace("%modifier", "%6").replace("%group", "%7").replace("%title", "%8").replace("%tags", "%9").replace("%nolink", "%10").replace("%custom", "%11")\n // Template for footer\n var pFooterTemplate = this.templates[pFormat][4].replace("%count", "%1")\n\n // Get all tiddlers\n var tiddlers = store.reverseLookup("tags","excludeLists",false);\n\n // Sorting\n if(!pOrder)\n pOrder = "title";\n if (pOrder.match(/^\s-/i)) {\n pOrder = pOrder.substr(1)\n var sortDesc = true;\n }\n if (sortDesc)\n tiddlers.sort(function (a,b) {if(a[pOrder] == b[pOrder]) return(0); else return (a[pOrder] > b[pOrder]) ? -1 : +1; });\n else\n tiddlers.sort(function (a,b) {if(a[pOrder] == b[pOrder]) return(0); else return (a[pOrder] < b[pOrder]) ? -1 : +1; });\n\n // Header\n if (pHeader)\n listWikiText += formatItem(this.templates[pFormat][0], [pHeader], pFormat)\n \n for(var t=0; t<tiddlers.length; t++) {\n tiddler = tiddlers[t];\n if (pTop==-1 || count<pTop) {\n if (pText=="" || tiddler.text.match(pText)) {\n if (pTitle=="" || tiddler.title.match(pTitle)) {\n if (pSearch=="" || (tiddler.title.match(pSearch) || tiddler.text.match(pSearch))) {\n if (pFilter=="" || eval(pFilter)) {\n if (pTags.length==0 || compareArrays(tiddler.tags, pTags, "all")) {\n count++;\n // Grouping\n if (pGroup) {\n theGroup = eval(pGroup);\n if(theGroup != lastGroup) {\n groupCount++;\n if (pGroupFooterTemplate && groupCount>1)\n listWikiText += pGroupFooterTemplate.replace("%group", theGroup)\n listWikiText += pGroupTemplate.replace("%group", theGroup)\n lastGroup = theGroup;\n }\n }\n // Seperators\n if (count>1) listWikiText += pSeperator;\n //Plaintext title\n var noLink = tiddler.title.match(config.textPrimitives.wikiLink)?"~" + tiddler.title:tiddler.title;\n // Custom parameter\n if (pCustomParameter)\n var custom="";\n try {\n custom = eval(pCustomParameter)\n } catch (e) {}\n // List individual tiddler\n listWikiText += formatItem(pItemTemplate,["[[" + tiddler.title + "]]",count,tiddler.text.substr(0,100),tiddler.text,tiddler.created.formatString(pDateFormat),tiddler.modified.formatString(pDateFormat),tiddler.modifier,theGroup,tiddler.title,tiddler.tags.join(" "),noLink,custom], pFormat)\n }\n }\n }\n }\n }\n }\n }\n \n // Last group footer\n if (pGroup && pGroupFooterTemplate && count>0)\n listWikiText += pGroupFooterTemplate.replace("%group", theGroup)\n\n // Footer\n if (pFooter) {\n pFooter = pFooter.replace("%count", count)\n listWikiText += formatItem(pFooterTemplate, [pFooter], pFormat)\n }\n \n // Render result\n if (!parameters[0]["debug"])\n wikify(listWikiText,place, null, currentTiddler)\n else\n place.innerHTML = "<textarea style=\s"width:100%;\s" rows=30>" + listWikiText + "</textarea>"\n \n \n // Local functions\n \n function paramFormat(param) {\n // Allow "\sn" in non evalled parameters\n return param.replace(/\s\sn/g, "\sn");\n }\n \n function formatItem(template, values, format) {\n // Fill template with values (depending on list format)\n if (format.match(/table/) && values[0].match(/\s|/))\n return ("%0\sn").format(values)\n else\n return template.format(values)\n }\n \n function compareArrays(array, values, logic) {\n // Compare items in array with AND("all") or OR("any") logic\n var matches=0;\n for(var v=0; v<values.length; v++)\n if(values[v].match(/^\s-/) && !array.contains(values[v].substr(1)))\n matches++;\n else if (array.contains(values[v]))\n matches++;\n return ((logic=="all" && matches==values.length) || (logic!="all" && matches>0))\n }\n \n}\n\nString.prototype.prettyTrim = function(len,prefix,postfix) {\n var result = this.trim().replace(/\sr\sn/g,' ').replace(/\sn/g,' ');\n if (!prefix) prefix = '';\n if (!postfix) postfix = '';\n if (result.length > len - 3)\n return prefix + result.substr(0,len) + '...' + postfix;\n else if (result.length > 0)\n return prefix + result + postfix;\n else\n return result;\n}\n\n//}}}
!Description\nThe TiddlerListMacro lists tiddlers with ~SQL-Like features:\n* List tiddlers containing a word in the title or text (case-sensitive)\n* List tiddlers tagged with given tags or exclude certain tags\n* Ascending and descending sorting of single fields\n* Limit number of tiddlers displayed\n* Specify different HTML formats for the lists\n* Grouping of items in a list\n* Customizable wiki templates\n* Numbering and totals\n!Revision History\n* Original by [[Jack]] 17-Apr-2006\n* Added formatting (v2.0.1 18-Apr-2006)\n* Added grouping (v2.0.2 18-Apr-2006)\n* Added flexible filtering (v2.0.3 19-Apr-2006)\n* Added custom item templates (v2.0.4 20-Apr-2006)\n* Added custom templates (v2.0.5 21-Apr-2006)\n* Allow evalled parameters (v2.0.7 23-Apr-2006)\n* Allow groupFooterTemplate (v2.0.9 30-Apr-2006)\n* Added the customParameter (v2.0.10 2-May-2006)\n!To Do\n* Case-insensitive searching\n* Sorting on multiple fields\n!Usage\n{{{<<tiddlerList parameter1:"value1" parameter2:"value2" ...>>}}}\n!Examples ([[TiddlerListMacroExamples]])\nList all tiddlers tagged with "Plugin"\n{{{<<tiddlerList tags:Plugin>>}}}\nList newest 3 plugins which are not templates:\n{{{<<tiddlerList tags:"Plugin,-Template" top:3 order:"-created">>}}}\nList all tiddlers containing "Jack" in their title or text (last modified first):\n{{{<<tiddlerList search:"Jack" order:"-modified">>}}}\nList all tiddlers starting with "T" in a table:\n{{{<<tiddlerList title:"^T" format:"table" header:"Tiddlers beginning with T" footer:"%count items listed">>}}}\nGroup tiddlers by first letter\n{{{<<tiddlerList top:"15" group:"tiddler.title.substr(0,1)" groupTemplate:"''%group''">>}}}\nShow a list of all tiddlers with creation date (overrides default item template)\n{{{<<tiddlerList itemTemplate:"* %link (%created)\sn">>}}}\nShow all tiddlers that have the host's tiddler title in their tag list\n{{{<<tiddlerList filter:"tiddler.tags.contains(currentTiddler.title)">>}}}\n!Parameters\n|!Parameter|!Type|!Meaning|!Example|\n|top|Integer|Number of tiddlers to display|"10"|\n|tags|String|List tiddlers with matching tags (AND Logic). Leading - to exclude.|"~ToDo,Urgent,-Done"|\n|title|~RegEx|List tiddlers with matching title|"^[Pp]"|\n|text|~RegEx|List tiddlers with matching text|"Searchtext"|\n|search|~RegEx|List tiddlers with matching title OR text|"Problem"|\n|filter*|~JavaScript|List tiddlers according to boolean expression)|"tiddler.title.length<4 && tiddler.tags.contains('Idea')"|\n|format|String (fixed list)|HTML formatting of list. list (ul, default), nlist (ol), span, stack (div), csv, table.|"list"|\n|order|String|Sort order of tiddlers. - is descending, + ascending|"-created"|\n|group*|~JavaScript|Grouping field|tiddler.title.substr(0,1)|\n|customParameter*|~JavaScript|Custom parameter to be evalled for use in the itemTemplate|tiddler.text.match(/Version: (.*)/)[1]|\n|header|String|Top caption|"Tiddlers beginning with T"|\n|footer|String|Bottom caption|"End of list"|\n|itemTemplate|~WikiTemplate|~WikiText with %placeholders|"%link\sn%abstract\sn%modified"|\n|groupTemplate|~WikiTemplate|~WikiText with %placeholders for the start of each group|"!!%group"|\n|groupFooterTemplate|~WikiTemplate|~WikiText with %placeholders for the end of each group|"----\sn"|\n|dateFormat|String|Date formatting string when displaying dates|~YYYY-MM-DD|\n|seperator|String|Define a string or character to be inserted between items listed|" "|\n|debug|Boolean|Set to 1 or true for debug mode where only wikitext will be output|debug:1|\n{{{*}}} Parameter will be evalled (do not pass with {{{{{ }} }}} unless you want it evalled twice!)\n!Template Placeholders\nPlaceholder values for itemTemplate parameter\n|!Placeholder|!Field|\n|%item|List item number|\n|%link|Link to Tiddler {{{[[MyTiddler]]}}}|\n|%title|Tiddler Name {{{MyTiddler}}}|\n|%nolink|Unlinked Tiddler Title {{{~MyTiddler}}}|\n|%abstract|First 100 chars of tiddler text|\n|%text|All tiddler text|\n|%tags|Tags seperated by space|\n|%created|Creation date|\n|%modified|Modified date|\n|%modifier|Last modifier|\n|%group|Name of group field|\n|%custom|The result of your evalled customParameter|\n|%count|Number of items listed (footer only)|\n!Variables\n{{{{{currentTiddler}} }}}refers to the current (host) tiddler in function scope (i.e. within the filter or group parameters)\n{{{{{gCurrentTiddler}} }}}refers to the current (host) tiddler in global scope (i.e. within{{{ {{}} }}}evalled parameters. Example:\n{{{<<tiddlerList tags:{{gCurrentTiddler.title}}>>}}}\n!Style\nNo styles are pre-assigned to the lists. Use {{{@@}}} notation to define custom styles in the header, footer, groupTemplate and itemTemplate parameters.
* DefaultTiddlers\n* MainMenu\n* SiteSubtitle\n* SiteTitle\n* SiteUrl
ToggleSideBarMacro has been completely rewritten. Now works flawlessly with custom stylesheets too, and is easier to customize. You can specify whether the sidebar is hidden or displayed to start off with.
<html><span style="float: right; margin-top: 1px;">\n<a href="" class="button" onclick="javascript:if(!document.getElementById('mainMenu').style.display || document.getElementById('mainMenu').style.display == 'block') { document.getElementById('mainMenu').style.display = 'none'; document.getElementById('displayArea').style.marginLeft = '1em'; } else { document.getElementById('mainMenu').style.display = 'block'; document.getElementById('displayArea').style.marginLeft = '12.5em'; }; if(!document.getElementById('sidebar').style.display || document.getElementById('sidebar').style.display == 'block') { document.getElementById('sidebar').style.display = 'none'; document.getElementById('displayArea').style.marginRight = '1em'; } else { document.getElementById('sidebar').style.display = 'block'; document.getElementById('displayArea').style.marginRight = '15.5em'; } return false;">↔</a>\n</span></html>
\n<<formTiddler fichaPlantilla>><data>{"tecnico":"José Luis González Castro","mes":"Abril","año":"2007","lugar":"aula","notes":"TASCAM HD-P2\snMicrófono AKG C414 B\sn\snMucho ruido de fondo.","interprete":"Guzmán Lloréns, Abel Clemente"}</data>
\n|[img[trombón|materiales/fotografías/trombon.jpg]]|\n\n!Guía\n\n1.Registro:\n\nEl límite inferior está en el mi grave; el límite superior está en el sib. Estos límites dependen en gran medida del instrumentista; se puede escribir notas por más allá de ese límite, con las debidas precauciones.\n+++[Ejemplo 1]...\n<<player id=1 quicktime materiales/grabaciones/trombon/trombon_1.wav 400 15>>\n===\n\n\nDentro del registro general se distinguen tres: grave, medio y agudo. En teoría dichos registros deben estar igualados, pero lo más lógico sería escribir en el registro medio del instrumento; el registro agudo da una sensación de mayor tensión y el grave de mayor profundidad. En todo caso, como base debe tomarse el registro medio. \n\nLas notas pedales se hacen sujetando la embocadura, pero abriendo mucho y soltando mucho los labios. \n+++[Ejemplo 2]...\n<<player id=2 quicktime materiales/grabaciones/trombon/trombon_2.wav 400 15>>\n===\n\n\nNo todas las notas pedales son igualmente difíciles: en el ejemplo anterior, la última es bastante complicada y la primera es incluso más fácil que otras más agudas. El sib pedal está en la primera posición, lo que conlleva que tenga menor dificultad que otras que necesitan más recorrido de tubo aun siendo más agudas.\n\nEn resumen: mi es la nota límite del registro en el grave; dese el mi hasta el sib pedal hay una serie de notas intermedias; las notas intermedias se hacen utilizando el transpositor, una válvula que abre una sección de tubo extra. La vuelta del aire en esas notas es muy superior y también la exigencia de aire, lo que las hace más complicadas que las pedales, sobre todo en cuanto a colocar el sonido y mantener el timbre del registro medio. \n\nMi; sib pedal; notas intermedias.\n+++[Ejemplo 3]...\n<<player id=3 quicktime materiales/grabaciones/trombon/trombon_3.wav 400 15>>\n=== \n\n\nNo se debe abusar de este registro, sobre todo en velocidad o articulaciones. Escribiendo para una sección de trombones, éste es el registro en el que el trombón bajo está más cómodo.\n\nLa vara del trombón es una línea armónica equivalente a una cuerda de un instrumento de cuerda (a un violonchelo); cada posición en que se "pise" lleva asociada una serie de armónicos (para conseguir una escala, el instrumentista va combinando armónicos de diferentes posiciones). Hay siete posiciones de referencia; en función del registro, la distancia entre una posición y otra cambia. \n\nAlgunas notas presentan ciertas dificultades de afinación:\n\nEl fa# es muy alto en la tercera posición.\n+++[Ejemplo 4]...\n<<player id=4 quicktime materiales/grabaciones/trombon/trombon_4.wav 400 15>>\n=== \n\n\nEl lab es muy bajo en la primera posición.\n\nLab; serie de armónicos hasta el lab.\n+++[Ejemplo 5]...\n<<player id=5 quicktime materiales/grabaciones/trombon/trombon_5.wav 400 15>>\n=== \n\n\nSe puede obtener enarmonías en los casos en los que una nota aparezca en más de una serie armónica (posición). La situación es análoga a obtener la misma nota en dos cuerdas diferentes de un instrumento de cuerda. Siendo el recorrido de aire diferente en cada caso, las notas resultantes tendrán calidades diferentes. \n\nfa obtenido desde la primera posición, fa obtenido desde la cuarta posición, misma nota en dos posiciones diferentes.\n+++[Ejemplo 6]...\n<<player id=6 quicktime materiales/grabaciones/trombon/trombon_6.wav 400 15>>\n=== \n\n\nEl añadido al que se accede con el transpositor evita tener una vara demasiado larga; en contrapartida, debido a la construcción del trombón, el transpositor presenta problemas de afinación. Al activar la válvula, para afinar el tubo hay que buscar distancias muy grandes de la vara respecto de la posición original: esto lleva a que la nota de la sexta posición salga en la séptima, y la de la séptima, el si natural inmediatamente anterior al sib pedal, no salga. Para conseguir esa nota hay que aflojar la embocadura desde el do o quitar la bomba del transpositor. Sib es pues fácil y suena muy bien, pero si natural es muy difícil.\n \nSi natural, desde el do.\n+++[Ejemplo 7]...\n<<player id=7 quicktime materiales/grabaciones/trombon/trombon_7.wav 400 15>>\n=== \n \n\nLa fundamental del trombón es el sib.\n+++[Ejemplo 8]...\n<<player id=8 quicktime materiales/grabaciones/trombon/trombon_8.wav 400 15>>\n=== \n \n\nMelodía del trombón en el grave.\n+++[Ejemplo 9]...\n<<player id=9 quicktime materiales/grabaciones/trombon/trombon_9.wav 400 15>>\n=== \n\n\nA partir del sib agudo se puede subir incluso una octava. El Bolero (reb) era hasta no hace mucho tabú; hoy día sigue siendo extremo, pero el registro se ha extendido mucho. En repertorio de trombón se llega hasta un mib o fa.\n+++[Ejemplo 10]...\n<<player id=10 quicktime materiales/grabaciones/trombon/trombon_10.wav 400 15>>\n=== \n\n\nNotas a partir del sib; fa.\n+++[Ejemplo 11]...\n<<player id=11 quicktime materiales/grabaciones/trombon/trombon_11.wav 400 15>>\n=== \n\n\nPasar de unos registros a otros requiere de trabajo para igualarlos y conectarlos. Siempre que se utiliza el transpositor el timbre cambia un poco; si se exige mucha velocidad en un pasaje que requiera cambios de posición, dicho pasaje será evidentemente complejo. \n\nLa afinación en el trombón no depende exclusivamente de la vara; depende también de a dónde se envíe el aire y dónde se coloque el sonido. Es un instrumento muy parecido a la voz, con las particularidades asociadas a la vara.\n\n2.Resistencia: El registro grave requiere de mucho aire y menos presión, mientras que el agudo requiere de muy poco aire a mucha velocidad; es mucho más exigente el registro agudo. No obstante, lo que más fatiga es tener que tocar largo tiempo sin momentos de descanso, incluso en registros favorables: se tolera mejor un registro muy agudo momentáneo que uno menos agudo mantenido mucho tiempo.\n\n3.Dinámicas:\n\nEl recorrido del aire es en el trombón muy directo, al igual que en la trompeta. El límite práctico de escritura es un pp (se puede escrbir pp incluso en el grave). Tocar p es complicado; no obstante, recordamos que "p" es una sensación, no una intensidad absoluta.\n\nTrombón en pp.\n+++[Ejemplo 12]...\n<<player id=12 quicktime materiales/grabaciones/trombon/trombon_12.wav 400 15>>\n=== \n\n\nLas secciones corales de trombones (y tuba) en p dan gran profundidad a la orquesta. \n\nNo se debe abusar del pp, igual que no se debe abusar del ff, porque el trombón es capaz de ahogar al resto de la orquesta.\n\nTrombón en ff, dos ejemplos.\n+++[Ejemplo 13]...\n<<player id=13 quicktime materiales/grabaciones/trombon/trombon_13.wav 400 15>>\n=== \n \n\nÉste era un ff "con sentido"; para efectos especiales se puede ir más allá (Stravinsky, efectos de glissandos en la Consagración). \n\nCambios de intensidad súbitos en una misma nota: p<f>p, sf>p.\n+++[Ejemplo 14]...\n<<player id=14 quicktime materiales/grabaciones/trombon/trombon_14.wav 400 15>>\n=== \n\n\nSforzatos:\n+++[Ejemplo 15]...\n<<player id=15 quicktime materiales/grabaciones/trombon/trombon_15.wav 400 15>>\n=== \n\n\n4.Velocidad:\n\nSe debe partir de la premisa de que el trombón es un instrumento "torpe", equivalente en este aspecto al contrabajo: los cambios de posiciones requieren del movimiento de todo el brazo. No obstante, en el ámbito de una misma posición o serie armónica puede ser muy rápido, al igual que tocando una sola nota. Cuanto máis medio- agudo es el registro más cerca están los armónicos, lo que facilita la velocidad en esas regiones. \n\nEscalas y arpegios.\n+++[Ejemplo 16]...\n<<player id=16 quicktime materiales/grabaciones/trombon/trombon_16.wav 400 15>>\n=== \n\n\nPasaje rápido, tocado primero en f- ff, luego en p.\n+++[Ejemplo 17]...\n<<player id=17 quicktime materiales/grabaciones/trombon/trombon_17.wav 400 15>>\n=== \n\n\nVelocidad en posiciones fijas; efectos (Bartok).\n+++[Ejemplo 18]...\n<<player id=18 quicktime materiales/grabaciones/trombon/trombon_18.wav 400 15>>\n=== \n\n\nEn notas fijas se puede utilizar el doble picado para conseguir velocidad.\n+++[Ejemplo 19]...\n<<player id=19 quicktime materiales/grabaciones/trombon/trombon_19.wav 400 15>>\n=== \n\n\n5.Articulaciones: \n\nEl trombón es un instrumento con una gran capacidad para el cantabile: puede hacer un legato muy puro al carecer de llaves o pistones. Para evitar el glissando natural del instrumento se aprovechan los cambios de armónicos naturales; cuando esto no es posible se usa la lengua para articular. \n\nPasajes en legato.\n+++[Ejemplo 20]...\n<<player id=20 quicktime materiales/grabaciones/trombon/trombon_20.wav 400 15>>\n=== \n\n\nDentro de una misma posición basta con variar la dirección y velocidad del aire para articular.\n+++[Ejemplo 21]...\n<<player id=21 quicktime materiales/grabaciones/trombon/trombon_21.wav 400 15>>\n=== \n\n\nSi el instrumentista se mantiene en un mismo armónico (es decir, mantiene una presión de aire fija y mueve la vara para cambiar de posición), la única forma de evitar el glissando es utilizar la lengua. \n+++[Ejemplo 22]...\n<<player id=22 quicktime materiales/grabaciones/trombon/trombon_22.wav 400 15>>\n=== \n\n\nAl moverse en diferente número de armónico tampoco hace falta utilizar la lengua (técnicamente, contraposiciones).\n\nfa- fa#\n+++[Ejemplo 23]...\n<<player id=23 quicktime materiales/grabaciones/trombon/trombon_23.wav 400 15>>\n=== \n\n\nEjemplos en Staccato.\n+++[Ejemplo 24]...\n<<player id=24 quicktime materiales/grabaciones/trombon/trombon_24.wav 400 15>>\n=== \n\n\nTenuto: similar al legato, marcando y manteniendo el valor de cada nota.\n+++[Ejemplo 25]...\n<<player id=25 quicktime materiales/grabaciones/trombon/trombon_25.wav 400 15>>\n=== \n\n\nVarios ejemplos de articulaciones, y combinaciones (las combinaciones pueden facilitar pasajes rápidos).\n+++[Ejemplo 26]...\n<<player id=26 quicktime materiales/grabaciones/trombon/trombon_26.wav 400 15>>\n=== \n\n\nEl doble picado combina articulación de lengua con garganta.\n\nPicado simple; doble picado.\n+++[Ejemplo 27]...\n<<player id=27 quicktime materiales/grabaciones/trombon/trombon_27.wav 400 15>>\n===\n\n\nEl triple picado no se utiliza tanto en el trombón como en trompetas (no tienen la misma facilidad de dicción por la cantidad de aire que mueven); si se escribe se hace en grupos sueltos o sobre una misma nota.\n+++[Ejemplo 28]...\n<<player id=28 quicktime materiales/grabaciones/trombon/trombon_28.wav 400 15>>\n=== \n\n\n6.Frulatos en diferentes intensidades, el segundo de ellos "rompiendo" la nota.\n+++[Ejemplo 29]...\n<<player id=29 quicktime materiales/grabaciones/trombon/trombon_29.wav 400 15>>\n=== \n\n\nFrulatos en ff, en diferentes registros (son muy complicados en el agudo).\n+++[Ejemplo 30]...\n<<player id=30 quicktime materiales/grabaciones/trombon/trombon_30.wav 400 15>>\n=== \n\n\n7.Multifónicos (muy infrecuentes).\n+++[Ejemplo 31]...\n<<player id=31 quicktime materiales/grabaciones/trombon/trombon_31.wav 400 15>>\n=== \n\n\n8.Glissandos:\n\nSe puede hacer glissandos "arrastrados" si hay relación directa entre el armónico que empieza y el que termina. El máximo posible son siete semitonos, las siete posiciones.\n\nPequeño glissando ascendente- descendete; conjunto de glissandos posibles, partiendo de la serie armónica de la primera posición.\n+++[Ejemplo 32]...\n<<player id=32 quicktime materiales/grabaciones/trombon/trombon_32.wav 400 15>>\n=== \n\n\nSi no se puede conectar los armónicos en un glissando, se puede hacer el glissando arrastrado hasta donde se pueda y después "arreglarlo" añadiendo la nota final.\n+++[Ejemplo 33]...\n<<player id=33 quicktime materiales/grabaciones/trombon/trombon_33.wav 400 15>>\n=== \n\n\n9.Sordinas: \n\nEs necesario dar al intérprete un margen de tiempo para poner y quitar la sordina.\n\nPasaje sin sordina, poner sordina, pasaje con sordina.\n+++[Ejemplo 34]...\n<<player id=34 quicktime materiales/grabaciones/trombon/trombon_34.wav 400 15>>\n=== \n\n\nSe puede hacer el cambio bastante rápido, pero hay cierto peligro de que se caiga la sordina.\n\nHay varios tipos de sordina (cup, wah, wah...). La estándar (stride), da un sonido más metálico, más nasal, al instrumento.\n\nStride mute (sordina stride).\n+++[Ejemplo 35]...\n<<player id=35 quicktime materiales/grabaciones/trombon/trombon_35.wav 400 15>>\n=== \n\n\n10.Trinos- trémolos:\n\nLos trinos "de labio" se hacen a partir de cierta altura, en el punto en el que los armónicos se acercan más. Se suelen hacer hasta una distancia de tercera menor; con el labio se puede hacer trémolos a mayor distancia, pero buscando un efecto peculiar: hay demasiado movimiento de embocadura como para que salgan fluidos.\n+++[Ejemplo 36]...\n<<player id=36 quicktime materiales/grabaciones/trombon/trombon_36.wav 400 15>>\n=== \n\n\nTrémolo a distancia de tercera menor.\n+++[Ejemplo 37]...\n<<player id=37 quicktime materiales/grabaciones/trombon/trombon_37.wav 400 15>>\n=== \n\n\nSiempre se busca como referencia la posición siguiente, que provee el semitono; después se toca en una zona intermedia para conseguir el trino (que nunca sale perfectamente afinado).\n\nNo se debe abusar demasiado del efecto; no todos los intérpretes tienen la capacidad de trinar directamente en cualquier momento.\n\nMás ejemplos.\n+++[Ejemplo 38]...\n<<player id=38 quicktime materiales/grabaciones/trombon/trombon_38.wav 400 15>>\n=== \n\n\n11.Tocar sin la bomba del transpositor. Técnicamente es posible buscar equivalencias de notas con y sin transpositor.\n+++[Ejemplo 39]...\n<<player id=39 quicktime materiales/grabaciones/trombon/trombon_39.wav 400 15>>\n=== \n\n\n12.Tocar y cantar una nota.\n+++[Ejemplo 40]...\n<<player id=40 quicktime materiales/grabaciones/trombon/trombon_40.wav 400 15>>\n=== \n\n\nCantar y tocar a la vez; gritar dentro del instrumento (Xenakis).\n+++[Ejemplo 41]...\n<<player id=41 quicktime materiales/grabaciones/trombon/trombon_41.wav 400 15>>\n=== \n\n\n13.Slaps.\n+++[Ejemplo 42]...\n<<player id=42 quicktime materiales/grabaciones/trombon/trombon_42.wav 400 15>>\n=== \n\n\n14.Soplido.\n+++[Ejemplo 43]...\n<<player id=43 quicktime materiales/grabaciones/trombon/trombon_43.wav 400 15>>\n=== \n\n\n15.Cambios de armónicos rápidos para una misma nota (cambiando la posición de la vara).\n+++[Ejemplo 44]...\n<<player id=44 quicktime materiales/grabaciones/trombon/trombon_44.wav 400 15>>\n=== \n\n\n16.Efecto "elefante".\n+++[Ejemplo 45]...\n<<player id=45 quicktime materiales/grabaciones/trombon/trombon_45.wav 400 15>>\n=== \n\n\n
\n<<formTiddler fichaPlantilla>>\n\n<data>{"tecnico":"José Luis González Castro","mes":"Marzo","año":"2007","level":"auditorio","notes":"TASCAM HD-P2\snMicrófono AKG C414 B\sn\snAlgunos principios y finales editados para evitar solapamientos con la voz.","interprete":"María del Pilar Simeó"}</data>
\n|[img[trompeta|materiales/fotografías/trompa.jpg]]|\n\n!Guía\n\n1.Registro:\n\nEn el grave la trompa llega hasta el sol escrito (nota real do, dos líneas adicionales por debajo del pentagrama en clave de fa). En el agudo, llega hasta el do escrito dos líneas adicionales por encima del pentagrama en clave de sol (nota real, fa).\n+++[Ejemplo 1]...\n<<player id=1 quicktime materiales/grabaciones/trompa/trompa_1.wav 400 15>>\n===\n\n\nPor debajo del sol (escrito) se puede hacer notas pedales, aunque no son prácticas.\n+++[Ejemplo 2]...\n<<player id=2 quicktime materiales/grabaciones/trompa/trompa_2.wav 400 15>>\n===\n\n\nLa trompa está formada por tres cilindros y un selector- transpositor; para cada cilindro hay una bomba en fa y otra en sib. El primer cilindro baja medio tono el sonido de la posición natural, el primero un tono y el tercero tono y medio; las combinaciones suman estos efectos. \n\nEn resumen, la serie armónica natural se consigue alterando la presión del aire; las posiciones (los cilindros) consiguen series cada vez más graves.\n\nSerie natural en fa; medio tono menos; un tono menos; tono y medio menos (se utiliza más la combinación del primer y segundo cilindro que el tercero).\n+++[Ejemplo 3]...\n<<player id=3 quicktime materiales/grabaciones/trompa/trompa_3.wav 400 15>>\n===\n\n\nA efectos de escritura la trompa siempre está en fa. En la actualidad es un instrumento cromático, sin que tenga notas defectuosas. \n\nEl color del instrumento es de forma natural más brillante en el agudo y más oscuro en el grave, aunque el intérprete puede igualarlo. En general, empasta bien con los instrumentos de sonido más oscuro (fagot, por ejemplo). \n\nEl intérprete de trompa coloca la mano dentro del pabellón para controlar el brillo y la afinación. Metiendo completamente la mano se puede hacer "sonidos tapados" (efecto bouchée), que tienen un color parecido al de la trompeta.\n+++[Ejemplo 4]...\n<<player id=4 quicktime materiales/grabaciones/trompa/trompa_4.wav 400 15>>\n===\n\n\nEn ocasiones (Mahler, habitualmente), se puede pedir al intérprete que utilice la mano únicamente para sujetar la trompa (pabellón al aire).\n+++[Ejemplo 5]...\n<<player id=5 quicktime materiales/grabaciones/trompa/trompa_5.wav 400 15>>\n===\n\n\n2.Velocidad:\n\nPrueba de velocidad en escalas; arpegios.\n+++[Ejemplo 6]...\n<<player id=6 quicktime materiales/grabaciones/trompa/trompa_6.wav 400 15>>\n===\n\n\nLos arpegios pueden resultar problemáticos si hay grandes saltos; las inversiones se hacen con facilidad.\n\n3.Dinámica:\n\nPrueba de reguladores: p<ff>pp, sf>p.\n+++[Ejemplo 7]...\n<<player id=7 quicktime materiales/grabaciones/trompa/trompa_7.wav 400 15>>\n===\n\n\nAl tocar en f es necesario controlar la cantidad de aire para evitar "romper la nota". En ocasiones, sin embargo, se pide este efecto.\n+++[Ejemplo 8]...\n<<player id=8 quicktime materiales/grabaciones/trompa/trompa_8.wav 400 15>>\n===\n\n\nLa trompa no tiene dificultad para tocar en p en el grave.\n+++[Ejemplo 9]...\n<<player id=9 quicktime materiales/grabaciones/trompa/trompa_9.wav 400 15>>\n===\n\n\n4.Articulaciones:\n\nSe puede hacer un ataque sólo de aire, apoyéndose en el diafragma; también se puede hacer un picado agresivo, con "ta", o más legato, con "da". \n\nAtaque sin lengua; ataque agresivo, ataques en legato.\n+++[Ejemplo 10]...\n<<player id=10 quicktime materiales/grabaciones/trompa/trompa_10.wav 400 15>>\n===\n \n\nEl doble picado se consigue pronunciando "ta-ka"; el triple picado se consigue pronunciando "ta-ta-ka". Lo complicado en este tipo de picados es conseguir que todas las notas parezcan articuladas de la misma manera, aunque pueden ser de ayuda en pasajes rápidos.\n\nPicado simple rápido; doble picado; triple picado; picados rápidos.\n+++[Ejemplo 11]...\n<<player id=11 quicktime materiales/grabaciones/trompa/trompa_10.wav 400 15>>\n===\n\n\nEn la tradición de orquesta, habiendo sólo dos trompas, se especializaban en el registro alto y bajo (cor alto, cor bajo): al añadir dos trompas más, las ya existentes pasaron a ser primera y tercera, mientras que las añadidas, las "trompas tutti" (segunda y cuarta), se especializaron en fragmentos graves. \n\nTchaikovsky, Quinta sinfonía, pasaje para trompas 2 y 4.\n+++[Ejemplo 12]...\n<<player id=12 quicktime materiales/grabaciones/trompa/trompa_12.wav 400 15>>\n===\n\n\nEn el registro grave es complicado articular p: hay una cierta tendencia a que las notas salgan picado-legato.\n+++[Ejemplo 13]...\n<<player id=13 quicktime materiales/grabaciones/trompa/trompa_13.wav 400 15>>\n===\n\n\nDos trompas juntas tocando en homofonía no tienen mayores problemas que cualesquiera otros dos intrumentos tendrían en la misma situación.\n\n5.Resistencia:\n\nComo norma general, es conveniente dar compases de espera tras pasajes largos.\n\nLa respiración circular se puede hacer pero es complicada; es más conveniente que el compositor sea prudente respecto de la duración de las notas tenidas.\n\nPrueba de duración de una nota tenida "natural", sin técnicas de respiración circular.\n+++[Ejemplo 14]...\n<<player id=14 quicktime materiales/grabaciones/trompa/trompa_14.wav 400 15>>\n===\n\n\nUn problema añadido es el controlar la afinación entre varias trompas si tocan la misma nota durante un periodo prolongado de tiempo.\n\n6.Trinos- Trémolos:\n\nLos trinos se suelen hacer con la presión del aire y la embocadura (posiciones fijas), ya que en particular en el registro medio y agudo coinciden muchos armónicos muy próximos.\n\nDos ejemplos de trinos en posiciones fijas; un ejemplo de trino con llaves.\n+++[Ejemplo 15]...\n<<player id=15 quicktime materiales/grabaciones/trompa/trompa_15.wav 400 15>>\n===\n\n\nSe puede hacer también trémolos, aunque al usar posiciones fijas no se alcanza gran velocidad porque se necesita un tiempo para controlar el cambio de nota.\n+++[Ejemplo 16]...\n<<player id=16 quicktime materiales/grabaciones/trompa/trompa_16.wav 400 15>>\n===\n\n\n7.Glissandos:\n\nEn el registro grave son complicados; en el medio y agudo coinciden más armónicos próximos, lo que facilita la tarea. En general, cuantos más cilindros haya que presionar más complicado es. Los cambios de posición impiden hacer determinados glissandos "arrastrados"; en esos casos se recurre al glissando cromático o diatónico, cosa que también se puede hacer sin problemas en el grave.\n+++[Ejemplo 17]...\n<<player id=17 quicktime materiales/grabaciones/trompa/trompa_17.wav 400 15>>\n===\n\n\n8.Sordinas: se usan, aunque el efecto es parecido al bouchée, por el que se opta más en música contemporánea.\n\n9.Multifónicos: muy inusuales. De hacer alguno, los más favorables están a tercera, quinta u octava en un acorde.\n\n10.Efectos:\n\nTocar quitando el primer pistón.\n+++[Ejemplo 18]...\n<<player id=18 quicktime materiales/grabaciones/trompa/trompa_18.wav 400 15>>\n===\n\n\nTocar con la boquilla puesta del revés.\n+++[Ejemplo 19]...\n<<player id=19 quicktime materiales/grabaciones/trompa/trompa_19.wav 400 15>>\n===\n\n\n\n\n\n
\n<<formTiddler fichaPlantilla>>\n\n<data>{"tecnico":"José Luis González Castro","mes":"Marzo","año":"2007","level":"auditorio","notes":"TASCAM HD-P2\snMicrófono AKG C414 B\sn\snEl micrófono se colocó en una posición de referencia apuntando hacia los intérpretes; en general se matuvieron en una posición estable pero en ocasiones cambiaron de sitio. Algunos principios y finales editados para evitar solapamientos con la voz.","interprete":"Jose Pérez, Óscar López, David Abal"}</data>
\n|[img[trompeta|materiales/fotografías/trompeta.jpg]]|\n\n!Guía\n\n1.Notas preliminares:\n\nLas trompetas estándar están en sib, do, piccolo y mib. En orquesta se utiliza la trompeta en do, salvo que se escriba específicamente para ella. La nota inferior de la trompeta en do es fa#; la trompeta en sib llega más abajo, pero lo que la trompeta en do pierde en registro lo gana en dimensión de sonido y color (brillo).\n\nMismo pasaje, tocado primero con una trompeta en do y a continuación por una trompeta en sib.\n+++[Ejemplo 1]...\n<<player id=1 quicktime materiales/grabaciones/trompeta/trompeta_1.wav 400 15>>\n===\n\n\n¿Qué condiciona escoger una u otra trompeta? En primer lugar, comodidad. Lo normal es que los trompetistas transporten en la, en re y mi. Las trompetas en fa y sol son menos usadas ahora; en el romanticismo se perdió el uso de la trompeta en fa y evolucionó hacia sib y do porque pese a perder fuerza en el registro grave ganan calidad y efectividad en el agudo. A la hora de hacer un fuerte las diferencias (entre sib y do) son relativas porque las trompetas pueden personalizarse en función de las preferencias del instrumentista. En la práctica éste escoge en función de los requerimientos de la obra y del director. El solo de La V sinfonía de Mahler, por ejemplo, está escrito en sib; sin embargo se está llevando más a la trompeta en do que a la de sib.\n\n2.Registro:\n\nTrompeta en do: \n\nRegistro grave.\n+++[Ejemplo 2]...\n<<player id=2 quicktime materiales/grabaciones/trompeta/trompeta_2.wav 400 15>>\n===\n\n\nRegistro medio.\n+++[Ejemplo 3]...\n<<player id=3 quicktime materiales/grabaciones/trompeta/trompeta_3.wav 400 15>>\n===\n\n\nEl sol, en la trompeta en do se conseidera normalmente registro agudo; en sib no.\n\nRegistro Agudo.\n+++[Ejemplo 4]...\n<<player id=4 quicktime materiales/grabaciones/trompeta/trompeta_4.wav 400 15>>\n===\n\n \nEl do agudo del extremo del registro es relativo. Se puede llegar más allá; cuánto más allá depende de las necesidades de precisión, volumen y color de cada caso (en música sinfónica hoy día se llega al mi -para trompeta en do; fa para trompeta en sib-). Del do en adelante es arriesgado poner una intensidad menor de mf; se puede hacer pero el instrumentista, ante la dificultad de asegurar la nota, podría optar por pasar a la trompeta en mib y tocar en un registro cómodo, aunque cambia el color y se pierde potencia. \n\nRegistro de la Trompeta en sib (no se pudo eliminar los comentarios- se mantiene como referencia): \n+++[Ejemplo 5]...\n<<player id=5 quicktime materiales/grabaciones/trompeta/trompeta_5.wav 400 15>>\n===\n\n\nLa trompeta en do llega en el grave al fa#, que es la nota real más grave; de ahí hacia abajo se entra en el registro pedal, que en esta trompeta no es efectivo: de tener que bajar más se prefiere la trompeta en sib. \n\nDescenso en arpegio hasta el do; descenso cromático al fa#; registro pedal.\n+++[Ejemplo 6]...\n<<player id=6 quicktime materiales/grabaciones/trompeta/trompeta_6.wav 400 15>>\n===\n\n\nEn las dos trompetas suele corregirse el do# grave porque sale muy alto; si la trompeta es mala también pueden aparecer otras notas defectuosas, como el fa o incluso el do.\n\nNotas do-do#, fa, do.\n+++[Ejemplo 7]...\n<<player id=7 quicktime materiales/grabaciones/trompeta/trompeta_7.wav 400 15>>\n===\n\n\n3.Dinámicas:\n\nEn el registro grave de la trompeta en sib es bastante difícil tocar un buen p.\n+++[Ejemplo 8]...\n<<player id=8 quicktime materiales/grabaciones/trompeta/trompeta_8.wav 400 15>>\n===\n\n\nEl fa# grave de la trompeta en sib, que en pp sería muy complicado, puede dar lugar a recursos interesantes, como tocar fuera del escenario. En todo caso, al escribir en pp para trompeta sería recomendable no bajar de do (línea adicional inferior en clave de sol).\n\nEjemplo descendiendo desde do; ejemplo en una región más favorable al pp.\n+++[Ejemplo 9]...\n<<player id=9 quicktime materiales/grabaciones/trompeta/trompeta_9.wav 400 15>>\n===\n\n\n+++[Ejemplo 10]...\n<<player id=10 quicktime materiales/grabaciones/trompeta/trompeta_10.wav 400 15>>\n===\n\n\nEl pp en el grave presenta por tanto dificultades de emisión (riesgo de que se corte la nota), dificultades de entonación (por ejemplo, si la nota es la tercera de un acorde), y dificultades en el ataque.\n\nEntonación en el grave.\n+++[Ejemplo 11]...\n<<player id=11 quicktime materiales/grabaciones/trompeta/trompeta_11.wav 400 15>>\n===\n\n\nEjemplos de ataques en pp.\n+++[Ejemplo 12]...\n<<player id=12 quicktime materiales/grabaciones/trompeta/trompeta_12.wav 400 15>>\n===\n\n\nHay que tener en cuenta que la intensidad es un valor relativo, que depende siempre de la sonoridad del contexto. Veamos el sigiente ejemplo:\n+++[Ejemplo 13]...\n<<player id=13 quicktime materiales/grabaciones/trompeta/trompeta_13.wav 400 15>>\n===\n\n\n¿p ó f? Dentro de la orquesta sería un pp y el intérprete tendría que esforzarse para llegar al fondo del auditorio; No es lo mismo pesar en un uso sinfónico que solístico del instrumento.\n\nPrueba general de intensidades en la trompeta en sib, para una sola nota.\n+++[Ejemplo 14]...\n<<player id=14 quicktime materiales/grabaciones/trompeta/trompeta_14.wav 400 15>>\n===\n\n\nIntensidad máxima, "rompiendo" la nota.\n+++[Ejemplo 15]...\n<<player id=15 quicktime materiales/grabaciones/trompeta/trompeta_15.wav 400 15>>\n===\n\n\n4.Velocidad, articulaciones:\n\nPruebas de velocidad en escalas y arpegios.\n+++[Ejemplo 16]...\n<<player id=16 quicktime materiales/grabaciones/trompeta/trompeta_16.wav 400 15>>\n===\n\n\nEn escalas ascendentes, si se pide igualdad en todo el ámbito, en picado (como en el ejemplo) no hay dificultades. En ligado habría problemas hacia el p a partir del límite (teórico, como dijimos previamente) del do; no los habría en f. En arpegios se puede tocar igualado después del do, aunque no se suelen hacer todas las notas picadas.\n\nVelocidad en notas ligadas; velocidad en notas picadas (doble picado)\n+++[Ejemplo 17]...\n<<player id=17 quicktime materiales/grabaciones/trompeta/trompeta_17.wav 400 15>>\n===\n\n\nMás pruebas de velocidad.\n+++[Ejemplo 18]...\n<<player id=18 quicktime materiales/grabaciones/trompeta/trompeta_18.wav 400 15>>\n===\n\n\nAlternancia de dos notas ligadas- dos notas picadas (difícil).\n+++[Ejemplo 19]...\n<<player id=19 quicktime materiales/grabaciones/trompeta/trompeta_19.wav 400 15>>\n===\n\n\nSobre una nota fija se puede hacer alcanzar gran velocidad utilizando dobles y triples picados.\n\nDobles picados; Triples picados; dobles y triples mezclados; dobles y triples mezclados a la inversa. \n+++[Ejemplo 20]...\n<<player id=20 quicktime materiales/grabaciones/trompeta/trompeta_20.wav 400 15>>\n===\n\n\nEstos efectos se utilizan mucho en trompeta sola; se puede hacer toda clase de combinaciones.\n\nCombinación de lengua, aire y bomba.\n+++[Ejemplo 21]...\n<<player id=21 quicktime materiales/grabaciones/trompeta/trompeta_21.wav 400 15>>\n===\n\n\nRegulador p<ff>pp.\n+++[Ejemplo 22]...\n<<player id=22 quicktime materiales/grabaciones/trompeta/trompeta_22.wav 400 15>>\n===\n\n\nsf>p.\n+++[Ejemplo 23]...\n<<player id=23 quicktime materiales/grabaciones/trompeta/trompeta_23.wav 400 15>>\n===\n\n\n5.Flutter (frulato):\n\nEl frulato con lengua es fácil; el de garganta es más complicado; abre más la nota.\n\nFrulato con lengua; frulato con lengua y garganta; frulato con garganta.\n+++[Ejemplo 24]...\n<<player id=24 quicktime materiales/grabaciones/trompeta/trompeta_24.wav 400 15>>\n===\n\n\n6.Multifónicos:\n\nSe puede hacer multifónicos con la trompeta, pero no son tan sencillos como en saxofón o incluso trombón y tuba. Las quintas son fáciles, y desde ahí se puede conseguir la serie armónica.\n+++[Ejemplo 25]...\n<<player id=25 quicktime materiales/grabaciones/trompeta/trompeta_25.wav 400 15>>\n===\n\n\n7.Trinos- trémolos:\n\nLos trinos se pueden hacer con facilidad, buscando posiciones fijas de la embocadura -es decir, si para la nota sol hay una posición y para la nota la, otra, para el hacer trino sol-la se busca una posición intermedia que permita hacer ambas con facilidad-. A veces se busca más la posición fija que el trino normal de tono o semitono. \n+++[Ejemplo 26]...\n<<player id=26 quicktime materiales/grabaciones/trompeta/trompeta_26.wav 400 15>>\n===\n\n\nEn el registro agudo, donde se juntan los armónicos, se puede hacer todos los trinos; en el registro grave hay algunos trinos complicados, como do- re y mi- fa (en la trompeta en sib; en la trompeta en do, no tanto).\n\n8.Glissandos:\n\nSe puede hacer glissandos como efecto, pero no tienen la precisión o la flexibilidad de un clarinete o un trombón.\n+++[Ejemplo 27]...\n<<player id=27 quicktime materiales/grabaciones/trompeta/trompeta_27.wav 400 15>>\n===\n\n\n9.Efectos:\n\nQuitar y poner bombas (en las obras se suele pedir que se quite una bomba todo el tiempo).\n+++[Ejemplo 28]...\n<<player id=28 quicktime materiales/grabaciones/trompeta/trompeta_28.wav 400 15>>\n===\n\n\nGolpeteos.\n+++[Ejemplo 29]...\n<<player id=29 quicktime materiales/grabaciones/trompeta/trompeta_29.wav 400 15>>\n===\n\n\nSoplido.\n+++[Ejemplo 30]...\n<<player id=30 quicktime materiales/grabaciones/trompeta/trompeta_30.wav 400 15>>\n===\n\n\nEfecto de "subtono" jazzístico, dejando sólo aire; también se puede hacer juegos con las bombas.\n+++[Ejemplo 31]...\n<<player id=31 quicktime materiales/grabaciones/trompeta/trompeta_31.wav 400 15>>\n===\n\n\nCambios de posición en una misma nota.\n+++[Ejemplo 32]...\n<<player id=32 quicktime materiales/grabaciones/trompeta/trompeta_32.wav 400 15>>\n===\n\n\n10.Sordinas: \n\n-Todos estos ejemplos se han hecho con trompeta en do, pero son aplicables a las demás.\n\nLas sordinas no apagan el sonido como sucede en la cuerda, sino que cambian el timbre del instrumento.\n\nSordina estándar (stride): timbre incisivo.\n+++[Ejemplo 33]...\n<<player id=33 quicktime materiales/grabaciones/trompeta/trompeta_33.wav 400 15>>\n===\n\n\nMisma melodía, con dos sordinas distintas y sin sordina.\n+++[Ejemplo 34]...\n<<player id=34 quicktime materiales/grabaciones/trompeta/trompeta_34.wav 400 15>>\n===\n\n\nDos sordinas del mismo tipo pueden alterar el sonido de diferente manera, según el fabricante y material.\n+++[Ejemplo 35]...\n<<player id=35 quicktime materiales/grabaciones/trompeta/trompeta_35.wav 400 15>>\n===\n\n\nLa sordina Harmond se utiliza mucho para acordes; como solista los franceses la han utilizado mucho en los tiempos lentos de los conciertos.\n+++[Ejemplo 36]...\n<<player id=36 quicktime materiales/grabaciones/trompeta/trompeta_36.wav 400 15>>\n===\n\n\nUn efecto típico de la sordina Harmond, abriéndola y cerrándola: "wah-wah".\n+++[Ejemplo 37]...\n<<player id=37 quicktime materiales/grabaciones/trompeta/trompeta_37.wav 400 15>>\n===\n\n\nOtro uso más jazzístico.\n+++[Ejemplo 38]...\n<<player id=38 quicktime materiales/grabaciones/trompeta/trompeta_38.wav 400 15>>\n===\n\n\nSordina Cup: su sonido es el más cerrado de todos (se puede regular).\nDiferentes efectos con la sordina más o menos abierta; efecto-abrir cerrar.\n+++[Ejemplo 39]...\n<<player id=39 quicktime materiales/grabaciones/trompeta/trompeta_39.wav 400 15>>\n===\n\n\nLas sordinas se pueden combinar con el efecto de quitar bombas a la trompeta.\n\nTrompeta con y sin bomba; mismo efecto con dos sordinas diferentes.\n+++[Ejemplo 40]...\n<<player id=40 quicktime materiales/grabaciones/trompeta/trompeta_40.wav 400 15>>\n===\n\n\n\n11.Trompetas pequeñas:\n\nEstas trompetas necesitan calentarse para sonar correctamente.\n\nTrompeta en mib (también la hay en re):\n\nLas trompetas más pequeñas facilitan los pasajes en agudos a costa de perder timbre y sonido.\n\nPruebas de velocidad y registro.\n+++[Ejemplo 41]...\n<<player id=41 quicktime materiales/grabaciones/trompeta/trompeta_41.wav 400 15>>\n===\n\n\nPiccolo:\n\nPuede estar en sib o la, aunque se utiliza normalmente en la.\n\nRegistro cómodo a partir del do; prueba de registro hacia el agudo.\n+++[Ejemplo 42]...\n<<player id=42 quicktime materiales/grabaciones/trompeta/trompeta_42.wav 400 15>>\n===\n\n\nEfecto quitando bombas.\n+++[Ejemplo 43]...\n<<player id=43 quicktime materiales/grabaciones/trompeta/trompeta_43.wav 400 15>>\n===\n\n\nEfecto tocando con la boquilla (también aplicable a las otras trompetas).\n+++[Ejemplo 44]...\n<<player id=44 quicktime materiales/grabaciones/trompeta/trompeta_44.wav 400 15>>\n===\n\n\nEn pasajes en los que técnicamente se puede tocar en re o con piccolo, de preferencia (por comodidad) se escoge el piccolo, aunque tiene menos sonido.\n\n\n12.Resistencia: hay que tener cuidado tanto con las notas largas como con los tiempos lentos, y hay que dejar tiempo suficiente para los cambios de sordina.\n\n\n13.Una nota sobre el Fliscorno: En sib, tiene un sonido más dulce, y la boquilla es más de trompa que de trompeta. Se utiliza en europa en las bandas de cornetines, o en las fanfarrias, sustituyendo a los clarinetes.\n\n14.Dos efectos de animales.\n+++[Ejemplo 45]...\n<<player id=45 quicktime materiales/grabaciones/trompeta/trompeta_45.wav 400 15>>\n===\n\n\n\n\n\n\n\n\n\n\n
\n<<formTiddler fichaPlantilla>><data>{"tecnico":"José Luis González Castro","mes":"Abril","año":"2007","lugar":"aula","notes":"TASCAM HD-P2\snMicrófono Rode NT5\sn\sn","interprete":"Antonio Rodríguez Iborra, Óscar Prieto Sanmartín"}</data>
\n|[img[tubas y bombardino|materiales/fotografías/tubas_bombardino.jpg]]|\n\n!Guía\n\nLas cuatro tubas más importantes están en sib (la más grande y más grave), do, mib y fa; en España se utilizan principalmente la tuba en do, para bandas de música, y en fa como solista; en orquesta se utilizan las dos según el tipo de repertorio.\n\nCuanto más grande es el instrumento, más grave y más pesado se hace. El volumen de la tuba en do es mayor que el de la tub en fa, y por ello es adecuada a la orquesta; no obstante la tuba en fa tiene más registro.\n\nAl tener la boquilla tan grande, la tuba necesita que el propio músico haga de caja de resonancia. La forma de colocar la boca e impostar se parece a la de los cantantes; más que aire, se echa aliento, aire caliente, para que el sonido sea redondo.\n\n!!Tuba en Do\n \n(modelo con llaves)\n\n1.Registro:\n\nPrimer y segundo armónicos.\n+++[Ejemplo 1]...\n<<player id=1 quicktime materiales/grabaciones/tuba/tuba_1.wav 400 15>>\n===\n\n\nSe puede llegar más abajo del primer armónico con los cilindros, pero estas notas son muy complicadas.\n+++[Ejemplo 2]...\n<<player id=2 quicktime materiales/grabaciones/tuba/tuba_2.wav 400 15>>\n===\n\n\nLa zona más adecuada al instrumento está entre el segundo armónico y el siguiente do: es el rango en la que suena con más facilidad y donde mejor se muestra la técnica del instrumento.\n+++[Ejemplo 3]...\n<<player id=3 quicktime materiales/grabaciones/tuba/tuba_3.wav 400 15>>\n===\n\n\nPor ejemplo, el doble picado en un fa es fácil tanto en esta zona como en el agudo; un doble picado en la región inferior (sib, por ejemplo), no suena tan claro.\n+++[Ejemplo 4]...\n<<player id=4 quicktime materiales/grabaciones/tuba/tuba_4.wav 400 15>>\n===\n\n\nEn el agudo se escribe normalmente hasta el do central (una línea por encima del pentagrama en clave de fa). Por encima de ese do se escribe más para tuba en fa.\n+++[Ejemplo 5]...\n<<player id=5 quicktime materiales/grabaciones/tuba/tuba_5.wav 400 15>>\n===\n\n\nRegistro medio y agudo.\n+++[Ejemplo 6]...\n<<player id=6 quicktime materiales/grabaciones/tuba/tuba_6.wav 400 15>>\n===\n\n\nLa tuba en fa se utiliza tambié más en mñusica de cámara por su facilidad de empaste con otros instrumentos.\n\nEn general, el registro es homogéneo. En las tubas de tres pistones (ó tres cilindros) hay una parte del registro que no existe; dado que el instrumento no está compensado, al llegar al fa del extremo inferior se oye prácticamente un fa, y al llegar al reb se oye re natural.\n\n+++[Ejemplo 7]...\n<<player id=7 quicktime materiales/grabaciones/tuba/tuba_7.wav 400 15>>\n===\n\n\nLa última nota debería ser un re, pero suena re. Para evitar este problema se añade una quinta llave al instrumento. En todo caso es desaconsejable escribir en este registro.\n\nCada vez que se pulsa una llave se alarga el tubo; las notas de las series se consiguen cambiando la presión del aire con el labio.\n\n2.Velocidad:\n\nPrueba de velocidad: giro do- si- sib picado a la velocidad más rápida en la que se puede tocar sonando correctamente; mismo giro picado más rápido (se observa cómo las notas empastan unas sobre otras); mismo giro legato más rápido, lo cual sí puede tocarse correctamente.\n+++[Ejemplo 8]...\n<<player id=8 quicktime materiales/grabaciones/tuba/tuba_8.wav 400 15>>\n===\n\n\nEscala diatónica de do, rápido, picado; doble picado; legato.\n+++[Ejemplo 9]...\n<<player id=9 quicktime materiales/grabaciones/tuba/tuba_9.wav 400 15>>\n===\n\n\nEn arpegios se utiliza mucho los saltos de cuarta, quinta y superiores.\n\nArpegios al aire, grupo picado y grupo en legato (muy complicados).\n+++[Ejemplo 10]...\n<<player id=10 quicktime materiales/grabaciones/tuba/tuba_10.wav 400 15>>\n===\n\n\n3.Dinámicas:\n\nEn el registro grave, lo más adecuado es mp- mf.\n\nPruebas de dinámicas en el registro grave (el segundo y tercer ejemplo muestran el margen cómodo).\n+++[Ejemplo 11]...\n<<player id=11 quicktime materiales/grabaciones/tuba/tuba_11.wav 400 15>>\n===\n\n\nPruebas de dinámicas en el siguiente tramo del registro. En intensidades muy fuertes se abre un poco el sonido.\n+++[Ejemplo 12]...\n<<player id=12 quicktime materiales/grabaciones/tuba/tuba_12.wav 400 15>>\n===\n\n\nSerie de acentos cortos, serie de acentos medios, sforzandos.\n+++[Ejemplo 13]...\n<<player id=13 quicktime materiales/grabaciones/tuba/tuba_13.wav 400 15>>\n===\n\n\np<f>p en una nota.\n+++[Ejemplo 14]...\n<<player id=14 quicktime materiales/grabaciones/tuba/tuba_14.wav 400 15>>\n===\n\n\n4.Articulaciones:\n\nPicado simple; doble picado; doble y triple picado.\nLos glissandos "deslizados" se pueden hacer con pistones, pero no con llaves, porque las llaves no suenan si se levantan a medias.\n+++[Ejemplo 15]...\n<<player id=15 quicktime materiales/grabaciones/tuba/tuba_15.wav 400 15>>\n===\n\n\n4.Glissandos: \n\nLos glissandos "deslizados" se pueden hacer con pistones, pero no con llaves, porque las llaves no suenan si se levantan a medias (pero se pueden hacer "de labio", ver ejemplo 24 más abajo).\n+++[Ejemplo 16]...\n<<player id=16 quicktime materiales/grabaciones/tuba/tuba_16.wav 400 15>>\n===\n\n\nNo obstante, los glissandos sí se pueden hacer con digitación, y hacen un efecto interesante doblando a los trombones.\n+++[Ejemplo 17]...\n<<player id=17 quicktime materiales/grabaciones/tuba/tuba_17.wav 400 15>>\n===\n\n\nLas tubas se pueden conseguir con llaves, cilindros o pistones. Con pistones el sonido es un poco más claro, el ligado es más fácil y se puede hacer glissandos, pero decantarse por una u otra es una cuestión de preferencia del intérprete.\n\n\n5.Frulatos:\n+++[Ejemplo 18]...\n<<player id=18 quicktime materiales/grabaciones/tuba/tuba_18.wav 400 15>>\n===\n\n\n6.Multifónicos:\n\nLos más adecuados están a quinta, octava y sexta. También se puede hacer unísono, aunque es muy complicado. Se consiguen tocando y cantando a la vez. Se puede conseguir multifónicos reales de tres notas tocando la tónica y la sexta: al hacerlo así se obtiene también la cuarta.\n\nEjemplos de multifónicos.\n+++[Ejemplo 19]...\n<<player id=19 quicktime materiales/grabaciones/tuba/tuba_19.wav 400 15>>\n===\n\n7.Sordinas: existen varias sordinas diferentes, metálicas y de roble, para toda la gama de tubas.\n\n8.Efectos:\n\nEfectos diversos de viento: con la boquilla del revés; mismo efecto moviendo llaves; soplido con lengua pegada al paladar; mismo efecto moviendo llaves. \n+++[Ejemplo 20]...\n<<player id=20 quicktime materiales/grabaciones/tuba/tuba_20.wav 400 15>>\n===\n\n\nEfecto apretando todos los cilindros y apretando fff en el agudo (se escribe un triángulo indicando la nota más aguda); mismo efecto sin pistones.\n+++[Ejemplo 21]...\n<<player id=21 quicktime materiales/grabaciones/tuba/tuba_21.wav 400 15>>\n===\n\n\nEl tercer cilindro (pistón) es la suma del primero y el segundo; se puede quitar la bomba asociada para provocar contrastes de color entre una misma nota dada con primero y segundo y dada con tercero sin bomba.\n+++[Ejemplo 22]...\n<<player id=22 quicktime materiales/grabaciones/tuba/tuba_22.wav 400 15>>\n===\n\n\nTambién se puede poner agua en el tercer pistón.\n+++[Ejemplo 23]...\n<<player id=23 quicktime materiales/grabaciones/tuba/tuba_23.wav 400 15>>\n===\n\n\n!!Tuba en Fa\n\n(modelo con pistones)\n\nSe escribe en do.\n\n9.Glissandos: Los pistones sí suenan en posiciones intermedias, con lo que se puede hacer glissandos "deslizados". También se puede hacer glissandos deslizados "de labio"; el rango es de aproximadamente un semitono ascendente o descendente.\n+++[Ejemplo 24]...\n<<player id=24 quicktime materiales/grabaciones/tuba/tuba_24.wav 400 15>>\n===\n\n\n10.Sonidos en el entorno del segundo armónico de la tuba en do; sonidos una octava más arriba; sonido equivalente al primer armónico de la tuba en do.\n+++[Ejemplo 25]...\n<<player id=25 quicktime materiales/grabaciones/tuba/tuba_25.wav 400 15>>\n===\n\n\nEn tuba en fa se puede pedir notas por debajo del fa pedal, aunque son difíciles.\n+++[Ejemplo 26]...\n<<player id=26 quicktime materiales/grabaciones/tuba/tuba_26.wav 400 15>>\n===\n\n\nEn el agudo se puede pedir hasta un fa- sol (segunda línea, clave de sol).\n+++[Ejemplo 27]...\n<<player id=27 quicktime materiales/grabaciones/tuba/tuba_27.wav 400 15>>\n===\n\n\nEl sonido es más brillante que el de la tuba en do, la cual no obstante tiene más volumen. La tuba en fa empasta mejor con otros instrumentos.\n\n11.Resistencia: Se puede poner notas muy largas, aunque los instrumentistas respiran cada cierto tiempo; la respiración continua se hace pero es muy complicada.\n\nCortes en una nota tenida; resistencia en una nota, en ff; resistencia en una nota en p.\n+++[Ejemplo 28]...\n<<player id=28 quicktime materiales/grabaciones/tuba/tuba_28.wav 400 15>>\n===\n\n\nCuanto más agudo sea el registro más tiempo se aguanta porque se necesita menos aire (cada octava en el grave necesita el doble de aire). \n\nPruebas de resistencia en el grave y el agudo.\n+++[Ejemplo 29]...\n<<player id=29 quicktime materiales/grabaciones/tuba/tuba_29.wav 400 15>>\n===\n\n\nLos instrumentistas pueden llegar a marearse por efecto de la hiperoxigenación tras pasajes de gran resistencia.\n\n\n12.Velocidad: \n\nLa tuba en fa es más ágil que la tuba en do; el doble picado y el legato se escuchan también más claros.\n\nPicado simple; picado doble; ligado.\n+++[Ejemplo 30]...\n<<player id=30 quicktime materiales/grabaciones/tuba/tuba_30.wav 400 15>>\n===\n\n\n13.Trinos- trémolos:\n\nUtlizando los pistones o llaves salen con facilidad.\n+++[Ejemplo 31]...\n<<player id=31 quicktime materiales/grabaciones/tuba/tuba_31.wav 400 15>>\n===\n\n\nLos trinos- trémolos de armónicos (sin cambiar de pistón), son más complicados.\n+++[Ejemplo 32]...\n<<player id=32 quicktime materiales/grabaciones/tuba/tuba_32.wav 400 15>>\n===\n\n\nfa-sol con pistones; fa- la (serie armónica).\n+++[Ejemplo 33]...\n<<player id=33 quicktime materiales/grabaciones/tuba/tuba_33.wav 400 15>>\n===\n\n\n!!Bombardino\n\nHay bombardinos en do y sib (en este caso se utilizó un bombardino en sib); todas las partituras se escriben en do (y siempre, como con todas las tubas, en clave de fa). El bombardino es un instrumento más pequeño, por tanto más ágil y más agudo. \n\n14.Registro medio; registro grave terminando en la nota pedal; notas inferiores hasta reb.\n+++[Ejemplo 34]...\n<<player id=34 quicktime materiales/grabaciones/tuba/tuba_34.wav 400 15>>\n===\n\n\nEl reb es la nota más grave del instrumento; se puede hacer algunas notas más, no reales, con el labio.\n+++[Ejemplo 35]...\n<<player id=35 quicktime materiales/grabaciones/tuba/tuba_35.wav 400 15>>\n===\n\n\nEn el agudo se suele escribir hasta el do (nota real, sib en tercera línea de sol), aunque se puede llegar más allá. Algunas partituras llegan incluso al sol; se suele escribir hasta un fa (nota real mib, cuarto espacio de sol). \n\nEscala hasta el do; notas por encima del do; nota fa límite.\n+++[Ejemplo 36]...\n<<player id=36 quicktime materiales/grabaciones/tuba/tuba_36.wav 400 15>>\n===\n\n\nEl bombardino puede tener tres o cuatro pistones, lo que le permite dar más notas en el último caso.\n\nLímite del bombardino con tres pistones; más notas en el bombardino con cuatro pistones.\n+++[Ejemplo 37]...\n<<player id=37 quicktime materiales/grabaciones/tuba/tuba_37.wav 400 15>>\n===\n\n\n15.Dinámicas:\n\nLas notas pedales admiten tocar muy piano, aunque esto es difícil. Lo normal es tocar hasta p. \n+++[Ejemplo 38]...\n<<player id=38 quicktime materiales/grabaciones/tuba/tuba_38.wav 400 15>>\n===\n\n\nPruebas en f, ff, y rompiendo el sonido.\n+++[Ejemplo 39]...\n<<player id=39 quicktime materiales/grabaciones/tuba/tuba_39.wav 400 15>>\n===\n\n\nPruebas de dinámicas en el registro medio, sobre la nota sol (nota real fa). es fácil tocar p.\n+++[Ejemplo 40]...\n<<player id=40 quicktime materiales/grabaciones/tuba/tuba_40.wav 400 15>>\n===\n\n\nPruebas de dinámicas en el registro agudo, sobre un do: ff y p. El p es complicado en este registro.\n+++[Ejemplo 41]...\n<<player id=41 quicktime materiales/grabaciones/tuba/tuba_41.wav 400 15>>\n===\n\n\n16.Velocidad:\n\nEscala cromática.\n+++[Ejemplo 42]...\n<<player id=42 quicktime materiales/grabaciones/tuba/tuba_42.wav 400 15>>\n===\n\n\nA este respecto el bombardino es mucho más rápido que las tubas (y la tuba en fa es más rápida que la tuba en do). La boquilla de la tuba en do es más grande que la de la tuba en fa; la del bombardino es muy parecida a la de trombón.\n\nLos arpegios y trinos (terceras, quintas, octavas...) ligando armónicos son más ágiles que en las tubas.\n+++[Ejemplo 43]...\n<<player id=43 quicktime materiales/grabaciones/tuba/tuba_43.wav 400 15>>\n===\n\n\nEjemplos similares utilizando pistones. Dependiendo del intervalo pueden ser complicados.\n+++[Ejemplo 44]...\n<<player id=44 quicktime materiales/grabaciones/tuba/tuba_44.wav 400 15>>\n===\n\n\n17.Multifónicos, cantando; multifónico de tres notas: sobre el do, cantando sol y la, se oirán las cuartas (también se podría variar la nota inferior).\n+++[Ejemplo 45]...\n<<player id=45 quicktime materiales/grabaciones/tuba/tuba_45.wav 400 15>>\n===\n\n\nAl cantar al unísono se puede conseguir un efecto de batido acercando la afinación.\n+++[Ejemplo 46]...\n<<player id=46 quicktime materiales/grabaciones/tuba/tuba_46.wav 400 15>>\n===\n\n\n18.Efecto helicóptero. Se hace con la lengua. Suena mejor en la tuba en do.\n\nEfecto con bombardino; efecto con tuba.\n+++[Ejemplo 47]...\n<<player id=47 quicktime materiales/grabaciones/tuba/tuba_47.wav 400 15>>\n===\n\n\n19.Golpes en la boquilla, ritmos, golpes en la campana; golpeteos tirando de la bomba.\n+++[Ejemplo 48]...\n<<player id=48 quicktime materiales/grabaciones/tuba/tuba_48.wav 400 15>>\n===\n\n\n20.Melodía con y sin vibrato.\n+++[Ejemplo 49]...\n<<player id=49 quicktime materiales/grabaciones/tuba/tuba_49.wav 400 15>>\n===\n\n\n21.Dúo de tubas.\n+++[Ejemplo 50]...\n<<player id=50 quicktime materiales/grabaciones/tuba/tuba_50.wav 400 15>>\n===\n\n\n\n
//last update: UploadPlugin v 3.4.5//\n\n!Description\nUploadPlugin with <<tag UploadService>> extend TiddlyWiki with @@upload@@ and @@save to web@@ commands. \nUploadPlugin uses Username and Password from UploadOptions stored in cookies to authenticate itself to [[store.php]] or [[store.cgi]].\nFrench translation available as a separate tiddler UploadPluginMsgFR\n\n!!UploadPlugin\n*If the TiddlyWiki is viewed from @@local disk@@ :\n**{{{<<saveChanges>>}}} \n***display as ''save to disk''\n***work as usual\n**{{{<<upload>>}}}\n***display as ''upload''\n***after saving to disk, upload in the storeUrl directory.\n*If the TiddlyWiki is viewed from @@website@@ and is @@readOnly@@ (in core TiddlyWiki since 2.0.6) :\n**{{{<<saveChanges>>}}} \n***print nothing\n***has been disabled\n**{{{<<upload>>}}}\n***display as '''save to web''\n***save in the uploadDir directory.\n*If GenerateAnRssFeed in AdvancedOptions is set :\n**generate the content of the RSSFeed \n**upload the RssFile in uploadDir directory\n**Caution : use the SiteUrl tiddler to specify the right url of the TiddlyWiki in the generated RssFile\n*DisplayMessage\n*Log upload action in UploadLog\nhint : if UploadLog is the first tiddler in the Timeline Tab, no tiddler has been updated since last upload.\n\n!![[store.php]]\n*UserVariables to set :\n//{{{\n$AUTHENTICATE_USER = true; // true | false\n$USERS = array(\n 'UserName1'=>'Password1', \n 'UserName2'=>'Password2', \n 'UserName3'=>'Password3'); // set usernames and strong passwords\n$DEBUG = false; // true | false\n//}}}\n*method GET\n**display an information page\n*method POST\n**if $~AUTHENTICATE_USER is ''true''\n***presence and value of user and password are checked with $USER and $PASSWORD \n**if toFilename already exists and backDir parameter specified\n***rename toFilename to backupDir/toFilename.AAAAMMDD.HHSS.html\n**copy temporaryUploadedFile to toFilename\n** return status\n\n!![[store.cgi]]\n*UserVariables to set :\n//{{{\nCONFIG = {\n :users => {\n 'UserName1'=>'Password1', \n 'UserName2'=>'Password2', \n 'UserName3'=>'Password3')\n },\n :authenticateUser => true,\n :backupExistingFile => true,\n :withUploadDir => true\n}\n//}}}\n*same processing as store.php above\n\n!Usage : \n{{{\n<<upload>>\n uses UploadOptions saved in cookies :\n txtUploadUserName: username\n pasUploadPassword : password\n txtUploadStoreUrl : store script\n txtUploadDir : relative path for upload directory\n txtUploadFilename : upload filename\n txtUploadBackupDir : relative path for backup directory\n\n<<upload [storeUrl [toFilename [backupDir [uploadDir [username]]]]]>>\n Optional positional parameters can be passed to overwrite \n UploadOptions. \n}}}\n\nInstall the {{{<<upload ... >>}}} macro in SideBarOptions just below {{{<<saveChanges>>}}} macro.\n\n\n!User manual\nSee HowToUpload\n\n!Installation :\n*Install the UploadPlugin as usual\n*Upload the [[store.php]] file on your php aware webserver in your TiddlyWiki directory\n*Protect your server against malicious upload. Two approaches :\n**set $~AUTHENTICATE_USER to true in the [[store.php]] script\n***configure $USER and $PASSWORD in the [[store.php]] script on your webserver\n***set UploadOptions in conformity with [[store.php]]\n**Use server protection :\n***for Apache web server ([[for detail see Apache documentation|http://httpd.apache.org/docs/1.3/howto/htaccess.html]]) : \n****configure and upload the [[.htaccess]] [[.passwd]]\n***for other web servers see the appropriate documentation\n*Configure an upload button, for example in the SideBarOptions\n!Suppported Browser\n*Firefox and Gecko based browser: tested Ok\n*Internet Explorer : tested Ok\n*Safari : tested ok on OS X\n*Others : Not tested, please report status.\n\n!Revision history\n*V 3.4.5 (2006/10/15)\n**Force checkAutoSave to false for http protocol only (thanks to SimonBaird)\n*V 3.4.4 (30/09/2006)\n**PasswordTweak V 1.0.3\n***add class attribute specific on each option input (thanks to ClintChecketts)\n**UploadOptions width set by styleSheet\n*V 3.4.3 (19/09/2006)\n**Add classname to input for options (thanks to ClintChecketts)\n**Force checkAutoSave to false\n**Alert if password is empty before Uploading\n*V 3.4.2 (04/09/2006)\n**add functions to format displayMessages (thanks to LucDeschenaux)\n**take return values from store.cgi of destfile and backupfile for displayMessages \n*V 3.4.1 (19/08/2006)\n**Error management improvement\n*V 3.4.0 (25/07/2006)\n**Manage Lock parameters for GroupAuthoring\n**Small code refactoring for new PluginFormat in TW 2.1\n+++[previous revisions]\n*V 3.3.3 (30/06/2006)\n**reinstall saveChanges Hijacking\n*V 3.3.2 (26/06/2006)\n** make "save to disk" disappear when TiddlyWiki is located on the web\n** small reformatting of post headers for store.cgi compatibility\n*V 3.3.1 (30/03/2006)\n**bug in backup folder when uploading rssfile fixed\n*V 3.3.0 (12/03/2006)\n**Code refactoring\n**suppress saveChanges hijacking\n*V3.2.2 (25/02/2006)\n**Use PasswordTweak 1.0.1\n**uploaddir is a relative path\n**backupdir is a relative path\n*V3.2.1 (13/02/2006)\n**name and password added to open.request (Thanks to TedPavlic)\n*V3.2.0 (14/02/2006)\n**Use PassworDTweak (http://tiddlyWiki.bidix.info/#PasswordTweak) for password\n*V3.1.0 (12/02/2006)\n**UploadOptions in Cookies\n**Username and password from UploadOptions pass to store.php script for authentification check\n*V3.0.3 (03/02/2006)\n**Firefox crashes due to global var fixed\n*V3.0.2 (25-Jan-2006)\n**HTTPS compatible\n*V3.0.1 (18-Jan-2006)\n**UTF8toUnicode conversion problem in Firefox\n*V3.0.0 (15-Jan-2006)\n**Asynchronous upload\n**Synchronous upload before unload of the page\n**All strings extracted in macro config\n**Compatibility checked with TW 2.0.2 & TW 1.2.39 for both FF 1.5 and IE 6\n*V2.0.2 (8-Jan-2006)\n**conversion of SiteTitle and SiteSubtitle in web page Title\n*V2.0.1 (8-Jan-2006)\n**Compatibilty with TiddlyWiki 2.0.1\n*V2.0.0 (3-Jan-2006)\n**Save to web\n**Compatibilty with TiddlyWiki 1.2.39 and TiddlyWiki 2.0.0 Beta 6\n*v1.1.0 (27-Dec-2005)\n**Upload RSS File\n*v1.0.3 (26-Dec-2005)\n**UploadLog tiddler\n*v1.0.2 (24-Dec-2005)\n**Optional parameter toFilename\n**Optional parameter backupDir\n*v1.0.1 (23-Dec-2005)\n**reformatting code\n* v1.0.0 (17-Dec-2005)\n** first public working version\n===\n\n
This form upload any file with an UploadService describe in [[Upload]]\n----\n<html><center>\n<form enctype="multipart/form-data" action="store.cgi" method="post" target="_blank">\n <input type="hidden" name="MAX_FILE_SIZE" value="3000000" />\nThis file : <input name="userfile" type="file" /><p>\nOptions* : <input type="text" name="UploadPlugin" size=70 value="backupDir=BACKUP_DIR;user=UPLOAD_USER;password=UPLOAD_PASSWORD;" /><p>\n <input type="submit" value="Upload" />\n</form></center>\n</html>\n----\n * Substitute BACKUP_DIR, UPLOAD_USER and UPLOAD_PASSWORD with your values. See UploadPlugin for option details. \nFor security reason, don't save your password in a tiddler.
/***\n|''Name:''|UploadPlugin|\n|''Description:''|Save to web a TiddlyWiki|\n|''Version:''|3.4.5|\n|''Date:''|Oct 15, 2006|\n|''Source:''|http://tiddlywiki.bidix.info/#UploadPlugin|\n|''Documentation:''|http://tiddlywiki.bidix.info/#UploadDoc|\n|''Author:''|BidiX (BidiX (at) bidix (dot) info)|\n|''License:''|[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D ]]|\n|''~CoreVersion:''|2.0.0|\n|''Browser:''|Firefox 1.5; InternetExplorer 6.0; Safari|\n|''Include:''|config.lib.file; config.lib.log; config.lib.options; PasswordTweak|\n|''Require:''|[[UploadService|http://tiddlywiki.bidix.info/#UploadService]]|\n***/\n//{{{\nversion.extensions.UploadPlugin = {\n major: 3, minor: 4, revision: 5, \n date: new Date(2006,9,15),\n source: 'http://tiddlywiki.bidix.info/#UploadPlugin',\n documentation: 'http://tiddlywiki.bidix.info/#UploadDoc',\n author: 'BidiX (BidiX (at) bidix (dot) info',\n license: '[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D]]',\n coreVersion: '2.0.0',\n browser: 'Firefox 1.5; InternetExplorer 6.0; Safari'\n};\n//}}}\n\n////+++!![config.lib.file]\n\n//{{{\nif (!config.lib) config.lib = {};\nif (!config.lib.file) config.lib.file= {\n author: 'BidiX',\n version: {major: 0, minor: 1, revision: 0}, \n date: new Date(2006,3,9)\n};\nconfig.lib.file.dirname = function (filePath) {\n var lastpos;\n if ((lastpos = filePath.lastIndexOf("/")) != -1) {\n return filePath.substring(0, lastpos);\n } else {\n return filePath.substring(0, filePath.lastIndexOf("\s\s"));\n }\n};\nconfig.lib.file.basename = function (filePath) {\n var lastpos;\n if ((lastpos = filePath.lastIndexOf("#")) != -1) \n filePath = filePath.substring(0, lastpos);\n if ((lastpos = filePath.lastIndexOf("/")) != -1) {\n return filePath.substring(lastpos + 1);\n } else\n return filePath.substring(filePath.lastIndexOf("\s\s")+1);\n};\nwindow.basename = function() {return "@@deprecated@@";};\n//}}}\n////===\n\n////+++!![config.lib.log]\n\n//{{{\nif (!config.lib) config.lib = {};\nif (!config.lib.log) config.lib.log= {\n author: 'BidiX',\n version: {major: 0, minor: 1, revision: 1}, \n date: new Date(2006,8,19)\n};\nconfig.lib.Log = function(tiddlerTitle, logHeader) {\n if (version.major < 2)\n this.tiddler = store.tiddlers[tiddlerTitle];\n else\n this.tiddler = store.getTiddler(tiddlerTitle);\n if (!this.tiddler) {\n this.tiddler = new Tiddler();\n this.tiddler.title = tiddlerTitle;\n this.tiddler.text = "| !date | !user | !location |" + logHeader;\n this.tiddler.created = new Date();\n this.tiddler.modifier = config.options.txtUserName;\n this.tiddler.modified = new Date();\n if (version.major < 2)\n store.tiddlers[tiddlerTitle] = this.tiddler;\n else\n store.addTiddler(this.tiddler);\n }\n return this;\n};\n\nconfig.lib.Log.prototype.newLine = function (line) {\n var now = new Date();\n var newText = "| ";\n newText += now.getDate()+"/"+(now.getMonth()+1)+"/"+now.getFullYear() + " ";\n newText += now.getHours()+":"+now.getMinutes()+":"+now.getSeconds()+" | ";\n newText += config.options.txtUserName + " | ";\n var location = document.location.toString();\n var filename = config.lib.file.basename(location);\n if (!filename) filename = '/';\n newText += "[["+filename+"|"+location + "]] |";\n this.tiddler.text = this.tiddler.text + "\sn" + newText;\n this.addToLine(line);\n};\n\nconfig.lib.Log.prototype.addToLine = function (text) {\n this.tiddler.text = this.tiddler.text + text;\n this.tiddler.modifier = config.options.txtUserName;\n this.tiddler.modified = new Date();\n if (version.major < 2)\n store.tiddlers[this.tiddler.tittle] = this.tiddler;\n else {\n store.addTiddler(this.tiddler);\n story.refreshTiddler(this.tiddler.title);\n store.notify(this.tiddler.title, true);\n }\n if (version.major < 2)\n store.notifyAll(); \n};\n//}}}\n////===\n\n////+++!![config.lib.options]\n\n//{{{\nif (!config.lib) config.lib = {};\nif (!config.lib.options) config.lib.options = {\n author: 'BidiX',\n version: {major: 0, minor: 1, revision: 0}, \n date: new Date(2006,3,9)\n};\n\nconfig.lib.options.init = function (name, defaultValue) {\n if (!config.options[name]) {\n config.options[name] = defaultValue;\n saveOptionCookie(name);\n }\n};\n//}}}\n////===\n\n////+++!![PasswordTweak]\n\n//{{{\nversion.extensions.PasswordTweak = {\n major: 1, minor: 0, revision: 3, date: new Date(2006,8,30),\n type: 'tweak',\n source: 'http://tiddlywiki.bidix.info/#PasswordTweak'\n};\n//}}}\n/***\n!!config.macros.option\n***/\n//{{{\nconfig.macros.option.passwordCheckboxLabel = "Save this password on this computer";\nconfig.macros.option.passwordType = "password"; // password | text\n\nconfig.macros.option.onChangeOption = function(e)\n{\n var opt = this.getAttribute("option");\n var elementType,valueField;\n if(opt) {\n switch(opt.substr(0,3)) {\n case "txt":\n elementType = "input";\n valueField = "value";\n break;\n case "pas":\n elementType = "input";\n valueField = "value";\n break;\n case "chk":\n elementType = "input";\n valueField = "checked";\n break;\n }\n config.options[opt] = this[valueField];\n saveOptionCookie(opt);\n var nodes = document.getElementsByTagName(elementType);\n for(var t=0; t<nodes.length; t++) \n {\n var optNode = nodes[t].getAttribute("option");\n if (opt == optNode) \n nodes[t][valueField] = this[valueField];\n }\n }\n return(true);\n};\n\nconfig.macros.option.handler = function(place,macroName,params)\n{\n var opt = params[0];\n if(config.options[opt] === undefined) {\n return;}\n var c;\n switch(opt.substr(0,3)) {\n case "txt":\n c = document.createElement("input");\n c.onkeyup = this.onChangeOption;\n c.setAttribute ("option",opt);\n c.className = "txtOptionInput "+opt;\n place.appendChild(c);\n c.value = config.options[opt];\n break;\n case "pas":\n // input password\n c = document.createElement ("input");\n c.setAttribute("type",config.macros.option.passwordType);\n c.onkeyup = this.onChangeOption;\n c.setAttribute("option",opt);\n c.className = "pasOptionInput "+opt;\n place.appendChild(c);\n c.value = config.options[opt];\n // checkbox link with this password "save this password on this computer"\n c = document.createElement("input");\n c.setAttribute("type","checkbox");\n c.onclick = this.onChangeOption;\n c.setAttribute("option","chk"+opt);\n c.className = "chkOptionInput "+opt;\n place.appendChild(c);\n c.checked = config.options["chk"+opt];\n // text savePasswordCheckboxLabel\n place.appendChild(document.createTextNode(config.macros.option.passwordCheckboxLabel));\n break;\n case "chk":\n c = document.createElement("input");\n c.setAttribute("type","checkbox");\n c.onclick = this.onChangeOption;\n c.setAttribute("option",opt);\n c.className = "chkOptionInput "+opt;\n place.appendChild(c);\n c.checked = config.options[opt];\n break;\n }\n};\n//}}}\n/***\n!! Option cookie stuff\n***/\n//{{{\nwindow.loadOptionsCookie_orig_PasswordTweak = window.loadOptionsCookie;\nwindow.loadOptionsCookie = function()\n{\n var cookies = document.cookie.split(";");\n for(var c=0; c<cookies.length; c++) {\n var p = cookies[c].indexOf("=");\n if(p != -1) {\n var name = cookies[c].substr(0,p).trim();\n var value = cookies[c].substr(p+1).trim();\n switch(name.substr(0,3)) {\n case "txt":\n config.options[name] = unescape(value);\n break;\n case "pas":\n config.options[name] = unescape(value);\n break;\n case "chk":\n config.options[name] = value == "true";\n break;\n }\n }\n }\n};\n\nwindow.saveOptionCookie_orig_PasswordTweak = window.saveOptionCookie;\nwindow.saveOptionCookie = function(name)\n{\n var c = name + "=";\n switch(name.substr(0,3)) {\n case "txt":\n c += escape(config.options[name].toString());\n break;\n case "chk":\n c += config.options[name] ? "true" : "false";\n // is there an option link with this chk ?\n if (config.options[name.substr(3)]) {\n saveOptionCookie(name.substr(3));\n }\n break;\n case "pas":\n if (config.options["chk"+name]) {\n c += escape(config.options[name].toString());\n } else {\n c += "";\n }\n break;\n }\n c += "; expires=Fri, 1 Jan 2038 12:00:00 UTC; path=/";\n document.cookie = c;\n};\n//}}}\n/***\n!! Initializations\n***/\n//{{{\n// define config.options.pasPassword\nif (!config.options.pasPassword) {\n config.options.pasPassword = 'defaultPassword';\n window.saveOptionCookie('pasPassword');\n}\n// since loadCookies is first called befor password definition\n// we need to reload cookies\nwindow.loadOptionsCookie();\n//}}}\n////===\n\n////+++!![config.macros.upload]\n\n//{{{\nconfig.macros.upload = {\n accessKey: "U",\n formName: "UploadPlugin",\n contentType: "text/html;charset=UTF-8",\n defaultStoreScript: "store.php"\n};\n\n// only this two configs need to be translated\nconfig.macros.upload.messages = {\n aboutToUpload: "About to upload TiddlyWiki to %0",\n backupFileStored: "Previous file backuped in %0",\n crossDomain: "Certainly a cross-domain isue: access to an other site isn't allowed",\n errorDownloading: "Error downloading",\n errorUploadingContent: "Error uploading content",\n fileLocked: "Files is locked: You are not allowed to Upload",\n fileNotFound: "file to upload not found",\n fileNotUploaded: "File %0 NOT uploaded",\n mainFileUploaded: "Main TiddlyWiki file uploaded to %0",\n passwordEmpty: "Unable to upload, your password is empty",\n urlParamMissing: "url param missing",\n rssFileNotUploaded: "RssFile %0 NOT uploaded",\n rssFileUploaded: "Rss File uploaded to %0"\n};\n\nconfig.macros.upload.label = {\n promptOption: "Save and Upload this TiddlyWiki with UploadOptions",\n promptParamMacro: "Save and Upload this TiddlyWiki in %0",\n saveLabel: "save to web", \n saveToDisk: "save to disk",\n uploadLabel: "upload" \n};\n\nconfig.macros.upload.handler = function(place,macroName,params){\n // parameters initialization\n var storeUrl = params[0];\n var toFilename = params[1];\n var backupDir = params[2];\n var uploadDir = params[3];\n var username = params[4];\n var password; // for security reason no password as macro parameter\n var label;\n if (document.location.toString().substr(0,4) == "http")\n label = this.label.saveLabel;\n else\n label = this.label.uploadLabel;\n var prompt;\n if (storeUrl) {\n prompt = this.label.promptParamMacro.toString().format([this.toDirUrl(storeUrl, uploadDir, username)]);\n }\n else {\n prompt = this.label.promptOption;\n }\n createTiddlyButton(place, label, prompt, \n function () {\n config.macros.upload.upload(storeUrl, toFilename, uploadDir, backupDir, username, password); \n return false;}, \n null, null, this.accessKey);\n};\nconfig.macros.upload.UploadLog = function() {\n return new config.lib.Log('UploadLog', " !storeUrl | !uploadDir | !toFilename | !backupdir | !origin |" );\n};\nconfig.macros.upload.UploadLog.prototype = config.lib.Log.prototype;\nconfig.macros.upload.UploadLog.prototype.startUpload = function(storeUrl, toFilename, uploadDir, backupDir) {\n var line = " [[" + config.lib.file.basename(storeUrl) + "|" + storeUrl + "]] | ";\n line += uploadDir + " | " + toFilename + " | " + backupDir + " |";\n this.newLine(line);\n};\nconfig.macros.upload.UploadLog.prototype.endUpload = function() {\n this.addToLine(" Ok |");\n};\nconfig.macros.upload.basename = config.lib.file.basename;\nconfig.macros.upload.dirname = config.lib.file.dirname;\nconfig.macros.upload.toRootUrl = function (storeUrl, username)\n{\n return root = (this.dirname(storeUrl)?this.dirname(storeUrl):this.dirname(document.location.toString()));\n}\nconfig.macros.upload.toDirUrl = function (storeUrl, uploadDir, username)\n{\n var root = this.toRootUrl(storeUrl, username);\n if (uploadDir && uploadDir != '.')\n root = root + '/' + uploadDir;\n return root;\n}\nconfig.macros.upload.toFileUrl = function (storeUrl, toFilename, uploadDir, username)\n{\n return this.toDirUrl(storeUrl, uploadDir, username) + '/' + toFilename;\n}\nconfig.macros.upload.upload = function(storeUrl, toFilename, uploadDir, backupDir, username, password)\n{\n // parameters initialization\n storeUrl = (storeUrl ? storeUrl : config.options.txtUploadStoreUrl);\n toFilename = (toFilename ? toFilename : config.options.txtUploadFilename);\n backupDir = (backupDir ? backupDir : config.options.txtUploadBackupDir);\n uploadDir = (uploadDir ? uploadDir : config.options.txtUploadDir);\n username = (username ? username : config.options.txtUploadUserName);\n password = config.options.pasUploadPassword; // for security reason no password as macro parameter\n if (!password || password === '') {\n alert(config.macros.upload.messages.passwordEmpty);\n return;\n }\n if (storeUrl === '') {\n storeUrl = config.macros.upload.defaultStoreScript;\n }\n if (config.lib.file.dirname(storeUrl) === '') {\n storeUrl = config.lib.file.dirname(document.location.toString())+'/'+storeUrl;\n }\n if (toFilename === '') {\n toFilename = config.lib.file.basename(document.location.toString());\n }\n\n clearMessage();\n // only for forcing the message to display\n if (version.major < 2)\n store.notifyAll();\n if (!storeUrl) {\n alert(config.macros.upload.messages.urlParamMissing);\n return;\n }\n // Check that file is not locked\n if (window.BidiX && BidiX.GroupAuthoring && BidiX.GroupAuthoring.lock) {\n if (BidiX.GroupAuthoring.lock.isLocked() && !BidiX.GroupAuthoring.lock.isMyLock()) {\n alert(config.macros.upload.messages.fileLocked);\n return;\n }\n }\n \n var log = new this.UploadLog();\n log.startUpload(storeUrl, toFilename, uploadDir, backupDir);\n if (document.location.toString().substr(0,5) == "file:") {\n saveChanges();\n }\n var toDir = config.macros.upload.toDirUrl(storeUrl, toFilename, uploadDir, username);\n displayMessage(config.macros.upload.messages.aboutToUpload.format([toDir]), toDir);\n this.uploadChanges(storeUrl, toFilename, uploadDir, backupDir, username, password);\n if(config.options.chkGenerateAnRssFeed) {\n //var rssContent = convertUnicodeToUTF8(generateRss());\n var rssContent = generateRss();\n var rssPath = toFilename.substr(0,toFilename.lastIndexOf(".")) + ".xml";\n this.uploadContent(rssContent, storeUrl, rssPath, uploadDir, '', username, password, \n function (responseText) {\n if (responseText.substring(0,1) != '0') {\n displayMessage(config.macros.upload.messages.rssFileNotUploaded.format([rssPath]));\n }\n else {\n var toFileUrl = config.macros.upload.toFileUrl(storeUrl, rssPath, uploadDir, username);\n displayMessage(config.macros.upload.messages.rssFileUploaded.format(\n [toFileUrl]), toFileUrl);\n }\n // for debugging store.php uncomment last line\n //DEBUG alert(responseText);\n });\n }\n return;\n};\n\nconfig.macros.upload.uploadChanges = function(storeUrl, toFilename, uploadDir, backupDir, \n username, password) {\n var original;\n if (document.location.toString().substr(0,4) == "http") {\n original = this.download(storeUrl, toFilename, uploadDir, backupDir, username, password);\n return;\n }\n else {\n // standard way : Local file\n \n original = loadFile(getLocalPath(document.location.toString()));\n if(window.Components) {\n // it's a mozilla browser\n try {\n netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");\n var converter = Components.classes["@mozilla.org/intl/scriptableunicodeconverter"]\n .createInstance(Components.interfaces.nsIScriptableUnicodeConverter);\n converter.charset = "UTF-8";\n original = converter.ConvertToUnicode(original);\n }\n catch(e) {\n }\n }\n }\n //DEBUG alert(original);\n this.uploadChangesFrom(original, storeUrl, toFilename, uploadDir, backupDir, \n username, password);\n};\n\nconfig.macros.upload.uploadChangesFrom = function(original, storeUrl, toFilename, uploadDir, backupDir, \n username, password) {\n var startSaveArea = '<div id="' + 'storeArea">'; // Split up into two so that indexOf() of this source doesn't find it\n var endSaveArea = '</d' + 'iv>';\n // Locate the storeArea div's\n var posOpeningDiv = original.indexOf(startSaveArea);\n var posClosingDiv = original.lastIndexOf(endSaveArea);\n if((posOpeningDiv == -1) || (posClosingDiv == -1))\n {\n alert(config.messages.invalidFileError.format([document.location.toString()]));\n return;\n }\n var revised = original.substr(0,posOpeningDiv + startSaveArea.length) + \n allTiddlersAsHtml() + "\sn\st\st" +\n original.substr(posClosingDiv);\n var newSiteTitle;\n if(version.major < 2){\n newSiteTitle = (getElementText("siteTitle") + " - " + getElementText("siteSubtitle")).htmlEncode();\n } else {\n newSiteTitle = (wikifyPlain ("SiteTitle") + " - " + wikifyPlain ("SiteSubtitle")).htmlEncode();\n }\n\n revised = revised.replaceChunk("<title"+">","</title"+">"," " + newSiteTitle + " ");\n revised = revised.replaceChunk("<!--PRE-HEAD-START--"+">","<!--PRE-HEAD-END--"+">","\sn" + store.getTiddlerText("MarkupPreHead","") + "\sn");\n revised = revised.replaceChunk("<!--POST-HEAD-START--"+">","<!--POST-HEAD-END--"+">","\sn" + store.getTiddlerText("MarkupPostHead","") + "\sn");\n revised = revised.replaceChunk("<!--PRE-BODY-START--"+">","<!--PRE-BODY-END--"+">","\sn" + store.getTiddlerText("MarkupPreBody","") + "\sn");\n revised = revised.replaceChunk("<!--POST-BODY-START--"+">","<!--POST-BODY-END--"+">","\sn" + store.getTiddlerText("MarkupPostBody","") + "\sn");\n\n var response = this.uploadContent(revised, storeUrl, toFilename, uploadDir, backupDir, \n username, password, function (responseText) {\n if (responseText.substring(0,1) != '0') {\n alert(responseText);\n displayMessage(config.macros.upload.messages.fileNotUploaded.format([getLocalPath(document.location.toString())]));\n }\n else {\n if (uploadDir !== '') {\n toFilename = uploadDir + "/" + config.macros.upload.basename(toFilename);\n } else {\n toFilename = config.macros.upload.basename(toFilename);\n }\n var toFileUrl = config.macros.upload.toFileUrl(storeUrl, toFilename, uploadDir, username);\n if (responseText.indexOf("destfile:") > 0) {\n var destfile = responseText.substring(responseText.indexOf("destfile:")+9, \n responseText.indexOf("\sn", responseText.indexOf("destfile:")));\n toFileUrl = config.macros.upload.toRootUrl(storeUrl, username) + '/' + destfile;\n }\n else {\n toFileUrl = config.macros.upload.toFileUrl(storeUrl, toFilename, uploadDir, username);\n }\n displayMessage(config.macros.upload.messages.mainFileUploaded.format(\n [toFileUrl]), toFileUrl);\n if (backupDir && responseText.indexOf("backupfile:") > 0) {\n var backupFile = responseText.substring(responseText.indexOf("backupfile:")+11, \n responseText.indexOf("\sn", responseText.indexOf("backupfile:")));\n toBackupUrl = config.macros.upload.toRootUrl(storeUrl, username) + '/' + backupFile;\n displayMessage(config.macros.upload.messages.backupFileStored.format(\n [toBackupUrl]), toBackupUrl);\n }\n var log = new config.macros.upload.UploadLog();\n log.endUpload();\n store.setDirty(false);\n // erase local lock\n if (window.BidiX && BidiX.GroupAuthoring && BidiX.GroupAuthoring.lock) {\n BidiX.GroupAuthoring.lock.eraseLock();\n // change mtime with new mtime after upload\n var mtime = responseText.substr(responseText.indexOf("mtime:")+6);\n BidiX.GroupAuthoring.lock.mtime = mtime;\n }\n \n \n }\n // for debugging store.php uncomment last line\n //DEBUG alert(responseText);\n }\n );\n};\n\nconfig.macros.upload.uploadContent = function(content, storeUrl, toFilename, uploadDir, backupDir, \n username, password, callbackFn) {\n var boundary = "---------------------------"+"AaB03x"; \n var request;\n try {\n request = new XMLHttpRequest();\n } \n catch (e) { \n request = new ActiveXObject("Msxml2.XMLHTTP"); \n }\n if (window.netscape){\n try {\n if (document.location.toString().substr(0,4) != "http") {\n netscape.security.PrivilegeManager.enablePrivilege('UniversalBrowserRead');}\n }\n catch (e) {}\n } \n //DEBUG alert("user["+config.options.txtUploadUserName+"] password[" + config.options.pasUploadPassword + "]");\n // compose headers data\n var sheader = "";\n sheader += "--" + boundary + "\sr\snContent-disposition: form-data; name=\s"";\n sheader += config.macros.upload.formName +"\s"\sr\sn\sr\sn";\n sheader += "backupDir="+backupDir\n +";user=" + username \n +";password=" + password\n +";uploaddir=" + uploadDir;\n // add lock attributes to sheader\n if (window.BidiX && BidiX.GroupAuthoring && BidiX.GroupAuthoring.lock) {\n var l = BidiX.GroupAuthoring.lock.myLock;\n sheader += ";lockuser=" + l.user\n + ";mtime=" + l.mtime\n + ";locktime=" + l.locktime;\n }\n sheader += ";;\sr\sn"; \n sheader += "\sr\sn" + "--" + boundary + "\sr\sn";\n sheader += "Content-disposition: form-data; name=\s"userfile\s"; filename=\s""+toFilename+"\s"\sr\sn";\n sheader += "Content-Type: " + config.macros.upload.contentType + "\sr\sn";\n sheader += "Content-Length: " + content.length + "\sr\sn\sr\sn";\n // compose trailer data\n var strailer = new String();\n strailer = "\sr\sn--" + boundary + "--\sr\sn";\n //strailer = "--" + boundary + "--\sr\sn";\n var data;\n data = sheader + content + strailer;\n //request.open("POST", storeUrl, true, username, password);\n try {\n request.open("POST", storeUrl, true); \n }\n catch(e) {\n alert(config.macros.upload.messages.crossDomain + "\snError:" +e);\n exit;\n }\n request.onreadystatechange = function () {\n if (request.readyState == 4) {\n if (request.status == 200)\n callbackFn(request.responseText);\n else\n alert(config.macros.upload.messages.errorUploadingContent + "\snStatus: "+request.status.statusText);\n }\n };\n request.setRequestHeader("Content-Length",data.length);\n request.setRequestHeader("Content-Type","multipart/form-data; boundary="+boundary);\n request.send(data); \n};\n\n\nconfig.macros.upload.download = function(uploadUrl, uploadToFilename, uploadDir, uploadBackupDir, \n username, password) {\n var request;\n try {\n request = new XMLHttpRequest();\n } \n catch (e) { \n request = new ActiveXObject("Msxml2.XMLHTTP"); \n }\n try {\n if (uploadUrl.substr(0,4) == "http") {\n netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");\n }\n else {\n netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");\n }\n } catch (e) { }\n //request.open("GET", document.location.toString(), true, username, password);\n try {\n request.open("GET", document.location.toString(), true);\n }\n catch(e) {\n alert(config.macros.upload.messages.crossDomain + "\snError:" +e);\n exit;\n }\n \n request.onreadystatechange = function () {\n if (request.readyState == 4) {\n if(request.status == 200) {\n config.macros.upload.uploadChangesFrom(request.responseText, uploadUrl, \n uploadToFilename, uploadDir, uploadBackupDir, username, password);\n }\n else\n alert(config.macros.upload.messages.errorDownloading.format(\n [document.location.toString()]) + "\snStatus: "+request.status.statusText);\n }\n };\n request.send(null);\n};\n\n//}}}\n////===\n\n////+++!![Initializations]\n\n//{{{\nconfig.lib.options.init('txtUploadStoreUrl','store.php');\nconfig.lib.options.init('txtUploadFilename','');\nconfig.lib.options.init('txtUploadDir','');\nconfig.lib.options.init('txtUploadBackupDir','');\nconfig.lib.options.init('txtUploadUserName',config.options.txtUserName);\nconfig.lib.options.init('pasUploadPassword','');\nsetStylesheet(\n ".pasOptionInput {width: 11em;}\sn"+\n ".txtOptionInput.txtUploadStoreUrl {width: 25em;}\sn"+\n ".txtOptionInput.txtUploadFilename {width: 25em;}\sn"+\n ".txtOptionInput.txtUploadDir {width: 25em;}\sn"+\n ".txtOptionInput.txtUploadBackupDir {width: 25em;}\sn"+\n "",\n "UploadOptionsStyles");\nif (document.location.toString().substr(0,4) == "http") {\n config.options.chkAutoSave = false; \n saveOptionCookie('chkAutoSave');\n}\nconfig.shadowTiddlers.UploadDoc = "[[Full Documentation|http://tiddlywiki.bidix.info/l#UploadDoc ]]\sn"; \n\n//}}}\n////===\n\n////+++!![Core Hijacking]\n\n//{{{\nconfig.macros.saveChanges.label_orig_UploadPlugin = config.macros.saveChanges.label;\nconfig.macros.saveChanges.label = config.macros.upload.label.saveToDisk;\n\nconfig.macros.saveChanges.handler_orig_UploadPlugin = config.macros.saveChanges.handler;\n\nconfig.macros.saveChanges.handler = function(place)\n{\n if ((!readOnly) && (document.location.toString().substr(0,4) != "http"))\n createTiddlyButton(place,this.label,this.prompt,this.onClick,null,null,this.accessKey);\n};\n\n//}}}\n////===\n
<<tiddler UploadDoc>>
/***\n|''Name:''|UploadPluginMsgEN|\n|''Description:''|English Translation|\n|''Date:''|Sep 20, 2006|\n|''Source:''|http://tiddlywiki.bidix.info/#UploadPluginMsgEN|\n|''Author:''|BidiX (BidiX (at) bidix (dot) info) with modifications by YannPerrin|\n|''License:''|[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D ]]|\n|''Include:''|none|\n|''Require:''|UploadPlugin 3.4.3|\n***/\n/***\n!Usage : \nFor an english translation of UploadPlugin Message when using PolyGlotPlugin, import this tiddler in the TiddlyWiki. Make sure it is tagged with {{{en}}} and {{{linguo}}}. \nComments and suggestions are welcome.\n***/\n//{{{\nconfig.macros.upload.messages = {\n aboutToUpload: "About to upload TiddlyWiki to %0",\n backupFileStored: "Previous file backuped in %0",\n crossDomain: "Certainly a cross-domain issue: access to an other site isn't allowed",\n errorDownloading: "Error downloading",\n errorUploadingContent: "Error uploading content",\n fileLocked: "Files is locked: You are not allowed to Upload",\n fileNotFound: "file to upload not found",\n fileNotUploaded: "File %0 NOT uploaded",\n mainFileUploaded: "Main TiddlyWiki file uploaded to %0",\n passwordEmpty: "Unable to upload, your password is empty",\n urlParamMissing: "url param missing",\n rssFileNotUploaded: "RssFile %0 NOT uploaded",\n rssFileUploaded: "Rss File uploaded to %0"\n};\n\nconfig.macros.upload.label = {\n promptOption: "Save and Upload this TiddlyWiki with UploadOptions",\n promptParamMacro: "Save and Upload this TiddlyWiki in %0",\n saveLabel: "save to web", \n saveToDisk: "save to disk",\n uploadLabel: "upload" \n};\n\nconfig.macros.saveChanges.label = config.macros.upload.label.saveToDisk;\n//}}}\n
/***\n|''Name:''|UploadPluginMsgFR|\n|''Description:''|French Translation|\n|''Date:''|Sep 20, 2006|\n|''Source:''|http://tiddlywiki.bidix.info/#UploadPluginMsgEN|\n|''Author:''|BidiX (BidiX (at) bidix (dot) info) with modifications by YannPerrin|\n|''License:''|[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D ]]|\n|''Include:''|none|\n|''Require:''|UploadPlugin 3.4.3|\n***/\n/***\n!Usage : \nFor a french translation of UploadPlugin Message when using PolyGlotPlugin, import this tiddler in the TiddlyWiki. Make sure it is tagged with {{{fr}}} and {{{linguo}}}. \nComments and suggestions are welcome.\n***/\n//{{{\nconfig.macros.upload.messages = {\n aboutToUpload: "Préparation du téléchargement le TiddlyWiki vers %0",\n backupFileStored: "Fichier précedent sauvegardé dans %0",\n crossDomain: "Certainement un problème d'accès cross-domaine: l'accès à un autre site n'est pas autorisé",\n errorDownloading: "Erreur de téléchargement de %0 depuis le serveur",\n errorUploadingContent: "Erreur de téléchargement vers le serveur du contenu",\n fileLocked: "Fichier est réservé: vous n'êtes pas autorisé à le mettre à jour",\n fileNotFound: "Fichier à télécharger vers le serveur non trouvé",\n fileNotUploaded: "Le fichier %0 N'A PAS été téléchargé vers le serveur",\n mainFileUploaded: "Le fichier TiddlyWiki a été téléchargé vers le serveur %0",\n passwordEmpty: "Impossible de télécharger, vous n'avez pas fourni de mot de passe.",\n urlParamMissing: "Paramètre URL manquant",\n rssFileNotUploaded: "Le fichier Rss %0 N'A PAS été téléchargé vers le serveur",\n rssFileUploaded: "Le fichier RSS a été téléchargé vers %0"\n};\n\nconfig.macros.upload.label = { \n promptOption: "Sauvegarde et télécharge ce TiddlyWiki avec les UploadOptions",\n promptParamMacro: "Sauvegarde et télécharge ce TiddlyWiki vers %0",\n saveLabel: "sauvegarde sur le web", \n saveToDisk: "sauvegarde sur le disque",\n uploadLabel: "Télécharge vers le web"\n};\n\nconfig.macros.saveChanges.label = config.macros.upload.label.saveToDisk;\n//}}}\n
/***\n|''Name:''|UploadToFileMacro|\n|''Description:''|Upload a tiddler as a file using UploadPlugin context. Used with the SimonBaird's RunMacroIfTagged in [[ViewTemplate|BidiXStyleViewTemplate]] provides a new command in the tiddler toolbar.|\n|''Version:''|1.0.0|\n|''Date:''|Mar 14, 2006|\n|''Source:''|http://tiddlywiki.bidix.info/#UploadToFileMacro|\n|''Documentation:''|http://tiddlywiki.bidix.info/#UploadToFileMacroDoc|\n|''Author:''|BidiX (BidiX (at) bidix (dot) info)|\n|''License:''|[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D ]]|\n|''~CoreVersion:''|2.0.0|\n|''Browser:''|Firefox 1.5; InternetExplorer 6.0; Safari|\n|''Include:''|none|\n|''Require:''|UploadPlugin|\n***/\n//{{{\nversion.extensions.UploadToFileMacro = {\n major: 1, minor: 0, revision: 0, \n date: new Date(2006,3,13),\n source: 'http://tiddlywiki.bidix.info/#UploadToFilePlugin',\n documentation: 'http://tiddlywiki.bidix.info/#UploadToFilePluginDoc',\n author: 'BidiX (BidiX (at) bidix (dot) info',\n license: '[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D]]',\n coreVersion: '2.0.0',\n browser: 'Firefox 1.5; InternetExplorer 6.0; Safari'\n};\n\nconfig.macros.uploadToFile = {\n label: "uploadToFile",\n prompt: "upload tiddler '%0' to file '%1' ",\n warning: "Are you sure you want to upload '%0'?",\n dirname: config.lib.file.dirname,\n basename: config.lib.file.dirname\n};\n\nconfig.macros.uploadToFile.messages = {\n fileUploaded: "tiddler '%0' uploaded to file '%1'",\n fileNotUploaded: "tiddler '%0' NOT uploaded"\n};\n\nconfig.macros.uploadToFile.handler = function(place, macroName, params, wikifier,paramString, tiddler) {\n // parameters initialization\n var toFilename = params[0];\n var tiddlerTitle = params[1];\n if (!tiddlerTitle) { \n tiddlerTitle = tiddler.title;\n } else {\n tiddler = store.getTiddler(tiddlerTitle);\n }\n if (!toFilename) { \n toFilename = tiddlerTitle;\n } \n var prompt = this.prompt.format([tiddlerTitle, toFilename]);\n createTiddlyButton(place, this.label, this.prompt.format([tiddlerTitle, toFilename]), \n function () {\n config.macros.uploadToFile.upload(tiddler, toFilename); \n return false;}, \n null, null, null);\n};\n\nconfig.macros.uploadToFile.upload = function(tiddler, toFilename, storeUrl, toFilename, uploadDir, backupDir, username, password) {\n var uploadIt = true; \n if (this.warning)\n uploadIt = confirm(this.warning.format([tiddler.title])); \n if (uploadIt) {\n if (!tiddler) {\n alert("Tiddler not found.");\n return;\n }\n if (!config.macros.upload.uploadContent) {\n alert ("no UploadPlugin extension");\n return;\n }\n // parameters initialization\n storeUrl = (storeUrl ? storeUrl : config.options.txtUploadStoreUrl);\n toFilename = (toFilename ? toFilename : tiddler.title);\n backupDir = (backupDir ? backupDir : config.options.txtUploadBackupDir);\n uploadDir = (uploadDir ? uploadDir : config.options.txtUploadDir);\n username = (username ? username : config.options.txtUploadUserName);\n password = (password ? password :config.options.pasUploadPassword); \n config.macros.upload.uploadContent(tiddler.text, storeUrl, toFilename, uploadDir, backupDir, username, password, \n function (responseText) {\n if (responseText.substring(0,1) != '0') {\n displayMessage(config.macros.uploadToFile.messages.fileNotUploaded.format([tiddler.title]));\n }\n else {\n if (uploadDir) {\n toFilename = uploadDir + "/" + config.macros.uploadToFile.basename(toFilename);\n } \n displayMessage(config.macros.uploadToFile.messages.fileUploaded.format(\n [tiddler.title, config.macros.uploadToFile.dirname(storeUrl)+"/"+toFilename]), config.macros.upload.dirname(storeUrl)+"/"+toFilename);\n }\n // for debugging store.php uncomment last line\n //DEBUG alert(responseText);\n });\n }\n return false;\n};\n\nconfig.shadowTiddlers.UploadToFileMacroDoc= "[[Full Documentation|http://tiddlywiki.bidix.info/l#UploadToFileMacroDoc]]\sn"; \n//}}}
//last update: UploadToFileMacro v 1.4.0//\n\n!Description\nUpload a tiddler as a file using UploadPlugin context. \n\nUsed with the SimonBaird's RunMacroIfTagged in [[ViewTemplate]] provides a new command in the tiddler toolbar.\n\n!Usage\n{{{\n <<uploadToFile>>\n <<uploadTofile [filename [tiddlerTitle]]>>\n \n tiddlerTitle: if omitted the title of the current tiddler \n filename: if omitted the title of the current tiddler\n\n}}}\n\n!Revision history\n* v1.0.0 (14/03/2006)\n** initial release\n
<<tiddlerList tags: clasifmadera,-etiquetasusuales format:"table" header:"Madera" >>\n<<tiddlerList tags: clasifmetal,-etiquetasusuales format:"table" header:"Metal" >>
<div class='toolbar' > <span macro='toolbar -closeTiddler closeOthers'></span></div>\n<div class='title' macro='view title'></div>\n\n\n\n\n<div class="viewer" macro="view text wikified"></div>\n\n<div class="tagglyTagged" macro="tags"></div>
\n<<formTiddler fichaPlantilla>>\n<data>{"tecnico":"José Luis González Castro","mes":"Febrero","año":"2007","lugar":"aula","notes":"Tascam HD-P2\snMicrófono AKG C414 B\sn\snAlgunos inicios y finales de notas están editados con fundidos para corregir el solapamiento con la voz durante la explicación. El intérprete tendía a \s"tirar de la nariz\s" inconscientemente al terminar cada pasaje.\sn","interprete":"David López"}</data>\n
\n|[img[viola|materiales/fotografías/viola.jpg]]|\n\n!Guía\n\nLa técnica de viola es básicamente la misma del violín; la principal diferencia es el tamaño del instrumento, que exige una mayor apertura de la mano. \n\n1.Ámbito: aproximadamente cuatro octavas desde el do escrito bajo la primera línea adicional en clave de do3. Hasta tres octavas (el do escrito dos líneas adicionales por encima del pentagrama en clave de sol), no hay problemas; la cuarta octava no suele utilizarse (en particular en orquesta): en esa tesitura resultan pasajes muy difíciles.\n+++[Ejemplo 1]...\n<<player id=1 quicktime materiales/grabaciones/viola/viola_1.wav 400 15>>\n===\n\n\n2. Afinación: las cuerdas al aire son do, sol, re y la.\n+++[Ejemplo 2]...\n<<player id=2 quicktime materiales/grabaciones/viola/viola_2.wav 400 15>>\n===\n\n\n3.Velocidad: tanta como alcanza el violín.\n+++[Ejemplo 3]...\n<<player id=3 quicktime materiales/grabaciones/viola/viola_3.wav 400 15>>\n===\n\n\n4.Golpes de arco y articulaciones: de nuevo, los mismo que en el violín.\n\nDetaché y martellé.\nEn ningún momento se saca el arco de la cuerda.\n+++[Ejemplo 4]...\n<<player id=4 quicktime materiales/grabaciones/viola/viola_4.wav 400 15>>\n===\n \n\nLegato.\nSpiccato (golpe de arco corto, uno para cada nota). El arco se separa de la cuerda.\nStaccato (golpe de arco corto, varias notas en un mismo arco). El arco no se separa de la cuerda: es como un martellé pequeñito en un mismo arco.\n+++[Ejemplo 5]...\n<<player id=5 quicktime materiales/grabaciones/viola/viola_5.wav 400 15>>\n===\n\n\n5.Trémolos.\n+++[Ejemplo 6]...\n<<player id=6 quicktime materiales/grabaciones/viola/viola_6.wav 400 15>>\n===\n\n\n6.Dinámicas:\nPianissimo.\nCrescendo/decresendo sobre una nota ("messa di voce").\n+++[Ejemplo 7]...\n<<player id=7 quicktime materiales/grabaciones/viola/viola_7.wav 400 15>>\n===\n\n\n7.Dobles cuerdas: en partes orquestales se opta por el divisi, pero sí son frecuentes a solo.\n+++[Ejemplo 8]...\n<<player id=8 quicktime materiales/grabaciones/viola/viola_8.wav 400 15>>\n===\n\n\nLas triples cuerdas o acordes se hacen partidos, salvo excepciones.\nEjemplo partiendo un acorde.\nAcorde partido y el mismo acorde entero.\nAcorde entero.\n+++[Ejemplo 9]...\n<<player id=9 quicktime materiales/grabaciones/viola/viola_9.wav 400 15>>\n===\n\n\n8.Glissandos.\n+++[Ejemplo 10]...\n<<player id=10 quicktime materiales/grabaciones/viola/viola_10.wav 400 15>>\n===\n\n\nSi un glissando sobrepasa la longitud de una cuerda, hay que partirlo necesariamente.\n+++[Ejemplo 11]...\n<<player id=13 quicktime materiales/grabaciones/viola/viola_13.wav 400 15>>\n===\n\n\n9.Posición del arco sobre el intrumento:\nSul tasto (sonido velado).\nSul ponticello.\n+++[Ejemplo 12]...\n<<player id=12 quicktime materiales/grabaciones/viola/viola_12.wav 400 15>>\n===\n\n\n10.Pizzicato.\n+++[Ejemplo 13]...\n<<player id=13 quicktime materiales/grabaciones/viola/viola_13.wav 400 15>>\n===\n\n\n11."Pizzicato Bartok", tirando de la cuerda (o pizzicato con sf).\n+++[Ejemplo 14]...\n<<player id=14 quicktime materiales/grabaciones/viola/viola_14.wav 400 15>>\n===\n\n\n11.Col legno (es decir, con la madera del arco).\n+++[Ejemplo 15]...\n<<player id=15 quicktime materiales/grabaciones/viola/viola_15.wav 400 15>>\n===\n\n\n12.Armónicos:\nNaturales.\nArtificiales (pisando la nota con un dedo y el armónico con otro). Son muy difíciles de tocar, más en la viola que en el violín o el violonchelo. La viola es un instrumento muy pequeño para la tesitura en que está, lo cual acarrea ciertas dificultades añadidas de interpretación.\n+++[Ejemplo 16]...\n<<player id=16 quicktime materiales/grabaciones/viola/viola_16.wav 400 15>>\n===\n\n\n13.Se puede hacer escordaturas, aunque no es una práctica habitual. Se hacen normalmente en la cuerda más grave.\nEl intérprete baja el do medio tono y a continuación toca una escala y acordes.\n+++[Ejemplo 17]...\n<<player id=17 quicktime materiales/grabaciones/viola/viola_17.wav 400 15>>\n===\n\n\n\n \n\n
\n<<formTiddler fichaPlantilla>>\n<data>{"tecnico":"José Luis González Castro","mes":"Mayo","año":"2007","lugar":"aula","notes":"Tascam HD-P2\snMicrófono Rode NT5\sn\snAlgunos inicios y finales de notas están editados con fundidos para corregir el solapamiento con la voz durante la explicación. ","interprete":"Rebeca Núñez Seijo, Ángel Blanco Tomé"}</data>\n
\n|[img[violonchelo|materiales/fotografías/violonchelo.jpg]]|\n\n!Guía\n\n1.Afinación:\n\nCuerdas al aire afinadas por quintas: do, sol, re y la.\n+++[Ejemplo 1]...\n<<player id=1 quicktime materiales/grabaciones/violonchelo/violonchelo_1.wav 400 15>>\n===\n\n\nLa distancia física entre notas implica dificultades de afinación cuando dos violonchelos tocan en homofonía. Por el mismo motivo el violonchelo no es un instrumento temperado; do# no es reb.\n\nLos arpegios presentan dificultades de afinación, en particular en pasajes rápidos.\n+++[Ejemplo 2]...\n<<player id=2 quicktime materiales/grabaciones/violonchelo/violonchelo_2.wav 400 15>>\n===\n\n\n2.Ámbito:\n\nLímite del instrumento en el agudo, tomando como referencia la primera cuerda.\n+++[Ejemplo 3]...\n<<player id=3 quicktime materiales/grabaciones/violonchelo/violonchelo_3.wav 400 15>>\n===\n\n\nEl sonido es en general uniforme en todo el registro; tiende a hacerse más brillante hacia el agudo, aunque esto depende también de otros fctores, como la posición del arco respecto del puente y la tastiera.\n\n3.Velocidad:\n\nPrueba de velocidad en una escala.\n+++[Ejemplo 4]...\n<<player id=4 quicktime materiales/grabaciones/violonchelo/violonchelo_4.wav 400 15>>\n===\n\n\nNo se suele tocar mucho más rápido que en el ejemplo.\n\n4.Golpes de arco y articulaciones: no hay peculiaridades significativas respecto del violín.\n\n5.Dinámicas:\n\nExiste una dificultad para mantener un sonido estable, sin temblores, al tocar pp.\n+++[Ejemplo 5]...\n<<player id=5 quicktime materiales/grabaciones/violonchelo/violonchelo_5.wav 400 15>>\n===\n\n\nEste defecto, no obstante, puede enmascararse utilizando el vibrato.\n+++[Ejemplo 6]...\n<<player id=6 quicktime materiales/grabaciones/violonchelo/violonchelo_6.wav 400 15>>\n===\n\n\nPrueba pp<ff>pp.\n+++[Ejemplo 7]...\n<<player id=7 quicktime materiales/grabaciones/violonchelo/violonchelo_7.wav 400 15>>\n===\n\n\n6.Vibrato:\n\nNota con vibrato añadido en crescendo; nota larga con poco vibrato; vibrato ancho, expresivo. \n+++[Ejemplo 8]...\n<<player id=8 quicktime materiales/grabaciones/violonchelo/violonchelo_8.wav 400 15>>\n===\n\n\nEl vibrato se puede modular dinámicamente durante la interpretación.\n\nEjemplo con vibrato abriéndose progresivamente.\n+++[Ejemplo 9]...\n<<player id=9 quicktime materiales/grabaciones/violonchelo/violonchelo_9.wav 400 15>>\n===\n\n\n7.Posición del arco:\n\nNota sul tasto; en posición intermedia; sul ponticello.\n+++[Ejemplo 10]...\n<<player id=10 quicktime materiales/grabaciones/violonchelo/violonchelo_10.wav 400 15>>\n===\n\n\nEn sforzandos se puede reforzar el efecto desplazando el arco desde sul tasto a sul ponticello.\n+++[Ejemplo 11]...\n<<player id=11 quicktime materiales/grabaciones/violonchelo/violonchelo_11.wav 400 15>>\n===\n\n\n8.Resistencia:\n\nPrueba de duración de una nota sin cortes (sin cambiar la dirección del arco).\n+++[Ejemplo 12]...\n<<player id=12 quicktime materiales/grabaciones/violonchelo/violonchelo_12.wav 400 15>>\n===\n\n\n8.Ataques:\n\nEl ataque con el talón consigue un acento más natural, aprovechando el peso del arco. Para conseguir un efecto similar atacando con la punta es necesario empujar más el arco.\n+++[Ejemplo 13]...\n<<player id=13 quicktime materiales/grabaciones/violonchelo/violonchelo_13.wav 400 15>>\n===\n\n\n9.Pizzicato, pizzicato en arpegio y Pizzicato Bartok, dejando que la cuerda vibre.\n+++[Ejemplo 14]...\n<<player id=14 quicktime materiales/grabaciones/violonchelo/violonchelo_14.wav 400 15>>\n===\n\n\n10.Armónicos:\n\nArmónicos naturales (los centrale de las cuerdas).\n+++[Ejemplo 15]...\n<<player id=15 quicktime materiales/grabaciones/violonchelo/violonchelo_15.wav 400 15>>\n===\n\n\nArmónicos artificiales, pisando una nota y clocando el otro dedo a una cuarta.\n+++[Ejemplo 16]...\n<<player id=16 quicktime materiales/grabaciones/violonchelo/violonchelo_16.wav 400 15>>\n===\n\n\n11.Dobles y triples cuerdas:\n\nLos problemas asociados siempre son de afinación; también dependen del intervalo, en función de cuánto haya que abrir la mano.\n+++[Ejemplo 17]...\n<<player id=17 quicktime materiales/grabaciones/violonchelo/violonchelo_17.wav 400 15>>\n===\n\n\nSalvo algunas excepciones, los acordes de más de dos notas se hacen partidos.\n\n12.Glissandos:\n\nSe puede hacer glissandos deslizados sin dificultad en toda la longitud de cada cuerda.\n+++[Ejemplo 18]...\n<<player id=18 quicktime materiales/grabaciones/violonchelo/violonchelo_18.wav 400 15>>\n===\n\n\n13.Col Legno; Col Legno Battuto.\n+++[Ejemplo 19]...\n<<player id=19 quicktime materiales/grabaciones/violonchelo/violonchelo_19.wav 400 15>>\n===\n\n\n\n\n\n\n
\n<<formTiddler fichaPlantilla>>\n<data>{"tecnico":"José Luis González Castro","mes":"Diciembre","año":"2006","lugar":"aula","notes":"ibook G3/600 con Protools\snMbox (modelo 2005)\snMicrófono AKG C414 B\sn\snAlgunos inicios y finales de notas están editados con fundidos para corregir el solapamiento con la voz durante la explicación.","interprete":"Leonardo Blanco"}</data>\n
\n|[img[violín|materiales/fotografías/violin.jpg]]|\n\n!Guía\n\n1.Detaché: golpe de arco básico; consiste en tocar sin ningún tipo de acentuación: "sonido limpio".\n\nEjemplos de Detaché en tres duraciones distintas, cuerdas al aire.\n+++[Ejemplo 1]...\n<<player id=1 quicktime materiales/grabaciones/violin/violin_1.wav 400 15>>\n===\n\n\n2.Martellé: consiste en acentuar el principio de la arcada y luego imprimir velocidad de arco.\n\nEjemplos de Martellé, con el arco completo y más corto.\n+++[Ejemplo 2]...\n<<player id=2 quicktime materiales/grabaciones/violin/violin_2.wav 400 15>>\n===\n\n\nEl Detaché siempre se utiliza; el Martellé se utiliza largo o corto según el tipo de obra. A partir de estos golpes de arco básicos hay muchos tipos de efectos.\n\n3.Dinámicas; Detaché, en un golpe de arco.\n+++[Ejemplo 3]...\n<<player id=3 quicktime materiales/grabaciones/violin/violin_3.wav 400 15>>\n===\n\n\n4.Pruebas de velocidad en escalas y arpegios.\n+++[Ejemplo 4]...\n<<player id=4 quicktime materiales/grabaciones/violin/violin_4.wav 400 15>>\n===\n\n\n5.Articulaciones:\n\nEscalas en Legato.\n+++[Ejemplo 5]...\n<<player id=5 quicktime materiales/grabaciones/violin/violin_5.wav 400 15>>\n===\n\n\nStaccatos en dos velocidades diferentes.\n+++[Ejemplo 6]...\n<<player id=6 quicktime materiales/grabaciones/violin/violin_6.wav 400 15>>\n===\n\n\nEscala de cuatro octavas en staccato, primero con grupos de ocho notas en un arco (dos repeticiones) y después todo entero en un golpe de arco (dos repeticiones).\n+++[Ejemplo 7]...\n<<player id=7 quicktime materiales/grabaciones/violin/violin_7.wav 400 15>>\n===\n\n\nStaccato volante: se aprovecha el rebote natural del arco, en series de varios rebotes para cada nota.\nDos, tres, cuatro, seis rebotes; rebotes indefinidos; efectos.\n+++[Ejemplo 8]...\n<<player id=8 quicktime materiales/grabaciones/violin/violin_8.wav 400 15>>\n===\n\n\nSaltillo: también se aprovecha el rebote natural del arco, nota a nota.\n+++[Ejemplo 9]...\n<<player id=9 quicktime materiales/grabaciones/violin/violin_9.wav 400 15>>\n===\n\n\nSpiccato: En comparación con el saltillo, en el spiccato el rebote está más controlado por los dedos.\n+++[Ejemplo 10]...\n<<player id=10 quicktime materiales/grabaciones/violin/violin_10.wav 400 15>>\n===\n\n\nSaltillo- Spiccato.\n+++[Ejemplo 11]...\n<<player id=11 quicktime materiales/grabaciones/violin/violin_11.wav 400 15>>\n===\n\n\nEjemplos de spiccato en una misma cuerda: Mendelsohn, concierto para violín.\n+++[Ejemplo 12]...\n<<player id=12 quicktime materiales/grabaciones/violin/violin_12.wav 400 15>>\n===\n\n\nAl spiccato hecho en un mismo golpe de arco también se le denomina spiccato volante.\n+++[Ejemplo 13]...\n<<player id=13 quicktime materiales/grabaciones/violin/violin_13.wav 400 15>>\n===\n\n\nEn la práctica es generalmente el intérprete quien decide qué articulación (staccato, saltillo, spiccato), en función del contexto.\n\nRicochet: Rebote de arco, cambiando de cuerda.\nTres ejemplos: en el tercero se muestra la forma de estudiar el efecto, comenzando en legato.\n+++[Ejemplo 14]...\n<<player id=14 quicktime materiales/grabaciones/violin/violin_14.wav 400 15>>\n===\n\n\nEjemplos de Ricochet en el concierto para violín de Mendelsohn.\n+++[Ejemplo 15]...\n<<player id=15 quicktime materiales/grabaciones/violin/violin_15.wav 400 15>>\n===\n\n\n6.Ataques: \n\nEl ataque desde el talón (arco abajo) da contundencia a la nota.\n+++[Ejemplo 16]...\n<<player id=16 quicktime materiales/grabaciones/violin/violin_16.wav 400 15>>\n===\n\n\nAtacando desde la punta también se puede conseguir ese efecto (pero es más conveniente hacerlo desde abajo).\n+++[Ejemplo 17]...\n<<player id=17 quicktime materiales/grabaciones/violin/violin_17.wav 400 15>>\n===\n\n\nLa misma nota, atacada desde el talón y desde la punta. Nótese la diferencia en los ataques.\n+++[Ejemplo 18]...\n<<player id=18 quicktime materiales/grabaciones/violin/violin_18.wav 400 15>>\n===\n\n\n7.Registro:\n\nSe puede alcanzar hasta un la o un si sobreagudo; el do casi no suena.\n+++[Ejemplo 19]...\n<<player id=19 quicktime materiales/grabaciones/violin/violin_19.wav 400 15>>\n===\n\n\n8.Glissandos: \n\nEl registro de cada cuerda es muy amplio, y mientras se permanezca en una misma cuerda se puede hacer glissandos continuos con comodidad.\n+++[Ejemplo 20]...\n<<player id=20 quicktime materiales/grabaciones/violin/violin_20.wav 400 15>>\n===\n\n\nNo obstante, si el glissando es muy amplio es necesario cambiar de cuerda y se producen cortes.\n+++[Ejemplo 21]...\n<<player id=21 quicktime materiales/grabaciones/violin/violin_21.wav 400 15>>\n===\n\n\nLos glissandos pueden hacerse a diferentes velocidades sin dificultad.\n+++[Ejemplo 22]...\n<<player id=22 quicktime materiales/grabaciones/violin/violin_22.wav 400 15>>\n===\n\n\n9.Vibrato:\n\nHay tres tipos básicos: de dedo, de muñeca y de brazo, que se aplican con mayor o menor intensidad o amplitud según el contexto. Cada violinista desarrolla su propio vibrato.\n\nCuatro series en diferentes velocidades e intensidades.\n+++[Ejemplo 23]...\n<<player id=23 quicktime materiales/grabaciones/violin/violin_23.wav 400 15>>\n===\n\n\n10.Posición del arco:\n\nDesde una posición central "neutra", el sonido gana armónicos al acercarse al puente y los pierde al acercarse a la tastiera.\n\nSin llegar a tocar sul ponticello, al acercarse al puente el sonido gana intensidad. Ejemplo: dos notas cerca de la tastiera, tres notas cerca del puente. El cambio de intensidad deriva en este ejemplo exclusivamente de la posición del arco.\n+++[Ejemplo 24]...\n<<player id=24 quicktime materiales/grabaciones/violin/violin_24.wav 400 15>>\n===\n\n\nAl tocar sul tasto, el sonido pierde armónicos, se hace más dulce. Ejemplo: mismo pasaje tocado primero sul tasto, luego en posición neutra.\n+++[Ejemplo 25]...\n<<player id=25 quicktime materiales/grabaciones/violin/violin_25.wav 400 15>>\n===\n\n\nMisma melodía en posición neutra y sul tasto.\n+++[Ejemplo 26]...\n<<player id=26 quicktime materiales/grabaciones/violin/violin_26.wav 400 15>>\n===\n\n\nPara conseguir el "efecto de piano", el violinista no sólo varía la posición del arco; también puede optar por utilizar menos crines, inclinando ligeramente el arco. \n+++[Ejemplo 27]...\n<<player id=27 quicktime materiales/grabaciones/violin/violin_27.wav 400 15>>\n===\n\n\nLa reducción de armónicos que provoca el acercarse a la tastiera no siempre es conveniente; en particular, cuando el violín es solista junto a otros instrumentos, es preferible buscar el "efecto piano" tocando con menos crines en una posición más bien central, proyectando el sonido adecuadamente, antes que acercarse mucho a la tastiera y arriesgarse a crear un sonido vacío.\n\nSe puede indicar sul tasto en otras intensidades como efecto de color: el violinista compensa la disminución natural de intensidad haciendo más presión.\n+++[Ejemplo 28]...\n<<player id=28 quicktime materiales/grabaciones/violin/violin_28.wav 400 15>>\n===\n\n\nAl tocar sul ponticello el sonido gana armónicos; para conseguir el efecto el instrumentista tiene que hacer menos presión.\nNotas en posición neutra y sul ponticello; efectos sul ponticello.\n+++[Ejemplo 29]...\n<<player id=29 quicktime materiales/grabaciones/violin/violin_29.wav 400 15>>\n===\n\n\nMás ejemplos sul ponticello.\n+++[Ejemplo 30]...\n<<player id=30 quicktime materiales/grabaciones/violin/violin_30.wav 400 15>>\n===\n\n\nTambién es posible tocar detrás del puente.\n+++[Ejemplo 31]...\n<<player id=31 quicktime materiales/grabaciones/violin/violin_31.wav 400 15>>\n===\n\n\n11.Pizzicatos:\n\nPizzicato básico.\n+++[Ejemplo 32]...\n<<player id=32 quicktime materiales/grabaciones/violin/violin_32.wav 400 15>>\n===\n\n\nMás forte, como en Prokofiev (concierto para violín nº1).\n+++[Ejemplo 33]...\n<<player id=33 quicktime materiales/grabaciones/violin/violin_33.wav 400 15>>\n===\n\n\nMás fuerte aún, intentando que la cuerda vibre en la tastiera: Pizzicato Bartok.\n+++[Ejemplo 34]...\n<<player id=34 quicktime materiales/grabaciones/violin/violin_34.wav 400 15>>\n===\n\n\n12.Arpegios con pizzicato, "rasgueando":\n\nSin arco: Falla (Danzas españolas).\nMismo ejemplo, con arco.\nOtro ejemplo con pizzcato, tomado de Boccherini.\n+++[Ejemplo 35]...\n<<player id=35 quicktime materiales/grabaciones/violin/violin_35.wav 400 15>>\n===\n\n\n13.Armónicos:\n\nEscala en armónicos.\n+++[Ejemplo 36]...\n<<player id=36 quicktime materiales/grabaciones/violin/violin_36.wav 400 15>>\n===\n\n\nDobles armónicos. Son muy difíciles de hacer.\n+++[Ejemplo 37]...\n<<player id=37 quicktime materiales/grabaciones/violin/violin_37.wav 400 15>>\n===\n\n\nLos armónicos naturales se consiguen con solo dedo, colocado sobre los distintos nodos de la cuerda, sin pisarla.\n+++[Ejemplo 38]...\n<<player id=38 quicktime materiales/grabaciones/violin/violin_38.wav 400 15>>\n===\n\n\nLos Armónicos artificiales se consiguen con dos dedos: uno pisa la cuerda y otro crea el armónico a distancia de cuarta o quinta.\n+++[Ejemplo 39]...\n<<player id=39 quicktime materiales/grabaciones/violin/violin_39.wav 400 15>>\n===\n\n\n14.Los instrumentos de cuerda no están temperados: un do# no es un reb.\nDo# -Reb en contexto.\nDo# e inmediatamente a continuación, Reb.\n+++[Ejemplo 40]...\n<<player id=40 quicktime materiales/grabaciones/violin/violin_40.wav 400 15>>\n===\n\n\nEn ciertas ocasiones los instrumentistas enarmonizan (lo cual les facilita la realización de ciertos pasajes), pero en general tenderán a hacer do# más brillante que reb. \n\n\n
/***\n|''Name:''|WikiBar|\n|''Version:''|2.0.0 beta3|\n|''Source:''|[[AiddlyWiki|http://aiddlywiki.sourceforge.net]]|\n|''Author:''|[[Arphen Lin|mailto:arphenlin@gmail.com]]|\n|''Type:''|toolbar macro command extension|\n|''Required:''|TiddlyWiki 2.0.0 beta6|\n!Description\nWikiBar is a toolbar that gives access to most of TiddlyWiki's formatting features with a few clicks. It's a handy tool for people who are not familiar with TiddlyWiki syntax.\nBesides, with WikiBar-addons, users can extend the power of WikiBar.\n!Support browser\n*Firefox 1.5\n!Revision history\n*v2.0.0 beta3 (2005/12/30)\n** remove macros (replaced by TWMacro addon)\n** add wikibar command in toolbar automatically\n** rename DOIT to HANDLER\n** rename TIP to TOOLTIP\n*v2.0.0 beta2 (2005/12/21)\n** re-design Wikibar addon framework\n*v2.0.0 beta1 (2005/12/14)\n** Note:\n*** WikiBarPlugin is renamed to WikiBar\n** New Features:\n*** support TiddlyWiki 2.0.0 template mechanism\n*** new wikibar data structure\n*** new wikibar-addon framework for developers\n**** support dynamic popup menu generator\n*** support most new macros added in TiddlyWiki 2.0.0\n*** multi-level popup menu\n*** fix wikibar tab stop\n*** remove paletteSelector\n** Known Bugs:\n*** popup-menu and color-picker can't be closed correctly\n*** some macros can't be displayed correctly in previewer\n*** text in previewer will be displayed italic\n*v1.2.0 (2005/11/21)\n**New Features:\n***User defined color palettes supported\n####Get color palettes from [[ColorZilla Palettes|http://www.iosart.com/firefox/colorzilla/palettes.html]].\n####Save the palette file(*.gpl) as a new tiddler and tag it with 'ColorPalettes', then you can use it in WikiBar.\n***WikiBar style sheet supported\n***Click on document to close current colorPicker, paletteSelector or aboutWikibar\n*v1.1.1 (2005/11/03)\n**Bugs fixed:\n***'Not enough parameters!' message is displayed when the parameter includes '%+number', ex: 'hello%20world!'\n*v1.1.0 (2005/11/01)\n**Bugs fixed:\n***WikiBar overruns (reported by by GeoffS <gslocock@yahoo.co.uk>)\n**New features:\n***Insert a color code at the cursor. (Thanks to RunningUtes <RunningUtes@gmail.com>)\n***Enable gradient macro. (Thanks to RunningUtes <RunningUtes@gmail.com>)\n***Insert tiddler comment tags {{{/% ... %/}}}. (new feature supported by TiddlyWiki 1.2.37)\n***Insert DateFormatString for {{{<<today>>}}} macro. (new feature supported by TiddlyWiki 1.2.37)\n**Enhanced:\n***Allow optional parameters in syntax.\n**Bugs:\n***'Not enough parameters!' message is displayed when the parameter includes '%+number', ex: 'hello%20world!'\n*v1.0.0 (2005/10/30)\n**Initial release\n!Code\n***/\n//{{{\nconfig.macros.wikibar = {major: 2, minor: 0, revision: 0, beta: 3, date: new Date(2005,12,30)};\nconfig.macros.wikibar.handler = function(place,macroName,params,wikifier,paramString,tiddler){\n if(!(tiddler instanceof Tiddler)) {return;}\n story.setDirty(tiddler.title,true);\n place.id = 'wikibar'+tiddler.title;\n place.className = 'toolbar wikibar';\n};\nfunction wikibar_install(){\n config.commands.wikibar = {\n text: 'wikibar',\n tooltip: 'wikibar on/off',\n handler: function(e,src,title) {\n if(!e){ e = window.event; }\n var theButton = resolveTarget(e);\n theButton.id = 'wikibarButton'+title;\n wikibarPopup.remove();\n wikibar_installAddons(theButton, title);\n wikibar_createWikibar(title);\n return(false);\n }\n };\n config.shadowTiddlers['EditTemplate'] = wikibar_addWikibarCommand(config.shadowTiddlers['EditTemplate']);\n var tiddler = store.getTiddler('EditTemplate');\n if(tiddler){\n tiddler.text = wikibar_addWikibarCommand(tiddler.text);\n }\n}\nfunction wikibar_installAddons(theButton, title){\n var tiddlers = store.getTaggedTiddlers('wikibarAddons');\n if(!tiddlers) { return; }\n theButton.addons=[];\n for(var i=0; i<tiddlers.length; i++){\n try{\n eval(tiddlers[i].text);\n try{\n wikibar_addonInstall(title);\n wikibar_addonInstall = null;\n theButton.addons.push({ok:true, name:tiddlers[i].title});\n }catch(ex){\n theButton.addons.push({ok:false, name:tiddlers[i].title, error:ex});\n }\n }catch(ex){\n theButton.addons.push({ok:false, name:tiddlers[i].title, error:ex});\n }\n }\n}\nfunction wikibar_addWikibarCommand(tiddlerText){\n var div = document.createElement('div');\n div.style.display = 'none';\n div.innerHTML = tiddlerText;\n for(var i=0; i<div.childNodes.length; i++){\n var o=div.childNodes[i];\n if(o.tagName==='DIV'){\n if(o.className=='toolbar'){\n var macroText = o.getAttribute('macro').trim();\n if(macroText.search('wikibar')<=0){\n macroText += ' wikibar';\n o.setAttribute('macro', macroText);\n }\n break;\n }\n }\n }\n return div.innerHTML.replace(/\s"/g, "\s'");\n}\nfunction wikibar_processSyntaxParams(theSyntax, params){\n try{\n var pcr = 'AplWikibarPcr';\n var rx=null;\n var allParams=null;\n if(params){\n if(typeof(params)=='object'){\n for(var i=0; i<params.length; i++){\n if(params[i]){\n params[i] = params[i].replace(new RegExp('%','g'), pcr).trim();\n rx = '(\s\s[%'+(i+1)+'\s\s])' + '|' + '(%'+(i+1)+')';\n theSyntax = theSyntax.replace(new RegExp(rx,'g'), params[i] );\n }\n }\n allParams = params.join(' ').trim();\n }else{\n allParams = params.replace(new RegExp('%','g'), pcr).trim();\n rx = /(\s[%1{1}\s])|(%1{1})/g;\n theSyntax = theSyntax.replace(rx, allParams);\n }\n }\n if(allParams){\n theSyntax = theSyntax.replace(new RegExp('%N{1}','g'), allParams);\n }\n rx=/\s[%(([1-9]{1,}[0-9]{0,})|(N{1}))\s]/g;\n theSyntax = theSyntax.replace(rx, '');\n rx=/%(([1-9]{1,}[0-9]{0,})|(N{1}))/g;\n if( theSyntax.match(rx) ){\n throw 'Not enough parameters! ' + theSyntax;\n }\n theSyntax=theSyntax.replace(new RegExp(pcr,'g'), '%');\n return theSyntax;\n } catch(ex){\n return null;\n }\n}\nfunction wikibar_resolveEditItem(tiddlerWrapper, itemName){\n if(tiddlerWrapper.hasChildNodes()){\n var c=tiddlerWrapper.childNodes;\n for(var i=0; i<c.length; i++){\n var txt=wikibar_resolveEditItem(c[i], itemName);\n if(!txt){\n continue;\n }else{\n return txt;\n }\n }\n }\n return ((tiddlerWrapper.getAttribute && tiddlerWrapper.getAttribute('edit')==itemName)? tiddlerWrapper : null);\n}\nfunction wikibar_resolveEditItemValue(tiddlerWrapper, itemName){\n var o = wikibar_resolveEditItem(tiddlerWrapper, itemName);\n return (o? o.value.replace(/\sr/mg,'') : null);\n}\nfunction wikibar_resolveTiddlerEditorWrapper(obj){\n if(obj.id=='tiddlerDisplay'){return null;}\n if((obj.getAttribute && obj.getAttribute('macro')=='edit text')){return obj;}\n return wikibar_resolveTiddlerEditorWrapper(obj.parentNode);\n}\nfunction wikibar_resolveTiddlerEditor(obj){\n if(obj.hasChildNodes()){\n var c = obj.childNodes;\n for(var i=0; i<c.length; i++){\n var o=wikibar_resolveTiddlerEditor(c[i]);\n if(o){ return o;}\n }\n }\n return ((obj.getAttribute && obj.getAttribute('edit')=='text')? obj : null);\n}\nfunction wikibar_resolveTargetButton(obj){\n if(obj.id && obj.id.substring(0,7)=='wikibar'){ return null; }\n if(obj.tiddlerTitle){\n return obj;\n }else{\n return wikibar_resolveTargetButton(obj.parentNode);\n }\n}\nfunction wikibar_isValidMenuItem(tool){\n if(!tool){ return false; }\n if(tool.TYPE=='MENU' || tool.TYPE=='MAIN_MENU'){\n for(var key in tool){\n if(key.substring(0,8)=='DYNAITEM'){ return true; }\n if(wikibar_isValidMenuItem(tool[key])){ return true; }\n }\n return false;\n }else{\n return (tool.HANDLER? true : false);\n }\n}\nfunction wikibar_editFormat(param){\n var editor = param.button.editor;\n var params = param.params;\n clearMessage();\n if(!editor){ return; }\n var repText = wikibar_processSyntaxParams(this.syntax, params);\n if(repText===null){ return; }\n var st = editor.scrollTop;\n var ss = editor.selectionStart;\n var se = editor.selectionEnd;\n var frontText= '';\n var endText = '';\n var fullText = editor.value;\n if(se>ss && ss>=0){\n frontText = fullText.substring(0, ss);\n endText = fullText.substring(se, fullText.length);\n }\n else if(ss===0 && (se===0 || se == fullText.length) ){\n endText = fullText;\n }\n else if(se==ss && ss>0){\n frontText = fullText.substring(0, ss);\n endText = fullText.substring(se, fullText.length);\n }\n if(repText.indexOf('user_text')>=0 && this.hint){\n repText = repText.replace('user_text', this.hint);\n }\n editor.value = frontText + repText + endText;\n editor.selectionStart = ss;\n editor.selectionEnd = ss + repText.length;\n editor.scrollTop = st;\n editor.focus();\n}\nfunction wikibar_editFormatByWord(param){\n var editor = param.button.editor;\n var params = param.params;\n clearMessage();\n if(!editor){return;}\n var repText = wikibar_processSyntaxParams(this.syntax, params);\n if(repText===null){ return; }\n var st = editor.scrollTop;\n var ss = editor.selectionStart;\n var se = editor.selectionEnd;\n var frontText= '';\n var selText = '';\n var endText = '';\n var fullText = editor.value;\n if(se>ss && ss>=0){\n frontText = fullText.substring(0, ss);\n selText = fullText.substring(ss,se);\n endText = fullText.substring(se, fullText.length);\n }\n else if(ss===0 && (se===0 || se == fullText.length) ){\n endText = fullText;\n }\n else if(se==ss && ss>0){\n frontText = fullText.substring(0, ss);\n endText = fullText.substring(se, fullText.length);\n if(!( fullText.charAt(ss-1).match(/\sW/gi) || fullText.charAt(ss).match(/\sW/gi) )){\n var m = frontText.match(/\sW/gi);\n if(m){\n ss = frontText.lastIndexOf(m[m.length-1])+1;\n }\n else{\n ss = 0;\n }\n m = endText.match(/\sW/gi);\n if(m){\n se += endText.indexOf(m[0]);\n }\n else{\n se = fullText.length;\n }\n frontText = fullText.substring(0, ss);\n endText = fullText.substring(se, fullText.length);\n selText = fullText.substring(ss,se);\n }\n }\n if(selText.length>0){\n repText = repText.replace('user_text', selText);\n }\n if(repText.indexOf('user_text')>=0 && this.hint){\n repText = repText.replace('user_text', this.hint);\n }\n editor.value = frontText + repText + endText;\n editor.selectionStart = ss;\n editor.selectionEnd = ss + repText.length;\n editor.scrollTop = st;\n editor.focus();\n}\nfunction wikibar_editFormatByCursor(param){\n var editor = param.button.editor;\n var params = param.params;\n clearMessage();\n if(!editor){ return; }\n var repText = wikibar_processSyntaxParams(this.syntax, params);\n if(repText===null){ return; }\n var st = editor.scrollTop;\n var ss = editor.selectionStart;\n var se = editor.selectionEnd;\n var frontText= '';\n var endText = '';\n var fullText = editor.value;\n if(se>ss && ss>=0){\n frontText = fullText.substring(0, ss);\n endText = fullText.substring(se, fullText.length);\n }\n else if(ss===0 && (se===0 || se == fullText.length) ){\n endText = fullText;\n }\n else if(se==ss && ss>0){\n frontText = fullText.substring(0, ss);\n endText = fullText.substring(se, fullText.length);\n }\n if(repText.indexOf('user_text')>=0 && this.hint){\n repText = repText.replace('user_text', this.hint);\n }\n editor.value = frontText + repText + endText;\n editor.selectionStart = ss;\n editor.selectionEnd = ss + repText.length;\n editor.scrollTop = st;\n editor.focus();\n}\nfunction wikibar_editFormatByLine(param){\n var editor = param.button.editor;\n var params = param.params;\n clearMessage();\n if(!editor){ return; }\n var repText = wikibar_processSyntaxParams(this.syntax, params);\n if(repText===null){ return; }\n var st = editor.scrollTop;\n var ss = editor.selectionStart;\n var se = editor.selectionEnd;\n var frontText= '';\n var selText = '';\n var endText = '';\n var fullText = editor.value;\n if(se>ss && ss>=0){\n if(this.byBlock){\n frontText = fullText.substring(0, ss);\n selText = fullText.substring(ss,se);\n endText = fullText.substring(se, fullText.length);\n }\n else{\n se = ss;\n }\n }\n if(ss===0 && (se===0 || se == fullText.length) ){\n var m=fullText.match(/(\sn|\sr)/g);\n if(m){\n se = fullText.indexOf(m[0]);\n }else{\n se = fullText.length;\n }\n selText = fullText.substring(0, se);\n endText = fullText.substring(se, fullText.length);\n }\n else if(se==ss && ss>0){\n frontText = fullText.substring(0, ss);\n endText = fullText.substring(se, fullText.length);\n m = frontText.match(/(\sn|\sr)/g);\n if(m){\n ss = frontText.lastIndexOf(m[m.length-1])+1;\n }\n else{\n ss = 0;\n }\n m = endText.match(/(\sn|\sr)/g);\n if(m){\n se += endText.indexOf(m[0]);\n }\n else{\n se = fullText.length;\n }\n frontText = fullText.substring(0, ss);\n selText = fullText.substring(ss,se);\n endText = fullText.substring(se, fullText.length);\n }\n if(selText.length>0){\n repText = repText.replace('user_text', selText);\n }\n if(repText.indexOf('user_text')>=0 && this.hint){\n repText = repText.replace('user_text', this.hint);\n }\n if(this.byBlock){\n if( (frontText.charAt(frontText.length-1)!='\sn') && ss>0 ){\n repText = '\sn' + repText;\n }\n if( (endText.charAt(0)!='\sn') || se==fullText.length){\n repText += '\sn';\n }\n }\n editor.value = frontText + repText + endText;\n editor.selectionStart = ss;\n editor.selectionEnd = ss + repText.length;\n editor.scrollTop = st;\n editor.focus();\n}\nfunction wikibar_editFormatByTableCell(param){\n var editor = param.button.editor;\n var params = param.params;\n clearMessage();\n if(!editor){ return; }\n var repText = wikibar_processSyntaxParams(this.syntax, params);\n if(repText===null){ return; }\n var st = editor.scrollTop;\n var ss = editor.selectionStart;\n var se = editor.selectionEnd;\n var frontText= '';\n var selText = '';\n var endText = '';\n var fullText = editor.value;\n if(ss===0 || ss==fullText.length){\n throw 'not valid cell!';\n }\n se=ss;\n frontText = fullText.substring(0, ss);\n endText = fullText.substring(se, fullText.length);\n i=frontText.lastIndexOf('\sn');\n j=frontText.lastIndexOf('|');\n if(i>j || j<0){\n throw 'not valid cell!';\n }\n ss = j+1;\n i=endText.indexOf('\sn');\n j=endText.indexOf('|');\n if(i<j || j<0){\n throw 'not valid cell!';\n }\n se += j;\n frontText = fullText.substring(0, ss-1);\n selText = fullText.substring(ss,se);\n endText = fullText.substring(se+1, fullText.length);\n if(this.key.substring(0,5)=='align'){\n selText = selText.trim();\n if( selText=='>' || selText=='~' || selText.substring(0,8)=='bgcolor(') {return; }\n }\n if(selText.length>0){\n repText = repText.replace('user_text', selText);\n }\n if(repText.indexOf('user_text')>=0 && this.hint){\n repText = repText.replace('user_text', this.hint);\n }\n editor.value = frontText + repText + endText;\n editor.selectionStart = ss;\n editor.selectionEnd = ss + repText.length - 2;\n editor.scrollTop = st;\n editor.focus();\n}\nfunction wikibar_editSelectAll(param){\n var editor = param.button.editor;\n editor.selectionStart = 0;\n editor.selectionEnd = editor.value.length;\n editor.scrollTop = 0;\n editor.focus();\n}\nfunction wikibar_doPreview(param){\n var theButton = param.button;\n var editor = param.button.editor;\n var wikibar = theButton.parentNode;\n if(!wikibar) { return; }\n title = theButton.tiddlerTitle;\n var editorWrapper = wikibar_resolveTiddlerEditorWrapper(editor);\n var tiddlerWrapper = editorWrapper.parentNode;\n var previewer = document.getElementById('previewer'+title);\n if(previewer){\n previewer.parentNode.removeChild(previewer);\n editorWrapper.style.display = 'block';\n visible=true;\n }else{\n previewer = document.createElement('div');\n previewer.id = 'previewer'+title;\n previewer.className = 'viewer previewer';\n previewer.style.height = (editor.offsetHeight) + 'px';\n wikify(editor.value, previewer);\n tiddlerWrapper.insertBefore(previewer, editorWrapper);\n editorWrapper.style.display = 'none';\n visible=false;\n }\n var pv=null;\n for(var i=0; i<wikibar.childNodes.length; i++){\n try{\n var btn = wikibar.childNodes[i];\n if(btn.toolItem.key == 'preview'){ pv=btn; }\n if(btn.toolItem.key != 'preview'){\n btn.style.display = visible ? '': 'none';\n }\n }catch(ex){}\n }\n if(!pv) { return; }\n if(visible){\n pv.innerHTML = '<font face=\s"verdana\s">&infin;</font>';\n pv.title = 'preview current tiddler';\n }\n else{\n pv.innerHTML = '<font face=\s"verdana\s">&larr;</font>';\n pv.title = 'back to editor';\n }\n}\nfunction wikibar_doListAddons(param){\n clearMessage();\n var title = param.button.tiddlerTitle;\n var wikibarButton = document.getElementById('wikibarButton'+title);\n var ok=0, fail=0;\n for(var i=0; i<wikibarButton.addons.length; i++){\n var addon=wikibarButton.addons[i];\n if(addon.ok){\n displayMessage('[ o ] '+addon.name);\n ok++;\n }\n else{\n displayMessage('[ x ] '+addon.name + ': ' + addon.error);\n fail++;\n }\n }\n displayMessage('---------------------------------');\n displayMessage(ok + ' ok ; ' + fail + ' failed');\n}\nfunction wikibar_getColorCode(param){\n var cbOnPickColor = function(colorCode, param){\n param.params = colorCode;\n param.button.toolItem.doMore(param);\n };\n wikibarColorTool.openColorPicker(param.button, cbOnPickColor, param);\n}\nfunction wikibar_getLinkUrl(param){\n var url= prompt('Please enter the link target', (this.param? this.param : ''));\n if (url && url.trim().length>0){\n param.params = url;\n this.doMore(param);\n }\n}\nfunction wikibar_getTableRowCol(param){\n var rc= prompt('Please enter (rows x cols) of the table', '2 x 3');\n if (!rc || (rc.trim()).length<=0){ return; }\n var arr = rc.toUpperCase().split('X');\n if(arr.length != 2) { return; }\n for(var i=0; i<arr.length; i++){\n if(isNaN(arr[i].trim())) { return; }\n }\n var rows = parseInt(arr[0].trim(), 10);\n var cols = parseInt(arr[1].trim(), 10);\n var txtTable='';\n for(var r=0; r<rows; r++){\n for(var c=0; c<=cols; c++){\n if(c===0){\n txtTable += '|';\n }else{\n txtTable += ' |';\n }\n }\n txtTable += '\sn';\n }\n if(txtTable.trim().length>0){\n param.params = txtTable.trim();\n this.doMore(param);\n }\n}\nfunction wikibar_getMacroParam(param){\n var p = prompt('Please enter the parameters of macro \s"' + this.key + '\s":' +\n '\snSyntax: ' + this.syntax +\n '\sn\snNote: '+\n '\sn%1,%2,... - parameter needed'+\n '\sn[%1] - optional parameter'+\n '\sn%N - more than one parameter(1~n)'+\n '\sn[%N] - any number of parameters(0~n)'+\n '\sn\snPS:'+\n '\sn1. Parameters should be seperated with space character'+\n '\sn2. Use \s" to wrap the parameter that includes space character, ex: \s"hello world\s"'+\n '\sn3. Input the word(null) for the optional parameter ignored',\n (this.param? this.param : '') );\n if(!p) { return; }\n p=p.readMacroParams();\n for(var i=0; i<p.length; i++){\n var s=p[i].trim();\n if(s.indexOf(' ')>0){ p[i]="'"+s+"'"; }\n if(s.toLowerCase()=='null'){ p[i]=null; }\n }\n param.params = p;\n this.doMore(param);\n}\nfunction wikibar_getMorePalette(unused){\n clearMessage();\n displayMessage('Get more color palettes(*.gpl) from ColorZilla Palettes site', 'http:\s/\s/www.iosart.com/firefox/colorzilla/palettes.html');\n displayMessage('Save it as a new tiddler with \s"ColorPalettes\s" tag');\n}\nfunction wikibar_createWikibar(title){\n var theWikibar = document.getElementById('wikibar' + title);\n if(theWikibar){\n if(theWikibar.hasChildNodes()){\n theWikibar.style.display = (theWikibar.style.display=='block'? 'none':'block');\n return;\n }\n }\n var tiddlerWrapper = document.getElementById('tiddler'+title);\n var theTextarea = wikibar_resolveTiddlerEditor(tiddlerWrapper);\n if(!theTextarea){\n clearMessage();\n displayMessage('WikiBar only works in tiddler edit mode now');\n return;\n }else{\n if(!theTextarea.id){ theTextarea.id = 'editor'+title; }\n if(!theTextarea.parentNode.id){ theTextarea.parentNode.id='editorWrapper'+title; }\n }\n if(theWikibar){\n theWikibar = document.getElementById('wikibar'+title);\n }else{\n var editorWrapper = wikibar_resolveTiddlerEditorWrapper(theTextarea);\n theWikibar = createTiddlyElement(tiddlerWrapper, 'div', 'wikibar'+title, 'toolbar');\n addClass(theWikibar, 'wikibar');\n var previewer = document.getElementById('previewer'+title);\n if(previewer){\n tiddlerWrapper.insertBefore(theWikibar, previewer);\n }else{\n tiddlerWrapper.insertBefore(theWikibar, editorWrapper);\n }\n }\n wikibar_createMenu(theWikibar,wikibarStore,title,theTextarea);\n if(config.options['chkWikibarSetEditorHeight'] && config.options['txtWikibarEditorRows']){\n theTextarea.rows = config.options['txtWikibarEditorRows'];\n }\n setStylesheet(\n '.wikibar{text-align:left;visibility:visible;margin:2px;padding:1px;}.previewer{overflow:auto;display:block;border:1px solid;}#colorPicker{position:absolute;display:none;z-index:10;margin:0px;padding:0px;}#colorPicker table{margin:0px;padding:0px;border:2px solid #000;border-spacing:0px;border-collapse:collapse;}#colorPicker td{margin:0px;padding:0px;border:1px solid;font-size:11px;text-align:center;cursor:auto;}#colorPicker .header{background-color:#fff;}#colorPicker .button{background-color:#fff;cursor:pointer;cursor:hand;}#colorPicker .button:hover{padding-top:3px;padding-bottom:3px;color:#fff;background-color:#136;}#colorPicker .cell{padding:4px;font-size:7px;cursor:crosshair;}#colorPicker .cell:hover{padding:10px;}.wikibarPopup{position:absolute;z-index:10;border:1px solid #014;color:#014;background-color:#cef;}.wikibarPopup table{margin:0;padding:0;border:0;border-spacing:0;border-collapse:collapse;}.wikibarPopup .button:hover{color:#eee;background-color:#014;}.wikibarPopup .disabled{color:#888;}.wikibarPopup .disabled:hover{color:#888;background-color:#cef;}.wikibarPopup tr .seperator hr{margin:0;padding:0;background-color:#cef;width:100%;border:0;border-top:1px dashed #014;}.wikibarPopup tr .icon{font-family:verdana;font-weight:bolder;}.wikibarPopup tr .marker{font-family:verdana;font-weight:bolder;}.wikibarPopup td{font-size:0.9em;padding:2px;}.wikibarPopup input{border:0;border-bottom:1px solid #014;margin:0;padding:0;font-family:arial;font-size:100%;background-color:#fff;}',\n 'WikiBarStyleSheet');\n}\nfunction wikibar_createMenu(place,toolset,title,editor){\n if(!wikibar_isValidMenuItem(toolset)){return;}\n if(!(toolset.TYPE=='MAIN_MENU' || toolset.TYPE=='MENU')){ return; }\n for(var key in toolset){\n if(key.substring(0,9)=='SEPERATOR'){\n wikibar_createMenuSeperator(place);\n continue;\n }\n if(key.substring(0,8)=='DYNAITEM'){\n var dynaTools = toolset[key](title,editor);\n if(dynaTools.TYPE && dynaTools.TYPE=='MENU'){\n wikibar_createMenuItem(place,dynaTools,null,editor,title);\n }else{\n dynaTools.TYPE = 'MENU';\n wikibar_createMenu(place, dynaTools, title, editor);\n }\n continue;\n }\n if((toolset[key].TYPE!='MENU' && toolset[key].TYPE!='MAIN_MENU') && !toolset[key].HANDLER){continue;}\n wikibar_createMenuItem(place,toolset,key,editor,title);\n }\n}\nfunction wikibar_createMenuItem(place,toolset,key,editor,title){\n if(!key){\n var tool = toolset;\n }else{\n tool = toolset[key];\n tool.key = key;\n }\n if(!wikibar_isValidMenuItem(tool)){return;}\n var toolIsOnMainMenu = (toolset.TYPE=='MAIN_MENU');\n var toolIsMenu = (tool.TYPE=='MENU');\n var theButton;\n if(toolIsOnMainMenu){\n theButton = createTiddlyButton(\n place,\n '',\n (tool.TOOLTIP? tool.TOOLTIP : ''),\n (toolIsMenu? wikibar_onClickMenuItem : wikibar_onClickItem),\n 'button');\n theButton.innerHTML = (tool.CAPTION? tool.CAPTION : key);\n theButton.isOnMainMenu = true;\n addClass(theButton, (toolIsMenu? 'menu' : 'item'));\n place.appendChild( document.createTextNode('\sn') );\n if(!toolIsMenu){\n if(config.options['chkWikibarPopmenuOnMouseOver']){\n theButton.onmouseover = function(e){ wikibarPopup.remove(); };\n }\n }\n }else{\n theButton=createTiddlyElement(place, 'tr',key,'button');\n theButton.title = (tool.TOOLTIP? tool.TOOLTIP : '');\n theButton.onclick = (toolIsMenu? wikibar_onClickMenuItem : wikibar_onClickItem);\n var tdL = createTiddlyElement(theButton, 'td','','marker');\n var td = createTiddlyElement(theButton, 'td');\n var tdR = createTiddlyElement(theButton, 'td','','marker');\n td.innerHTML = (tool.CAPTION? tool.CAPTION : key);\n if(toolIsMenu){\n tdR.innerHTML='&nbsp;&nbsp;&rsaquo;';\n }\n if(tool.SELECTED){\n tdL.innerHTML = '&radic; ';\n addClass(theButton, 'selected');\n }\n if(tool.DISABLED){\n addClass(theButton, 'disabled');\n }\n }\n theButton.tiddlerTitle = title;\n theButton.toolItem = tool;\n theButton.editor = editor;\n theButton.tabIndex = 999;\n if(toolIsMenu){\n if(config.options['chkWikibarPopmenuOnMouseOver']){\n theButton.onmouseover = wikibar_onClickMenuItem;\n }\n }\n}\nfunction wikibar_createMenuSeperator(place){\n if(place.id.substring(0,7)=='wikibar') { return; }\n var onclickSeperator=function(e){\n if(!e){ e = window.event; }\n e.cancelBubble = true;\n if (e.stopPropagation){ e.stopPropagation(); }\n return(false);\n };\n var theButton=createTiddlyElement(place,'tr','','seperator');\n var td = createTiddlyElement(theButton, 'td','','seperator');\n td.colSpan=3;\n theButton.onclick=onclickSeperator;\n td.innerHTML = '<hr>';\n}\nfunction wikibar_genWikibarAbout(){\n var toolset={};\n toolset.version = {\n CAPTION: '<center>WikiBar ' +\n config.macros.wikibar.major + '.' +\n config.macros.wikibar.minor + '.' +\n config.macros.wikibar.revision +\n (config.macros.wikibar.beta? ' beta '+config.macros.wikibar.beta : '') +\n '</center>',\n HANDLER: function(){}\n };\n toolset.SEPERATOR = {};\n toolset.author = {\n CAPTION: '<center>Arphen Lin<br>arphenlin@gmail.com</center>',\n TOOLTIP: 'send mail to the author',\n HANDLER: function(){ window.open('mailto:arphenlin@gmail.com'); }\n };\n toolset.website = {\n CAPTION: '<center>aiddlywiki.sourceforge.net</center>',\n TOOLTIP: 'go to the web site of WikiBar',\n HANDLER: function(){ window.open('http:\s/\s/aiddlywiki.sourceforge.net/'); }\n };\n return toolset;\n}\nfunction wikibar_genWikibarOptions(title, editor){\n var toolset={};\n toolset.popOnMouseOver = {\n CAPTION:'popup menu on mouse over',\n SELECTED: config.options['chkWikibarPopmenuOnMouseOver'],\n HANDLER: function(param){\n config.options['chkWikibarPopmenuOnMouseOver'] = !config.options['chkWikibarPopmenuOnMouseOver'];\n saveOptionCookie('chkWikibarPopmenuOnMouseOver');\n var title = param.button.tiddlerTitle;\n var wikibar = document.getElementById('wikibar'+title);\n if(wikibar){ wikibar.parentNode.removeChild(wikibar); }\n wikibar_createWikibar(title);\n }\n };\n toolset.setEditorSize = {\n CAPTION:'set editor height: <input id=\s"txtWikibarEditorRows\s" type=text size=1 MAXLENGTH=3 value=\s"' +\n (config.options['txtWikibarEditorRows']? config.options['txtWikibarEditorRows']:editor.rows) + '\s"> ok',\n HANDLER: function(param){\n var input = document.getElementById('txtWikibarEditorRows');\n if(input){\n var rows = parseInt(input.value, 10);\n if(!isNaN(rows)){\n var editor = param.button.editor;\n editor.rows = rows;\n }else{\n rows=config.maxEditRows;\n }\n config.options['txtWikibarEditorRows'] = rows;\n saveOptionCookie('txtWikibarEditorRows');\n config.maxEditRows = rows;\n }\n }\n };\n toolset.setEditorSizeOnLoadingWikibar = {\n CAPTION:'set editor height on loading wikibar',\n SELECTED: config.options['chkWikibarSetEditorHeight'],\n HANDLER: function(param){\n config.options['chkWikibarSetEditorHeight'] = !config.options['chkWikibarSetEditorHeight'];\n saveOptionCookie('chkWikibarSetEditorHeight');\n if(config.options['chkWikibarSetEditorHeight']){\n var rows = config.options['txtWikibarEditorRows'];\n if(!isNaN(rows)){ rows = 15; }\n var editor = param.button.editor;\n editor.rows = rows;\n config.options['txtWikibarEditorRows'] = rows;\n saveOptionCookie('txtWikibarEditorRows');\n }\n }\n };\n toolset.SEPERATOR = {};\n toolset.update = {\n CAPTION: 'check for updates',\n DISABLED: true,\n HANDLER: function(){}\n };\n return toolset;\n}\nfunction wikibar_genPaletteSelector(){\n try{\n var cpTiddlers = store.getTaggedTiddlers('ColorPalettes');\n if(!cpTiddlers) { return; }\n var palettes=[];\n palettes.push(wikibarColorTool.defaultPaletteName);\n for(var i=0; i<cpTiddlers.length; i++){\n palettes.push(cpTiddlers[i].title.trim());\n }\n var toolset={};\n for(i=0; i<palettes.length; i++){\n toolset[palettes[i]] = {\n TOOLTIP: palettes[i],\n SELECTED: (palettes[i]==wikibarColorTool.paletteName),\n HANDLER: wikibar_doSelectPalette\n };\n }\n return toolset;\n }catch(ex){ return null; }\n}\nfunction wikibar_onClickItem(e){\n if(!e){ e = window.event; }\n var theTarget = resolveTarget(e);\n if(theTarget.tagName=='INPUT'){\n e.cancelBubble = true;\n if (e.stopPropagation){ e.stopPropagation(); }\n return;\n }\n var theButton = wikibar_resolveTargetButton(theTarget);\n if(!theButton){ return(false); }\n var o = theButton.toolItem;\n if(!o) { return; }\n var param = {\n event: e,\n button: theButton\n };\n if(o.HANDLER){ o.HANDLER(param); }\n if(o.DISABLED){\n e.cancelBubble = true;\n if (e.stopPropagation){ e.stopPropagation(); }\n }\n return(false);\n}\nfunction wikibar_onClickMenuItem(e){\n if(!e){ e = window.event; }\n var theButton = wikibar_resolveTargetButton(resolveTarget(e));\n if(!theButton){ return(false); }\n e.cancelBubble = true;\n if (e.stopPropagation){ e.stopPropagation(); }\n var title = theButton.tiddlerTitle;\n var editor = theButton.editor;\n var tool = theButton.toolItem;\n if(!tool) { return; }\n var popup = wikibarPopup.create(this);\n if(popup){\n wikibar_createMenu(popup,tool,title,editor);\n if(!popup.hasChildNodes()){\n wikibarPopup.remove();\n }else{\n wikibarPopup.show(popup, false);\n }\n }\n return(false);\n}\nvar wikibarColorTool = {\n defaultPaletteName : 'default',\n defaultColumns : 16,\n defaultPalette : [\n '#FFF','#DDD','#CCC','#BBB','#AAA','#999','#666','#333','#111','#000','#FC0','#F90','#F60','#F30','#C30','#C03',\n '#9C0','#9D0','#9E0','#E90','#D90','#C90','#FC3','#FC6','#F96','#F63','#600','#900','#C00','#F00','#F36','#F03',\n '#CF0','#CF3','#330','#660','#990','#CC0','#FF0','#C93','#C63','#300','#933','#C33','#F33','#C36','#F69','#F06',\n '#9F0','#CF6','#9C3','#663','#993','#CC3','#FF3','#960','#930','#633','#C66','#F66','#903','#C39','#F6C','#F09',\n '#6F0','#9F6','#6C3','#690','#996','#CC6','#FF6','#963','#630','#966','#F99','#F39','#C06','#906','#F3C','#F0C',\n '#3F0','#6F3','#390','#6C0','#9F3','#CC9','#FF9','#C96','#C60','#C99','#F9C','#C69','#936','#603','#C09','#303',\n '#0C0','#3C0','#360','#693','#9C6','#CF9','#FFC','#FC9','#F93','#FCC','#C9C','#969','#939','#909','#636','#606',\n '#060','#3C3','#6C6','#0F0','#3F3','#6F6','#9F9','#CFC','#9CF','#FCF','#F9F','#F6F','#F3F','#F0F','#C6C','#C3C',\n '#030','#363','#090','#393','#696','#9C9','#CFF','#39F','#69C','#CCF','#C9F','#96C','#639','#306','#90C','#C0C',\n '#0F3','#0C3','#063','#396','#6C9','#9FC','#9CC','#06C','#369','#99F','#99C','#93F','#60C','#609','#C3F','#C0F',\n '#0F6','#3F6','#093','#0C6','#3F9','#9FF','#699','#036','#039','#66F','#66C','#669','#309','#93C','#C6F','#90F',\n '#0F9','#6F9','#3C6','#096','#6FF','#6CC','#366','#069','#36C','#33F','#33C','#339','#336','#63C','#96F','#60F',\n '#0FC','#6FC','#3C9','#3FF','#3CC','#399','#033','#39C','#69F','#00F','#00C','#009','#006','#003','#63F','#30F',\n '#0C9','#3FC','#0FF','#0CC','#099','#066','#3CF','#6CF','#09C','#36F','#0CF','#09F','#06F','#03F','#03C','#30C'\n ],\n colorPicker : null,\n pickColorHandler: null,\n userData: null\n};\nwikibarColorTool.paletteName = wikibarColorTool.defaultPaletteName;\nwikibarColorTool.columns = wikibarColorTool.defaultColumns;\nwikibarColorTool.palette = wikibarColorTool.defaultPalette;\nwikibarColorTool.onPickColor = function(e){\n if (!e){ e = window.event; }\n var theCell = resolveTarget(e);\n if(!theCell){ return(false); }\n color = theCell.bgColor.toLowerCase();\n if(!color) { return; }\n wikibarColorTool.displayColorPicker(false);\n if(wikibarColorTool.pickColorHandler){\n wikibarColorTool.pickColorHandler(color, wikibarColorTool.userData);\n }\n return(false);\n};\nwikibarColorTool.onMouseOver = function(e){\n if (!e){ e = window.event; }\n var theButton = resolveTarget(e);\n if(!theButton){ return(false); }\n if(!wikibarColorTool) { return; }\n color = theButton.bgColor.toUpperCase();\n if(!color) { return; }\n td=document.getElementById('colorPickerInfo');\n if(!td) { return; }\n td.bgColor = color;\n td.innerHTML = '<span style=\s"color:#000;\s">'+color+'</span>&nbsp;&nbsp;&nbsp;' +\n '<span style=\s"color:#fff;\s">'+color+'</span>';\n e.cancelBubble = true;\n if (e.stopPropagation){ e.stopPropagation(); }\n return(false);\n};\nwikibarColorTool.openColorPicker = function(theTarget, pickColorHandler, userData){\n wikibarColorTool.skipClickDocumentEvent = true;\n wikibarColorTool.pickColorHandler = pickColorHandler;\n wikibarColorTool.userData = userData;\n wikibarColorTool.moveColorPicker(theTarget);\n};\nwikibarColorTool.convert3to6HexColor = function(c){\n c=c.trim();\n var rx=/^\s#(\sd|[a-f])(\sd|[a-f])(\sd|[a-f])$/gi;\n return (rx.test(c)? c.replace(rx, '#$1$1$2$2$3$3') : c);\n};\nwikibarColorTool.numToHexColor = function (n){\n if(typeof(n)=='number' && (n>=0 && n<=255)) {\n s = n.toString(16).toLowerCase();\n return ((s.length==1)? '0'+s : s);\n }else{\n return null;\n }\n};\nwikibarColorTool.renderColorPalette = function(){\n if(wikibarColorTool.paletteName==wikibarColorTool.defaultPaletteName){\n wikibarColorTool.palette=wikibarColorTool.defaultPalette;\n wikibarColorTool.columns=wikibarColorTool.defaultColumns;\n return;\n }\n tiddlerText = (store.getTiddlerText(wikibarColorTool.paletteName, '')).trim();\n if(tiddlerText.length<=0) { return; }\n var cpContents = tiddlerText.split('\sn');\n var colors=[];\n columns = wikibarColorTool.defaultColumns;\n var tmpArray=null;\n errCount=0;\n for(var i=0; i<cpContents.length; i++){\n cpLine=cpContents[i].trim();\n if( (!cpLine) || (cpLine.length<=0) || (cpLine.charAt(0) == '#') ){ continue; }\n if(cpLine.substring(0,8).toLowerCase()=='columns:'){\n tmpArray = cpLine.split(':');\n try{\n columns = parseInt(tmpArray[1],10);\n }catch(ex){\n columns = wikibarColorTool.defaultColumns;\n }\n }else{\n tmpArray = cpLine.replace('\st', ' ').split(/[ ]{1,}/);\n try{\n color='';\n for(var j=0; j<3; j++){\n c=parseInt(tmpArray[j].trim(), 10);\n if(isNaN(c)){\n break;\n }else{\n c=wikibarColorTool.numToHexColor(c);\n if(!c) {break;}\n color+=c;\n }\n }\n if(color.length==6){\n colors.push('#'+color);\n } else {\n throw 'error';\n }\n }catch(ex){\n }\n }\n }\n if(colors.length>0){\n wikibarColorTool.palette = colors;\n wikibarColorTool.columns = columns;\n }else{\n throw 'renderColorPalette(): No color defined in the palette.';\n }\n};\nwikibarColorTool.displayColorPicker = function(visible){\n if(wikibarColorTool.colorPicker){\n wikibarColorTool.colorPicker.style.display = (visible? 'block' : 'none');\n }\n};\nwikibarColorTool.moveColorPicker = function(theTarget){\n if(!wikibarColorTool.colorPicker){\n wikibarColorTool.createColorPicker();\n }\n var cp = wikibarColorTool.colorPicker;\n var rootLeft = findPosX(theTarget);\n var rootTop = findPosY(theTarget);\n var popupLeft = rootLeft;\n var popupTop = rootTop;\n var popupWidth = cp.offsetWidth;\n var winWidth = findWindowWidth();\n if(popupLeft + popupWidth > winWidth){\n popupLeft = winWidth - popupWidth;\n }\n cp.style.left = popupLeft + 'px';\n cp.style.top = popupTop + 'px';\n wikibarColorTool.displayColorPicker(true);\n};\nwikibarColorTool.createColorPicker = function(unused, palette){\n if(palette){ wikibarColorTool.paletteName=palette; }\n wikibarColorTool.renderColorPalette();\n wikibarColorTool.colorPicker = document.createElement('div');\n wikibarColorTool.colorPicker.id = 'colorPicker';\n document.body.appendChild(wikibarColorTool.colorPicker);\n var theTable = document.createElement('table');\n wikibarColorTool.colorPicker.appendChild(theTable);\n var theTR = document.createElement('tr');\n theTable.appendChild(theTR);\n var theTD = document.createElement('td');\n theTD.className = 'header';\n theTD.colSpan = wikibarColorTool.columns;\n theTD.innerHTML = wikibarColorTool.paletteName;\n theTR.appendChild(theTD);\n for(var i=0; i<wikibarColorTool.palette.length; i++){\n if((i%wikibarColorTool.columns)===0){\n theTR = document.createElement('tr');\n theTable.appendChild(theTR);\n }\n theTD = document.createElement('td');\n theTD.className = 'cell';\n theTD.bgColor = wikibarColorTool.convert3to6HexColor(wikibarColorTool.palette[i]);\n theTD.onclick = wikibarColorTool.onPickColor;\n theTD.onmouseover = wikibarColorTool.onMouseOver;\n theTR.appendChild(theTD);\n }\n rest = wikibarColorTool.palette.length % wikibarColorTool.columns;\n if(rest>0){\n theTD = document.createElement('td');\n theTD.colSpan = wikibarColorTool.columns-rest;\n theTD.bgColor = '#000000';\n theTR.appendChild(theTD);\n }\n theTR = document.createElement('tr');\n theTable.appendChild(theTR);\n theTD = document.createElement('td');\n theTD.colSpan = wikibarColorTool.columns;\n theTD.id = 'colorPickerInfo';\n theTR.appendChild(theTD);\n};\nwikibarColorTool.onDocumentClick = function(e){\n if (!e){ e = window.event; }\n if(wikibarColorTool.skipClickDocumentEvent) {\n wikibarColorTool.skipClickDocumentEvent = false;\n return true;\n }\n if((!e.eventPhase) || e.eventPhase == Event.BUBBLING_PHASE || e.eventPhase == Event.AT_TARGET){\n wikibarColorTool.displayColorPicker(false);\n }\n return true;\n};\nfunction wikibar_doSelectPalette(param){\n clearMessage();\n var theButton = param.button;\n if(!theButton.toolItem.key) { return; }\n var palette = theButton.toolItem.key;\n var oldPaletteName = wikibarColorTool.paletteName;\n if(oldPaletteName != palette){\n try{\n wikibarColorTool.createColorPicker(theButton, palette);\n displayMessage('Palette \s"'+palette+'\s" ('+ wikibarColorTool.palette.length +' colors) is selected');\n }catch(ex){\n errMsg = ex;\n if(errMsg.substring(0,18)=='renderColorPalette'){\n displayMessage('Invalid palette \s"' + palette + '\s", please check it out!');\n wikibarColorTool.createColorPicker(theButton, oldPaletteName);\n }\n }\n }\n}\nvar wikibarPopup = {\n skipClickDocumentEvent: false,\n stack: []\n};\nwikibarPopup.resolveRootPopup = function(o){\n if(o.isOnMainMenu){ return null; }\n if(o.className.substring(0,12)=='wikibarPopup'){ return o;}\n return wikibarPopup.resolveRootPopup(o.parentNode);\n};\nwikibarPopup.create = function(root){\n for(var i=0; i<wikibarPopup.stack.length; i++){\n var p=wikibarPopup.stack[i];\n if(p.root==root){\n wikibarPopup.removeFrom(i+1);\n return null;\n }\n }\n var rootPopup = wikibarPopup.resolveRootPopup(root);\n if(!rootPopup){\n wikibarPopup.remove();\n }else{\n wikibarPopup.removeFromRootPopup(rootPopup);\n }\n var popup = createTiddlyElement(document.body,'div','wikibarPopup'+root.toolItem.key,'wikibarPopup');\n var pop = createTiddlyElement(popup,'table','','');\n wikibarPopup.stack.push({rootPopup: rootPopup, root: root, popup: popup});\n return pop;\n};\nwikibarPopup.show = function(unused,slowly){\n var curr = wikibarPopup.stack[wikibarPopup.stack.length-1];\n var overlayWidth = 1;\n var rootLeft, rootTop, rootWidth, rootHeight, popupLeft, popupTop, popupWidth;\n if(curr.rootPopup){\n rootLeft = findPosX(curr.rootPopup);\n rootTop = findPosY(curr.root);\n rootWidth = curr.rootPopup.offsetWidth;\n popupLeft = rootLeft + rootWidth - overlayWidth;\n popupTop = rootTop;\n }else{\n rootLeft = findPosX(curr.root);\n rootTop = findPosY(curr.root);\n rootHeight = curr.root.offsetHeight;\n popupLeft = rootLeft;\n popupTop = rootTop + rootHeight;\n }\n var winWidth = findWindowWidth();\n popupWidth = curr.popup.offsetWidth;\n if(popupLeft + popupWidth > winWidth){\n popupLeft = rootLeft - popupWidth + overlayWidth;\n }\n curr.popup.style.left = popupLeft + 'px';\n curr.popup.style.top = popupTop + 'px';\n curr.popup.style.display = 'block';\n addClass(curr.root, 'highlight');\n if(config.options.chkAnimate){\n anim.startAnimating(new Scroller(curr.popup,slowly));\n }else{\n window.scrollTo(0,ensureVisible(curr.popup));\n }\n};\nwikibarPopup.remove = function(){\n if(wikibarPopup.stack.length > 0){\n wikibarPopup.removeFrom(0);\n }\n};\nwikibarPopup.removeFrom = function(from){\n for(var t=wikibarPopup.stack.length-1; t>=from; t--){\n var p = wikibarPopup.stack[t];\n removeClass(p.root,'highlight');\n p.popup.parentNode.removeChild(p.popup);\n }\n wikibarPopup.stack = wikibarPopup.stack.slice(0,from);\n};\nwikibarPopup.removeFromRootPopup = function(from){\n for(var t=0; t<wikibarPopup.stack.length; t++){\n var p = wikibarPopup.stack[t];\n if(p.rootPopup==from){\n wikibarPopup.removeFrom(t);\n break;\n }\n }\n};\nwikibarPopup.onDocumentClick = function(e){\n if (!e){ e = window.event; }\n if(wikibarPopup.skipClickDocumentEvent){\n wikibarPopup.skipClickDocumentEvent=false;\n return true;\n }\n if((!e.eventPhase) || e.eventPhase == Event.BUBBLING_PHASE || e.eventPhase == Event.AT_TARGET){\n wikibarPopup.remove();\n }\n return true;\n};\nvar wikibarStore = {\n TYPE: 'MAIN_MENU',\n help:{\n TYPE:'MENU',\n CAPTION: '<font face=\s"verdana\s">?</font>',\n TOOLTIP: 'about WikiBar',\n options:{\n TYPE:'MENU',\n DYNAITEM: wikibar_genWikibarOptions\n },\n about:{\n TYPE:'MENU',\n DYNAITEM: wikibar_genWikibarAbout\n }\n },\n preview:{\n TOOLTIP: 'preview this tiddler',\n CAPTION: '<font face=\s"verdana\s">&infin;</font>',\n HANDLER: wikibar_doPreview\n },\n line:{\n TOOLTIP: 'horizontal line',\n CAPTION: '<font face=\s"verdana\s">&mdash;</font>',\n syntax: '\sn----\sn',\n HANDLER: wikibar_editFormatByCursor\n },\n crlf:{\n TOOLTIP: 'new line',\n CAPTION: '<font face=\s"verdana\s">&para;</font>',\n syntax: '\sn',\n HANDLER: wikibar_editFormatByCursor\n },\n selectAll:{\n TOOLTIP: 'select all',\n CAPTION: '<font face=\s"verdana\s">&sect;</font>',\n HANDLER: wikibar_editSelectAll\n },\n deleteSelected:{\n TOOLTIP: 'delete selected',\n CAPTION: '<font face=\s"verdana\s">&times;</font>',\n syntax: '',\n HANDLER: wikibar_editFormat\n },\n textFormat:{\n TYPE: 'MENU',\n CAPTION: 'text',\n TOOLTIP: 'text formatters',\n ignore:{\n TOOLTIP: 'ignore wiki word',\n CAPTION: 'ignore wikiWord',\n syntax: '~user_text',\n hint: 'wiki_word',\n HANDLER: wikibar_editFormatByWord\n },\n bolder:{\n TOOLTIP: 'bolder text',\n CAPTION: '<strong>bolder</strong>',\n syntax: "''user_text''",\n hint: 'bold_text',\n HANDLER: wikibar_editFormatByWord\n },\n italic:{\n TOOLTIP: 'italic text',\n CAPTION: '<em>italic</em>',\n syntax: '\s/\s/user_text\s/\s/',\n hint: 'italic_text',\n HANDLER: wikibar_editFormatByWord\n },\n underline:{\n TOOLTIP: 'underline text',\n CAPTION: '<u>underline</u>',\n syntax: '__user_text__',\n hint: 'underline_text',\n HANDLER: wikibar_editFormatByWord\n },\n strikethrough:{\n TOOLTIP: 'strikethrough text',\n CAPTION: '<strike>strikethrough</strike>',\n syntax: '==user_text==',\n hint: 'strikethrough_text',\n HANDLER: wikibar_editFormatByWord\n },\n superscript:{\n TOOLTIP: 'superscript text',\n CAPTION: 'X<sup>superscript</sup>',\n syntax: '^^user_text^^',\n hint: 'superscript_text',\n HANDLER: wikibar_editFormatByWord\n },\n subscript:{\n TOOLTIP: 'subscript text',\n CAPTION: 'X<sub>subscript</sub>',\n syntax: '~~user_text~~',\n hint: 'subscript_text',\n HANDLER: wikibar_editFormatByWord\n },\n comment:{\n TOOLTIP: 'comment text',\n CAPTION: 'comment text',\n syntax: '/%user_text%/',\n hint: 'comment_text',\n HANDLER: wikibar_editFormatByWord\n },\n monospaced:{\n TOOLTIP: 'monospaced text',\n CAPTION: '<code>monospaced</code>',\n syntax: '{{{user_text}}}',\n hint: 'monospaced_text',\n HANDLER: wikibar_editFormatByWord\n }\n },\n paragraph:{\n TYPE: 'MENU',\n TOOLTIP: 'paragarph formatters',\n list:{\n TYPE: 'MENU',\n TOOLTIP: 'list tools',\n bullet:{\n TOOLTIP: 'bullet point',\n syntax: '*user_text',\n hint: 'bullet_text',\n HANDLER: wikibar_editFormatByLine\n },\n numbered:{\n TOOLTIP: 'numbered list',\n syntax: '#user_text',\n hint: 'numbered_text',\n HANDLER: wikibar_editFormatByLine\n }\n },\n heading:{\n TYPE: 'MENU',\n heading1:{\n CAPTION:'<h1>Heading 1</h1>',\n TOOLTIP: 'Heading 1',\n syntax: '!user_text',\n hint: 'heading_1',\n HANDLER: wikibar_editFormatByLine\n },\n heading2:{\n CAPTION:'<h2>Heading 2<h2>',\n TOOLTIP: 'Heading 2',\n syntax: '!!user_text',\n hint: 'heading_2',\n HANDLER: wikibar_editFormatByLine\n },\n heading3:{\n CAPTION:'<h3>Heading 3</h3>',\n TOOLTIP: 'Heading 3',\n syntax: '!!!user_text',\n hint: 'heading_3',\n HANDLER: wikibar_editFormatByLine\n },\n heading4:{\n CAPTION:'<h4>Heading 4</h4>',\n TOOLTIP: 'Heading 4',\n syntax: '!!!!user_text',\n hint: 'heading_4',\n HANDLER: wikibar_editFormatByLine\n },\n heading5:{\n CAPTION:'<h5>Heading 5</h5>',\n TOOLTIP: 'Heading 5',\n syntax: '!!!!!user_text',\n hint: 'heading_5',\n HANDLER: wikibar_editFormatByLine\n }\n },\n comment:{\n TYPE: 'MENU',\n commentByLine:{\n CAPTION:'comment by line',\n TOOLTIP: 'line comment',\n syntax: '/%user_text%/',\n hint: 'comment_text',\n HANDLER: wikibar_editFormatByLine\n },\n commentByBlock:{\n CAPTION:'comment by block',\n TOOLTIP: 'block comment',\n syntax: '/%\snuser_text\sn%/',\n hint: 'comment_text',\n byBlock: true,\n HANDLER: wikibar_editFormatByLine\n }\n },\n monospaced:{\n TYPE: 'MENU',\n monosByLine:{\n CAPTION: 'monospaced by line',\n TOOLTIP: 'line monospaced',\n syntax: '{{{\snuser_text\sn}}}',\n hint: 'monospaced_text',\n HANDLER: wikibar_editFormatByLine\n },\n monosByBlock:{\n CAPTION: 'monospaced by block',\n TOOLTIP: 'block monospaced',\n syntax: '{{{\snuser_text\sn}}}',\n hint: 'monospaced_text',\n byBlock: true,\n HANDLER: wikibar_editFormatByLine\n }\n },\n quote:{\n TYPE: 'MENU',\n quoteByLine:{\n CAPTION: 'quote by line',\n TOOLTIP: 'line quote',\n syntax: '>user_text',\n hint: 'quote_text',\n HANDLER: wikibar_editFormatByLine\n },\n quoteByBlcok:{\n CAPTION: 'quote by block',\n TOOLTIP: 'block quote',\n syntax: '<<<\snuser_text\sn<<<',\n hint: 'quote_text',\n byBlock: true,\n HANDLER: wikibar_editFormatByLine\n }\n },\n plugin:{\n TYPE: 'MENU',\n code:{\n CAPTION: 'code area',\n TOOLTIP: 'block monospaced for plugin',\n syntax: '\sn\s/\s/{{{\snuser_text\sn\s/\s/}}}\sn',\n hint: 'monospaced_plugin_code',\n byBlock: true,\n HANDLER: wikibar_editFormatByLine\n },\n commentByLine:{\n CAPTION: 'comment by line',\n TOOLTIP: 'line comment',\n syntax: '\s/\s/user_text',\n hint: 'plugin_comment',\n HANDLER: wikibar_editFormatByLine\n },\n commentByBlock:{\n CAPTION: 'comment by block',\n TOOLTIP: 'block comment',\n syntax: '\s/\s***\snuser_text\sn***\s/',\n hint: 'plugin_comment',\n byBlock: true,\n HANDLER: wikibar_editFormatByLine\n }\n },\n css:{\n TYPE: 'MENU',\n code:{\n CAPTION: 'code area',\n TOOLTIP: 'block monospaced for css',\n syntax: '\sn\snuser_text\sn\sn',\n hint: 'monospaced_css_code',\n byBlock: true,\n HANDLER: wikibar_editFormatByLine\n },\n commentByLine:{\n CAPTION: 'comment by line',\n TOOLTIP: 'line comment',\n syntax: '',\n hint: 'css_comment',\n HANDLER: wikibar_editFormatByLine\n },\n commentByBlock:{\n CAPTION: 'comment by block',\n TOOLTIP: 'block comment',\n syntax: '',\n hint: 'css_comment',\n byBlock: true,\n HANDLER: wikibar_editFormatByLine\n }\n }\n },\n color:{\n TYPE: 'MENU',\n TOOLTIP: 'color tools',\n highlight:{\n CAPTION:'highlight text',\n TOOLTIP: 'highlight text',\n syntax: '@@user_text@@',\n hint: 'highlight_text',\n HANDLER: wikibar_editFormatByWord\n },\n color:{\n CAPTION:'text color',\n TOOLTIP: 'text color',\n hint: 'your_text',\n syntax: '@@color(%1):user_text@@',\n HANDLER: wikibar_getColorCode,\n doMore: wikibar_editFormatByWord\n },\n bgcolor:{\n CAPTION:'background color',\n TOOLTIP: 'background color',\n hint: 'your_text',\n syntax: '@@bgcolor(%1):user_text@@',\n HANDLER: wikibar_getColorCode,\n doMore: wikibar_editFormatByWord\n },\n colorcode:{\n CAPTION:'color code',\n TOOLTIP: 'insert color code',\n syntax: '%1',\n HANDLER: wikibar_getColorCode,\n doMore: wikibar_editFormatByCursor\n },\n 'color palette':{\n TYPE:'MENU',\n DYNAITEM: wikibar_genPaletteSelector,\n SEPERATOR:{},\n morePalette:{\n CAPTION:'more palettes',\n TOOLTIP:'get more palettes',\n HANDLER: wikibar_getMorePalette\n }\n }\n },\n link:{\n TYPE: 'MENU',\n TOOLTIP: 'insert link',\n wiki:{\n CAPTION:'wiki link',\n TOOLTIP: 'wiki link',\n syntax: '[[user_text]]',\n hint: 'wiki_word',\n HANDLER: wikibar_editFormatByWord\n },\n pretty:{\n CAPTION: 'pretty link',\n TOOLTIP: 'pretty link',\n syntax: '[[user_text|%1]]',\n hint: 'pretty_word',\n param: 'PrettyLink Target',\n HANDLER: wikibar_getLinkUrl,\n doMore: wikibar_editFormatByWord\n },\n url:{\n TOOLTIP: 'url link',\n syntax: '[[user_text|%1]]',\n hint: 'your_text',\n param: 'http:\s/\s/...',\n HANDLER: wikibar_getLinkUrl,\n doMore: wikibar_editFormatByWord\n },\n image:{\n TOOLTIP: 'image link',\n syntax: '[img[user_text|%1]]',\n hint: 'alt_text',\n param: 'image/icon.jpg',\n HANDLER: wikibar_getLinkUrl,\n doMore: wikibar_editFormatByWord\n }\n },\n macro:{},\n more:{\n TYPE: 'MENU',\n TOOLTIP: 'more tools',\n table:{\n TYPE: 'MENU',\n TOOLTIP: 'table',\n table:{\n CAPTION:'create table',\n TOOLTIP: 'create a new table',\n syntax: '\sn%1\sn',\n HANDLER: wikibar_getTableRowCol,\n doMore: wikibar_editFormatByWord\n },\n header:{\n TOOLTIP: 'table header text',\n syntax: '|user_text|c',\n hint: 'table_header',\n HANDLER: wikibar_editFormatByWord\n },\n cell:{\n TOOLTIP: 'create a tabel cell',\n syntax: '|user_text|',\n hint: 'your_text',\n HANDLER: wikibar_editFormatByWord\n },\n columnHeader:{\n CAPTION:'column header',\n TOOLTIP: 'create a column header cell',\n syntax: '|!user_text|',\n hint: 'column_header',\n HANDLER: wikibar_editFormatByWord\n },\n cell:{\n TYPE: 'MENU',\n CAPTION: 'cell options',\n bgcolor:{\n CAPTION: 'background color',\n TOOLTIP: 'cell bgcolor',\n syntax: '|bgcolor(%1):user_text|',\n hint: 'your_text',\n HANDLER: wikibar_getColorCode,\n doMore: wikibar_editFormatByTableCell\n },\n alignLeft:{\n CAPTION: 'align left',\n TOOLTIP: 'left align cell text',\n syntax: '|user_text|',\n hint: 'your_text',\n HANDLER: wikibar_editFormatByTableCell\n },\n alignCenter:{\n CAPTION: 'align center',\n TOOLTIP: 'center align cell text',\n syntax: '| user_text |',\n hint: 'your_text',\n HANDLER: wikibar_editFormatByTableCell\n },\n alignRight:{\n CAPTION: 'align right',\n TOOLTIP: 'right align cell text',\n syntax: '| user_text|',\n hint: 'your_text',\n HANDLER: wikibar_editFormatByTableCell\n }\n }\n },\n html:{\n TYPE: 'MENU',\n html:{\n CAPTION: '&lt;html&gt;',\n TOOLTIP: 'html tag',\n syntax: '<html>\snuser_text\sn</html>',\n hint: 'html_content',\n byBlock: true,\n HANDLER: wikibar_editFormatByLine\n }\n }\n },\n addon:{\n TYPE: 'MENU',\n TOOLTIP:'3rd party tools',\n 'about addons':{\n TOOLTIP: 'list loaded addons',\n HANDLER: wikibar_doListAddons\n },\n SEPERATOR:{}\n }\n};\naddEvent(document, 'click', wikibarColorTool.onDocumentClick);\naddEvent(document, 'click', wikibarPopup.onDocumentClick);\nwikibar_install();\n//}}}
/***\n!WikiBar CSS 說明\n*井號開頭表示 id, ex: #colorPicker\n*點號開頭表示 class, ex: .wikibar\n\n!WikiBar Colors Used\n*@@bgcolor(#014):color(#fff): #014 - 選單邊框@@\n*@@bgcolor(#014):color(#fff): #014 - 選單字體色@@\n*@@bgcolor(#cef): #cef - 選單底色@@\n*@@bgcolor(#eee): #eee - 選單字體色:游標滑過時@@\n*@@bgcolor(#014):color(#fff): #014 - 選單底色:游標滑過時@@\n*@@bgcolor(#888): #888 - 無效選單字體色@@\n*@@bgcolor(#cef): #cef - 無效選單底色:游標滑過時@@\n*@@bgcolor(#014):color(#fff): #014 - 分隔線顏色@@\n\n!wikibar: 工具列, 繼承 .toolbar /%==============================================%/\n***/\n/*{{{*/\n.wikibar {\n text-align: left;\n visibility: visible;\n margin:2px; padding:1px;\n}\n/*}}}*/\n\n/***\n!previewer: 預覽區, 繼承 .viewer /%==============================================%/\n***/\n/*{{{*/\n.previewer {overflow:auto; display:block; border:1px solid;}\n/*}}}*/\n\n/***\n!colorPicker 調色盤 /%==============================================%/\n***/\n/*{{{*/\n#colorPicker {position:absolute; display:none; z-index:10; margin:0px; padding:0px; }\n#colorPicker table {\n margin:0px; padding:0px;\n border:2px solid #000;\n border-spacing: 0px;\n border-collapse: collapse;\n}\n#colorPicker td {margin:0px; padding:0px; border:1px solid; font-size:11px; text-align:center; cursor:auto;}\n#colorPicker .header {background-color: #fff;}\n#colorPicker .button {background-color: #fff; cursor:pointer; cursor:hand;}\n#colorPicker .button:hover {padding-top:3px; padding-bottom:3px; color:#fff; background-color:#136;}\n#colorPicker .cell {padding:4px; font-size:7px; cursor:crosshair;}\n#colorPicker .cell:hover {padding:10px;}\n/*}}}*/\n\n/***\n!wikibarPopup 功能表選單 /%==============================================%/\n***/\n/*{{{*/\n.wikibarPopup{\n position:absolute; z-index:10;\n border: 1px solid #014;\n color: #014; background-color: #cef;\n /*\n max-height:150px;\n overflow-x:hidden; overflow-y:auto;\n */\n}\n\n/* 彈出選單 */\n.wikibarPopup table{\n margin:0; padding:0;\n border:0;\n border-spacing:0;\n border-collapse:collapse;\n}\n\n/* 選單上之按鈕 */\n.wikibarPopup .button:hover{color:#eee; background-color: #014;}\n\n/*\n.wikibarPopup .selected {background-color: #cf6;}\n*/\n\n/* 停用選項 */\n.wikibarPopup .disabled {color: #888;}\n.wikibarPopup .disabled:hover {color: #888; background-color: #cef;}\n\n/* 分隔線 */\n.wikibarPopup tr .seperator hr{\n margin:0; padding:0; background-color: #cef; width: 100%;\n border: 0;\n border-top: 1px dashed #014;\n}\n\n/* 選項左右兩邊符號區 */\n.wikibarPopup tr .icon {font-family:verdana; font-weight:bolder;}\n.wikibarPopup tr .marker {font-family:verdana; font-weight:bolder;}\n\n/* 選項 */\n.wikibarPopup td {font-size:0.9em; padding:2px;}\n\n.wikibarPopup input{\n border:0;\n border-bottom: 1px solid #014;\n margin:0; padding:0;\n font-family: arial;\n font-size:100%;\n background-color: #fff;\n}\n\n/*}}}*/
/***\n|''Name:''|YourSearchPlugin|\n|''Version:''|2.1.0 (2006-10-12)|\n|''Source:''|http://tiddlywiki.abego-software.de/#YourSearchPlugin ([[del.icio.us|http://del.icio.us/post?url=http://tiddlywiki.abego-software.de/index.html%23YourSearchPlugin]])|\n|''Author:''|UdoBorkowski (ub [at] abego-software [dot] de)|\n|''Licence:''|[[BSD open source license (abego Software)|http://www.abego-software.de/legal/apl-v10.html]]|\n|''Copyright:''|&copy; 2005-2006 [[abego Software|http://www.abego-software.de]]|\n|''~CoreVersion:''|2.1.0|\n|''Browser:''|Firefox 1.0.4+; Firefox 1.5; ~InternetExplorer 6.0|\n!About YourSearch\nYourSearch gives you a bunch of new features to simplify and speed up your daily searches in TiddlyWiki. It seamlessly integrates into the standard TiddlyWiki search: just start typing into the 'search' field and explore!\n\nFor more information see [[Help|YourSearch Help]].\n!Compatibility\nThis plugin requires TiddlyWiki 2.1. \nCheck the [[archive|http://tiddlywiki.abego-software.de/archive]] for ~YourSearchPlugins supporting older versions of TiddlyWiki.\n!Source Code\n***/\n/***\nThis plugin's source code is compressed (and hidden). Use this [[link|http://tiddlywiki.abego-software.de/archive/YourSearchPlugin/Plugin-YourSearch-src.2.1.0.js]] to get the readable source code.\n***/\n///%\nif(!version.extensions.YourSearchPlugin){version.extensions.YourSearchPlugin={major:2,minor:1,revision:0,source:"http://tiddlywiki.abego-software.de/#YourSearchPlugin",licence:"[[BSD open source license (abego Software)|http://www.abego-software.de/legal/apl-v10.html]]",copyright:"Copyright (c) abego Software GmbH, 2005-2006 (www.abego-software.de)"};if(!window.abego){window.abego={};}if(!Array.forEach){Array.forEach=function(_1,_2,_3){for(var i=0,len=_1.length;i<len;i++){_2.call(_3,_1[i],i,_1);}};Array.prototype.forEach=function(_5,_6){for(var i=0,len=this.length;i<len;i++){_5.call(_6,this[i],i,this);}};}abego.toInt=function(s,_9){if(!s){return _9;}var n=parseInt(s);return (n==NaN)?_9:n;};abego.createEllipsis=function(_b){var e=createTiddlyElement(_b,"span");e.innerHTML="&hellip;";};abego.shallowCopy=function(_d){if(!_d){return _d;}var _e={};for(var n in _d){_e[n]=_d[n];}return _e;};abego.copyOptions=function(_10){return !_10?{}:abego.shallowCopy(_10);};abego.countStrings=function(_11,s){if(!s){return 0;}var len=s.length;var n=0;var _15=0;while(1){var i=_11.indexOf(s,_15);if(i<0){return n;}n++;_15=i+len;}return n;};abego.getBracedText=function(_17,_18,_19){if(!_18){_18=0;}var re=/\s{([^\s}]*)\s}/gm;re.lastIndex=_18;var m=re.exec(_17);if(m){var s=m[1];var _1d=abego.countStrings(s,"{");if(!_1d){if(_19){_19.lastIndex=re.lastIndex;}return s;}var len=_17.length;for(var i=re.lastIndex;i<len&&_1d;i++){var c=_17.charAt(i);if(c=="{"){_1d++;}else{if(c=="}"){_1d--;}}}if(!_1d){if(_19){_19.lastIndex=i-1;}return _17.substring(m.index+1,i-1);}}};abego.select=function(_21,_22,_23,_24){if(!_24){_24=[];}_21.forEach(function(t){if(_22.call(_23,t)){_24.push(t);}});return _24;};abego.TiddlerFilterTerm=function(_26,_27){if(!_27){_27={};}var _28=_26;if(!_27.textIsRegExp){_28=_26.escapeRegExp();if(_27.fullWordMatch){_28="\s\sb"+_28+"\s\sb";}}var _29=new RegExp(_28,"m"+(_27.caseSensitive?"":"i"));this.tester=new abego.MultiFieldRegExpTester(_29,_27.fields,_27.withExtendedFields);};abego.TiddlerFilterTerm.prototype.test=function(_2a){return this.tester.test(_2a);};abego.parseNewTiddlerCommandLine=function(s){var m=/(.*?)\s.(?:\ss+|$)([^#]*)(#.*)?/.exec(s);if(!m){m=/([^#]*)()(#.*)?/.exec(s);}if(m){var r;if(m[3]){var s2=m[3].replace(/#/g,"");r=s2.parseParams("tag");}else{r=[[]];}var _2f=m[2]?m[2].trim():"";r.push({name:"text",value:_2f});r[0].text=[_2f];return {title:m[1].trim(),params:r};}else{return {title:s.trim(),params:[[]]};}};abego.parseTiddlerFilterTerm=function(_30,_31,_32){var re=/\ss*(?:(?:\s{([^\s}]*)\s})|(?:(=)|([#%!])|(?:(\sw+)\ss*\s:(?!\s/\s/))|(?:(?:("(?:(?:\s\s")|[^"])+")|(?:\s/((?:(?:\s\s\s/)|[^\s/])+)\s/)|(\sw+\s:\s/\s/[^\ss]+)|([^\ss\s)\s-\s"]+)))))/mg;var _34={"!":"title","%":"text","#":"tags"};var _35={};var _36;re.lastIndex=_31;while(1){var i=re.lastIndex;var m=re.exec(_30);if(!m||m.index!=i){throw "Word or String literal expected";}if(m[1]){var _39={};var _3a=abego.getBracedText(_30,0,_39);if(!_3a){throw "Invalid {...} syntax";}var f=Function("tiddler","return ("+_3a+");");return {func:f,lastIndex:_39.lastIndex,markRE:null};}if(m[2]){_36=true;}else{if(m[3]){_35[_34[m[3]]]=1;}else{if(m[4]){_35[m[4]]=1;}else{var _3c=m[6];var _3d=m[5]?window.eval(m[5]):m[6]?m[6]:m[7]?m[7]:m[8];var _32=abego.copyOptions(_32);_32.fullWordMatch=_36;_32.textIsRegExp=_3c;var _3e=[];for(var n in _35){_3e.push(n);}if(_3e.length==0){_32.fields=_32.defaultFields;}else{_32.fields=_3e;_32.withExtendedFields=false;}var _40=new abego.TiddlerFilterTerm(_3d,_32);var _41=_3c?_3d:_3d.escapeRegExp();if(_41&&_36){_41="\s\sb"+_41+"\s\sb";}return {func:function(_42){return _40.test(_42);},lastIndex:re.lastIndex,markRE:_41?"(?:"+_41+")":null};}}}}};abego.BoolExp=function(s,_44,_45){this.s=s;var _46=_45&&_45.defaultOperationIs_OR;var _47=/\ss*(?:(\s-|not)|(\s())/gi;var _48=/\ss*\s)/g;var _49=/\ss*(?:(and|\s&\s&)|(or|\s|\s|))/gi;var _4a=/\ss*[^\s)\ss]/g;var _4b=/\ss*(\s-|not)?(\ss*\s()?/gi;var _4c=function(_4d){_4b.lastIndex=_4d;var m=_4b.exec(s);var _4f;var _50;if(m&&m.index==_4d){_4d=_4b.lastIndex;_4f=m[1];if(m[2]){var e=parseBoolExpression(_4d);_48.lastIndex=e.lastIndex;if(!_48.exec(s)){throw "Missing ')'";}_50={func:e.func,lastIndex:_48.lastIndex};}}if(!_50){_50=_44(s,_4d,_45);}if(_4f){_50.func=(function(f){return function(_53){return !f(_53);};})(_50.func);_50.markRE=null;}return _50;};var _54=function(_55){var _56=_4c(_55);while(1){var l=_56.lastIndex;_49.lastIndex=l;var m=_49.exec(s);var _59;var _5a;if(m&&m.index==l){_59=!m[1];_5a=_4c(_49.lastIndex);}else{try{_5a=_4c(l);}catch(e){return _56;}_59=_46;}_56.func=(function(_5b,_5c,_5d){return _5d?function(_5e){return _5b(_5e)||_5c(_5e);}:function(_5f){return _5b(_5f)&&_5c(_5f);};})(_56.func,_5a.func,_59);_56.lastIndex=_5a.lastIndex;if(!_56.markRE){_56.markRE=_5a.markRE;}else{if(_5a.markRE){_56.markRE=_56.markRE+"|"+_5a.markRE;}}}};var _60=_54(0);this.evalFunc=_60.func;if(_60.markRE){this.markRegExp=new RegExp(_60.markRE,_45.caseSensitive?"mg":"img");}};abego.BoolExp.prototype.exec=function(){return this.evalFunc.apply(this,arguments);};abego.BoolExp.prototype.getMarkRegExp=function(){return this.markRegExp;};abego.BoolExp.prototype.toString=function(){return this.s;};abego.MultiFieldRegExpTester=function(re,_62,_63){this.re=re;this.fields=_62?_62:["title","text","tags"];this.withExtendedFields=_63;};abego.MultiFieldRegExpTester.prototype.test=function(_64){var re=this.re;for(var i=0;i<this.fields.length;i++){var s=store.getValue(_64,this.fields[i]);if(typeof s=="string"&&re.test(s)){return this.fields[i];}}if(this.withExtendedFields){return store.forEachField(_64,function(_68,_69,_6a){return typeof _6a=="string"&&re.test(_6a)?_69:null;},true);}return null;};abego.TiddlerQuery=function(_6b,_6c,_6d,_6e,_6f){if(_6d){this.regExp=new RegExp(_6b,_6c?"mg":"img");this.tester=new abego.MultiFieldRegExpTester(this.regExp,_6e,_6f);}else{this.expr=new abego.BoolExp(_6b,abego.parseTiddlerFilterTerm,{defaultFields:_6e,caseSensitive:_6c,withExtendedFields:_6f});}this.getQueryText=function(){return _6b;};this.getUseRegExp=function(){return _6d;};this.getCaseSensitive=function(){return _6c;};this.getDefaultFields=function(){return _6e;};this.getWithExtendedFields=function(){return _6f;};};abego.TiddlerQuery.prototype.test=function(_70){if(!_70){return false;}if(this.regExp){return this.tester.test(_70);}return this.expr.exec(_70);};abego.TiddlerQuery.prototype.filter=function(_71){return abego.select(_71,this.test,this);};abego.TiddlerQuery.prototype.getMarkRegExp=function(){if(this.regExp){return "".search(this.regExp)>=0?null:this.regExp;}return this.expr.getMarkRegExp();};abego.TiddlerQuery.prototype.toString=function(){return (this.regExp?this.regExp:this.expr).toString();};abego.PageWiseRenderer=function(){this.firstIndexOnPage=0;};merge(abego.PageWiseRenderer.prototype,{setItems:function(_72){this.items=_72;this.setFirstIndexOnPage(0);},getMaxPagesInNavigation:function(){return 10;},getItemsCount:function(_73){return this.items?this.items.length:0;},getCurrentPageIndex:function(){return Math.floor(this.firstIndexOnPage/this.getItemsPerPage());},getLastPageIndex:function(){return Math.floor((this.getItemsCount()-1)/this.getItemsPerPage());},setFirstIndexOnPage:function(_74){this.firstIndexOnPage=Math.min(Math.max(0,_74),this.getItemsCount()-1);},getFirstIndexOnPage:function(){this.firstIndexOnPage=Math.floor(this.firstIndexOnPage/this.getItemsPerPage())*this.getItemsPerPage();return this.firstIndexOnPage;},getLastIndexOnPage:function(){return Math.min(this.getFirstIndexOnPage()+this.getItemsPerPage()-1,this.getItemsCount()-1);},onPageChanged:function(_75,_76){},renderPage:function(_77){if(_77.beginRendering){_77.beginRendering(this);}try{if(this.getItemsCount()){var _78=this.getLastIndexOnPage();var _79=-1;for(var i=this.getFirstIndexOnPage();i<=_78;i++){_79++;_77.render(this,this.items[i],i,_79);}}}finally{if(_77.endRendering){_77.endRendering(this);}}},addPageNavigation:function(_7b){if(!this.getItemsCount()){return;}var _7c=this;var _7d=function(e){if(!e){var e=window.event;}var _7f=abego.toInt(this.getAttribute("page"),0);var _80=_7c.getCurrentPageIndex();if(_7f==_80){return;}var _81=_7f*_7c.getItemsPerPage();_7c.setFirstIndexOnPage(_81);_7c.onPageChanged(_7f,_80);};var _82;var _83=this.getCurrentPageIndex();var _84=this.getLastPageIndex();if(_83>0){_82=createTiddlyButton(_7b,"Previous","Go to previous page (Shortcut: Alt-'<')",_7d,"prev");_82.setAttribute("page",(_83-1).toString());_82.setAttribute("accessKey","<");}for(var i=-this.getMaxPagesInNavigation();i<this.getMaxPagesInNavigation();i++){var _86=_83+i;if(_86<0){continue;}if(_86>_84){break;}var _87=(i+_83+1).toString();var _88=_86==_83?"currentPage":"otherPage";_82=createTiddlyButton(_7b,_87,"Go to page %0".format([_87]),_7d,_88);_82.setAttribute("page",(_86).toString());}if(_83<_84){_82=createTiddlyButton(_7b,"Next","Go to next page (Shortcut: Alt-'>')",_7d,"next");_82.setAttribute("page",(_83+1).toString());_82.setAttribute("accessKey",">");}}});abego.LimitedTextRenderer=function(){var _89=40;var _8a=4;var _8b=function(_8c,_8d,_8e){var n=_8c.length;if(n==0){_8c.push({start:_8d,end:_8e});return;}var i=0;for(;i<n;i++){var _91=_8c[i];if(_91.start<=_8e&&_8d<=_91.end){var r;var _93=i+1;for(;_93<n;_93++){r=_8c[_93];if(r.start>_8e||_8d>_91.end){break;}}var _94=_8d;var _95=_8e;for(var j=i;j<_93;j++){r=_8c[j];_94=Math.min(_94,r.start);_95=Math.max(_95,r.end);}_8c.splice(i,_93-i,{start:_94,end:_95});return;}if(_91.start>_8e){break;}}_8c.splice(i,0,{start:_8d,end:_8e});};var _97=function(_98){var _99=0;for(var i=0;i<_98.length;i++){var _9b=_98[i];_99+=_9b.end-_9b.start;}return _99;};var _9c=function(c){return (c>="a"&&c<="z")||(c>="A"&&c<="Z")||c=="_";};var _9e=function(s,_a0){if(!_9c(s[_a0])){return null;}for(var i=_a0-1;i>=0&&_9c(s[i]);i--){}var _a2=i+1;var n=s.length;for(i=_a0+1;i<n&&_9c(s[i]);i++){}return {start:_a2,end:i};};var _a4=function(s,_a6,_a7){var _a8;if(_a7){_a8=_9e(s,_a6);}else{if(_a6<=0){return _a6;}_a8=_9e(s,_a6-1);}if(!_a8){return _a6;}if(_a7){if(_a8.start>=_a6-_8a){return _a8.start;}if(_a8.end<=_a6+_8a){return _a8.end;}}else{if(_a8.end<=_a6+_8a){return _a8.end;}if(_a8.start>=_a6-_8a){return _a8.start;}}return _a6;};var _a9=function(s,_ab){var _ac=[];if(_ab){var _ad=0;var n=s.length;var _af=0;do{_ab.lastIndex=_ad;var _b0=_ab.exec(s);if(_b0){if(_ad<_b0.index){var t=s.substring(_ad,_b0.index);_ac.push({text:t});}_ac.push({text:_b0[0],isMatch:true});_ad=_b0.index+_b0[0].length;}else{_ac.push({text:s.substr(_ad)});break;}}while(true);}else{_ac.push({text:s});}return _ac;};var _b2=function(_b3){var _b4=0;for(var i=0;i<_b3.length;i++){if(_b3[i].isMatch){_b4++;}}return _b4;};var _b6=function(s,_b8,_b9,_ba,_bb){var _bc=Math.max(Math.floor(_bb/(_ba+1)),_89);var _bd=Math.max(_bc-(_b9-_b8),0);var _be=Math.min(Math.floor(_b9+_bd/3),s.length);var _bf=Math.max(_be-_bc,0);_bf=_a4(s,_bf,true);_be=_a4(s,_be,false);return {start:_bf,end:_be};};var _c0=function(_c1,s,_c3){var _c4=[];var _c5=_b2(_c1);var pos=0;for(var i=0;i<_c1.length;i++){var t=_c1[i];var _c9=t.text;if(t.isMatch){var _ca=_b6(s,pos,pos+_c9.length,_c5,_c3);_8b(_c4,_ca.start,_ca.end);}pos+=_c9.length;}return _c4;};var _cb=function(s,_cd,_ce){var _cf=_ce-_97(_cd);while(_cf>0){if(_cd.length==0){_8b(_cd,0,_a4(s,_ce,false));return;}else{var _d0=_cd[0];var _d1;var _d2;if(_d0.start==0){_d1=_d0.end;if(_cd.length>1){_d2=_cd[1].start;}else{_8b(_cd,_d1,_a4(s,_d1+_cf,false));return;}}else{_d1=0;_d2=_d0.start;}var _d3=Math.min(_d2,_d1+_cf);_8b(_cd,_d1,_d3);_cf-=(_d3-_d1);}}};var _d4=function(_d5,s,_d7,_d8,_d9){if(_d8.length==0){return;}var _da=function(_db,s,_dd,_de,_df){var t;var _e1;var pos=0;var i=0;var _e4=0;for(;i<_dd.length;i++){t=_dd[i];_e1=t.text;if(_de<pos+_e1.length){_e4=_de-pos;break;}pos+=_e1.length;}var _e5=_df-_de;for(;i<_dd.length&&_e5>0;i++){t=_dd[i];_e1=t.text.substr(_e4);_e4=0;if(_e1.length>_e5){_e1=_e1.substr(0,_e5);}if(t.isMatch){createTiddlyElement(_db,"span",null,"marked",_e1);}else{createTiddlyText(_db,_e1);}_e5-=_e1.length;}if(_df<s.length){abego.createEllipsis(_db);}};if(_d8[0].start>0){abego.createEllipsis(_d5);}var _e6=_d9;for(var i=0;i<_d8.length&&_e6>0;i++){var _e8=_d8[i];var len=Math.min(_e8.end-_e8.start,_e6);_da(_d5,s,_d7,_e8.start,_e8.start+len);_e6-=len;}};this.render=function(_ea,s,_ec,_ed){if(s.length<_ec){_ec=s.length;}var _ee=_a9(s,_ed);var _ef=_c0(_ee,s,_ec);_cb(s,_ef,_ec);_d4(_ea,s,_ee,_ef,_ec);};};(function(){function alertAndThrow(msg){alert(msg);throw msg;}if(version.major<2||(version.major==2&&version.minor<1)){alertAndThrow("YourSearchPlugin requires TiddlyWiki 2.1 or newer.\sn\snCheck the archive for YourSearch plugins\snsupporting older versions of TiddlyWiki.\sn\snArchive: http://tiddlywiki.abego-software.de/archive");}abego.YourSearch={};var _f1;var _f2;var _f3=function(_f4){_f1=_f4;};var _f5=function(){return _f1?_f1:[];};var _f6=function(){return _f1?_f1.length:0;};var _f7=4;var _f8=10;var _f9=2;var _fa=function(s,re){var m=s.match(re);return m?m.length:0;};var _fe=function(_ff,_100){var _101=_100.getMarkRegExp();if(!_101){return 1;}var _102=_ff.title.match(_101);var _103=_102?_102.length:0;var _104=_fa(_ff.getTags(),_101);var _105=_102?_102.join("").length:0;var _106=_ff.title.length>0?_105/_ff.title.length:0;var rank=_103*_f7+_104*_f9+_106*_f8+1;return rank;};var _108=function(_109,_10a,_10b,_10c,_10d,_10e){_f2=null;var _10f=_109.reverseLookup("tags",_10e,false);try{var _110=[];if(config.options.chkSearchInTitle){_110.push("title");}if(config.options.chkSearchInText){_110.push("text");}if(config.options.chkSearchInTags){_110.push("tags");}_f2=new abego.TiddlerQuery(_10a,_10b,_10c,_110,config.options.chkSearchExtendedFields);}catch(e){return [];}var _111=_f2.filter(_10f);var _112=abego.YourSearch.getRankFunction();for(var i=0;i<_111.length;i++){var _114=_111[i];var rank=_112(_114,_f2);_114.searchRank=rank;}if(!_10d){_10d="title";}var _116=function(a,b){var _119=a.searchRank-b.searchRank;if(_119==0){if(a[_10d]==b[_10d]){return (0);}else{return (a[_10d]<b[_10d])?-1:+1;}}else{return (_119>0)?-1:+1;}};_111.sort(_116);return _111;};var _11a=80;var _11b=50;var _11c=250;var _11d=50;var _11e=25;var _11f=10;var _120="yourSearchResult";var _121="yourSearchResultItems";var _122;var _123;var _124;var _125;var _126;var _127=function(){if(version.extensions.YourSearchPlugin.styleSheetInited){return;}version.extensions.YourSearchPlugin.styleSheetInited=true;setStylesheet(store.getTiddlerText("YourSearchStyleSheet"),"yourSearch");};var _128=function(){return _123!=null&&_123.parentNode==document.body;};var _129=function(){if(_128()){document.body.removeChild(_123);}};var _12a=function(e){_129();var _12c=this.getAttribute("tiddlyLink");if(_12c){var _12d=this.getAttribute("withHilite");var _12e=highlightHack;if(_12d&&_12d=="true"&&_f2){highlightHack=_f2.getMarkRegExp();}story.displayTiddler(this,_12c);highlightHack=_12e;}return (false);};var _12f=function(){if(!_124){return;}var root=_124;var _131=findPosX(root);var _132=findPosY(root);var _133=root.offsetHeight;var _134=_131;var _135=_132+_133;var _136=findWindowWidth();if(_136<_123.offsetWidth){_123.style.width=(_136-100)+"px";_136=findWindowWidth();}var _137=_123.offsetWidth;if(_134+_137>_136){_134=_136-_137-30;}if(_134<0){_134=0;}_123.style.left=_134+"px";_123.style.top=_135+"px";_123.style.display="block";};var _138=function(){if(_123){window.scrollTo(0,ensureVisible(_123));}if(_124){window.scrollTo(0,ensureVisible(_124));}};var _139=function(){_12f();_138();};var _13a;var _13b;var _13c=new abego.PageWiseRenderer();var _13d=function(_13e){this.itemHtml=store.getTiddlerText("YourSearchItemTemplate");if(!this.itemHtml){alertAndThrow("YourSearchItemTemplate not found");}this.place=document.getElementById(_121);if(!this.place){this.place=createTiddlyElement(_13e,"div",_121);}};merge(_13d.prototype,{render:function(_13f,_140,_141,_142){_13a=_142;_13b=_140;var item=createTiddlyElement(this.place,"div",null,"yourSearchItem");item.innerHTML=this.itemHtml;applyHtmlMacros(item,null);refreshElements(item,null);},endRendering:function(_144){_13b=null;}});var _145=function(){if(!_123||!_124){return;}var html=store.getTiddlerText("YourSearchResultTemplate");if(!html){html="<b>Tiddler YourSearchResultTemplate not found</b>";}_123.innerHTML=html;applyHtmlMacros(_123,null);refreshElements(_123,null);var _147=new _13d(_123);_13c.renderPage(_147);_139();};_13c.getItemsPerPage=function(){var n=(config.options.chkPreviewText)?abego.toInt(config.options.txtItemsPerPageWithPreview,_11f):abego.toInt(config.options.txtItemsPerPage,_11e);return (n>0)?n:1;};_13c.onPageChanged=function(){_145();};var _149=function(){if(!_123){_123=createTiddlyElement(document.body,"div",_120,"yourSearchResult");}else{if(_123.parentNode!=document.body){document.body.appendChild(_123);}}_145();};var _14a=function(){if(_124==null||!config.options.chkUseYourSearch){return;}if((_124.value==_122)&&_122&&!_128()){if(_123&&(_123.parentNode!=document.body)){document.body.appendChild(_123);_139();}else{_149();}}};var _14b=function(){_129();_123=null;_122=null;};var _14c=function(self,e){while(e!=null){if(self==e){return true;}e=e.parentNode;}return false;};var _14f=function(e){if(e.target==_124){return;}if(e.target==_125){return;}if(_123&&_14c(_123,e.target)){return;}_129();};var _151=function(e){if(e.keyCode==27){_129();}};addEvent(document,"click",_14f);addEvent(document,"keyup",_151);var _153=function(text,_155,_156){_122=text;_f3(_108(store,text,_155,_156,"title","excludeSearch"));highlightHack=_f2?_f2.getMarkRegExp():null;_13c.setItems(_f5());_149();highlightHack=null;};var _157=function(_158,_159,_15a,_15b,_15c,_15d){_127();_122="";var _15e=null;var _15f=function(txt){if(config.options.chkUseYourSearch){_153(txt.value,config.options.chkCaseSensitiveSearch,config.options.chkRegExpSearch);}else{story.search(txt.value,config.options.chkCaseSensitiveSearch,config.options.chkRegExpSearch);}_122=txt.value;};var _161=function(e){_15f(_124);return false;};var _163=function(e){if(!e){var e=window.event;}_124=this;switch(e.keyCode){case 13:if(e.ctrlKey&&_126&&_128()){_126.onclick.apply(_126,[e]);}else{_15f(this);}break;case 27:if(_128()){_129();}else{this.value="";clearMessage();}break;}if(String.fromCharCode(e.keyCode)==this.accessKey||e.altKey){_14a();}if(this.value.length<3&&_15e){clearTimeout(_15e);}if(this.value.length>2){if(this.value!=_122){if(!config.options.chkUseYourSearch||config.options.chkSearchAsYouType){if(_15e){clearTimeout(_15e);}var txt=this;_15e=setTimeout(function(){_15f(txt);},500);}}else{if(_15e){clearTimeout(_15e);}}}if(this.value.length==0){_129();}};var _166=function(e){this.select();clearMessage();_14a();};var args=_15c.parseParams("list",null,true);var _169=getFlag(args,"buttonAtRight");var _16a=getParam(args,"sizeTextbox",this.sizeTextbox);var btn;if(!_169){btn=createTiddlyButton(_158,this.label,this.prompt,_161);}var txt=createTiddlyElement(_158,"input",null,null,null);if(_15a[0]){txt.value=_15a[0];}txt.onkeyup=_163;txt.onfocus=_166;txt.setAttribute("size",_16a);txt.setAttribute("accessKey",this.accessKey);txt.setAttribute("autocomplete","off");if(config.browser.isSafari){txt.setAttribute("type","search");txt.setAttribute("results","5");}else{txt.setAttribute("type","text");}if(_169){btn=createTiddlyButton(_158,this.label,this.prompt,_161);}_124=txt;_125=btn;};var _16d=function(){_129();var _16e=_f5();var n=_16e.length;if(n){var _170=[];for(var i=0;i<n;i++){_170.push(_16e[i].title);}story.displayTiddlers(null,_170);}};var _172=function(_173,_174,_175,_176){invokeMacro(_173,"option",_174,_175,_176);var elem=_173.lastChild;var _178=elem.onclick;elem.onclick=function(e){var _17a=_178.apply(this,arguments);_145();return _17a;};return elem;};var _17b=function(s){var _17d=["''","{{{","}}}","//","<<<","/***","***/"];var _17e="";for(var i=0;i<_17d.length;i++){if(i!=0){_17e+="|";}_17e+="("+_17d[i].escapeRegExp()+")";}return s.replace(new RegExp(_17e,"mg"),"").trim();};var _180=function(){var i=_13a;return (i>=0&&i<=9)?(i<9?(i+1):0):-1;};var _182=new abego.LimitedTextRenderer();var _183=function(_184,s,_186){_182.render(_184,s,_186,_f2.getMarkRegExp());};var _187=TiddlyWiki.prototype.saveTiddler;TiddlyWiki.prototype.saveTiddler=function(_188,_189,_18a,_18b,_18c,tags,_18e){_187.apply(this,arguments);_14b();};var _18f=TiddlyWiki.prototype.removeTiddler;TiddlyWiki.prototype.removeTiddler=function(_190){_18f.apply(this,arguments);_14b();};config.macros.yourSearch={label:"yourSearch",prompt:"Gives access to the current/last YourSearch result",handler:function(_191,_192,_193,_194,_195,_196){if(_193.length==0){return;}var name=_193[0];var func=config.macros.yourSearch.funcs[name];if(func){func(_191,_192,_193,_194,_195,_196);}},tests:{"true":function(){return true;},"false":function(){return false;},"found":function(){return _f6()>0;},"previewText":function(){return config.options.chkPreviewText;}},funcs:{itemRange:function(_199){if(_f6()){var _19a=_13c.getLastIndexOnPage();var s="%0 - %1".format([_13c.getFirstIndexOnPage()+1,_19a+1]);createTiddlyText(_199,s);}},count:function(_19c){createTiddlyText(_19c,_f6().toString());},query:function(_19d){if(_f2){createTiddlyText(_19d,_f2.toString());}},version:function(_19e){var t="YourSearch %0.%1.%2".format([version.extensions.YourSearchPlugin.major,version.extensions.YourSearchPlugin.minor,version.extensions.YourSearchPlugin.revision]);var e=createTiddlyElement(_19e,"a");e.setAttribute("href","http://tiddlywiki.abego-software.de/#YourSearchPlugin");e.innerHTML="<font color=\s"black\s" face=\s"Arial, Helvetica, sans-serif\s">"+t+"<font>";},copyright:function(_1a1){var e=createTiddlyElement(_1a1,"a");e.setAttribute("href","http://www.abego-software.de");e.innerHTML="<font color=\s"black\s" face=\s"Arial, Helvetica, sans-serif\s">&copy; 2005-2006 <b><font color=\s"red\s">abego</font></b> Software<font>";},newTiddlerButton:function(_1a3){if(_f2){var r=abego.parseNewTiddlerCommandLine(_f2.getQueryText());var btn=config.macros.newTiddler.createNewTiddlerButton(_1a3,r.title,r.params,"new tiddler","Create a new tiddler based on search text. (Shortcut: Ctrl-Enter; Separators: '.', '#')",null,"text");var _1a6=btn.onclick;btn.onclick=function(){_129();_1a6.apply(this,arguments);};_126=btn;}},linkButton:function(_1a7,_1a8,_1a9,_1aa,_1ab,_1ac){if(_1a9<2){return;}var _1ad=_1a9[1];var text=_1a9<3?_1ad:_1a9[2];var _1af=_1a9<4?text:_1a9[3];var _1b0=_1a9<5?null:_1a9[4];var btn=createTiddlyButton(_1a7,text,_1af,_12a,null,null,_1b0);btn.setAttribute("tiddlyLink",_1ad);},closeButton:function(_1b2,_1b3,_1b4,_1b5,_1b6,_1b7){var _1b8=createTiddlyButton(_1b2,"close","Close the Search Results (Shortcut: ESC)",_129);},openAllButton:function(_1b9,_1ba,_1bb,_1bc,_1bd,_1be){var n=_f6();if(n==0){return;}var _1c0=n==1?"open tiddler":"open all %0 tiddlers".format([n]);var _1c1=createTiddlyButton(_1b9,_1c0,"Open all found tiddlers (Shortcut: Alt-O)",_16d);_1c1.setAttribute("accessKey","O");},naviBar:function(_1c2,_1c3,_1c4,_1c5,_1c6,_1c7){_13c.addPageNavigation(_1c2);},"if":function(_1c8,_1c9,_1ca,_1cb,_1cc,_1cd){if(_1ca.length<2){return;}var _1ce=_1ca[1];var _1cf=(_1ce=="not");if(_1cf){if(_1ca.length<3){return;}_1ce=_1ca[2];}var test=config.macros.yourSearch.tests[_1ce];var _1d1=false;try{if(test){_1d1=test(_1c8,_1c9,_1ca,_1cb,_1cc,_1cd)!=_1cf;}else{_1d1=(!eval(_1ce))==_1cf;}}catch(ex){}if(!_1d1){_1c8.style.display="none";}},chkPreviewText:function(_1d2,_1d3,_1d4,_1d5,_1d6,_1d7){var _1d8=_1d4.slice(1).join(" ");var elem=_172(_1d2,"chkPreviewText",_1d5,_1d7);elem.setAttribute("accessKey","P");elem.title="Show text preview of found tiddlers (Shortcut: Alt-P)";return elem;}}};config.macros.foundTiddler={label:"foundTiddler",prompt:"Provides information on the tiddler currently processed on the YourSearch result page",handler:function(_1da,_1db,_1dc,_1dd,_1de,_1df){var name=_1dc[0];var func=config.macros.foundTiddler.funcs[name];if(func){func(_1da,_1db,_1dc,_1dd,_1de,_1df);}},funcs:{title:function(_1e2,_1e3,_1e4,_1e5,_1e6,_1e7){if(!_13b){return;}var _1e8=_180();var _1e9=_1e8>=0?"Open tiddler (Shortcut: Alt-%0)".format([_1e8.toString()]):"Open tiddler";var btn=createTiddlyButton(_1e2,null,_1e9,_12a,null);btn.setAttribute("tiddlyLink",_13b.title);btn.setAttribute("withHilite","true");_183(btn,_13b.title,_11a);if(_1e8>=0){btn.setAttribute("accessKey",_1e8.toString());}},tags:function(_1eb,_1ec,_1ed,_1ee,_1ef,_1f0){if(!_13b){return;}_183(_1eb,_13b.getTags(),_11b);},text:function(_1f1,_1f2,_1f3,_1f4,_1f5,_1f6){if(!_13b){return;}_183(_1f1,_17b(_13b.text),_11c);},field:function(_1f7,_1f8,_1f9,_1fa,_1fb,_1fc){if(!_13b){return;}var name=_1f9[1];var len=_1f9.length>2?abego.toInt(_1f9[2],_11d):_11d;var v=store.getValue(_13b,name);if(v){_183(_1f7,_17b(v),len);}},number:function(_200,_201,_202,_203,_204,_205){var _206=_180();if(_206>=0){var text="%0)".format([_206.toString()]);createTiddlyElement(_200,"span",null,"shortcutNumber",text);}}}};var opts={chkUseYourSearch:true,chkPreviewText:true,chkSearchAsYouType:true,chkSearchInTitle:true,chkSearchInText:true,chkSearchInTags:true,chkSearchExtendedFields:true,txtItemsPerPage:_11e,txtItemsPerPageWithPreview:_11f};for(var n in opts){if(config.options[n]==undefined){config.options[n]=opts[n];}}config.shadowTiddlers.AdvancedOptions+="\sn<<option chkUseYourSearch>> Use 'Your Search' //([[more options|YourSearch Options]]) ([[help|YourSearch Help]])// ";config.shadowTiddlers["YourSearch Help"]="!Field Search\snWith the Field Search you can restrict your search to certain fields of a tiddler, e.g"+" only search the tags or only the titles. The general form is //fieldname//'':''//textToSearch// (e."+"g. {{{title:intro}}}). In addition one-character shortcuts are also supported for the standard field"+"s {{{title}}}, {{{text}}} and {{{tags}}}:\sn|!What you want|!What you type|!Example|\sn|Search ''titles "+"only''|start word with ''!''|{{{!jonny}}} (shortcut for {{{title:jonny}}})|\sn|Search ''contents/text "+"only''|start word with ''%''|{{{%football}}} (shortcut for {{{text:football}}})|\sn|Search ''tags only"+"''|start word with ''#''|{{{#Plugin}}} (shortcut for {{{tags:Plugin}}})|\sn\snUsing this feature you may"+" also search the extended fields (\s"Metadata\s") introduced with TiddlyWiki 2.1, e.g. use {{{priority:1"+"}}} to find all tiddlers with the priority field set to \s"1\s".\sn\snYou may search a word in more than one"+" field. E.g. {{{!#Plugin}}} (or {{{title:tags:Plugin}}} in the \s"long form\s") finds tiddlers containin"+"g \s"Plugin\s" either in the title or in the tags (but does not look for \s"Plugin\s" in the text). \sn\sn!Boole"+"an Search\snThe Boolean Search is useful when searching for multiple words.\sn|!What you want|!What you "+"type|!Example|\sn|''All words'' must exist|List of words|{{{jonny jeremy}}} (or {{{jonny and jeremy}}}"+")|\sn|''At least one word'' must exist|Separate words by ''or''|{{{jonny or jeremy}}}|\sn|A word ''must "+"not exist''|Start word with ''-''|{{{-jonny}}} (or {{{not jonny}}})|\sn\sn''Note:'' When you specify two"+" words, separated with a space, YourSearch finds all tiddlers that contain both words, but not neces"+"sarily next to each other. If you want to find a sequence of word, e.g. '{{{John Brown}}}', you need"+" to put the words into quotes. I.e. you type: {{{\s"john brown\s"}}}.\sn\snUsing parenthesis you may change "+"the default \s"left to right\s" evaluation of the boolean search. E.g. {{{not (jonny or jeremy)}}} finds"+" all tiddlers that contain neither \s"jonny\s" nor \s"jeremy. In contrast to this {{{not jonny or jeremy}}"+"} (i.e. without parenthesis) finds all tiddlers that either don't contain \s"jonny\s" or that contain \s"j"+"eremy\s".\sn\sn!'Exact Word' Search\snBy default a search result all matches that 'contain' the searched tex"+"t. E.g. if you search for {{{Task}}} you will get all tiddlers containing 'Task', but also '~Complet"+"edTask', '~TaskForce' etc.\sn\snIf you only want to get the tiddlers that contain 'exactly the word' you"+" need to prefix it with a '='. E.g. typing '=Task' will find the tiddlers that contain the word 'Tas"+"k', ignoring words that just contain 'Task' as a substring.\sn\sn!~CaseSensitiveSearch and ~RegExpSearch"+"\snThe standard search options ~CaseSensitiveSearch and ~RegExpSearch are fully supported by YourSearc"+"h. However when ''~RegExpSearch'' is on Filtered and Boolean Search are disabled.\sn\snIn addition you m"+"ay do a \s"regular expression\s" search even with the ''~RegExpSearch'' set to false by directly enterin"+"g the regular expression into the search field, framed with {{{/.../}}}. \sn\snExample: {{{/m[ae][iy]er/"+"}}} will find all tiddlers that contain either \s"maier\s", \s"mayer\s", \s"meier\s" or \s"meyer\s".\sn\sn!~JavaScript E"+"xpression Filtering\snIf you are familiar with JavaScript programming and know some TiddlyWiki interna"+"ls you may also use JavaScript expression for the search. Just enter a JavaScript boolean expression"+" into the search field, framed with {{{ { ... } }}}. In the code refer to the variable tiddler and e"+"valuate to {{{true}}} when the given tiddler should be included in the result. \sn\snExample: {{{ { tidd"+"ler.modified > new Date(\s"Jul 4, 2005\s")} }}} returns all tiddler modified after July 4th, 2005.\sn\sn!Com"+"bined Search\snYou are free to combine the various search options. \sn\sn''Examples''\sn|!What you type|!Res"+"ult|\sn|{{{!jonny !jeremy -%football}}}|all tiddlers with both {{{jonny}}} and {{{jeremy}}} in its tit"+"les, but no {{{football}}} in content.|\sn|{{{#=Task}}}|All tiddlers tagged with 'Task' (the exact wor"+"d). Tags named '~CompletedTask', '~TaskForce' etc. are not considered.|\sn\sn!Access Keys\snYou are encour"+"aged to use the access keys (also called \s"shortcut\s" keys) for the most frequently used operations. F"+"or quick reference these shortcuts are also mentioned in the tooltip for the various buttons etc.\sn\sn|"+"!Key|!Operation|\sn|{{{Alt-F}}}|''The most important keystroke'': It moves the cursor to the search in"+"put field so you can directly start typing your query. Pressing {{{Alt-F}}} will also display the pr"+"evious search result. This way you can quickly display multiple tiddlers using \s"Press {{{Alt-F}}}. S"+"elect tiddler.\s" sequences.|\sn|{{{ESC}}}|Closes the [[YourSearch Result]]. When the [[YourSearch Resul"+"t]] is already closed and the cursor is in the search input field the field's content is cleared so "+"you start a new query.|\sn|{{{Alt-1}}}, {{{Alt-2}}},... |Pressing these keys opens the first, second e"+"tc. tiddler from the result list.|\sn|{{{Alt-O}}}|Opens all found tiddlers.|\sn|{{{Alt-P}}}|Toggles the "+"'Preview Text' mode.|\sn|{{{Alt-'<'}}}, {{{Alt-'>'}}}|Displays the previous or next page in the [[Your"+"Search Result]].|\sn|{{{Return}}}|When you have turned off the 'as you type' search mode pressing the "+"{{{Return}}} key actually starts the search (as does pressing the 'search' button).|\sn\sn//If some of t"+"hese shortcuts don't work for you check your browser if you have other extensions installed that alr"+"eady \s"use\s" these shortcuts.//";config.shadowTiddlers["YourSearch Options"]="|>|!YourSearch Options|\sn|>|<<option chkUseYourSearch>> Use 'Your Search'|\sn|!|<<option chkPreviewText"+">> Show Text Preview|\sn|!|<<option chkSearchAsYouType>> 'Search As You Type' Mode (No RETURN required"+" to start search)|\sn|!|Default Search Filter:<<option chkSearchInTitle>>Title ('!') <<option chk"+"SearchInText>>Text ('%') <<option chkSearchInTags>>Tags ('#') <<option chkSearchExtendedFiel"+"ds>>Extended Fields<html><br><font size=\s"-2\s">The fields of a tiddlers that are searched when you don"+"'t explicitly specify a filter in the search text <br>(Explictly specify fields using one or more '!"+"', '%', '#' or 'fieldname:' prefix before the word/text to find).</font></html>|\sn|!|Number of items "+"on search result page: <<option txtItemsPerPage>>|\sn|!|Number of items on search result page with pre"+"view text: <<option txtItemsPerPageWithPreview>>|\sn";config.shadowTiddlers["YourSearchStyleSheet"]="/***\sn!~YourSearchResult Stylesheet\sn***/\sn/*{{{*/\sn.yourSearchResult {\sn\stposition: absolute;\sn\stwidth: 800"+"px;\sn\sn\stpadding: 0.2em;\sn\stlist-style: none;\sn\stmargin: 0;\sn\sn\stbackground: #ffd;\sn\stborder: 1px solid DarkGra"+"y;\sn}\sn\sn/*}}}*/\sn/***\sn!!Summary Section\sn***/\sn/*{{{*/\sn.yourSearchResult .summary {\sn\stborder-bottom-width:"+" thin;\sn\stborder-bottom-style: solid;\sn\stborder-bottom-color: #999999;\sn\stpadding-bottom: 4px;\sn}\sn\sn.yourSea"+"rchRange, .yourSearchCount, .yourSearchQuery {\sn\stfont-weight: bold;\sn}\sn\sn.yourSearchResult .summary ."+"button {\sn\stfont-size: 10px;\sn\sn\stpadding-left: 0.3em;\sn\stpadding-right: 0.3em;\sn}\sn\sn.yourSearchResult .summa"+"ry .chkBoxLabel {\sn\stfont-size: 10px;\sn\sn\stpadding-right: 0.3em;\sn}\sn\sn/*}}}*/\sn/***\sn!!Items Area\sn***/\sn/*{{{*"+"/\sn.yourSearchResult .marked {\sn\stbackground: none;\sn\stfont-weight: bold;\sn}\sn\sn.yourSearchItem {\sn\stmargin-to"+"p: 2px;\sn}\sn\sn.yourSearchNumber {\sn\stcolor: #808080;\sn}\sn\sn\sn.yourSearchTags {\sn\stcolor: #008000;\sn}\sn\sn.yourSearc"+"hText {\sn\stcolor: #808080;\sn\stmargin-bottom: 6px;\sn}\sn\sn/*}}}*/\sn/***\sn!!Footer\sn***/\sn/*{{{*/\sn.yourSearchFoote"+"r {\sn\stmargin-top: 8px;\sn\stborder-top-width: thin;\sn\stborder-top-style: solid;\sn\stborder-top-color: #999999;"+"\sn}\sn\sn.yourSearchFooter a:hover{\sn\stbackground: none;\sn\stcolor: none;\sn}\sn/*}}}*/\sn/***\sn!!Navigation Bar\sn***/"+"\sn/*{{{*/\sn.yourSearchNaviBar a {\sn\stfont-size: 16px;\sn\stmargin-left: 4px;\sn\stmargin-right: 4px;\sn\stcolor: bla"+"ck;\sn\sttext-decoration: underline;\sn}\sn\sn.yourSearchNaviBar a:hover {\sn\stbackground-color: none;\sn}\sn\sn.yourSe"+"archNaviBar .prev {\sn\stfont-weight: bold;\sn\stcolor: blue;\sn}\sn\sn.yourSearchNaviBar .currentPage {\sn\stcolor: #"+"FF0000;\sn\stfont-weight: bold;\sn\sttext-decoration: none;\sn}\sn\sn.yourSearchNaviBar .next {\sn\stfont-weight: bold"+";\sn\stcolor: blue;\sn}\sn/*}}}*/\sn";config.shadowTiddlers["YourSearchResultTemplate"]="<!--\sn{{{\sn-->\sn<span macro=\s"yourSearch if found\s">\sn<!-- The Summary Header ============================"+"================ -->\sn<table class=\s"summary\s" border=\s"0\s" width=\s"100%\s" cellspacing=\s"0\s" cellpadding=\s"0\s">"+"<tbody>\sn <tr>\sn\st<td align=\s"left\s">\sn\st\stYourSearch Result <span class=\s"yourSearchRange\s" macro=\s"yourSearc"+"h itemRange\s"></span>\sn\st\st&nbsp;of&nbsp;<span class=\s"yourSearchCount\s" macro=\s"yourSearch count\s"></span>\sn"+"\st\stfor&nbsp;<span class=\s"yourSearchQuery\s" macro=\s"yourSearch query\s"></span>\sn\st</td>\sn\st<td class=\s"yourSea"+"rchButtons\s" align=\s"right\s">\sn\st\st<span macro=\s"yourSearch chkPreviewText\s"></span><span class=\s"chkBoxLabel"+"\s">preview text</span>\sn\st\st<span macro=\s"yourSearch newTiddlerButton\s"></span>\sn\st\st<span macro=\s"yourSearch openAllButton\s"></span>\sn\st\st<span macro=\s"yourSearch lin"+"kButton 'YourSearch Options' options 'Configure YourSearch'\s"></span>\sn\st\st<span macro=\s"yourSearch linkB"+"utton 'YourSearch Help' help 'Get help how to use YourSearch'\s"></span>\sn\st\st<span macro=\s"yourSearch clo"+"seButton\s"></span>\sn\st</td>\sn </tr>\sn</tbody></table>\sn\sn<!-- The List of Found Tiddlers ================="+"=========================== -->\sn<div id=\s"yourSearchResultItems\s" itemsPerPage=\s"25\s" itemsPerPageWithPr"+"eview=\s"10\s"></div>\sn\sn<!-- The Footer (with the Navigation) ==========================================="+"= -->\sn<table class=\s"yourSearchFooter\s" border=\s"0\s" width=\s"100%\s" cellspacing=\s"0\s" cellpadding=\s"0\s"><tbody"+">\sn <tr>\sn\st<td align=\s"left\s">\sn\st\stResult page: <span class=\s"yourSearchNaviBar\s" macro=\s"yourSearch naviBar"+"\s"></span>\sn\st</td>\sn\st<td align=\s"right\s"><span macro=\s"yourSearch version\s"></span>, <span macro=\s"yourSearc"+"h copyright\s"></span>\sn\st</td>\sn </tr>\sn</tbody></table>\sn<!-- end of the 'tiddlers found' case ========="+"================================== -->\sn</span>\sn\sn\sn<!-- The \s"No tiddlers found\s" case ================="+"========================== -->\sn<span macro=\s"yourSearch if not found\s">\sn<table class=\s"summary\s" border="+"\s"0\s" width=\s"100%\s" cellspacing=\s"0\s" cellpadding=\s"0\s"><tbody>\sn <tr>\sn\st<td align=\s"left\s">\sn\st\stYourSearch Resu"+"lt: No tiddlers found for <span class=\s"yourSearchQuery\s" macro=\s"yourSearch query\s"></span>.\sn\st</td>\sn\st<t"+"d class=\s"yourSearchButtons\s" align=\s"right\s">\sn\st\st<span macro=\s"yourSearch newTiddlerButton\s"></span>\sn\st\st<span macro=\s"yourSearch linkButton 'YourSearch Options'"+" options 'Configure YourSearch'\s"></span>\sn\st\st<span macro=\s"yourSearch linkButton 'YourSearch Help' help"+" 'Get help how to use YourSearch'\s"></span>\sn\st\st<span macro=\s"yourSearch closeButton\s"></span>\sn\st</td>\sn <"+"/tr>\sn</tbody></table>\sn</span>\sn\sn\sn<!--\sn}}}\sn-->\sn";config.shadowTiddlers["YourSearchItemTemplate"]="<!--\sn{{{\sn-->\sn<span class='yourSearchNumber' macro='foundTiddler number'></span>\sn<span class='yourSea"+"rchTitle' macro='foundTiddler title'/></span>&nbsp;-&nbsp;\sn<span class='yourSearchTags' macro='found"+"Tiddler field tags 50'/></span>\sn<span macro=\s"yourSearch if previewText\s"><div class='yourSearchText' macro='fo"+"undTiddler field text 250'/></div></span>\sn<!--\sn}}}\sn-->";config.shadowTiddlers["YourSearch"]="<<tiddler [[YourSearch Help]]>>";config.shadowTiddlers["YourSearch Result"]="The popup-like window displaying the result of a YourSearch query.";config.macros.search.handler=_157;var _20a=function(){if(config.macros.search.handler!=_157){alert("Message from YourSearchPlugin:\sn\sn\snAnother plugin has disabled the 'Your Search' features.\sn\sn\snYou may "+"disable the other plugin or change the load order of \snthe plugins (by changing the names of the tidd"+"lers)\snto enable the 'Your Search' features.");}};setTimeout(_20a,5000);abego.YourSearch.getStandardRankFunction=function(){return _fe;};abego.YourSearch.getRankFunction=function(){return abego.YourSearch.getStandardRankFunction();};abego.YourSearch.getCurrentTiddler=function(){return _13b;};abego.YourSearch.closeResult=function(){_129();};})();}\n//%/
<<tiddlerList tags: clarinete,-etiquetasusuales format:"table" header:"Clarinete" >>
<<tiddlerList tags: flauta,-etiquetasusuales format:"table" header:"Flauta Travesera" >>
<<tiddlerList tags: oboe,-etiquetasusuales format:"table" header:"Oboe" >>
<<tiddlerList tags: trompeta,-etiquetasusuales format:"table" header:"Trompeta" >>
<<tiddlerList tags: violín,-etiquetasusuales format:"table" header:"Violín" >>
<<tiddlerList tags: fagot,-etiquetasusuales format:"table" header:"Fagot" >>
<<tiddlerList tags: flautín,-etiquetasusuales format:"table" header:"Flautín" >>
<<tiddlerList tags: requinto,-etiquetasusuales format:"table" header:"Requinto" >>
<<tiddlerList tags: trompa,-etiquetasusuales format:"table" header:"Trompa" >>
<<tiddlerList tags: viola,-etiquetasusuales format:"table" header:"Viola" >>
<<tiddlerList tags: clarinete_bajo,-etiquetasusuales format:"table" header:"Clarinete Bajo" >>
<<tiddlerList tags: trombón,-etiquetasusuales format:"table" header:"Trombón" >>
<<tiddlerList tags: violonchelo,-etiquetasusuales format:"table" header:"Violonchelo" >>
<<tiddlerList tags: contrabajo,-etiquetasusuales format:"table" header:"Contrabajo" >>
<<tiddlerList tags: saxofón_soprano,-etiquetasusuales format:"table" header:"Saxofón Soprano" >>
<<tiddlerList tags: tuba,-etiquetasusuales format:"table" header:"Tuba" >>
<<tiddlerList tags: saxofón_barítono,-etiquetasusuales format:"table" header:"Saxofón Barítono" >>
\n<html>\n <td align="right"><b>Técnico:</b></td>\n <td colspan="3"><input name= tecnico type=text style="width:25%" /></td></tr>\n<b>Intérprete(s):</b>\n <td colspan="3"><input name= interprete type=text style="width:50%" /></td></tr><br/>\n<sub><b>Fecha de la Grabación:</b><br/>\n<sub><b>Mes:</b></sub>\n<select name=mes >\n<option> \n<option>Enero\n<option>Febrero\n<option>Marzo\n<option>Abril\n<option>Mayo\n<option>Junio\n<option>Julio\n<option>Agosto\n<option>Septiembre\n<option>Octubre\n<option>Noviembre\n<option>Diciembre\n</select >\n<sub><b>Año:</b></sub>\n<select name=año >\n<option> \n<option>2005\n<option>2006\n<option>2007\n<option>2008\n<option>2009\n</select >\n<br/>\n\n<sub><b>Lugar de Grabación:</b></sub><br/><input name=lugar type=radio value="aula" />aula\n<input name=level type=radio value="auditorio" />auditorio\n<input name=level type=radio value="estudio" />estudio<br/>\n\n<sub><b>Equipo/Notas:</b></sub><br/>\n<TEXTAREA name=notes rows=5 cols=80 ></TEXTAREA>\n<p/>\n\n\n<br/>\n</div>\n</html>\n