{{{#}}} is only allowed once preceded by either an {{{absoluteURI}}} or a {{{relativeURI}}} and followed by ''zero or more'' of any of the following characters:\n{{{\n;/?:@&=+$,-_.!~*'()abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890\n or\n%\n when followed by at least two and no more then two of any of the following characters:\n1234567890abcdefABCDEF\n}}}
{{{%}}} is ''only'' allowed when it precedes 2 instances of {{{hex}}} where {{{hex}}} is one of the following characters:\n{{{\n0123456789abcdefABCDEF\n}}}
The first colon in a [[URI]] or [[URI-reference]] always follows after the [[scheme]] part.\n\nalthough.... also look at the example of [[colons and slashes]].\n
This is a reserved character.\n\nWhen used in a relative URI it should be before the {{{?}}} where it can be surrounded any one of the following characters: \n{{{-_.!~*'()$,;:@&=+}}} or {{{alphanum}}} or {{{%}}} under the condition that the {{{%}}} character is followed by two {{{hex}}} characters.\nIt can be followed by a {{{/}}} followed by a {{{path_segment}}} or a {{{#}}} followed by a fragment.\n\nWhen used in an absolute URI it should be before the {{{?}}} and after the {{{://}}}\n\nThe [[;]] is part of one of the following:\n# reg_name used in {{{authority}}}, which is used in {{{net_path}}}, which is used in either {{{relativeURI}}} (always before the {{{?}}}) or in {{{hier_part}}}, which is used in {{{absoluteURI}}} (always after {{{://}}} and before {{{?}}}) where it can be surrounded any one of the following characters: {{{-_.!~*'()$,;:@&=+}}} or {{{alphanum}}} or {{{%}}} under the condition that the {{{%}}} character is followed by two {{{hex}}} characters.\n# rel_segment used in {{{rel_path}}} where it precedes the optional {{{abs_path}}} (which always starts with a {{{/}}} followed by a {{{path_segment}}}) and which is used in {{{relativeURI}}}, which is used in {{{URI_reference}}} where it precedes the optional {{{#}}} followed by a {{{fragment}}}.\n# reserved\n# segment\n# uric_no_slash\n# userinfo
This page is a means to understand the possible structures of a URI_reference.\nIt aims at requiring an insight on what characters and sequence of characters are allowed in a URI.\nIt is not meant to discribe the way one should parse a URI. For this you read [[RFC 2396]].\n\n\nIn IMS VDEX the URI format allowed is the one below:\nconformant to [[RFC 2396]] as amended by [[RFC 2732]] in the value space according to [[ISO/IEC 10646-1:2000]]\nThis means I have to look into [[RFC 2732]] and [[ISO/IEC 10646-1:2000]] in order to make this document complete.\n=> see [[Changes to RFC 2396 in RFC 2732]]\n
The text below is a copy of part of [[RFC 2732]]. The actual consequences to the URI format according to [[RFC 2396]] still need to be added to this [[URI-help|About this page]] pages.\n\n\n3. Changes to [[RFC 2396]]\n\nThis document updates the generic syntax for Uniform Resource\nIdentifiers defined in [[RFC 2396]] [URL]. It defines a syntax for IPv6\naddresses and allows the use of "[" and "]" within a URI explicitly\nfor this reserved purpose.\n\nThe following changes to the syntax in RFC 2396 are made:\n(1) change the 'host' non-terminal to add an IPv6 option:\n\nhost = hostname | IPv4address | IPv6reference\nipv6reference = "[" IPv6address "]"\n\nwhere IPv6address is defined as in [[RFC 2373]] [ARCH].\n\n(2) Replace the definition of 'IPv4address' with that of [[RFC 2373]], as\nit correctly defines an IPv4address as consisting of at most three\ndecimal digits per segment.\n\n(3) Add "[" and "]" to the set of 'reserved' characters:\n\nreserved = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" |\n"$" | "," | "[" | "]"\n\nand remove them from the 'unwise' set:\n\nunwise = "{" | "}" | "|" | "\s" | "^" | "`"\n
[[About this page]]\n[[URI_reference]]
{{{\n%Z is not a valid URI\n}}}
http://kennisnet.wikia.com/edurep/wiki/Een_geldige_URI is a valid URI.\n{{{\noai:/hii:803 is a valid URI\n}}}\n''explained'':\nThis is either an [[absoluteURI]] or a [[relativeURI]]. "{{{oai:/hii:803}}}" doesn't contain [[#]], so there is no [[fragment]] part.\n\nSuppose it is an [[absoluteURI]]. This requires a [[scheme]] (first part) folowed by [[:]] followed by either [[hier_part]] or [[opaque_part]] (second part)\nA [[scheme]] starts with an [[alpha]] followed by zore or more of the either an [[alpha]], a [[digit]], a [[+]], a [[-]] or a [[.]] in random order.\n*This means the first part is "{{{oai}}}"\nThen follows the [[:]], which leaves us with "{{{/hii:803}}}"\nThe second part is a [[hier_part]]. A [[hier_part]] starts with either a [[net_path]] or an [[abs_path]]. "{{{/hii:803}}}" doesn't contain [[?]], so there is no [[query]] part.\nA [[net_path]] starts with [[//]], so no [[net_path]] is used.\nA [[abs_path]] starts with [[/]] followed by a [[path_segments]], which leaves us with "{{{hii:830}}}" for the [[path_segments]].\nA [[path_segments]] starts with one [[segment]] followed by zero or more sequences of [[/]][[segment]]. "{{{hii:830}}}" contains no [[/]], so "{{{hii:830}}}" is only one [[segment]].\nA [[segment]] starts with zero or more [[pchar]]s followed by zero or more sequnces of [[;]][[param]]. "{{{hii:830}}}" contains no [[;]], so "{{{hii:830}}}" should only contain zero or more [[pchar]]s.\nAll characters in "{{{hii:830}}}" are valid [[pchar]] characters, so "{{{hii:830}}}" is a valid [[path_segments]].\n!first character of a URI\n*can be any of the following characters:\n{{{\n;@&=+$,-_.!~*'()abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890\n}}}\nor\n{{{\n%\n}}}\nin which case is ''must be'' followed by at least two of any of the following characters:\n{{{\n1234567890abcdefABCDEF\n}}}\n!following characters\n*can be any of the following characters:\n{{{\n;@&=+$,-_.!~*'()abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890:/?#\n}}}\nor\n{{{\n%\n}}}\nin which case is ''must be'' followed by at least two of any of the following characters:\n{{{\n1234567890abcdefABCDEF\n}}}\n*If the URI contains a {{{:}}} without any {{{/}}} to its left the first character is only allowed to be one of the following characters:\n{{{\nabcdefghijklmnopqrstuvwxyaABCDEFGHIJKLMNOPQRSTUVWXYZ\n}}}\nfollowed by zero or more of any of the following characters:\n{{{\nabcdefghijklmnopqrstuvwxyaABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890+-.\n}}}\n\n*the above sequence of characters is terminated when one of the following characters is met:
= 1*[[digit]] [[.]] 1*[[digit]] [[.]] 1*[[digit]] [[.]] 1*[[digit]]
[[About this page]]\n[[rfc2396|http://www.ietf.org/rfc/rfc2396.txt]]\n----\n[[URI_reference]]\n----\n[[examples]]\n----\n[[Tiddlyspot|Welcome to Tiddlyspot]]\nGettingStarted\n[[gaaf filmpje|we are teaching the machine to help us...]]
see http://www.ietf.org/rfc/rfc2396.txt
see http://www.ietf.org/rfc/rfc2732.txt
for understanding the structure of a URI
Your URI help
http://www.tiddlywiki.com
/***\nRequired by Tiddlyspot\n***/\n//{{{\n\nconfig.options.chkHttpReadOnly = false; // make it so you can by default see edit controls via http\n\nif (window.location.protocol != "file:")\n config.options.chkGTDLazyAutoSave = false; // disable autosave in d3\n\nconfig.tiddlyspotSiteId = 'uri-help';\n\n// probably will need to redo this for TW 2.2\nwith (config.shadowTiddlers) {\n SiteUrl = 'http://'+config.tiddlyspotSiteId+'.tiddlyspot.com';\n SideBarOptions = SideBarOptions.replace(/(<<saveChanges>>)/,"$1<<tiddler TspotSidebar>>");\n OptionsPanel = OptionsPanel.replace(/^/,"<<tiddler TspotOptions>>");\n DefaultTiddlers = DefaultTiddlers.replace(/^/,"[[Welcome to Tiddlyspot]] ");\n MainMenu = MainMenu.replace(/^/,"[[Welcome to Tiddlyspot]] ");\n}\n\nmerge(config.shadowTiddlers,{\n\n'Welcome to Tiddlyspot':[\n "This document is a ~TiddlyWiki from tiddlyspot.com. A ~TiddlyWiki is an electronic notebook that is great for managing todo lists, personal information, and all sorts of things.",\n "",\n "@@font-weight:bold;font-size:1.3em;color:#444; //What now?// &nbsp;&nbsp;@@ Before you can save any changes, you need to enter your password in the form below. Then configure privacy and other site settings at your [[control panel|http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/controlpanel]] (your control panel username is //" + config.tiddlyspotSiteId + "//).",\n "<<tiddler TspotControls>>",\n "See also GettingStarted.",\n "",\n "@@font-weight:bold;font-size:1.3em;color:#444; //Working online// &nbsp;&nbsp;@@ You can edit this ~TiddlyWiki right now, and save your changes using the \s"save to web\s" button in the column on the right.",\n "",\n "@@font-weight:bold;font-size:1.3em;color:#444; //Working offline// &nbsp;&nbsp;@@ A fully functioning copy of this ~TiddlyWiki can be saved onto your hard drive or USB stick. You can make changes and save them locally without being connected to the Internet. When you're ready to sync up again, just click \s"upload\s" and your ~TiddlyWiki will be saved back to tiddlyspot.com.",\n "",\n "@@font-weight:bold;font-size:1.3em;color:#444; //Help!// &nbsp;&nbsp;@@ Find out more about ~TiddlyWiki at [[TiddlyWiki.com|http://tiddlywiki.com]]. Also visit [[TiddlyWiki Guides|http://tiddlywikiguides.org]] for documentation on learning and using ~TiddlyWiki. New users are especially welcome on the [[TiddlyWiki mailing list|http://groups.google.com/group/TiddlyWiki]], which is an excellent place to ask questions and get help. If you have a tiddlyspot related problem email [[tiddlyspot support|mailto:support@tiddlyspot.com]].",\n "",\n "@@font-weight:bold;font-size:1.3em;color:#444; //Enjoy :)// &nbsp;&nbsp;@@ We hope you like using your tiddlyspot.com site. Please email [[feedback@tiddlyspot.com|mailto:feedback@tiddlyspot.com]] with any comments or suggestions."\n].join("\sn"),\n\n'TspotControls':[\n "| tiddlyspot password:|<<option pasUploadPassword>>|",\n "| site management:|<<upload http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/store.cgi index.html . . " + config.tiddlyspotSiteId + ">>//(requires tiddlyspot password)//<<br>>[[control panel|http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/controlpanel]], [[download (go offline)|http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/download]]|",\n "| links:|[[tiddlyspot.com|http://tiddlyspot.com/]], [[FAQs|http://faq.tiddlyspot.com/]], [[announcements|http://announce.tiddlyspot.com/]], [[blog|http://tiddlyspot.com/blog/]], email [[support|mailto:support@tiddlyspot.com]] & [[feedback|mailto:feedback@tiddlyspot.com]], [[donate|http://tiddlyspot.com/?page=donate]]|"\n].join("\sn"),\n\n'TspotSidebar':[\n "<<upload http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/store.cgi index.html . . " + config.tiddlyspotSiteId + ">><html><a href='http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/download' class='button'>download</a></html>"\n].join("\sn"),\n\n'TspotOptions':[\n "tiddlyspot password:",\n "<<option pasUploadPassword>>",\n ""\n].join("\sn")\n\n});\n//}}}\n
= [ [[absoluteURI]] | [[relativeURI]] ] [ [[#]] [[fragment]] ]
| !date | !user | !location | !storeUrl | !uploadDir | !toFilename | !backupdir | !origin |\n| 5/4/2007 15:51:35 | Jeroen Hamers | [[/|http://uri-help.tiddlyspot.com/]] | [[store.cgi|http://uri-help.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 5/4/2007 15:56:5 | Jeroen Hamers | [[/|http://uri-help.tiddlyspot.com/]] | [[store.cgi|http://uri-help.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 5/4/2007 16:22:18 | Jeroen Hamers | [[/|http://uri-help.tiddlyspot.com/]] | [[store.cgi|http://uri-help.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 5/4/2007 16:36:42 | Jeroen Hamers | [[/|http://uri-help.tiddlyspot.com/]] | [[store.cgi|http://uri-help.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 5/4/2007 17:29:52 | Jeroen Hamers | [[/|http://uri-help.tiddlyspot.com/]] | [[store.cgi|http://uri-help.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 6/4/2007 13:3:52 | Jeroen Hamers | [[/|http://uri-help.tiddlyspot.com/]] | [[store.cgi|http://uri-help.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 6/4/2007 17:43:43 | Jeroen Hamers | [[/|http://uri-help.tiddlyspot.com/]] | [[store.cgi|http://uri-help.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 18/4/2007 14:41:48 | Jeroen Hamers | [[/|http://uri-help.tiddlyspot.com/]] | [[store.cgi|http://uri-help.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 5/11/2007 11:28:24 | Jeroen Hamers | [[/|http://uri-help.tiddlyspot.com/]] | [[store.cgi|http://uri-help.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 5/11/2007 11:28:33 | Jeroen Hamers | [[/|http://uri-help.tiddlyspot.com/]] | [[store.cgi|http://uri-help.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok | Ok |\n| 5/11/2007 11:30:30 | Jeroen Hamers | [[/|http://uri-help.tiddlyspot.com/]] | [[store.cgi|http://uri-help.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 21/9/2009 9:37:22 | JeroenHamers | [[/|http://uri-help.tiddlyspot.com/]] | [[store.cgi|http://uri-help.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 21/9/2009 9:37:43 | JeroenHamers | [[/|http://uri-help.tiddlyspot.com/]] | [[store.cgi|http://uri-help.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 21/9/2009 9:38:59 | JeroenHamers | [[/|http://uri-help.tiddlyspot.com/]] | [[store.cgi|http://uri-help.tiddlyspot.com/store.cgi]] | . | index.html | . |
/***\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\n
= [[/]] [[path_segments]]
= [[scheme]] [[:]] ( [[hier_part]] | [[opaque_part]] )\n
= [[lowalpha]] | [[upalpha]]\n\n//which means//\nany of the following characters:\n{{{\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\n}}}
= [[alpha]] | [[digit]]\n\n//which means//\nany of the following characters:\n{{{\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890\n}}}\n
= [[server]] | [[reg_name]]\n\n//which means://\n*Since {{{reg_name}}} is less restrictive, making it indistinguishable for {{{server}}} the same rules as [[reg_name]] apply.
The example below shows a valid URI:\n<nowiki>abc/xyzabcxyz:0123456789(abcxyz)</nowiki>\n\nHowever if you replace the slash with %20 (which is the legitimate escape for a space) the URI is no longer valid:\n<nowiki>abc%20xyzabcxyz:0123456789(abcxyz)</nowiki>\n\nBut if you also replace the colon with %20 it becomes valid again.\n<nowiki>abc%20xyzabcxyz%200123456789(abcxyz)</nowiki>\n
any of the following characters:\n{{{\n1234567890\n}}}
= [[alphanum]] | [[alphanum]] *( [[alphanum]] | [[-]] ) [[alphanum]]
= [[%]] [[hex]] [[hex]]\n\n//which means//\n{{{\n%\n}}}\nfollowed by ''2'' //(at least two and no more then two)// of any of the following characters:\n{{{\n1234567890abcdefABCDEF\n}}}
[[valid URI's|Examples of valid URI's]]\n[[non-valid URI's|Examples of non-valid URI's]]\n\n\n[[colons and slashes]]\n\n
= *[[uric]]\n\n//which means//\none or more of the following characters:\n{{{\n;/?:@&=+$,-_.!~*'()abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890\n}}}\nor\n{{{\n%\n}}}\nwhen followed by ''2'' //(at least two and no more then two)// of any of the following characters:\n{{{\n1234567890abcdefABCDEF\n}}}\n''However, always preceded by a {{{#}}}''\n\nThe difference between a {{{fragment}}} and an {{{opaque_part}}} is that a {{{fragment}}} is always preceded by a {{{#}}} while an {{{opaque_part}}} is always preceded by a {{{:}}} and a {{{fragment}}} may also start with a {{{/}}}.\nThe difference between a {{{fragment}}} and a {{{query}}} is that a {{{fragment}}} is always preceded by a {{{#}}} while an {{{query}}} is always preceded by a {{{?}}}.\n\nA {{{fragment}}} is always at the end of a URI.\nThere can only be one {{{fragment}}} or none at all.
= [[digit]] | "A" | "B" | "C" | "D" | "E" | "F" | "a" | "b" | "c" | "d" | "e" | "f"\n\n//which means//\nany of the following characters:\n{{{\n1234567890ABCDEFabcdef\n}}}\n
= ( [[net_path]] | [[abs_path]] ) [ [[?]] [[query]] ]
= [[hostname]] | [[IPv4address]]
= *( [[domainlabel]] [[.]] ) [[toplabel]] [ [[.]] ]
= [[host]] [ [[:]] [[port]] ]\n\n//which means://\n''zero or more'' of the following characters not entirely in random order:\n{{{\n.-:abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890\n}}}\n*''always'' starting with one of the following characters:\n{{{\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890\n}}}\n*At the most containing one {{{:}}} followed by zero or more of the following characters:\n{{{\n1234567890\n}}}\n*''always'' ending with one of the following characters:\n{{{\n:.abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890\n}}}\n\n{{{hostport}}} is ''only'' used in {{{server}}}, which is ''only'' used in {{{authority}}}, which is ''only'' used in {{{net_path}}} which is either used in {{{relativeURI}}} or in {{{hier_part}}} which is used in {{{absoluteURI}}}.\n//which means://\n* That it could be preceded by a sequence of {{{userinfo}}} and {{{@}}}\n* That it could also be replaced by {{{reg_name}}}.\n* That it is ''always'' preceded by {{{//}}}, which could be preceded by a sequence of a {{{scheme}}} and a {{{:}}}.\n* That it could be followed by an optional {{{abs_path}}}, which can be followed by an optional sequence of {{{?}}} and {{{query}}}, which can be followed by an optional sequence of {{{#}}} and {{{fragment}}}.\n* That it could also be replaced by an {{{abs_path}}} or a {{{rel_path}}}.
any of the following characters:\n{{{\nabcdefghijklmnopqrstuvwxyz\n}}}
any of the following characters:\n{{{\n-_.!~*'()\n}}}
= [[//]] [[authority]] [ [[abs_path]] ]
= [[uric_no_slash]] *[[uric]]\n\n//which means//\none or more of the following characters:\n{{{\n;/?:@&=+$,-_.!~*'()abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890\n}}}\nor\n{{{\n%\n}}}\nwhen followed by ''2'' //(at least two and no more then two)// of any of the following characters:\n{{{\n1234567890abcdefABCDEF\n}}}\n''However, always preceded by a {{{:}}} and never starting with a {{{/}}}''\n\nThe difference between an {{{opaque_part}}} and a {{{fragment}}} is that an {{{opaque_part}}} is always preceded by a {{{:}}} while an {{{fragment}}} is always preceded by a {{{#}}} and an {{{opaque_part}}} shall never start with a {{{/}}}.\nThe difference between a {{{opaque_part}}} and a {{{query}}} is that a {{{opaque_part}}} is always preceded by a {{{:}}} while an {{{query}}} is always preceded by a {{{?}}} and an {{{opaque_part}}} shall never start with a {{{/}}}.\n\nA {{{opaque_part}}} can be followed by a {{{fragment}}} but nothing else.\nThere can only be one {{{opaque_part}}} or none at all.
= *[[pchar]]
= [[segment]] *( [[/]] [[segment]] )
= [[unreserved]] | [[escaped]] | [[:]] | [[@]] | [[&]] | [[=]] | [[+]] | [[$]] | [[,]]\n\n//which means//\nany of the following characters:\n{{{\n:@&=+$,-_.!~*'()abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890\n}}}\nor\n{{{\n%\n}}}\nwhen followed by ''2'' //(at least two and no more then two)// of any of the following characters:\n{{{\n1234567890abcdefABCDEF\n}}}\n\nThe difference between {{{pchar}}} and {{{uric}}} is that {{{pchar}}} can not be one of the following characters: {{{;/?}}}\nIn other words {{{uric = pchar | ; | / | ?}}}\n\nThe difference between {{{pchar}}} and {{{uric_no_slash}}}} is that {{{pchar}}} can not be one of the following characters: {{{;?}}}\nIn other words {{{uric_no_slash = pchar | ; | ?}}}
= *[[digit]]
= *[[uric]]\n\n//which means//\none or more of the following characters:\n{{{\n;/?:@&=+$,-_.!~*'()abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890\n}}}\nor\n{{{\n%\n}}}\nwhen followed by ''2'' //(at least two and no more then two)// of any of the following characters:\n{{{\n1234567890abcdefABCDEF\n}}}\n''However, always preceded by a {{{?}}}''\n\nThe difference between a {{{query}}} and an {{{opaque_part}}} is that a {{{query}}} is always preceded by a {{{?}}} while an {{{opaque_part}}} is always preceded by a {{{:}}} and a {{{query}}} may also start with a {{{/}}}.\nThe difference between a {{{query}}} and an {{{fragment}}} is that a {{{query}}} is always preceded by a {{{?}}} while an {{{fragment}}} is always preceded by a {{{#}}}.\n\nA {{{query}}} can be followed by a {{{fragment}}} but nothing else.\nThere can only be one {{{query}}} or none at all.
= 1*( [[unreserved]] | [[escaped]] | [[$]] | [[,]] | [[;]] | [[:]] | [[@]] | [[&]] | [[=]] | [[+]] )\n\n//which means://\n''one or more'' of the following characters in random order:\n{{{\n@;:&=+$,-_.!~*'()abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890\n or\n%\n when followed by ''2'' (at least two and no more then two) of any of the following characters:\n1234567890abcdefABCDEF\n}}}\n\n{{{regname}}} is ''only'' used in {{{authority}}}, which is ''only'' used in {{{net_path}}} which is either used in {{{relativeURI}}} or in {{{hier_part}}} which is used in {{{absoluteURI}}}.\n//which means//\n\n*That it could also be replaced by {{{server}}}, in which case it would be more restrictive.\n*That it is ''always'' preceded by {{{//}}}, which could be preceded by a sequence of a {{{scheme}}} and a {{{:}}}.\n*That it could be followed by an optional {{{abs_path}}}, which can be followed by an optional sequence of {{{?}}} and {{{query}}}, which can be followed by an optional sequence of {{{#}}} and {{{fragment}}}.\n*That it could also be replaced by an {{{abs_path}}} or a {{{rel_path}}}.
= [[rel_segment]] [ [[abs_path]] ]
= 1*( [[unreserved]] | [[escaped]] | [[;]] | [[@]] | [[&]] | [[=]] | [[+]] | [[$]] | [[,]] )
= ( [[net_path]] | [[abs_path]] | [[rel_path]] ) [ [[?]] [[query]] ]
any of the following characters:\n{{{\n;/?:@&=+$,\n}}}
= [[alpha]] *( [[alpha]] | [[digit]] | [[+]] | [[-]] | [[.]] )
= *[[pchar]] *( [[;]] [[param]] )
= [ [ [[userinfo]] [[@]] ] [[hostport]] ]\n\n//which means://\n*That it could be empty.\n*It could contain ''zero or more'' of the following characters not entirely in random order (see [[hostport]]):\n{{{\n.-:abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890\n}}}\n*If it contains the character {{{@}}} that character may be preceded by zero or more of the following characters in random order:\n{{{\n;:&=+$,-_.!~*'()abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890\n or\n%\n when followed by ''2'' (at least two and no more then two) of any of the following characters:\n1234567890abcdefABCDEF\n}}}\n*{{{server}}} is ''only'' used in {{{authority}}}, which is ''only'' used in {{{net_path}}} which is either used in {{{relativeURI}}} or in {{{hier_part}}} which is used in {{{absoluteURI}}}.\n//which means//\n*That it could be replaced by {{{reg_name}}}.\n*That it is ''always'' preceded by {{{//}}}, which could be preceded by a sequence of a {{{scheme}}} and a {{{:}}}.\n*That it could be followed by an optional {{{abs_path}}}, which can be followed by an optional sequence of {{{?}}} and {{{query}}}, which can be followed by an optional sequence of {{{#}}} and {{{fragment}}}.\n*That it could also be replaced by an {{{abs_path}}} or a {{{rel_path}}}.
= [[alpha]] | [[alpha]] *( [[alphanum]] | [[-]] ) [[alphanum]]
= [[alphanum]] | [[mark]]\n\n//which means//\nany of the following characters:\n{{{\n-_.!~*'()abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890\n}}}
any of the following characters:\n{{{\nABCDEFGHIJKLMNOPQRSTUVWXYZ\n}}}
= [[reserved]] | [[unreserved]] | [[escaped]]\n\n//which means//\nany of the following characters:\n{{{\n;/?:@&=+$,-_.!~*'()abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890\n}}}\nor\n{{{\n%\n}}}\nwhen followed by ''2'' //(at least two and no more then two)// of any of the following characters:\n{{{\n1234567890abcdefABCDEF\n}}}\n\nThe difference between {{{uric}}} and {{{pchar}}} is that {{{uric}}} could also be one of the following characters: {{{;/?}}}\nIn other words {{{uric = pchar | ; | / | ?}}}\n\nThe difference between {{{uric}}} and {{{uric_no_slash}}} is that {{{uric}}} could also be the following character: {{{/}}}\nIn other words {{{uric = uric_no_slash | /}}}
= [[unreserved]] | [[escaped]] | [[;]] | [[?]] | [[:]] | [[@]] | [[&]] | [[=]] | [[+]] | [[$]] | [[,]]\n\n//which means//\nany of the following characters:\n{{{\n;?:@&=+$,-_.!~*'()abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890\n}}}\nor\n{{{\n%\n}}}\nwhen followed by ''2'' //(at least two and no more then two)// of any of the following characters:\n{{{\n1234567890abcdefABCDEF\n}}}\n\nThe difference between {{{uric_no_slash}}} and {{{pchar}}} is that {{{uric_no_slash}}} could also be one of the following characters: {{{;?}}}\nIn other words {{{uric_no_slash = pchar | ; | ?}}}\n\nThe difference between {{{uric_no_slash}}} and {{{uric}}} is that {{{uric_no_slash}}} can not be the following character: {{{/}}}\nIn other words {{{uric = uric_no_slash | /}}}
= *( [[unreserved]] | [[escaped]] | [[;]] | [[:]] | [[&]] | [[=]] | [[+]] | [[$]] | [[,]] )\n\n//which means//\n''zero or more'' of the following characters in random order:\n{{{\n;:&=+$,-_.!~*'()abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890\n or\n%\n when followed by ''2'' (at least two and no more then two) of any of the following characters:\n1234567890abcdefABCDEF\n}}}\n\n{{{userinfo}}} is ''only'' used in {{{server}}}, which is ''only'' used in {{{authority}}}, which is ''only'' used in {{{net_path}}} which is either used in {{{relativeURI}}} or in {{{hier_part}}} which is used in {{{absoluteURI}}}.\n//which means//\n*That it is ''always'' terminated with a {{{@}}} followed by a {{{hostport}}} (only {{{alphanum}}}s or {{{-}}} or {{{.}}} or {{{:}}} with some restrictions to {{{digit}}}s and {{{-}}} and {{{.}}}) and {{{:}}}.\n*That it could also be replaced by {{{reg_name}}}.\n*That it is ''always'' preceded by {{{//}}}, which could be preceded by a sequence of a {{{scheme}}} and a {{{:}}}.\n*That it could be followed by an optional {{{abs_path}}}, which can be followed by an optional sequence of {{{?}}} and {{{query}}}, which can be followed by an optional sequence of {{{#}}} and {{{fragment}}}.\n*That it could also be replaced by an {{{abs_path}}} or a {{{rel_path}}}.
<html><object width="425" height="350"><param name="movie" value="http://www.youtube.com/v/6gmP4nk0EOE"></param><param name="wmode" value="transparent"></param><embed src="http://www.youtube.com/v/6gmP4nk0EOE" type="application/x-shockwave-flash" wmode="transparent" width="425" height="350"></embed></object></html>\nProvided By: [[mwesch|http://www.youtube.com/user/mwesch]] on http://www.youtube.com/watch?v=6gmP4nk0EOE