Background: #fff
Foreground: #000
PrimaryPale: #8cf
PrimaryLight: #18f
PrimaryMid: #04b
PrimaryDark: #014
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
Error: #f88
<!--{{{-->
<div class='toolbar' macro='toolbar [[ToolbarCommands::EditToolbar]]'></div>
<div class='title' macro='view title'></div>
<div class='editor' macro='edit title'></div>
<div macro='annotations'></div>
<div class='editor' macro='edit text'></div>
<div class='editor' macro='edit tags'></div><div class='editorFooter'><span macro='message views.editor.tagPrompt'></span><span macro='tagChooser excludeLists'></span></div>
<!--}}}-->
To get started with this blank [[TiddlyWiki]], you'll need to modify the following tiddlers:
* [[SiteTitle]] & [[SiteSubtitle]]: The title and subtitle of the site, as shown above (after saving, they will also appear in the browser title bar)
* [[MainMenu]]: The menu (usually on the left)
* [[DefaultTiddlers]]: Contains the names of the tiddlers that you want to appear when the TiddlyWiki is opened
You'll also need to enter your username for signing your edits: <<option txtUserName>>
<<importTiddlers>>
<!--{{{-->
<link rel='alternate' type='application/rss+xml' title='RSS' href='index.xml' />
<!--}}}-->
These [[InterfaceOptions]] for customising [[TiddlyWiki]] are saved in your browser

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

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

----
Also see [[AdvancedOptions]]
<!--{{{-->
<div class='header' role='banner' macro='gradient vert [[ColorPalette::PrimaryLight]] [[ColorPalette::PrimaryMid]]'>
<div class='headerShadow'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
<div class='headerForeground'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
</div>
<div id='mainMenu' role='navigation' refresh='content' tiddler='MainMenu'></div>
<div id='sidebar'>
<div id='sidebarOptions' role='navigation' refresh='content' tiddler='SideBarOptions'></div>
<div id='sidebarTabs' role='complementary' refresh='content' force='true' tiddler='SideBarTabs'></div>
</div>
<div id='displayArea' role='main'>
<div id='messageArea'></div>
<div id='tiddlerDisplay'></div>
</div>
<!--}}}-->
/*{{{*/
body {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

hr {height:1px;}

a {text-decoration:none;}

dt {font-weight:bold;}

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

.txtOptionInput {width:11em;}

#contentWrapper .chkOptionInput {border:0;}

.externalLink {text-decoration:underline;}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

.whenBackstage {display:none;}
.backstageVisible .whenBackstage {display:block;}
/*}}}*/
/***
StyleSheet for use when a translation requires any css style changes.
This StyleSheet can be used directly by languages such as Chinese, Japanese and Korean which need larger font sizes.
***/
/*{{{*/
body {font-size:0.8em;}
#sidebarOptions {font-size:1.05em;}
#sidebarOptions a {font-style:normal;}
#sidebarOptions .sliderPanel {font-size:0.95em;}
.subtitle {font-size:0.8em;}
.viewer table.listView {font-size:0.95em;}
/*}}}*/
/*{{{*/
@media print {
#mainMenu, #sidebar, #messageArea, .toolbar, #backstageButton, #backstageArea {display: none !important;}
#displayArea {margin: 1em 1em 0em;}
noscript {display:none;} /* Fixes a feature in Firefox 1.5.0.2 where print preview displays the noscript content */
}
/*}}}*/
<!--{{{-->
<div class='toolbar' role='navigation' macro='toolbar [[ToolbarCommands::ViewToolbar]]'></div>
<div class='title' macro='view title'></div>
<div class='subtitle'><span macro='view modifier link'></span>, <span macro='view modified date'></span> (<span macro='message views.wikified.createdPrompt'></span> <span macro='view created date'></span>)</div>
<div class='tagging' macro='tagging'></div>
<div class='tagged' macro='tags'></div>
<div class='viewer' macro='view text wikified'></div>
<div class='tagClear'></div>
<!--}}}-->
/***
|''Name''|RefreshTiddlerCommand|
|''Version''|0.3.0|
***/
//{{{
(function($) {

var cmd = config.commands.refreshTiddler = {
	text: "refresh",
	locale: {
		refreshing: "Refreshing tiddler..."
	},
	tooltip: "refresh this tiddler to be the one on the server",
	handler: function(ev, src, title) {
		var tiddler = store.getTiddler(title);
		if(!tiddler) {
			tiddler = new Tiddler(title);
			merge(tiddler.fields, config.defaultCustomFields);
		}
		$(story.getTiddler(title)).find(".viewer").
			empty().text(cmd.locale.refreshing);
		var dirtyStatus = store.isDirty();
		story.loadMissingTiddler(title, {
			"server.workspace": tiddler.fields["server.recipe"]  ? "recipes/" + tiddler.fields["server.recipe"] :
				tiddler.fields["server.workspace"] || "bags/"+tiddler.fields["server.bag"],
			"server.host": tiddler.fields["server.host"],
			"server.type": tiddler.fields["server.type"]
		}, function() {
			store.setDirty(dirtyStatus);
		});
	}
};

})(jQuery);
//}}}
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xl="http://www.w3.org/1999/xlink" version="1.1" viewBox="72 648 70 70" 
width="30" height="30">
<g stroke="none" stroke-opacity="1" stroke-dasharray="none" fill="none" fill-opacity="1">
	<g>
		<path d="M 77.59005 669.34003 C 71.532745 681.90424 73.714462 697.4441 84.135193 707.86475 
		C 97.315445 721.0451 118.684715 721.0451 131.8649 707.86475 
		C 145.04515 694.68457 145.04515 673.31537 131.8649 660.13513 
		C 121.4441 649.7141 105.90419 647.53253 93.339905 653.5899 L 102.047455 662.2976 
		C 109.58637 660.2373 117.987976 662.16803 123.90997 668.08997 
		C 132.69673 676.8767 132.69673 691.12317 123.90997 699.90985 
		C 115.12313 708.6966 100.87699 708.6966 92.09012 699.90985 
		C 86.168266 693.98804 84.23744 685.58643 86.297653 678.04755 Z M 72 648 L 72 668.25 L 78.75 661.49957 
		L 99.00019 681.7502 L 105.750175 675.00006 L 85.50013 654.75012 L 92.249985 648 Z" fill="black"
		class="glyph"/>
	</g>
</g>
</svg>
A [[SiteIcon|SiteIcon tiddler]]@glossary helps provide some identity to your space.  Ideally it'd be a square and a minimum of 48*48 pixels size.  You can upload your site icon using the uploader below.

<<binaryUploadPublic title:SiteIcon>>
*{{listTitle{all tags...}}}
<<allTags excludeLists>>
<html><nowiki>
<h1> Cases | ਕਾਰਕ </h1>
<p>
Kaaruks or Cases are the relationship which nouns or pronouns have with the verb or other words in the sentence. Cases are expressed using Postpositions or ਸੰਬੰਧਕ or postpositional suffixes with the nouns. But not every case requires a Postposition word or the postpositional noun form. Some cases can be expressed without either changing the noun form or using a Postposition.
</p>
<p class="indent1 exampleText"> He sits <u>on</u> a chair.</p>
<p>
   As you would know that the word <b>on</b> depicts a relationship between the noun 'chair' and the verb 'sits'. Now lets express the same sentence in Punjabi.
 </p>
<p class="indent1 exampleText">ਉਹ ਕੁਰਸੀ ਉੱਤੇ ਬੈਠਾ ਹੈ।</p>
<p> The noun ਕੁਰਸੀ (chair) is related to the verb phrase ਬੈਠਦਾ ਹੈ through the postposition ਉੰਤੇ, which means the same as 'on' in English. </p>

<div class="loc">
 <h2 class="title">contents</h2>
<ol>
  <li><a href="#kurta">Kurtaa Kaaruk</a></li>
  <li><a href="#kurum">Kurum Kaaruk</a></li>
  <li><a href="#kurun">Kurun Kaaruk</a></li>
  <li><a href="#sumpurdaan">Sumpurdaan Kaaruk </a></li>
  <li><a href="#upaadaan">Upaadaan Kaaruk </a></li>
  <li><a href="#sumbundh">Sumbundh Kaaruk </a></li>
  <li><a href="#udhikurun">Udhikurun Kaaruk </a></li>
  <li><a href="#sumbodhun">Sumbodhun Kaaruk </a></li>
</ol>
</div>


<h2><a name="kurta">1. Kurtaa Kaaruk | ਕਰਤਾ ਕਾਰਕ </a></h2> 
<p>The noun with which does the action is said to be in Kurtaa Kaaruk. The postposition <b>ਨੇ</b> is used for this purpose. 
<p><b> To be completed </b></p>


<h2><a name="kurum">2. Kurum Kaaruk | ਕਰਮ ਕਾਰਕ </a></h2>
<p>The noun or a pronoun which is affected by the action of the verb is said to be in <b>Kurum Kaarak</b>. The noun in this case in followed by the postposition <b>ਨੂੰ</b> (loosely similar to the English preposition 'to').  For example take this sentence:</p>
<table class="exampleTable">
<tr class="exampleText">
  <td>ਮੁੰਡਾ</td>
  <td>ਕੁੱਤੇ ਨੂੰ</td>
  <td>ਮਾਰਦਾ ਹੈ</td>
  <td> (Boy beats the dog)</td>
</tr><tr class="exampleGloss">
  <td>Boy</td>
  <td>to Dog</td>
  <td>beats</td>
  <td></td>
</tr><tr class="exampleGloss">
  <td>Subject Noun</td>
  <td>Object Noun+postposition</td>
  <td>Verb Phrase</td>
 <td> </td>
</tr>
</table>

<p>In this sentence the effect of the verb phrase ਮਾਰਦਾ ਹੈ falls on the noun ਕੁੱਤਾ (Dog), therefore it is followed by the postposition <b>ਨੂੰ</b>. Also note that nouns which end with a ਾ (Kunna) are inflected due to this and a Kunna is replaced with a ੇ (laan). Take another example:</p>

<table class="exampleTable">
<tr class="exampleText">
  <td>ਅਧਿਆਪਕ ਨੇ</td>
  <td>ਜਮਾਤ ਨੂੰ</td>
  <td>ਪੜ੍ਹਾਇਆ</td>
  <td>(Teacher taught the class)</td>
</tr><tr class="exampleGloss">
  <td>Teacher</td>
  <td>to class</td>
  <td>taught</td>
  <td></td>
</tr><tr class="exampleGloss">
  <td> Subject Noun + postposition</td>
  <td> Object Noun + postposition</td>
  <td>Verb</td>
  <td> </td>
</tr>
</table>

<p>In this sentence the noun ਜਮਾਤ is in Kurum Kaaruk case, bearing the effect of the verb ਪੜ੍ਹਾਇਆ (taught). Hence it is followed by the postposition ਨੂੰ. But notice that since the ਜਮਾਤ does not end with a ਾ (Kunna) it does not change its form. Take a look at some more examples:</p>
<table class="exampleTable">
<tr class="exampleText">
  <td>ਦੁਕਾਨਦਾਰ ਨੇ</td>
  <td>ਗ੍ਰਾਹਕ ਨੂੰ</td>
  <td>ਬਕਾਇਆ</td>
  <td>ਮੋੜ ਦਿੱਤਾ</td>
  <td>Shopkeeper returned the balance to the customer</td>
</tr><tr class="exampleGloss">
  <td>Shopkeeper</td>
  <td>to customer</td>
  <td>balance</td>
  <td>returned</td>
  <td></td>
</tr><tr class="exampleGloss">
   <td>Subject + postposition</td>
  <td>Indirect object + postposition</td>
  <td>Direct object + postposition</td>
  <td>Verb phrase</td>
</tr>
</table>

<table class="exampleTable">
<tr class="exampleText"> 
  <td>ਗੁਰੂ ਨਾਨਕ ਨੇ</td>
  <td>ਬਾਬਾ ਬੁੱਢਾ ਜੀ ਨੂੰ</td>
  <td>ਆਸ਼ੀਰਵਾਦ</td>
  <td>ਦਿੱਤਾ</td> 
  <td> Guru Nanak gave blessings to Baba Buddha ji.</td>
</tr><tr class="exampleGloss">
  <td>Guru Nanak (did)</td>
  <td>Baba Buddha ji (to)</td>
  <td>Blessing</td>
  <td>Give</td>
</tr><tr class="exampleGloss">
   <td>Subject + postposition</td>
   <td>Indirect object + postposition</td>
  <td>Direct object</td>
   <td>Verb</td>
  <td> </td>
</tr>
</table>

<p> All the pronouns are suffixed with a ਨੂੰ when they are in this case.</p>

<table class="exampleTable">
<tr>
  <th> </th><th>First Person</th><th>Second Person</th><th>Third Person</th>
</tr><tr class="exampleText">
  <th>Singular</th><td>ਮੈਨੂੰ</td><td>ਤੈਨੂੰ</td><td>ਉਹਨੂੰ</td>
</tr><tr class="exampleText">
  <th>Plural</th><td>ਸਾਨੂੰ</td><td>ਤੁਹਾਨੂੰ</td><td>ਉਹਨਾਂ ਨੂੰ</td>
</tr>
</table>


<table class="noteTable">
<tr><td>Note: Not all nouns in Kurum Kaaruk take on a Postposition. For example the sentence, <b>ਪਿਤਾ ਜੀ ਅਖ਼ਬਾਰ ਪੜ੍ਹਦੇ ਹਨ</b>, has the object noun ਅਖ਼ਬਾਰ (newspaper) in kurum kaarak and yet is not followed by a postposition word.</td></tr></table>

<h2><a name="kurun">3. Kurrun Kaaruk | ਕਰਨ ਕਾਰਕ</a></h2>
<p> A noun or a pronoun is said to be in Kurrun Kaarak when it is instrumental in bringing about the action in the sentence. The postpositions used in this case are:</p>
<ul class="indent1 exampleText">
  <li>ਨਾਲ - with</li>
  <li>ਦੁਆਰਾ, ਤੋਂ  - by </li>
  <li>ਰਾਹੀਂ - through</li>
</ul>

<h3>Some Examples</h3>

<table class="exampleTable">
<tr class="exampleText">
  <td>ਲੜਕੀ ਨੇ</td> 
  <td>ਛੁਰੀ ਨਾਲ</td>
  <td>ਸਬਜ਼ੀ</td>
  <td> ਕੱਟੀ</td>
  <td>The Girl chopped the vegetables with a knife </td>
</tr><tr class="exampleGloss">
  <td>Girl (did)</td>
  <td>Knife (with)</td>
  <td>Vegetable</td>
  <td>chopped</td>
  <td> </td>
</tr><tr class="exampleGloss">
  <td>Subject + postposition</td>
  <td>Indirect object + postposition</td>
  <td>Direct object</td>
  <td>Verb</td>
  <td> </td>
</tr>
</table>
<table class="exampleTable">
<tr class="exampleText">
  <td>ਰਮੇਸ਼ ਤੋਂ</td>
  <td>ਇਹ ਗਲਤੀ</td>
  <td>ਹੋਈ</td>
  </td>This mistake was done by Ramesh</td>
</tr><tr>
  <td>Ramesh (by)</td>
  <td>this mistake</td>
  <td>happened/committed</td>
  <td></td>
</tr><tr class="exampleGloss">
  <td>Subject + postposition</td>
  <td>adjective+object</td>
  <td>Verb</td>
 <td> </td>
</tr>
</table>

<table class="exampleTable">
<tr class="exampleText">
  <td> ਹਰ ਸਮੱਸਿਆ </td>
  <td> ਗਲਬਾਤ ਰਾਹੀਂ </td>
  <td> ਹੱਲ ਹੋ ਸਕਦੀ ਹੈ </td>
  </td>Every problem can be solved through discussion</td>
</tr><tr class="exampleGloss">
  <td> Every problem </td>
  <td> through discussion/talk </td>
  <td> can be solved </td>
  <td> </td>
</tr><tr class="exampleGloss">
  <td> adjective+Subject </td>
  <td> object + postposition </td>
  <td> Verb Phrase </td>
 <td> </td>
</tr>
</table>

<h3>The pronouns take on the following forms</h3>
<table class="exampleTable">
<tr>
  <th> </th>
  <th>First Person</th>
  <th>Second Person</th>
  <th>Third Person</th>
</tr><tr class="exampleText">
  <th>Singular</th>
  <td>ਮੇਰੇ ਤੋਂ, ਮੈਥੋਂ, ਮੇਰੇ ਦੁਆਰਾ, ਮੇਰੇ ਰਾਹੀਂ</td>
  <td>ਤੇਰੇ ਤੋਂ, ਤੈਥੋਂ, ਤੇਰੇ ਦੁਆਰਾ, ਤੇਰੇ ਰਾਹੀਂ</td>
  <td>ਉਹਤੋਂ, ਉਹਦੇ ਰਾਹੀਂ, ਉਹਦੇ ਦੁਆਰਾ</td>
</tr><tr class="exampleText">
  <th>Plural</th>
  <td>ਸਾਥੋਂ, ਸਾਡੇ ਰਾਹੀਂ, ਸਾਡੇ ਦੁਆਰਾ</td>
  <td>ਤੁਹਾਥੋਂ, ਤੁਹਾਡੇ ਰਾਹੀਂ, ਤੁਹਾਡੇ ਦੁਆਰਾ</td>
  <td>ਉਹਨਾਂ ਤੋਂ, ਉਹਨਾਂ ਰਾਹੀਂ, ਉਹਨਾਂ ਦੁਆਰਾ</td>
</tr>
</table>

<h2><a name="sumpurdaan">4. Sumpurdaan Kaaruk | ਸੰਪਰਦਾਨ ਕਾਰਕ</a></h2>
<p>Sumpurdaan means to give, to donate.  A noun or a pronoun is said to be in Sumpurdaan Kaaruk when the action of the sentence is done 'for' it or 'to' it. The postpositions used for this are:</p>
<ul class="indent1 exampleText">
  <li>ਨੂੰ  - to</li>
  <li>ਲਈ  - for</li>
  <li>ਵਾਸਤੇ  - for</li>
  <li>ਹਿੱਤ  - for, towards this end</li>
</ul>

<table class="exampleTable">
<tr class="exampleText">
  <td>ਪਿਤਾ ਨੇ</td>
  <td>ਪੁੱਤਰ ਨੂੰ</td>
  <td>ਪੰਜ ਰੁਪਏ</td>
  <td>ਦਿੱਤੇ</td>
  <td>Father gave the child five rupees</td>
</tr><tr class="exampleGloss">
  <td>Father</td>
  <td>to son</td>
  <td>five rupees</td>
  <td>gave</td>
  <td> </td>
</tr><tr class="exampleGloss">
  <td>Subject Noun</td>
  <td>Indirect object+postposition</td>
  <td>Direct Objec with a numeral adjective</td>
  <td>Verb</td>
</tr>
</table>
<table class="exampleTable">
<tr class="exampleText">
  <td>ਤੁਸੀਂ</td>
  <td>ਸਾਡੇ ਲਈ</td>
  <td>ਕੁਝ ਨਹੀਂ ਕੀਤਾ</td>
  <td> You did nothing for us</td>
</tr><tr class="exampleGloss">
  <td>You</td>
  <td>for us</td>
  <td>did nothing</td>
  <td></td>
</tr><tr class="exampleGloss">
  <td>Subject</td>
  <td>Object+postposition</td>
  <td>verb+negator</td>
  <td></td>
</tr></table>

<h3>The pronouns take on the following forms</h3>
<table class="exampleTable">
<tr>
  <th> </th>
  <th>First Person</th>
  <th>Second Person</th>
  <th>Third Person</th>
</tr><tr class="exampleText">
  <th>Singular</th>
  <td>ਮੈਨੂੰ, ਮੇਰੇ ਲਈ, ਮੇਰੇ ਵਾਸਤੇ, ਮੇਰੇ ਹਿੱਤ</td>
  <td>ਤੈਨੂੰ, ਤੇਰੇ ਲਈ, ਤੇਰੇ ਵਾਸਤੇ, ਤੇਰੇ ਹਿੱਤ</td>
  <td>ਉਹਨੂੰ, ਉਹਦੇ ਲਈ, ਉਹਦੇ ਵਾਸਤੇ, ਉਹਦੇ ਹਿੱਤ</td>
</tr><tr class="exampleText">
  <th>Plural</th>
  <td>ਸਾਨੂੰ, ਸਾਡੇ ਲਈ, ਸਾਡੇ ਵਾਸਤੇ, ਸਾਡੇ ਹਿੱਤ</td>
  <td>ਤੁਹਾਨੂੰ, ਤੁਹਾਡੇ ਲਈ, ਤੁਹਾਡੇ ਵਾਸਤੇ, ਤੁਹਾਡੇ ਹਿੱਤ</td>
  <td>ਉਹਨਾਂ ਨੂੰ, ਉਹਨਾਂ ਲਈ, ਉਹਨਾਂ ਵਾਸਤੇ, ਉਹਨਾਂ ਹਿੱਤ</td>
</tr>
</table>

<h2><a name="upaadaan">5. Upaadaan Kaaruk | ਅਪਾਦਾਨ ਕਾਰਕ</a></h2>
<p>Upaadaan means to take away, to separate. A noun or a pronoun is said to be in this case when something is taken away from it or separated from it. The postpositions used here are:</p>
<ul class="indent1 exampleText">
  <li>ਵਿੱਚੋਂ - out of</li>
  <li>ਤੋਂ - from</li>
  <li>ਉਤੋਂ - from top </li>
  <li>ਹੇਠੋਂ - from below </li>
  <li>ਲਾਗਿਓਂ, ਕੋਲੋਂ - from near</li>
</ul>

<table class="exampleTable">
<tr class="exampleText">
  <td>ਰਾਮ ਲਾਲ </td>
  <td> ਭੀੜ ਵਿੱਚੋਂ </td>
  <td> ਨਿਕਲ ਆਇਆ</td>
  <td> </td>
</tr><tr class="exampleGloss">
  <td> Ram Lal</td>
  <td> crowd out of </td>
  <td> came out</td>
  <td>Ram Lal came out of the crowd </td>
</tr><tr class="exampleGloss">
  <td> Subject </td>
  <td> Object + postposition </td>
  <td> Verb phrase </td>
  <td> </td>
</tr>
</table>
<p>In this sentence the subject comes out of the crowd, he gets away from it. Hence the object, the crowd comes under the upaadaan kaaruk case and is followed by a postposition ਵਿੱਚੋਂ meaning 'out of the crowd'.

<table class="exampleTable">
<tr class="exampleText">
  <td> ਮੁੰਡਾ </td>
  <td> ਕੋਠੇ ਤੋਂ </td>
  <td> ਡਿੱਗਾ </td>
  <td> </td>
</tr><tr class="exampleGloss">
  <td> Boy </td>
  <td> roof from </td>
  <td> fell </td>
  <td> Boy fell from the roof </td>
</tr><tr class="exampleGloss">
  <td> Subject </td>
  <td> Object + postposition </td>
  <td> Verb </td>
  <td> </td>
</tr>
</table>
<p> The act of falling from the roof separated the boy from the roof. Hence the object roof comes under upaadaan kaaruk. Therefore it is followed by the postposition ਤੋਂ which means 'from'. </p>

<table class="exampleTable">
<tr class="exampleText">
  <td> ਖੂਹ ਵਿੱਚੋਂ </td>
  <td> ਪਾਣੀ </td>
  <td> ਕੱਢਿਆ </td>
  <td> </td>
</tr><tr class="exampleGloss">
  <td>Well from </td>
  <td>water </td>
  <td>drawn </td>
  <td> Water was drawn from the well </td>
</tr><tr class="exampleGloss">
  <td> Indirect object + postposition </td>
  <td> Direct object  </td>
  <td> Verb </td>
  <td> </td>
</tr>
</table>

<p> In this sentence the direct object, water, is 'taken out' from the indirect object, the well, which makes the indirect object as Upaadaan kaaruk. Therefore the indirect object is followed by postposition ਵਿੱਚੋਂ, which means 'out of'.</p>
<p> Often the upaadaan kaaruk is expressed by changing the noun to its postpositional form instead of using a separate postposition word. This is achieved by suffixing a ਓ with the noun.</p>

<table class="exampleTable">
<tr class="exampleText">
  <td> ਉਹ </td>
  <td> ਘਰੋਂ (ਘਰ+ਓਂ) </td>
  <td> ਆਇਆ </td>
  <td> </td>
</tr><tr class="exampleGloss">
  <td> He </td>
  <td> home (from) </td>
  <td> came </td>
  <td> He came from home </td>
</tr><tr class="exampleGloss">
  <td> Subject </td>
  <td> Object + postposition suffix</td>
  <td> Verb </td>
  <td> </td>
</tr>
</table>

<table class="exampleTable">
<tr class="exampleText">
  <td> ਉਹ </td>
  <td> ਗੱਡੀਓਂ (ਗੱਡੀ + ਓਂ) </td>
  <td> ਉਤਰਿਆ </td>
  <td> </td>
</tr><tr class="exampleGloss">
  <td> He </td>
  <td> vehicle/car/bus </td>
  <td> alighted </td>
  <td> He alighted from the bus </td>
</tr><tr class="exampleGloss">
  <td> Subject </td>
  <td> Object + postposition suffix</td>
  <td> Verb </td>
  <td> </td>
</tr>
</table>

<table class="exampleTable">
<tr class="exampleText">
  <td> ਕਿਤਾਬ </td>
  <td> ਹੱਥੋਂ (ਹੱਥ+ਓਂ) </td>
  <td> ਡਿੱਗੀ </td>
  <td> </td>
</tr><tr class="exampleGloss">
  <td> Book </td>
  <td> hands (from) </td>
  <td> fell </td>
  <td> Book fell from his hands </td>
</tr><tr class="exampleGloss">
  <td> Subject </td>
  <td> Object + postpositional suffix </td>
  <td> Verb </td>
  <td> </td>
</tr>
</table>

<h3>The pronouns take on the following forms</h3>
<table class="exampleTable">
<tr>
  <th> </th>
  <th>First Person</th>
  <th>Second Person</th>
  <th>Third Person</th>
</tr><tr class="exampleText">
  <th>Singular</th>
  <td>ਮੈਥੋਂ, ਮੇਰੇ ਕੋਲੋਂ, ਮੇਰੇ ਲਾਗਿਓਂ, ਮੇਰੇ ਉਤੋਂ, ਮੇਰੇ ਹੇਠੋਂ </td>
  <td>ਤੈਥੋਂ, ਤੇਰੇ ਕੋਲੋਂ, ਤੇਰੇ ਲਾਗਿਓਂ, ਤੇਰੇ ਉਤੋਂ, ਤੇਰੇ ਹੇਠੋਂ </td>
  <td> ਉਹਥੋਂ, ਉਹਦੇ ਕੋਲੋਂ, ਉਹਦੇ ਲਾਗਿਓਂ, ਉਹਦੇ ਉਤੋਂ, ਉਹਦੇ ਹੇਠੋਂ </td>
</tr><tr class="exampleText">
  <th>Plural</th>
  <td> ਸਾਥੋਂ, ਸਾਡੇ ਕੋਲੋਂ, ਸਾਡੇ ਲਾਗਿਓਂ, ਸਾਡੇ ਉਤੋਂ, ਸਾਡੇ ਹੇਠੋਂ </td>
  <td> ਤੁਹਾਥੋਂ, ਤੁਹਾਡੇ ਕੋਲੋਂ, ਤੁਹਾਡੇ ਲਾਗਿਓਂ, ਤੁਹਾਡੇ ਉਤੋਂ, ਤੁਹਾਡੇ ਹੇਠੋਂ </td>
  <td> ਉਹਨਾਂ ਤੋਂ, ਉਹਨਾਂ ਕੋਲੋਂ, ਉਹਨਾਂ ਲਾਗਿਓਂ, ਉਹਨਾਂ ਉਤੋਂ, ਉਹਨਾਂ ਹੇਠੋਂ</td>
</tr>
</table>

<h2><a name="sumbundh">6. Sumbundh Kaaruk | ਸੰਬੰਧ ਕਾਰਕ</a></h2>
<p>The nouns or pronouns which have a relationship of ownership with other nouns are said to be in Sumbudh Kaaruk. The postposition used in this case is <b>ਦਾ</b> which is similar to apostrophe s in Emglish language. For example Jaspreet's Motorcycle can be written as  ਜਸਪ੍ਰੀਤ <b>ਦਾ</b> ਮੋਟਰਸਾਈਕਲ. This postposition word changes its form according to the latter nouns ਲਿੰਗ (gender) and ਵਚਨ (number). Since motorcycle is a masculine noun in Punjabi ਦਾ has been used in the example sentence just cited, but 'Shirt' is a feminine noun in punjabi hence it would be written as ਜਸਪ੍ਰੀਤ <b>ਦੀ</b> ਕਮੀਜ਼ (shirt). In case of masculine plurals the form ਦੇ is to be used, for example ਜਸਪ੍ਰੀਤ <b>ਦੇ</b> ਘੋੜੇ (horses). When the owned noun is feminine plural the form ਦੀਆਂ is used, for example ਜਸਪ੍ਰੀਤ <b>ਦੀਆਂ</b> ਕਿਤਾਬਾਂ (books).
<table class="exampleTable">
<tr>
  <th> Owned noun </th>
  <th> Masculine </th>
  <th> Feminine </th>
</tr><tr class="exampleText">
  <th> Singular </th>
  <td> ਦਾ </td>
  <td> ਦੀ </td>
</tr><tr class="exampleText">
  <th> Plural </th>
  <td> ਦੇ </td>
  <td> ਦੀਆਂ </td>
</tr>
</table>
All these above forms of ਦਾ are used in third person. But, when the noun following the postposition comes as the second person, that is when it is addressed to, the form changes yet again!

<h3>ਦਾ in Second person</h3>
<table class="exampleTable">
<tr>
  <th> Owned noun </th>
  <th> Masculine </th>
  <th> Feminine </th>
</tr><tr class="exampleText">
  <th> Singular </th>
  <td> ਦਿਆ </td>
  <td> ਦੀਏ </td>
</tr><tr class="exampleText">
  <th> Plural </th>
  <td> ਦਿਓ </td>
  <td> ਦੀਓ </td>
</tr>
</table>

<h3>Examples of owned noun in Second Person</h3>
<ul class="exampleText">
  <li>ਮੁੰਡੇ ਦਿਆ ਮਾਮਿਆ! ( Maternal uncle, singular)</li>
  <li>ਮੁੰਡੇ ਦੀਏ ਮਾਮੀਏ! (Maternal aunt, singular) </li>
  <li>ਮੁੰਡੇ ਦਿਓ ਮਾਮਿਓ! (Maternal uncles, plural)</li>
  <li>ਮੁੰਡੇ ਦੀਓ ਮਾਮਿਓ! (Maternal aunts, plural)</li>
</ul>

<h3>The pronouns take on the following forms</h3>
<table class="exampleTable">
<tr>
  <th> </th>
  <th>First Person</th>
  <th>Second Person</th>
  <th>Third Person</th>
</tr><tr class="exampleText">
  <th>Singular</th>
  <td> ਮੇਰਾ (masc., sing.), ਮੇਰੇ & ਮੇਰਿਆਂ (masc., plu.), ਮੇਰੀ (fem., sing.), ਮੇਰੀਆਂ (fem., plu.) </td>
  <td> ਤੇਰਾ (masc., sing.), ਤੇਰੇ & ਤੇਰਿਆਂ (masc., plu.), ਤੇਰੀ (fem., sing.), ਤੇਰੀਆਂ (fem., plu.) </td>
  <td> ਉਹਦਾ (masc., sing.), ਉਹਦੇ & ਉਹਦਿਆਂ (masc., plu.), ਉਹਦੀ (fem., sing.), ਉਹਦੀਆਂ (fem., plu.) </td>
</tr><tr class="exampleText">
  <th>Plural</th>
  <td> ਸਾਡਾ (masc., sing.), ਸਾਡੇ & ਸਾਡੀਆਂ (masc., plu.), ਸਾਡੀ (fem., sing.), ਸਾਡੀਆਂ (fem., plu.) </td>
  <td> ਤੁਹਾਡਾ (masc., sing.), ਤੁਹਾਡੇ & ਤੁਹਾਡਿਆਂ (masc., plu.), ਤੁਹਾਡੀ (fem., sing.), ਤੁਹਾਡੀਆਂ (fem., plu.) </td>
  <td> ਉਹਨਾਂ ਦਾ (masc., sing.), ਉਹਨਾਂ ਦੇ (masc., plu.), ਉਹਨਾਂ ਦੀ (fem., sing.), ਉਹਨਾਂ ਦੀਆਂ (fem., plu.) </td>
</tr>
</table>


<h2><a name="udhikurun">7. Udhikurun Kaaruk | ਅਧੀਕਰਨ ਕਾਰਕ</a></h2>
<p> Udhikurun is related with 'site' of a noun. When a noun is placed on or near or in another noun then the latter is said to be in udhikurun kaaruk. The postpositions used are:</p>
<ul class="indent1 exampleText">
<li>ਵਿੱਚ - in</li>
<li>ਉੱਤੇ - on</li>
<li>ਨੇੜੇ, ਲਾਗੇ - near</li>
<li>ਕੋਲ਼ - near or in possession</li>
</ul>

<table class="noteTable"><tr><td>You might recognise these postpositions as being similar to the ones used in Upaadaan kaaruk. Actually these are the basic postpositional words which are suffixed with an ਓ to form postpositions for Upaadaan Kaaruk. ਵਿੱਚ - ਵਿੱਚੋਂ, ਉੱਤੇ - ਉੱਤੋਂ, ਨੇੜੇ - ਨੇੜਿਓਂ, ਲਾਗੇ - ਲਾਗਿਓਂ </td></tr></table>

<table class="exampleTable">
<tr class="exampleText">
  <td> ਕਿਤਾਬ </td>
  <td> ਮੇਜ਼ ਉੱਤੇ </td>
  <td> ਹੈ </td>
  <td> </td>
</tr><tr class="exampleGloss">
  <td> Book </td>
  <td> table on </td>
  <td> is</td>
  <td> Book is lying on the table </td>
</tr><tr class="exampleGloss">
  <td> Subject </td>
  <td> Object + postposition </td>
  <td> Verb </td>
  <td> </td>
</tr></table>

<table class="exampleTable">
<tr class="exampleText">
  <td>ਘੜੀ </td>
  <td> ਪਾਣੀ ਵਿੱਚ </td>
  <td> ਡਿੱਗ ਪਈ </td>
  <td> </td>
</tr><tr class="exampleGloss">
  <td> Watch </td>
  <td> water in </td>
  <td> fell </td>
  <td> Watch fell in the water </td>
</tr><tr class="exampleGloss">
  <td> Subject </td>
  <td> Object + postposition </td>
  <td> Verb phrase </td>
  <td> </td>
</tr></table>


<table class="exampleTable">
<tr class="exampleText">
  <td> ਸਿਰ ਉੱਤੇ </td>
  <td> ਪੰਡ  </td>
  <td> ਹੈ </td>
  <td> </td>
</tr><tr class="exampleGloss">
  <td> Head on </td>
  <td> Bundle </td>
  <td> is </td>
  <td> The bundle is on the head </td>
</tr><tr class="exampleGloss">
  <td> Object + postposition </td>
  <td> Subject </td>
  <td> Verb </td>
  <td> </td>
</tr></table>

<table class="exampleTable">
<tr class="exampleText">
  <td> ਕੰਧ ਨੇੜੇ </td>
  <td> ਇੱਟਾਂ </td>
  <td> ਪਈਆਂ ਹਨ </td>
  <td> </td>
</tr><tr class="exampleGloss">
  <td> Wall near </td>
  <td> bricks </td>
  <td> lying are </td>
  <td> Bricks are lying near the wall </td>
</tr><tr class="exampleGloss">
  <td> Object + postposition </td>
  <td> Subject </td>
  <td> Verb phrase </td>
  <td> </td>
</tr></table>

<p> Similar to Kurun Kaaruk, the postposition ਵਿੱਚ is sometimes dispensed with, by attaching a ੀ + ਂ as a suffix to the plural noun.</p>

<span class="indent1 exampleText">ਘਰਾਂ ਵਿੱਚ ਬੈਠੇ ਲੋਕ --> ਘਰੀਂ ਬੈਠੇ ਲੋਕ </span><br>
<span class="indent1 exampleText">ਸ਼ਹਿਰਾਂ ਵਿੱਚ ਵਸਦੇ ਬੰਦੇ --> ਸ਼ਹਿਰੀਂ ਵਸਦੇ ਬੰਦੇ </span><br>

<h3>The pronouns take on the following forms</h3>
<table class="exampleTable">
<tr>
  <th> </th>
  <th>First Person</th>
  <th>Second Person</th>
  <th>Third Person</th>
</tr><tr class="exampleText">
  <th>Singular</th>
  <td>ਮੇਰੇ ਉੱਤੇ, ਮੇਰੇ ਵਿੱਚ, ਮੇਰੇ ਕੋਲ਼, ਮੇਰੇ ਨੇੜੇ, ਮੇਰੇ ਲਾਗੇ </td>
  <td>ਤੇਰੇ ਉੱਤੇ, ਤੇਰੇ ਵਿੱਚ, ਤੇਰੇ ਕੋਲ਼, ਤੇਰੇ ਨੇੜੇ, ਤੇਰੇ ਲਾਗੇ </td>
  <td>ਉਹਦੇ ਉੱਤੇ, ਉਹਦੇ ਵਿੱਚ, ਉਹਦੇ ਕੋਲ਼, ਉਹਦੇ ਲਾਗੇ </td>
</tr><tr class="exampleText">
  <th>Plural</th>
  <td> ਸਾਡੇ ਉੱਤੇ, ਸਾਡੇ ਕੋਲ਼, ਸਾਡੇ ਨੇੜੇ, ਸਾਡੇ ਲਾਗੇ </td>
  <td> ਤੁਹਾਡੇ ਉੱਤੇ, ਤੁਹਾਡੇ ਕੋਲ਼, ਤੁਹਾਡੇ ਨੇੜੇ, ਤੁਹਾਡੇ ਲਾਗੇ  </td>
  <td> ਉਹਨਾਂ ਉੱਤੇ, ਉਹਨਾਂ ਕੋਲ਼, ਉਹਨਾਂ ਨੇੜੇ, ਉਹਨਾਂ ਲਾਗੇ  </td>
</tr>
</table>

<h2><a name="sumbodhun">8. Sumbodhan Kaaruk | ਸੰਬੋਧਨ ਕਾਰਕ</a></h2>
<p> Sumbodhan means to address. When a noun is used to address(second person) somebody it is said to in Sumbodhan Kaaruk. In the sentence <span class="exampleText">ਮੁੰਡਿਆ, ਮੇਰੀ ਗੱਲ ਸੁਣ! ( Boy! listen to me )</span> the noun <span class="exampleText">ਮੁੰਡਿਆ</span> is in Sumbodhan kaaruk.</p>
<p>For masculine nouns ending with a mukta letter (without any lugg/matra) the sumbodhni form is achieved by suffixing a kunna (ਾ) to the noun:</p>

<p class="indent1 exampleText"> ਦੇਵ --> ਦੇਵਤਾ! &nbsp;&nbsp;&nbsp;&nbsp; ਭਗਤ --> ਭਗਤਾ! &nbsp;&nbsp;&nbsp;&nbsp; ਸੱਜਣ --> ਸੱਜਣਾ!</p>

<p>For masculine nouns ending with a kunna (ਾ) the Sumbodhan kaaruk form is made by removing the kunna and sufixing a Sihari (ਿ) and a ਆ</p>
<p class="indent1 exampleText">ਘੋੜਾ --> ਘੋੜਿਆ! &nbsp;&nbsp;&nbsp;&nbsp; ਭਲਾ --> ਭਲਿਆ! &nbsp;&nbsp;&nbsp;&nbsp;  ਕੁੱਤਾ --> ਕੁੱਤਿਆ!</p>

<p>For plural masculine as well as feminine nouns the sumbodhni form is made by attaching a ਓ at the end.</p>
<p class="indent1 exampleText"> ਮੁੰਡੇ --> ਮੁੰਡਿਓ! &nbsp;&nbsp;&nbsp;&nbsp; ਕੁੜੀ --> ਕੁੜੀਓ! &nbsp;&nbsp;&nbsp;&nbsp; ਰਾਗੀ -- ਰਾਗੀਓ!</p>

<p>Feminine nouns are made into sumbodhni form by attaching a ਏ at the end</p>
<p class="indent1 exampleText"> ਕੁੜੀ --> ਕੁੜੀਏ! &nbsp;&nbsp;&nbsp;&nbsp; ਭਲੀ --> ਭਲੀਏ &nbsp;&nbsp;&nbsp;&nbsp; ਚਿੜੀ --> ਚਿੜੀਏ &nbsp;&nbsp;&nbsp;&nbsp; ਬਿੱਲੀ --> ਬਿੱਲੀਏ </p>


</html>
/***
TiddlySpace extensions for [[chrjs]]
***/
//{{{
(function($) {

tiddlyweb.routes.spaces = "{host}/spaces";
tiddlyweb.routes.space = "{host}/spaces/{name}";
tiddlyweb.routes.members = "{host}/spaces/{name}/members";
tiddlyweb.routes.member = "{host}/spaces/{name}/members/{username}";

tiddlyweb.Space = function(name, host) {
	tiddlyweb.Resource.apply(this, ["space", host]);
	this.name = name;
};
tiddlyweb.Space.prototype = new tiddlyweb.Resource();
$.extend(tiddlyweb.Space.prototype, {
	create: function(callback, errback) { // API wrapper
		this.put.apply(this, arguments);
	},
	members: function() {
		return new MemberCollection(this);
	},
	includes: function() {
		return new IncludesCollection(this);
	}
});

var Member = function(username, space) {
	tiddlyweb.Resource.apply(this, ["member", space.host]);
	this.name = space.name;
	this.username = username;
};
Member.prototype = new tiddlyweb.Resource();

var MemberCollection = function(space) {
	tiddlyweb.Collection.apply(this, ["members", space.host, {
		name: space.name
	}]);
};
MemberCollection.prototype = new tiddlyweb.Collection();
$.extend(MemberCollection.prototype, {
	add: function(username, callback, errback) {
		var member = new Member(username, this);
		member.put(callback, errback);
	},
	remove: function(username, callback, errback) {
		var member = new Member(username, this);
		member["delete"](callback, errback);
	}
});

var IncludesCollection = function(space) {
	tiddlyweb.Collection.apply(this, ["space", space.host, {
		name: space.name
	}]);
};
IncludesCollection.prototype = new tiddlyweb.Collection();
$.extend(IncludesCollection.prototype, {
	get: function(callback, errback) {
		var self = this;
		var recipe = new tiddlyweb.Recipe(this.name + "_public", this.host);
		recipe.get(function(recipe, status, xhr) {
			var inclusions = $.map(recipe.recipe, function(item, i) {
				var arr = item[0].split("_public");
				return (arr[0] != self.name && arr[1] === "") ? arr[0] : null;
			});
			callback(inclusions, status, xhr);
		}, function(xhr, error, exc) {
			errback(xhr, error, exc, self);
		});
	},
	add: function(name, callback, errback) {
		var self = this;
		var names = typeof(name) === "string" ? [ name ] : name;
		$.ajax({
			type: "post",
			url: this.route(),
			contentType: "json",
			data: $.toJSON({ "subscriptions": names }),
			success: function(response, status, xhr) {
				callback(self, status, xhr);
			},
			errback: function(xhr, error, exc) {
				errback(xhr, error, exc, self);
			}
		});
	},
	remove: function(name, callback, errback) {
		var self = this;
		var names = typeof(name) === "string" ? [ name ] : name;
		$.ajax({
			type: "post",
			contentType: "json",
			url: this.route(),
			data: $.toJSON({ "unsubscriptions": names }),
			success: function(response, status, xhr) {
				callback(self, status, xhr);
			},
			errback: function(xhr, error, exc) {
				errback(xhr, error, exc, self);
			}
		});
	}
});

})(jQuery);
//}}}
<html><nowiki>
<style>
.verbConjugation table{
     border: none;
     background-color: none;
     text-align: center;
}
.verbConjugation tr{
     border: none;
     background-color: none;     
}
.verbConjugation tr th{
     background-color: #519600;
     border: 1px solid #00ff00;
}
.verbConjugation tr.singular{
     background-color: #9ff33d;
}
.verbConjugation tr.plural{
     background-color: #B5F36D; 
}

.verbConjugation tr td{
     border: 1px solid #00ff00;
     text-align: center;
}

</style>

<h1>  Future Tense </h1>
<h2> ਜਾ (Go)</h2>
<h3>1. Future Indefinite Tense ਅਨਿਸ਼ਚਿਤ ਭਵਿੱਖਤ ਕਾਲ / ਸਾਧਾਰਣ ਭਵਿੱਖਤ ਕਾਲ</h3>

<table class="verbConjugation">
<tr>
    <th rowspan=2 >Subject </th>
    <th rowspan=2>Object </th>
    <th colspan=2> Verb (phrase) </th>
    <th rowspan=2> English Translation </th>
</tr>
<tr>

     <th> Masculine </th>
     <th> Feminine </th>
</tr>
<tr class="singular" >
     <td> ਮੈਂ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td>  ਜਾਂਵਾਗਾ </td>
     <td> ਜਾਂਵਾਗੀ</td>
     <td>I will go to the market </td>
</tr> <tr class="plural">
     <td> ਅਸੀਂ </td>
     <td>  ਬਜ਼ਾਰ </td>
     <td>  ਜਾਂਵਾਗੇ </td>
     <td> ਜਾਂਵਾਗੀਆਂ/ਜਾਂਵਾਗੇ </td>
     <td> We will go  to the market </td>
</tr><tr class="singular">
     <td> ਤੂੰ </td>
     <td> ਬਜ਼ਾਰ </td> 
     <td> ਜਾਂਵੇਗਾ </td>
     <td> ਜਾਂਵੇਗੀ </td>
     <td> You will go to the market </td>
</tr><tr class="plural">
     <td> ਤੁਸੀਂ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਜਾਂਵੋਗੇ/ਜਾਂਓਗੇ </td>
     <td> ਜਾਂਵੋਗੀਓ/ਜਾਂਓਗੇ </td>
     <td> You (plural) will go to the market </td>
</tr><tr class="singular">
     <td> ਓਹ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਜਾਵੇਗਾ/ਜਾਏਗਾ </td>
     <td> ਜਾਵੇਗੀ/ਜਾਏਗੀ </td>
     <td> He/She will go to the market </td>
</tr><tr class="plural">
     <td> ਓਹ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਜਾਂਣਗੇ </td>
     <td> ਜਾਣਗੀਆਂ  </td>
     <td> They will go to the market </td>
</tr>
<tr class="singular">
     <td> ਰਾਮ  </td>
     <td>ਬਜ਼ਾਰ  </td>
     <td>ਜਾਵੇਗਾ</td>
     <td>  </td>
     <td> Ram will go to the market </td>
</tr>
<tr class="singular">
     <td>ਸੀਤਾ </td>
     <td>ਬਜ਼ਾਰ </td>
     <td> </td>
     <td> ਜਾਵੇਗੀ </td>
     <td>Sita will go to the market </td>
</tr>
<tr class="plural">
     <td> ਰਾਮ ਅਤੇ ਸੀਤਾ</td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਜਾਣਗੇ </td>
     <td>  </td>
     <td> Ram and Sita will go to the market </td>
</tr>
<tr class="plural">
     <td> ਸੀਤਾ ਅਤੇ ਗੀਤਾ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> </td>
     <td> ਜਾਣਗੀਆਂ </td>
     <td> Sita and Gita will go to the market </td>
</tr>
</table>
<br/>
<table>
<tr>
     <td style="background-color: #9FF33d;" >Singular </td> <td style="background-color: #b5f36d;">Plural </td>
</tr>
</table>


<h3>2. Future Imperfect Continuous Tense ਅਪੂਰਨ ਚਾਲੂ ਭਵਿੱਖਤ ਕਾਲ</h3>
<table class="verbConjugation">
<tr>
    <th rowspan=2 >Subject </th>
    <th rowspan=2>Object </th>
    <th colspan=2> Verb (phrase) </th>
    <th rowspan=2> English Translation </th>
</tr>
<tr>

     <th> Masculine </th>
     <th> Feminine </th>
</tr>
<tr class="singular" >
     <td> ਮੈਂ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td>  ਜਾ ਰਿਹਾ ਹੋਵਾਂਗਾ  </td>
     <td> ਜਾ ਰਹੀ ਹੋਵਾਂਗੀ</td>
     <td>I will be going to the market </td>
</tr> <tr class="plural">
     <td> ਅਸੀਂ </td>
     <td>  ਬਜ਼ਾਰ </td>
     <td>  ਜਾ ਰਹੇ ਹੋਵਾਂਗੇ </td>
     <td> ਜਾ ਰਹੀਆਂ ਹੋਵਾਂਗੀਆਂ </td>
     <td> We will be going to the market </td>
</tr><tr class="singular">
     <td> ਤੂੰ </td>
     <td> ਬਜ਼ਾਰ </td> 
     <td> ਜਾ ਰਿਹਾ ਹੋਵੇਂਗਾ </td>
     <td> ਜਾ ਰਹੀ ਹੋਵੇਂਗੀ </td>
     <td> You will be going to the market </td>
</tr><tr class="plural">
     <td> ਤੁਸੀਂ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਜਾ ਰਹੇ ਹੋਵੋਂਗੇ </td>
     <td> ਜਾ ਰਹੀਆਂ ਹੋਵੋਂਗੀਆਂ</td>
     <td> You (plural) will be going to the market </td>
</tr><tr class="singular">
     <td> ਓਹ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਜਾ ਰਿਹਾ ਹੋਵੇਗਾ </td>
     <td> ਜਾ ਰਹੀ ਹੋਵੇਗਾ </td>
     <td> He/She will be going to the market </td>
</tr><tr class="plural">
     <td> ਓਹ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਜਾ ਰਹੇ ਹੋਵਣਗੇ/ਹੋਣਗੇ </td>
     <td> ਜਾ ਰਹੀਆਂ ਹੋਵਣਗੀਆਂ/ਹੋਣਗੀਆਂ </td>
     <td> They will be going to the market </td>
</tr>
<tr class="singular">
     <td> ਰਾਮ  </td>
     <td>ਬਜ਼ਾਰ  </td>
     <td>ਜਾ ਰਿਹਾ ਹੋਵੇਗਾ </td>
     <td> </td>
     <td> Ram will be going to the market </td>
</tr>
<tr class="singular">
     <td>ਸੀਤਾ </td>
     <td>ਬਜ਼ਾਰ </td>
     <td> </td>
     <td>ਜਾ ਹੋਵੇਗੀ </td>
     <td> Sita will be going to the market </td>
</tr>
<tr class="plural">
     <td> ਰਾਮ ਅਤੇ ਸੀਤਾ</td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਜਾ ਰਹੇ ਹੋਵਣਗੇ/ਹੋਣਗੇ </td>
     <td>  </td>
     <td> Ram and Sita will be going to the market </td>
</tr>
<tr class="plural">
     <td> ਸੀਤਾ ਅਤੇ ਗੀਤਾ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> </td>
     <td> ਜਾ ਰਹੀਆਂ ਹੋਣਗੀਆਂ </td>
     <td> Sita and Gita will be going to the market </td>
</tr>
</table>
<br/>
<table>
<tr>
     <td style="background-color: #9FF33d;" >Singular </td> <td style="background-color: #b5f36d;">Plural </td>
</tr>
</table>

<h3>3. Future Perfect indefinite ਅਨਿਸ਼ਚਿਤ ਪੂਰਨ ਭਵਿੱਖਤ ਕਾਲ</h3>
<table class="verbConjugation">
<tr>
    <th rowspan=2 >Subject </th>
    <th rowspan=2>Object </th>
    <th colspan=2> Verb (phrase) </th>
    <th rowspan=2> English Translation </th>
</tr>
<tr>

     <th> Masculine </th>
     <th> Feminine </th>
</tr>
<tr class="singular" >
     <td> ਮੈਂ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td>  ਗਿਆ ਹੋਵਾਂਗਾ  </td>
     <td> ਗਈ ਹੋਵਾਂਗੀ</td>
     <td> I will have gone to the market </td>
</tr> <tr class="plural">
     <td> ਅਸੀਂ </td>
     <td>  ਬਜ਼ਾਰ </td>
     <td> ਗਏ ਹੋਵਾਂਗੇ </td>
     <td> ਗਈਆਂ ਹੋਵਾਂਗੀਆਂ </td>
     <td> We will have gone to the market  </td>
</tr><tr class="singular">
     <td> ਤੂੰ </td>
     <td> ਬਜ਼ਾਰ </td> 
     <td> ਗਿਆ ਹੋਵੇਂਗਾ </td>
     <td> ਗਈ ਹੋਵੇਂਗੀ </td>
     <td> You will have gone to the market  </td>
</tr><tr class="plural">
     <td> ਤੁਸੀਂ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਗਏ ਹੋਵੋਂਗੇ </td>
     <td> ਗਈਆਂ ਹੋਵੋਂਗੀਆਂ</td>
     <td> You(plural) will have gone to the market  </td>
</tr><tr class="singular">
     <td> ਓਹ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਗਿਆ ਹੋਵੇਗੇ </td>
     <td> ਗਈ ਹੋਵੇਗੀ </td>
     <td> He/She will have gone to the market  </td>
</tr><tr class="plural">
     <td> ਓਹ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਗਏ ਹੋਣਗੇ </td>
     <td> ਗਈਆਂ ਹੋਣਗੀਆਂ </td>
     <td> They will have gone to the market  </td>
</tr>
<tr class="singular">
     <td> ਰਾਮ  </td>
     <td>ਬਜ਼ਾਰ  </td>
     <td>ਗਿਆ ਹੋਵੇਗਾ </td>
     <td> </td>
     <td> Ram will have gone to the market </td>
</tr>
<tr class="singular">
     <td>ਸੀਤਾ </td>
     <td>ਬਜ਼ਾਰ </td>
     <td> </td>
     <td>ਗਈ ਹੋਵੇਗੀ </td>
     <td>Sita will have gone to the market </td>
</tr>
<tr class="plural">
     <td> ਰਾਮ ਅਤੇ ਸੀਤਾ</td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਗਏ ਹੋਣਗੇ </td>
     <td>  </td>
     <td> Ram and Sita will have gone to the market</td>
</tr>
<tr class="plural">
     <td> ਸੀਤਾ ਅਤੇ ਗੀਤਾ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> </td>
     <td> ਗਈਆਂ ਹੋਣਗੀਆਂ </td>
     <td> Sita and Gita will have gone to the market </td>
</tr>
</table>
<br/>
<table>
<tr>
     <td style="background-color: #9FF33d;" >Singular </td> <td style="background-color: #b5f36d;">Plural </td>
</tr>
</table>

<h3>4. Future Perfect Definite  ਨਿਸ਼ਚਿਤ ਪੂਰਨ ਭੂਤ ਕਾਲ</h3>
<table class="verbConjugation">
<tr>
    <th rowspan=2 >Subject </th>
    <th rowspan=2>Object </th>
    <th colspan=2> Verb (phrase) </th>
    <th rowspan=2> English Translation </th>
</tr>
<tr>

     <th> Masculine </th>
     <th> Feminine </th>
</tr>
<tr class="singular" >
     <td> ਮੈਂ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td>  ਜਾ ਚੁੱਕਾ ਹੋਵਾਂਗਾ  </td>
     <td> ਜਾ ਚੁੱਕੀ ਹੋਵਾਂਗੀ </td>
     <td> </td>
</tr> <tr class="plural">
     <td> ਅਸੀਂ </td>
     <td>  ਬਜ਼ਾਰ </td>
     <td> ਜਾ ਚੁੱਕੇ ਹੋਵਾਂਗੇ </td>
     <td> ਜਾ ਚੁੱਕੀਆਂ ਹੋਵਾਂਗੀਆਂ </td>
     <td>  </td>
</tr><tr class="singular">
     <td> ਤੂੰ </td>
     <td> ਬਜ਼ਾਰ </td> 
     <td> ਜਾ ਚੁੱਕਾਂ ਹੋਵੇਂਗਾ </td>
     <td> ਜਾ ਚੁੱਕੀ ਹੋਵੇਂਗੀ </td>
     <td>  </td>
</tr><tr class="plural">
     <td> ਤੁਸੀਂ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਜਾ ਚੁੱਕੇ ਹੋਵੋਂਗੇ </td>
     <td> ਜਾ ਚੁੱਕੀਆਂ ਹੋਵੋਂਗੀਆਂ</td>
     <td>  </td>
</tr><tr class="singular">
     <td> ਓਹ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਜਾ ਚੁੱਕਾ ਹੋਵੇਗਾ </td>
     <td> ਜਾ ਚੁੱਕੀ ਹੋਵੇਗੀ </td>
     <td>  </td>
</tr><tr class="plural">
     <td> ਓਹ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਜਾ ਚੁੱਕੇ ਹੋਣਗੇ </td>
     <td> ਜਾ ਚੁੱਕੀਆਂ ਹੋਣਗੀਆਂ </td>
     <td>  </td>
</tr>
<tr class="singular">
     <td> ਰਾਮ  </td>
     <td>ਬਜ਼ਾਰ  </td>
     <td>ਜਾ ਚੁੱਕਾ ਹੋਵੇਗਾ </td>
     <td> </td>
     <td>  </td>
</tr>
<tr class="singular">
     <td>ਸੀਤਾ </td>
     <td>ਬਜ਼ਾਰ </td>
     <td> </td>
     <td>ਜਾ ਚੁੱਕੀ ਹੋਵੇਗੀ </td>
     <td> </td>
</tr>
<tr class="plural">
     <td> ਰਾਮ ਅਤੇ ਸੀਤਾ</td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਜਾ ਚੁੱਕੇ ਹੋਣਗੇ </td>
     <td>  </td>
     <td> </td>
</tr>
<tr class="plural">
     <td> ਸੀਤਾ ਅਤੇ ਗੀਤਾ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> </td>
     <td> ਜਾ ਚੁੱਕੀਆਂ ਹੋਣਗੀਆਂ </td>
     <td>   </td>
</tr>
</table>
<br/>
<table>
<tr>
     <td style="background-color: #9FF33d;" >Singular </td> <td style="background-color: #b5f36d;">Plural </td>
</tr>
</table>
<h3>5. Conditional Future Tense ਸ਼ਰਤੀ ਭੂਤ ਕਾਲ </h3>
<table class="verbConjugation">
<tr>
    <th rowspan=2> Conjugate </th>
    <th rowspan=2 >Subject </th>
    <th rowspan=2>Object </th>
    <th colspan=2> Verb (phrase) </th>
    <th rowspan=2> English Translation </th>
</tr>
<tr>

     <th> Masculine </th>
     <th> Feminine </th>
</tr>
<tr class="singular" >
     <td> ਜੇ </td>
     <td> ਮੈਂ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td >  ਜਾਵਾਂਗਾ  </td>
     <td >  ਜਾਵਾਂਗੀ  </td>
     <td> If I go to the market </td>
</tr> <tr class="plural">
     <td> ਜੇ </td>
     <td> ਅਸੀਂ </td>
     <td>  ਬਜ਼ਾਰ </td>
     <td colspan=2> ਜਾਵਾਂਗੇ</td>
     <td> If we go to the market </td>
</tr><tr class="singular">
     <td> ਜੇ </td>
     <td> ਤੂੰ </td>
     <td> ਬਜ਼ਾਰ </td> 
     <td> ਜਾਵੇਂਗਾ </td>
     <td> ਜਾਵੇਂਗੀ </td>
     <td> If you go to the market  </td>
</tr><tr class="plural">
     <td> ਜੇ </td>
     <td> ਤੁਸੀਂ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td colspan=2> ਜਾਵੋਂਗੇ </td>
     <td> If you(plural) go to the market  </td>
</tr><tr class="singular">
     <td> ਜੇ </td>
     <td> ਓਹ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਜਾਵੇਗਾ</td>
     <td> ਜਾਵੇਗੀ </td>
     <td> If he goes to the market  </td>
</tr><tr class="plural">
     <td> ਜੇ </td>
     <td> ਓਹ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td colspan=2> ਜਾਣਗੇ</td>
     <td> If they go to the market  </td>
</tr>
<tr class="singular">
     <td> ਜੇ </td>
     <td> ਰਾਮ  </td>
     <td>ਬਜ਼ਾਰ  </td>
     <td colspan=2>ਜਾਵੇਗਾ </td>
     <td> If Ram goes to the market  </td>
</tr>
<tr class="singular">
     <td> ਜੇ </td>
     <td>ਸੀਤਾ </td>
     <td>ਬਜ਼ਾਰ </td>
     <td colspan=2>ਜਾਵੇਗੀ</td>
     <td>If Sita goes to the market </td>
</tr>
<tr class="plural">
     <td> ਜੇ </td>
     <td> ਰਾਮ ਅਤੇ ਸੀਤਾ</td>
     <td> ਬਜ਼ਾਰ </td>
     <td colspan=2> ਜਾਣਗੇ</td>
     <td>If Ram and Sita go to the market </td>
</tr>
<tr class="plural">
     <td> ਜੇ </td>
     <td> ਸੀਤਾ ਅਤੇ ਗੀਤਾ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td colspan=2> ਜਾਣਗੀਆਂ</td>
     <td> If Sita and Gita go to the market  </td>
</tr>
</table>
<br/>
<table>
<tr>
     <td style="background-color: #9FF33d;" >Singular </td> <td style="background-color: #b5f36d;">Plural </td>
</tr>
</table>
</html>
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

/***
|''Name''|TiddlyFileImporter|
|''Version''|0.3.8|
|''Author''|Ben Gillies|
|''Type''|plugin|
|''Description''|Upload a TiddlyWiki file to TiddlyWeb, and import the tiddlers.|
!Usage
Upload a TiddlyWiki file to TiddlyWeb, and import the tiddlers.
!Requires
tiddlyweb
tiddlywebplugins.reflector
!Code
***/
//{{{
(function($){
if(!version.extensions.TiddlyFileImporter)
{ //# ensure that the plugin is only installed once
	version.extensions.TiddlyFileImporter = { installed: true };
}

config.macros.fileImport = {
	reflectorURI: '/reflector?csrf_token=%0',
	incorrectTypeError: 'Incorrect File Type. You must upload a TiddlyWiki',
	uploadLabel: 'Upload',
	uploadLabelPrompt: 'Import tiddlers from this TiddlyWiki',
	step1FileText: 'File:',
	step1PostText: 'In the next screen you will select the tiddlers to import.',
	step1Title: 'Step 1: Pick a TiddlyWiki to import',
	step1TypeChooser: 'Import From:',
	step3Html: ['<input type="hidden" name="markList" />',
		'<input type="hidden" checked="true" name="chkSync" />',
		'<input type="hidden" name="chkSave" />',
		'<input type="hidden" name="txtSaveTiddler" />'].join(),

	handler: function(place, macroName, params, wikifier, paramString) {
		var wizard = new Wizard();
		wizard.createWizard(place, 'Import a TiddlyWiki');
		this.restart(wizard);
	},

	restart: function(wizard) {
		var me = config.macros.fileImport;
		wizard.addStep(me.step1Title, ['<input type="hidden" ',
			'name="markList" />'].join(""));
		var markList = wizard.getElement('markList');
		var uploadWrapper = document.createElement('div');
		markList.parentNode.insertBefore(uploadWrapper, markList);
		uploadWrapper.setAttribute('refresh', 'macro');
		uploadWrapper.getAttribute('macroName', 'fileImport');
		var iframeName = 'reflectorImporter' + Math.random().toString();
		me.createForm(uploadWrapper, wizard, iframeName);
		$(uploadWrapper).append('<p>' + me.step1PostText + '</p>');
		wizard.setValue('serverType', 'tiddlyweb');
		wizard.setValue('adaptor', new config.adaptors.file());
		wizard.setValue('host', config.defaultCustomFields['server.host']);
		wizard.setValue('context', {});
		var iframe = $(['<iframe name="' + iframeName + '" ',
			'style="display: none" />'].join("")).appendTo(uploadWrapper);
		var onSubmit = function(ev) {
			var uploadType = $('select[name=uploadtype]', wizard.formElem).val();
			if (uploadType == "file") {
				// set an onload ready to hijack the form
				me.setOnLoad(uploadWrapper, wizard, iframe[0]);
				wizard.importType = 'file';
				wizard.formElem.submit();
			} else {
				var csrf_token = config.extensions.tiddlyspace.getCSRFToken();
				$.ajax({
					url: "%0/reflector?csrf_token=%1".format(
						config.defaultCustomFields["server.host"], csrf_token),
					type: "POST",
					dataType: "text",
					data: {
						uri: $("input", ".importFrom", wizard.formElem).val()
					},
					success: function(data, txtStatus, xhr) {
						wizard.POSTResponse = data;
						me.importTiddlers(uploadWrapper, wizard);
					},
					error: function(xhr, txtStatus, error) {
						displayMessage(["There was an error fetching the ",
							'url: ', txtStatus].join(""));
						me.restart(wizard);
					}
				});
				return false;
			}
		};
		wizard.setButtons([{
			caption: me.uploadLabel,
			tooltip: me.uploadLabelPrompt,
			onClick: onSubmit
		}]);
		$(wizard.formElem).submit(function(ev) {
			onSubmit(ev);
			ev.preventDefault();
		});
	},

	createForm: function(place, wizard, iframeName) {
		var form = wizard.formElem;
		var me = config.macros.fileImport;
		form.action = me.reflectorURI.format(
			config.extensions.tiddlyspace.getCSRFToken());
		form.enctype = 'multipart/form-data';
		form.encoding = 'multipart/form-data';
		form.method = 'POST';
		form.target = iframeName;
		onSelectChange = function(e) {
			var changeTo = $(this).val();
			if (changeTo == "file") {
				$(".importFrom").html('%0 <input type="file" name="file" />'.
					format(me.step1FileText));
			} else {
				$(".importFrom").html('URL: <input type="text" name="uri" />'
					+ ' Do you want <a target="_blank" href="http://faq.tiddlyspace.com/How%20do%20I%20include%2Fexclude%20spaces%3F">inclusion</a> instead?');
			}
		};
		$(place).append('<span>%0</span>'.format(me.step1TypeChooser)).
			append($(['<select name="uploadtype"><option value="file" selected="selected">file',
				'<option value="uri">url</select>'].join("")).change(onSelectChange)).
			append('<div class="importFrom">%0<input type="file" name="file" /></div>'.
					format(me.step1FileText));
	},

	setOnLoad: function(place, wizard, iframe) {
		var me = config.macros.fileImport;
		var loadHandler = function() {
			me.importTiddlers.apply(this, [place, wizard, iframe]);
		};
		iframe.onload = loadHandler;
		completeReadyStateChanges = 0;
		iframe.onreadystatechange = function() {
			if (++(completeReadyStateChanges) == 5) {
				loadHandler();
			}
		};
	},

	importTiddlers: function(place, wizard, iframe) {
		var tmpStore = new TiddlyWiki();
		var POSTedWiki = "";
		if (wizard.importType == "file") {
			try {
				POSTedWiki= iframe.contentWindow
					.document.documentElement.innerHTML;
			} catch(e) {
				displayMessage(config.macros.fileImport.incorrectTypeError);
				config.macros.fileImport.restart(wizard);
				return;
			}
			// now we are done, so remove the iframe
			$(iframe).remove();
		} else {
			POSTedWiki = wizard.POSTResponse;
		}

		tmpStore.importTiddlyWiki(POSTedWiki);
		var newTiddlers = tmpStore.getTiddlers();
		var workspace = config.defaultCustomFields['server.workspace'];
		var context = {
			status: true,
			statusText: 'OK',
			httpStatus: 200,
			adaptor: wizard.getValue('adaptor'),
			tiddlers: newTiddlers
		};
		context.adaptor.store = tmpStore;
		wizard.setValue('context', context);
		wizard.setValue('workspace', workspace);
		wizard.setValue('inFileImport', true);
		config.macros.importTiddlers.onGetTiddlerList(context, wizard);
	}
};

var _onGetTiddler = config.macros.importTiddlers.onGetTiddler;
config.macros.importTiddlers.onGetTiddler = function(context, wizard) {
	if (wizard.getValue('inFileImport')) {
		var me = config.macros.importTiddlers;
		if(!context.status)
			displayMessage("Error in importTiddlers.onGetTiddler: " + context.statusText);
		var tiddler = context.tiddler;
		var fields = tiddler.fields;
		merge(fields, config.defaultCustomFields);
		fields["server.workspace"] = wizard.getValue('workspace');
		delete fields['server.permissions'];
		delete fields['server.bag'];
		fields['server.page.revision'] = 'false';
		delete fields['server.recipe'];
		fields.changecount = 1;
		store.suspendNotifications();
		store.saveTiddler(tiddler.title, tiddler.title, tiddler.text,
			tiddler.modifier, tiddler.modified, tiddler.tags, tiddler.fields,
			false, tiddler.created);
		store.resumeNotifications();
		var remainingImports = wizard.getValue("remainingImports")-1;
		wizard.setValue("remainingImports",remainingImports);
		if(remainingImports === 0) {
			if(context.isSynchronous) {
				store.notifyAll();
				refreshDisplay();
			}
			wizard.setButtons([
					{caption: me.doneLabel, tooltip: me.donePrompt, onClick: me.onClose}
				],me.statusDoneImport);
			autoSaveChanges();
		}
	} else {
		_onGetTiddler.apply(this, arguments);
	}
};

var _onCancel = config.macros.importTiddlers.onCancel;
config.macros.importTiddlers.onCancel = function(e)
{
	var wizard = new Wizard(this);
	if (!wizard.getValue('inFileImport')) {
		return _onCancel.apply(this, arguments);
	}
	var place = wizard.clear();
	config.macros.fileImport.restart(wizard);
	return false;
};

var _step3Html = config.macros.importTiddlers.step3Html;
var _onGetTiddlerList = config.macros.importTiddlers.onGetTiddlerList;
config.macros.importTiddlers.onGetTiddlerList = function(context, wizard) {
	var fileImport = config.macros.fileImport;
	var importTiddlers = config.macros.importTiddlers;
	if (wizard.getValue('inFileImport')) {
		importTiddlers.step3Html = fileImport.step3Html;
	} else {
		importTiddlers.step3Html = _step3Html;
	}
	_onGetTiddlerList.apply(this, arguments);
};
})(jQuery);
//}}}
/***
|''Name''|TiddlySpaceInstaller|
|''Version''|0.6.0|
|''Requires''|GUID|
|''Source''|https://github.com/jdlrobson/TiddlyWiki/raw/master/plugins/TiddlySpaceInstaller/TiddlySpaceInstaller.js|
!Usage
{{{<<showInstall bar Foo>>}}}
Opens the tiddler Foo to visitors of the bar space. 
In a space that is not bar, nothing happens.

{{{<<install foo bar>>}}}
Provides a ui for installing a space that includes foo and bar taking into account whether the user is new or currently logged in.
optional parameters:
* label - change the label of the button that is clicked to install.
* header - provide alternative text to show for "choose a website address"
* choice - allow a user to install a choice of various spaces
* choiceLabel - control the label presents for each space that is installable
* privateSpace - specifies that the newly created space should be private.
* addMember - specifies that a certain member should be added to the created space - note multiple members can be added to a new space
e.g.
{{{
<<install choice:foo choiceLabel:'install foo' choice:bar choiceLabel:'install bar'>>
}}}
provides an interface to install foo or bar space.
***/
//{{{
(function($) {

var tweb = config.extensions.tiddlyweb;
var tiddlyspace = config.extensions.tiddlyspace;
config.macros.showInstall = {
	handler: function(place, macroName, params) {
		if(config.extensions.tiddlyspace.currentSpace.name == params[0]) {
			story.displayTiddler(null, params[1] || "Install");
		}
	}
};
var macro = config.macros.install = {
	locale: {
		spaceName: "Choose a website address (note this will also be your tiddlyspace username):",
		identity: "Logged in as %0.",
		spaceCreationError: "Failed to create space %0",
		password: "Enter a password:",
		passwordAgain: "Enter password again:",
		setup: "create",
		passwordError: "your passwords do not match.. please try entering them again.",
		nameError: "The name %0 is taken or is invalid. Please try another.",
		loginRequired: "You must be logged in to use this.",
		inputLabel: {
			choice: "Select a space to install:"
		},
		choiceError: "No space has been selected to be installed."
	},
	handler: function(place, macroName, params, wikifier, paramString, tiddler) {
		var args = paramString.parseParams("anon")[0];
		params = args.anon || [];
		var locale = macro.locale;
		var mustBeLoggedIn = args.loggedInOnly ? args.loggedInOnly[0] != "no" : false;
		var options = {
			headerTxt: args.header ? args.header[0] : locale.spaceName,
			setupLabel: args.label ? args.label[0] : locale.setup,
			loginTiddler: args.loginTiddler ? args.loginTiddler[0] : false,
			inputs: args.input ? args.input : [],
			paramifierName: args.pname ? args.pname[0] : "install",
			choices: args.choice,
			choiceLabels: args.choiceLabel,
			privateSpace: args.privateSpace ? true : false,
			addMember: args.addMember ? args.addMember.join(",") : false
		};
		tweb.getStatus(function(r) {
			options.identity = tweb.status.identity;
			var host = r.server_host.host;
			if(params.length === 0) {
				params = [ tiddlyspace.currentSpace.name ];
			}
			options.includeSpaces = params;
			var container = $("<div />").appendTo(place)[0];
			tweb.getUserInfo(function(userInfo) {
				var disabled = userInfo.anon && mustBeLoggedIn && !options.identity;
				if(!disabled) {
					var form = $("<form />").addClass("spaceInstaller").appendTo(container)[0];
					macro._fillForm(form, host, userInfo, options);
				} else {
					var c = $("<span />").addClass("annotation").appendTo(container)[0];
					if(options.loginTiddler) {
						wikify(store.getTiddlerText(options.loginTiddler), c);
					} else {
						$(c).text(macro.locale.loginRequired);
					}
				}
			});
		});
	},
	_fillForm: function(form, host, userInfo, options) {
		var locale = macro.locale;
		$("<div />").text(options.headerTxt).appendTo(form);
		var user = $("<input />").addClass("reqInput input").attr("name", "username").attr("type", "text").appendTo(form);
		$("<span />").text("." + host).addClass("reqInputLabel inputLabel").appendTo(form);
		var identity = options.identity;
		if(userInfo.anon && !identity) {
			$("<div />").addClass("reqInputLabel inputLabel").text(locale.password).appendTo(form);
			var pass1 = $("<input />").addClass("reqInput input").attr("name", "pass1").attr("type", "password").appendTo(form);
			$("<div />").addClass("reqInputLabel inputLabel").text(locale.passwordAgain).appendTo(form);
			var pass2 = $("<input />").addClass("reqInput input").attr("name", "pass2").attr("type", "password").appendTo(form);
		} else if(userInfo.anon && identity) {
			$("<input />").attr("type", "hidden").attr("name", "identity").val(identity).appendTo(form);
			$("<div />").text(locale.identity.format(identity)).appendTo(form);
		}
		var inputs = options.inputs;
		for(var i = 0; i < inputs.length; i++) {
			var name = inputs[i];
			if(!["pass1", "pass2", "username"].contains(name)) {
				$("<div />").addClass("inputLabel optInputLabel").text(locale.inputLabel[name] || name).appendTo(form);
				$("<input />").addClass("input optInput").attr("input", "user").attr("name", name).appendTo(form);
			}
		}
		if(options.choices) {
			var labels = options.choiceLabels || [];
			$("<div />").addClass("inputLabel optInputLabel").text(locale.inputLabel.choice).appendTo(form);
			for(var i = 0; i < options.choices.length; i++) {
				var choice = options.choices[i];
				var radio = $("<input type='radio' />").addClass("input optInput choice").attr("name", "choice").val(choice).appendTo(form)[0];
				if(i === 0) {
					$(radio).attr("checked", true);
				}
				var label = labels[i] ? labels[i] : choice;
				$("<span />").text(label).appendTo(form);
			}
		}
		$("<input />").addClass("installButton").attr("type", "submit").val(options.setupLabel).appendTo(form);
		options.formEl = form;
		$("<div />").addClass("messageArea annotation").hide().prependTo(form.parentNode);
		$(form).submit(function(ev) {
			ev.preventDefault();
			var paramifier = [];
			$("[input=user]", ev.target).each(function(i, el) {
				paramifier.push("%0:%1".format($(el).attr("name"), $(el).val()));
			});
			if(paramifier.length === 0) {
				paramifier = false;
			} else {
				paramifier = paramifier.join(" ");
			}
			var user = $("[name=username]", ev.target).val();
			var pass = $("[name=pass1]", ev.target).val();
			var pass2 = $("[name=pass2]", ev.target).val();
			options.paramifier = paramifier;
			var choices = $("[name=choice]", form);
			var includes = options.includeSpaces;
			if(choices.length > 0) {
				includes = [];
				var space = $("[name=choice]:checked").val();
				if(space) {
					includes.push(space);
				}
			}
			if(includes.length === 0) {
				macro.updateUserMessage(form, 3);
				return;
			}
			$(form).hide();
			macro.updateUserMessage(form, 4, true);
			if(userInfo.anon && identity) {
				pass = macro.generatePassword();
				macro.installNewUser(user, pass, includes, options);
			} else if(userInfo.anon && pass != pass2) {
				macro.updateUserMessage(form, 2);
			} else if(userInfo.anon && user && pass == pass2) {
				macro.installNewUser(user, pass, includes, options);
			} else if(!userInfo.anon && user) {
				macro.setup(user, includes, options)
			} else {
				macro.updateUserMessage(form, 1);
			}
		});
	},
	updateUserMessage: function(form, code, keephidden) {
		var locale = macro.locale;
		var container = form.parentNode;
		var username = $("[name='username']", form).text();
		var msg = "";
		switch(code) {
			case 1:
				msg = "Please enter a website address";
				break;
			case 2:
				msg = locale.passwordError;
				break;
			case 3:
				msg = locale.choiceError;
				break;
			case 4:
				msg = "Installing your new space...";
				break;
			case 5:
				msg = macro.locale.nameError.format(username);
				break;
			case 6:
				msg = macro.locale.spaceCreationError.format(username);
		}
		$(".messageArea", container).text(msg).show();
		if(!keephidden) {
			$(form).show();
		}
	},
	generatePassword: function() {
		var guid = config.extensions.GuidPlugin;
		return guid ? guid.guid.generate() + "_" + guid.guid.generate() :
			"" + Math.random() * 1000;
	},
	login: function(username, password, callback, errback, challenger) {
		challenger = challenger ? challenger : "tiddlywebplugins.tiddlyspace.cookie_form";
		var uri = "%0/challenge/%1".format([tweb.host, challenger]);
		ajaxReq({ url: uri, type: "POST", success: callback,
			data: {
				user: username,
				password: password,
				csrf_token: tiddlyspace.getCSRFToken(),
				tiddlyweb_redirect: tweb.serverPrefix + "/status" // workaround to marginalize automatic subsequent GET
			},
			error: function(xhr, error, exc) {
				if(errback) {
					errback.apply(this, arguments);
				} else {
					displayMessage(admin.locale.loginError.format(username, error));
				}
			}
		});
	},
	installNewUser: function(username, password, includes, options) {
		username = username.toLowerCase();
		var user = new tiddlyweb.User(username, password, tweb.host);
		user.create(
			function() {
				macro.login(username, password, function() {
					macro.setup(username, includes, options);
				});
			},
			function() {
				macro.updateUserMessage(options.formEl, 5);
				$(options.formEl).show();
			}
		);
	},
	setup: function(spacename, includes, options) {
		var identity = options.identity;
		var space = new tiddlyweb.Space(spacename, tweb.host);
		tweb.getStatus(function(status) {
			var url = tiddlyspace.getHost(status.server_host, spacename);
			var newLocation = "%0/tiddlers.wiki#".format(url);
			if(identity) {
				newLocation += "auth:OpenID=%0".format(identity);
			}
			if(options.paramifier) {
				newLocation += "%0:[[%1]]".format(options.paramifierName, options.paramifier);
			}
			if(options.addMember) {
				newLocation += "addMember:[[%0]]".format(options.addMember);
			}
			if(options.privateSpace) {
				newLocation += "privacyMode:[[private]]";
			}
			space.create(function() {
				$.ajax({
					url: tweb.host + "/spaces/"+ spacename,
					type: "POST",
					contentType: "application/json",
					data: jQuery.toJSON({
						"subscriptions": includes
					}),
					success: function() {
						window.location = newLocation;
					},
					error: function() {
						window.location = newLocation;
					}
				});
			}, function() {
				macro.updateUserMessage(options.formEl, 6);
			});
		});
	}
};

var p = config.paramifiers.addMember = {
	onstart: function(members) {
		try {var space = config.extensions.tiddlyspace.currentSpace.name;
		var host = config.extensions.tiddlyweb.host;
		space = new tiddlyweb.Space(space, host); // XXX: singleton
		p.add(space, members.split(",")); } catch(e) {};
	},
	add: function(space, members) {
		var _dirty = story.isDirty();
		for(var i = 0; i < members.length; i++) {
			var username = members[i];
			space.members().add(username, function(){
				story.setDirty(false);
			}, function(){
				story.setDirty(false);
			});
		}
	}
};
var p2 = config.paramifiers.privacyMode = {
	onstart: function(mode) {
		if(mode == 'private') {
			config.options.chkPrivateMode = true;
			store.getTiddler("SystemSettings").fields['server.page.revision'] = 'false';
			saveSystemSetting("chkPrivateMode", true);
		}
	}
};

})(jQuery);
//}}}
<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
	<title>Reply</title>
	<link rel="stylesheet" href="//tiddlyspace.com/bags/benspa_public/tiddlers/bootvelcro.css">
	<style>
		html,
		body {
			overflow: hidden;
			background-color: transparent;
		}

		#container {
			/* prevent a fouc if no images present */
			display: none;
		}

		.modal-header {
			border-bottom: none;
			padding: 5px 0 0;
			position: absolute;
			width: 100%;
			background-color: #e0e0e0;
			-webkit-border-radius: 6px 6px 0 0;
			-moz-border-radius: 6px 6px 0 0;
			border-radius: 6px 6px 0 0;
			cursor: move;
		}

		.form-actions {
			position: absolute;
			bottom: 0;
			box-sizing: border-box;
			-moz-box-sizing: border-box;
			width: 100%;
			margin: 0;
			border-radius: 0 0 6px 6px;
			background-color: #e0e0e0;
			border-top: 1px solid gray;
		}

		.form-actions input.btn {
			width: auto;
			float: right;
			margin: 0 0.2em;
		}

		.closeBtn {
			background-color: #DCE7F1 !important;
		}

		.primary {
			background-color: #09F !important;
		}

		h1 {
			margin-bottom: 9px;
			margin-top: 9px;
		}

		body {
			width: 100%;
			height: 100%;
			position: absolute;
		}

		.modal {
			margin: 10px;
			top: 0;
			left: 0;
			bottom: 0;
			width: 510px;
			position: absolute;
			box-shadow: #444 0px 0px 10px 2px;
			border-radius: 6px;
			background-color: white;
			border: 1px solid gray;
			background-color: #F0F4F8;
		}

		label em {
			cursor: pointer;
		}

		.modal-body {
			overflow: auto;
			position: absolute;
			top: 0;
			bottom: 0;
			left: 0;
			right: 0;
			margin: 65px 20px 67px;
			background-color: transparent;
		}

		.nav-tabs {
			padding-left: 1%;
			margin: 0;
			width: 99%;
			border-color: gray;
		}

		.nav-tabs > li {
			cursor: pointer;
		}

		.nav-tabs > li > a {
			line-height: 2.4em;
			font-weight: bold;
			font-size: 100%;
		}

		.nav-tabs > li.active > a{
			background-color: #F0F4F8;
			border-color: gray;
			border-bottom-color: #F0F4F8;
		}

		.active {
			display: block;
		}

		input,
		textarea,
		select,
		.uneditable-input {
			color: #606060;
		}

		.imagePicker {
			-moz-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1);
			-webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1);
			box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1);
			border: 1px solid #CCC;
			height: 110px;
			overflow: auto;
			-webkit-border-radius: 3px;
			-moz-border-radius: 3px;
			border-radius: 3px;
			margin-left: 0;
		}

		.imagePicker img {
			margin: 5px;
			border: 2px solid transparent;
		}

		.imagePicker .current {
			border: 2px dotted #555;
		}

		label {
			font-weight: bold;
		}

		.form-actions label {
			float: left;
			margin-top: 0.75em;
		}

		fieldset input,
		fieldset textarea {
			width: 90%;
			border-color: gray;
		}

		@media all and (max-width: 550px) {
			.modal {
				width: 95%;
			}
		}

		#help {
			position: absolute;
			border: 0;
			right: 4px;
			top: 5px;
			text-indent: -9999px;
			color: transparent;
			height: 16px;
			width: 16px;
			background: none;
			background-image: url(/bags/common/tiddlers/help.png);
			background-repeat: no-repeat;
			background-color: white;
			z-index: 2;
			border-radius: 10px;
		}

		#help-info {
			padding: 0;
			border: 1px solid gray;
			width: 60%;
			height: 50px;
			color: #404040;
			background-color: white;
			position: absolute;
			top: 5px;
			right: 5px;
			z-index: 1;
			cursor: auto;
			border-radius: 5px;

		}

		#help-info p {
			padding: 10px 25px;
			margin-bottom: 0;
		}
	</style>
</head>
<body>
	<div id="container">
		<form action="#" class="modal">
			<div class="modal-header">
				<button id="help">help</button>
				<div id="help-info" style="display:none;"><p>
				Found something interesting? Write about it in your own space. <a href="//docs.tiddlyspace.com/Reply to this Tiddler" target="_blank">Find out more</a>
				</p></div>
				<ul class="nav nav-tabs" data-tabs="tabs">
					<li class="active" data-tab-name="post"><a href="#postForm">Reply</a></li>
				</ul>
			</div>


			<fieldset id="postForm" class="modal-body">
				<label>Title
					<input type="text" name="title">
				</label>
				<input type="hidden" name="url">
				<label>Post
					<textarea name="text" rows="8"></textarea>
				</label>
				<label>Tags
					<input type="text" name="tags" value="">
				</label>
			</fieldset>


			<div class="form-actions">
				<label class="checkbox">
					<input type="checkbox" name="private" val="private">
					keep private
				</label>
				<input type="submit" class="btn primary btn-large" value="Done">
				<input type="button" class="btn btn-large closeBtn" value="Cancel">
			</div>
		</form>
	</div>

	<script type="text/javascript"
            src="/bags/common/tiddlers/jquery.js"></script>
	<script type="text/javascript" src="/bags/tiddlyspace/tiddlers/chrjs"></script>
	<script type="text/javascript" src="/bags/common/tiddlers/_reply.js"></script>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
	<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
	<title>Account</title>
	<link href="/bags/common/tiddlers/profile.css" type='text/css' rel='stylesheet' >
	<link href="/bags/common/tiddlers/admin.css" type='text/css' rel='stylesheet' >
	<link href="/bags/common/tiddlers/jquery-ui.custom.css" type='text/css' rel='stylesheet' >
</head>
<body>

<div id="container">
	<div class="main section">
		<a class="app" href="/">home</a>
		<div class="left">
		<div id="siteiconArea">
		<h2>User Icon</h2>
		<div>
			<img id="siteicon" class="siteicon">
			<form id="upload" method="POST" enctype="multipart/form-data">
				<input type="hidden" name="title" value="SiteIcon" />
				<input type="hidden" name="tags" value="excludeLists">
				<input type="hidden" name="csrf_token" class="csrf" />
				<input type="file" name="file" accept="image/*" />
				<input type="submit" value="upload" />
			</form>
			<div id="dropzone">Drop file here
				<img class="notloading" src="/bags/common/tiddlers/ajax-loader.gif" alt="submitting SiteIcon" />
			</div>
		</div>
		</div>
		<h2>Find Space</h2>
		<form class="spaceSearch">
			<input class="inputBox" type="text" placeholder="find space" />
			<a href="http://docs.tiddlyspace.com/What%20is%20a%20Space%3F" class="help"
				title="What is a space?">What is a space?</a>
			<button>view all</button>
		</form>
		<div class='list-container'>
			You are a member of the following spaces:
			<ul class='ts-space-search'>
			</ul>
		</div>
		<h2>Create New Space</h2>
		<form class="ts-spaces">
			<input class="inputBox" type="text" name="spacename" placeholder="space name"><span class="hostSuffix">.tiddlyspace.com</span>
			<input type="submit" value="Create Space" />
		</form>
		</div>
		<div class="right">
		<h2>Change Password</h2>
		<form class="ts-password">
			<input class="inputBox" placeholder="existing password" type="password" name="password">
			<input class="inputBox" placeholder="new password" type="password" name="new_password">
			<input class="inputBox" placeholder="new password"	type="password" name="new_password_confirm">
			<input type="submit" value="Change password">
		</form>
		<h2>OpenID</h2>
		<h3>Why OpenID?</h3>
		<a href="http://openid.net/"><img src="/bags/common/tiddlers/openid.png" alt="openid" ></a><br />
		Use just one username and password across hundreds of OpenID-enabled sites.<br />
		It's an open standard.<br />
		<a href="http://openid.net/what/">learn more</a>
		<ul class="ts-identities"></ul>
		<form class="ts-openid" target="_top">
			<div>
				Add an openid:
			</div>
			<input class="inputBox" type="text" name="openid" placeholder="your openid" />
			<input type="submit" value="Register" />
			<a href="http://openid.net/get-an-openid/" class="help"
			title="What is an open id?">What is an open id?</a>
		</form>
		</div>
		<div class="clear"></div>
	</div>
</div>
<script src="/bags/common/tiddlers/backstage.js"></script>
<script src='/bags/common/tiddlers/jquery.js'></script>
<script src='/bags/tiddlyspace/tiddlers/chrjs'></script>
<script src='/bags/common/tiddlers/chrjs.space'></script>
<script src='/bags/common/tiddlers/chrjs.users'></script>
<script src='/bags/common/tiddlers/chrjs.identities'></script>
<script src="/bags/common/tiddlers/jquery-ui.custom.js"></script>
<script src='/bags/common/tiddlers/jquery-form.js'></script>
<script src="/bags/common/tiddlers/siteiconupload.js"></script>
<script src='/bags/common/tiddlers/ts.js'></script>
<script src="/status.js"></script>
<script type="text/javascript">
/*
 * jQuery UI Autocomplete HTML Extension
 *
 * Copyright 2010, Scott González (http://scottgonzalez.com)
 * Dual licensed under the MIT or GPL Version 2 licenses.
 *
 * http://github.com/scottgonzalez/jquery-ui-extensions
 */
(function( $ ) {

var proto = $.ui.autocomplete.prototype,
	initSource = proto._initSource;

function filter( array, term ) {
	var matcher = new RegExp( $.ui.autocomplete.escapeRegex(term), "i" );
	return $.grep( array, function(value) {
		return matcher.test( $( "<div>" ).html( value.label || value.value || value ).text() );
	});
}

$.extend( proto, {
	_initSource: function() {
		if ( this.options.html && $.isArray(this.options.source) ) {
			this.source = function( request, response ) {
				response( filter( this.options.source, request.term ) );
			};
		} else {
			initSource.call( this );
		}
	},

	_renderItem: function( ul, item) {
		return $( "<li></li>" )
			.data( "item.autocomplete", item )
			.append( $( "<a></a>" )[ this.options.html ? "html" : "text" ]( item.label ) )
			.appendTo( ul );
	}
});

})( jQuery );

/***
_accounts application specific javascript
***/
var link;
ts.init(function(ts) {
	if(ts.user.anon) { // redirect to homepage when user not logged in
		window.location = ts.getHost();
	} else if(ts.user.name === ts.currentSpace){
		initSiteIconUpload(ts.user.name);
	} else {
		link = $("<a />").attr("href", ts.getHost(ts.user.name) + "/_account").text("Change User Icon");
		$("#siteiconArea div").empty().append(link);
	}
	$(".hostSuffix").text("." + ts.getHost("").split("//")[1]);
	ts.getSpaces(function(spaces) {
		$("<div class='info' />").text("You have " + spaces.length + " spaces.").insertBefore($(".spaceSearch")[0]);
		$("form.spaceSearch input").autocomplete({
			html: true,
			source: function(req, response) {
				ts.getSpaces(function(spaces) {
					var selected = [];
					for(var i = 0; i < spaces.length; i++) {
						var space = spaces[i];
						if(space.name.indexOf(req.term) > -1) {
							var host = ts.getHost(space.name) ;
							var img = host + "/SiteIcon";
							selected.push({
								value: space.name,
								label: '<a href="' + host + '" target="_parent" class="autocompleteLink"><img src="' + img + '" style="height:24px;width:auto;max-height:24px;max-width:24px;"/>' + space.name + '</a>'
							});
						}
					}
					response(selected);
				});
			},
			select: function(event, ui) {
				window.top.location = ts.getHost(ui.item.value);
			}
		});

		var $ul = $('.ts-space-search');
		$.each(spaces, function(i, space) {
			$ul.append($('<li/>').html($('<a/>').attr('href', space.uri)
				.text(space.name)));
		});

		$('form.spaceSearch button').click(function(ev) {
			$('.list-container').slideToggle('fast');
			ev.preventDefault();
			return false;
		});
	});
});

if(window != window.top) {
	$("html").addClass("iframeMode");
	$("a").live("click",function(ev) {
		$(ev.target).attr("target", "_parent");
	});
}
</script>
<!--[if lt IE 8]>
<script type="text/javascript" src="/bags/common/tiddlers/json2.js"></script>
<![endif]-->
</body>
</html>

!Upload an icon
<<tiddler spaceIcon>>
!Describe your space
If you haven't already done so, you should provide a brief decscription of yourself and what you're using this space for. To do this, just edit the [[SiteInfo]] tiddler (keeping the title the same of course).

!Change the title
<<tiddler spaceTitle>>
!Change the theme
<<tiddler colorScheme>>
!Change the menu
If you'd like to change the menu items along the top, you can edit the [[MainMenu]] tiddler.

!Change the default tiddlers
<<tiddler setDefaultTiddlers>>
!More Advanced customisations
If you know HTML and CSS, you can edit some or all of the following tiddlers to customise your space further:
* PageTemplate
* EditTemplate
* ViewTemplate
* StyleSheet
/***
|''Name''|TiddlySpaceConfig|
|''Version''|0.7.7|
|''Description''|TiddlySpace configuration|
|''Status''|stable|
|''Source''|http://github.com/TiddlySpace/tiddlyspace/raw/master/src/plugins/TiddlySpaceConfig.js|
|''CoreVersion''|2.6.1|
|''Requires''|TiddlyWebConfig ServerSideSavingPlugin TiddlyFileImporter|
!Code
***/
//{{{
(function($) {

var tweb = config.extensions.tiddlyweb;

var recipe = config.defaultCustomFields["server.workspace"].split("recipes/")[1];
var currentSpace; // assigned later

var disabledTabs = [];

var coreBags = ["system", "tiddlyspace"];
var systemSpaces = ["plugins", "info", "images", "theme"];
systemSpaces = $.map(systemSpaces, function(item, i) {
	return "system-%0_public".format(item);
});

// hijack search macro to add custom attributes for mobile devices
var _search = config.macros.search.handler;
config.macros.search.handler = function(place, macroName, params) {
	_search.apply(this, arguments);
	$(".searchField:input", place).
		attr({ autocapitalize: "off", autocorrect: "off" });
};

// arg is either a container name or a tiddler object
// if fuzzy is truthy, space may be inferred from workspace (for new tiddlers)
// returns space object or false
var determineSpace = function(arg, fuzzy) {
	if(typeof arg == "string") { // container name
		var space = split(arg, "_", "r");
		return ["public", "private"].contains(space.type) ? space : false;
	} else if(arg) { // tiddler
		var container = determineContainer(arg, fuzzy);
		return container ? determineSpace(container.name, fuzzy) : false;
	} else {
		return false;
	}
};

// if fuzzy is truthy, container may be inferred from workspace for new tiddlers
// returns container object or false
var determineContainer = function(tiddler, fuzzy) { // TODO: expose?
	var bag = tiddler.fields["server.bag"];
	var recipe = tiddler.fields["server.recipe"]; // XXX: unused/irrelevant/redundant!?
	if(bag) {
		return { type: "bag", name: bag };
	} else if(recipe) {
		return { type: "recipe", name: recipe };
	} else if(fuzzy) { // new tiddler
		var workspace = tiddler.fields["server.workspace"];
		if(workspace) {
			var container = split(workspace, "/", "l");
			return ["bags", "recipes"].contains(container.type) ? container : false;
		} else {
			return false;
		}
	} else {
		return false;
	}
};

// hijack removeTiddlerCallback to restore tiddler from recipe cascade -- TODO: move into TiddlyWebWiki?
var sssp = config.extensions.ServerSideSavingPlugin;
var _removeTiddlerCallback = sssp.removeTiddlerCallback;
sssp.removeTiddlerCallback = function(context, userParams) {
	var title = context.tiddler.title;
	var recipe = context.tiddler.fields["server.recipe"];
	_removeTiddlerCallback.apply(this, arguments);
	if(recipe) {
		context.workspace = "recipes/" + recipe;
		var callback = function(context, userParams) {
			if(context.status) {
				var dirty = store.isDirty();
				store.saveTiddler(context.tiddler).clearChangeCount();
				store.setDirty(dirty);
			} else {
				store.notify(title, true);
			}
		};
		context.adaptor.getTiddler(title, context, null, callback);
	}
};

// splits a string once using delimiter
// mode "l" splits at the first, "r" at the last occurrence
// returns an object with members type and name
var split = function(str, sep, mode) {
	mode = mode == "r" ? "pop" : "shift"; // TODO: use +/-1 instead of "l"/"r"?
	var arr = str.split(sep);
	var type = arr.length > 1 ? arr[mode]() : null;
	return { type: type, name: arr.join(sep) };
};

var plugin = config.extensions.tiddlyspace = {
	currentSpace: determineSpace(recipe),
	coreBags: coreBags.concat(systemSpaces),

	determineSpace: determineSpace,
	isValidSpaceName: function(name) {
		return name.match(/^[a-z][0-9a-z\-]*[0-9a-z]$/) ? true : false;
	},
	getCurrentBag: function(type) {
		return "%0_%1".format(currentSpace, type);
	},
	getCurrentWorkspace: function(type) {
		return "bags/" + this.getCurrentBag(type);
	},
	// returns the URL for a space's avatar (SiteIcon) based on a server_host
	// object and an optional space name
	// optional nocors argument prevents cross-domain URLs from being generated
	getAvatar: function(host, space, nocors) {
		if(space && typeof space != "string") { // backwards compatibility -- XXX: deprecated
			space = space.name;
		}
		var subdomain = nocors ? currentSpace : space;
		host = host ? this.getHost(host, subdomain) : "";
		var bag = space ? "%0_public".format(space) : "tiddlyspace";
		return "%0/bags/%1/tiddlers/SiteIcon".format(host, bag);
	},
	// returns the URL based on a server_host object (scheme, host, port) and an
	// optional subdomain
	getHost: function(host, subdomain) {
		if(host === undefined) { // offline
			tweb.status.server_host = {}; // prevents exceptions further down the stack -- XXX: hacky workaround, breaks encapsulation
			return null;
		}
		subdomain = subdomain ? subdomain + "." : "";
		var url = "%0://%1%2".format(host.scheme, subdomain, host.host);
		var port = host.port;
		if(port && !["80", "443"].contains(port)) {
			url += ":" + port;
		}
		return url;
	},
	disableTab: function(tabTiddler) {
		if(typeof(tabTiddler) == "string") {
			disabledTabs.push(tabTiddler);
		} else {
			for(var i = 0; i < tabTiddler.length; i++) {
				plugin.disableTab(tabTiddler[i]);
			}
		}
	},
    checkSyncStatus: function(tiddler) {
		if(tiddler) {
			var title = typeof(tiddler) === "string" ? tiddler : tiddler.title;
			var el = story.getTiddler(title) || false;
			if(el) {
				refreshElements(el);
			}
		}
	},
	isDisabledTab: function(tabTitle) {
		var match = new RegExp("(?:\\[\\[([^\\]]+)\\]\\])", "mg").exec(tabTitle);
		var tabIdentifier = match ? match[1] : tabTitle;
		return disabledTabs.contains(tabIdentifier);
	},
	getCSRFToken: window.getCSRFToken || null // this may not have been processed yet
};

currentSpace = plugin.currentSpace.name;

tweb.serverPrefix = tweb.host.split("/")[3] || ""; // XXX: assumes root handler
tweb.getStatus(function(status) {
	var url = plugin.getHost(status.server_host);
	tweb.status.server_host.url = url;
	config.messages.tsVersion = status.version;
});

if(window.location.protocol == "file:") {
	// enable AutoSave by default
	config.options.chkAutoSave = config.options.chkAutoSave === undefined ?
		true : config.options.chkAutoSave;
} else {
	// set global read-only mode based on membership heuristics
	var indicator = store.getTiddler("SiteTitle") || tiddler;
	readOnly = !(recipe.split("_").pop() == "private" ||
		tweb.hasPermission("write", indicator));
	// replace TiddlyWiki's ImportTiddlers due to cross-domain restrictions
	if(config.macros.fileImport) {
		$.extend(config.macros.importTiddlers, config.macros.fileImport);
	}
}

// hijack saveChanges to ensure SystemSettings is private by default
var _saveChanges = saveChanges;
saveChanges = function(onlyIfDirty, tiddlers) {
	if(tiddlers && tiddlers.length == 1 &&
			tiddlers[0] && tiddlers[0].title == "SystemSettings") {
		var fields = tiddlers[0].fields;
		delete fields["server.recipe"];
		fields["server.bag"] = plugin.getCurrentBag("private");
		fields["server.workspace"] = plugin.getCurrentWorkspace("private");
	}
	return _saveChanges.apply(this, arguments);
};

// ensure backstage is always initialized
// required to circumvent TiddlyWiki's read-only based handling
config.macros.backstageInit = {
	init: function() {
		showBackstage = true;
	}
};

// disable evaluated macro parameters for security reasons
config.evaluateMacroParameters = "none";
var _parseParams = String.prototype.parseParams;
String.prototype.parseParams = function(defaultName, defaultValue, allowEval,
		noNames, cascadeDefaults) {
	if(config.evaluateMacroParameters == "none") {
		arguments[2] = false;
	}
	return _parseParams.apply(this, arguments);
};

var _tabsMacro = config.macros.tabs.handler;
config.macros.tabs.handler = function(place, macroName, params) {
	var newParams = [params[0]]; // keep cookie name
	for(var i = 1; i < params.length; i += 3) {
		var tabTitle = params[i + 2];
		if(!plugin.isDisabledTab(tabTitle)){
			newParams = newParams.concat(params[i], params[i + 1], tabTitle);
		}
	}
	_tabsMacro.apply(this, [place, macroName, newParams]);
};

// disable ControlView for XHRs by default
$.ajaxSetup({
	beforeSend: function(xhr) {
		xhr.setRequestHeader("X-ControlView", "false");
	}
});
// TiddlyWeb adaptor currently still uses httpReq, which needs extra magic -- XXX: obsolete this!
var _httpReq = httpReq;
httpReq = function(type, url, callback, params, headers, data, contentType,
		username, password, allowCache) {
	headers = headers || {};
	headers["X-ControlView"] = "false";
	_httpReq.apply(this, arguments);
};

// register style sheet for backstage separately (important)
store.addNotification("StyleSheetBackstage", refreshStyles);

// option for default privacy setting
config.optionsDesc.chkPrivateMode = "Set your default privacy mode to private";
config.optionsSource.chkPrivateMode = "setting";
config.options.chkPrivateMode = config.options.chkPrivateMode || false;
saveSystemSetting("chkPrivateMode", true);
config.defaultCustomFields["server.workspace"] = plugin.
	getCurrentWorkspace(config.options.chkPrivateMode ? "private" : "public");

config.paramifiers.follow = {
	onstart: function(v) {
		if(!readOnly) {
			var bag = "%0_public".format(currentSpace);
			story.displayTiddler(null, v, DEFAULT_EDIT_TEMPLATE, null, null,
				"server.bag:%0 server.workspace:bags/%0".format(bag));
			story.setTiddlerTag(v, "follow", 1);
			story.focusTiddler(v, "text");
		}
	}
};

var fImport = config.macros.fileImport;
if(fImport) {
	fImport.uploadTo = "Upload to: ";
	var _createForm = config.macros.fileImport.createForm;
	config.macros.fileImport.createForm = function(place, wizard, iframeName) {
		var container = $("<div />").text(fImport.uploadTo).appendTo(place);
		var select = $('<select name="mode" />').appendTo(container)[0];
		$('<option value="private" selected>private</a>').appendTo(select);
		$('<option value="public">public</a>').appendTo(select);
		wizard.setValue("importmode", select);
		_createForm.apply(this, [place, wizard, iframeName]);
	};

	var _onGet = config.macros.importTiddlers.onGetTiddler;
	config.macros.importTiddlers.onGetTiddler = function(context, wizard) {
		var type = $(wizard.getValue("importmode")).val();
		var ws =  plugin.getCurrentWorkspace(type);
		wizard.setValue("workspace", ws);
		_onGet.apply(this, [context, wizard]);
	};
}

config.extensions.ServerSideSavingPlugin.reportSuccess = function(msg, tiddler) {
	plugin.checkSyncStatus(tiddler);
	msg = config.extensions.ServerSideSavingPlugin.locale[msg];
	var link = "/" + encodeURIComponent(tiddler.title);
	displayMessage(msg.format([tiddler.title]), link);
};


})(jQuery);
//}}}
/***
|''Name''|TiddlyWebAdaptor|
|''Description''|adaptor for interacting with TiddlyWeb|
|''Author:''|FND|
|''Contributors''|Chris Dent, Martin Budden|
|''Version''|1.4.10|
|''Status''|stable|
|''Source''|http://svn.tiddlywiki.org/Trunk/association/adaptors/TiddlyWebAdaptor.js|
|''CodeRepository''|http://svn.tiddlywiki.org/Trunk/association/|
|''License''|[[BSD|http://www.opensource.org/licenses/bsd-license.php]]|
|''CoreVersion''|2.5|
|''Keywords''|serverSide TiddlyWeb|
!Notes
This plugin includes [[jQuery JSON|http://code.google.com/p/jquery-json/]].
!To Do
* createWorkspace
* document custom/optional context attributes (e.g. filters, query, revision) and tiddler fields (e.g. server.title, origin)
!Code
***/
//{{{
(function($) {

var adaptor = config.adaptors.tiddlyweb = function() {};

adaptor.prototype = new AdaptorBase();
adaptor.serverType = "tiddlyweb";
adaptor.serverLabel = "TiddlyWeb";
adaptor.mimeType = "application/json";

adaptor.parsingErrorMessage = "Error parsing result from server";
adaptor.noBagErrorMessage = "no bag specified for tiddler";
adaptor.locationIDErrorMessage = "no bag or recipe specified for tiddler"; // TODO: rename

// retrieve current status (requires TiddlyWeb status plugin)
adaptor.prototype.getStatus = function(context, userParams, callback) {
	context = this.setContext(context, userParams, callback);
	var uriTemplate = "%0/status";
	var uri = uriTemplate.format([context.host]);
	var req = httpReq("GET", uri, adaptor.getStatusCallback, context,
		null, null, null, null, null, true);
	return typeof req == "string" ? req : true;
};

adaptor.getStatusCallback = function(status, context, responseText, uri, xhr) {
	context.status = responseText ? status : false;
	try {
		context.statusText = xhr.statusText;
	} catch(exc) { // offline (Firefox)
		context.status = false;
		context.statusText = null;
	}
	context.httpStatus = xhr.status;
	if(context.status) {
		context.serverStatus = $.evalJSON(responseText); // XXX: error handling!?
	}
	if(context.callback) {
		context.callback(context, context.userParams);
	}
};

// retrieve a list of workspaces
adaptor.prototype.getWorkspaceList = function(context, userParams, callback) {
	context = this.setContext(context, userParams, callback);
	context.workspaces = [];
	var uriTemplate = "%0/recipes"; // XXX: bags?
	var uri = uriTemplate.format([context.host]);
	var req = httpReq("GET", uri, adaptor.getWorkspaceListCallback,
		context, { accept: adaptor.mimeType }, null, null, null, null, true);
	return typeof req == "string" ? req : true;
};

adaptor.getWorkspaceListCallback = function(status, context, responseText, uri, xhr) {
	context.status = status;
	context.statusText = xhr.statusText;
	context.httpStatus = xhr.status;
	if(status) {
		try {
			var workspaces = $.evalJSON(responseText);
		} catch(ex) {
			context.status = false; // XXX: correct?
			context.statusText = exceptionText(ex, adaptor.parsingErrorMessage);
			if(context.callback) {
				context.callback(context, context.userParams);
			}
			return;
		}
		context.workspaces = workspaces.map(function(itm) { return { title: itm }; });
	}
	if(context.callback) {
		context.callback(context, context.userParams);
	}
};

// retrieve a list of tiddlers
adaptor.prototype.getTiddlerList = function(context, userParams, callback) {
	context = this.setContext(context, userParams, callback);
	var uriTemplate = "%0/%1/%2/tiddlers%3";
	var params = context.filters ? "?" + context.filters : "";
	if(context.format) {
		params = context.format + params;
	}
	var workspace = adaptor.resolveWorkspace(context.workspace);
	var uri = uriTemplate.format([context.host, workspace.type + "s",
		adaptor.normalizeTitle(workspace.name), params]);
	var req = httpReq("GET", uri, adaptor.getTiddlerListCallback,
		context, merge({ accept: adaptor.mimeType }, context.headers), null, null, null, null, true);
	return typeof req == "string" ? req : true;
};

adaptor.getTiddlerListCallback = function(status, context, responseText, uri, xhr) {
	context.status = status;
	context.statusText = xhr.statusText;
	context.httpStatus = xhr.status;
	if(status) {
		context.tiddlers = [];
		try {
			var tiddlers = $.evalJSON(responseText); //# NB: not actual tiddler instances
		} catch(ex) {
			context.status = false; // XXX: correct?
			context.statusText = exceptionText(ex, adaptor.parsingErrorMessage);
			if(context.callback) {
				context.callback(context, context.userParams);
			}
			return;
		}
		for(var i = 0; i < tiddlers.length; i++) {
			var tiddler = adaptor.toTiddler(tiddlers[i], context.host);
			context.tiddlers.push(tiddler);
		}
	}
	if(context.callback) {
		context.callback(context, context.userParams);
	}
};

// perform global search
adaptor.prototype.getSearchResults = function(context, userParams, callback) {
	context = this.setContext(context, userParams, callback);
	var uriTemplate = "%0/search?q=%1%2";
	var filterString = context.filters ? ";" + context.filters : "";
	var uri = uriTemplate.format([context.host, context.query, filterString]); // XXX: parameters need escaping?
	var req = httpReq("GET", uri, adaptor.getSearchResultsCallback,
		context, { accept: adaptor.mimeType }, null, null, null, null, true);
	return typeof req == "string" ? req : true;
};

adaptor.getSearchResultsCallback = function(status, context, responseText, uri, xhr) {
	adaptor.getTiddlerListCallback(status, context, responseText, uri, xhr); // XXX: use apply?
};

// retrieve a particular tiddler's revisions
adaptor.prototype.getTiddlerRevisionList = function(title, limit, context, userParams, callback) {
	context = this.setContext(context, userParams, callback);
	var uriTemplate = "%0/%1/%2/tiddlers/%3/revisions";
	var workspace = adaptor.resolveWorkspace(context.workspace);
	var uri = uriTemplate.format([context.host, workspace.type + "s",
		adaptor.normalizeTitle(workspace.name), adaptor.normalizeTitle(title)]);
	var req = httpReq("GET", uri, adaptor.getTiddlerRevisionListCallback,
		context, merge({ accept: adaptor.mimeType }, context.headers), null, null, null, null, true);
	return typeof req == "string" ? req : true;
};

adaptor.getTiddlerRevisionListCallback = function(status, context, responseText, uri, xhr) {
	context.status = status;
	context.statusText = xhr.statusText;
	context.httpStatus = xhr.status;
	if(status) {
		context.revisions = [];
		try {
			var tiddlers = $.evalJSON(responseText); //# NB: not actual tiddler instances
		} catch(ex) {
			context.status = false; // XXX: correct?
			context.statusText = exceptionText(ex, adaptor.parsingErrorMessage);
			if(context.callback) {
				context.callback(context, context.userParams);
			}
			return;
		}
		for(var i = 0; i < tiddlers.length; i++) {
			var tiddler = adaptor.toTiddler(tiddlers[i], context.host);
			context.revisions.push(tiddler);
		}
		var sortField = "server.page.revision";
		context.revisions.sort(function(a, b) {
			return a.fields[sortField] < b.fields[sortField] ? 1 :
				(a.fields[sortField] == b.fields[sortField] ? 0 : -1);
		});
	}
	if(context.callback) {
		context.callback(context, context.userParams);
	}
};

// retrieve an individual tiddler revision -- XXX: breaks with standard arguments list -- XXX: convenience function; simply use getTiddler?
adaptor.prototype.getTiddlerRevision = function(title, revision, context, userParams, callback) {
	context = this.setContext(context, userParams, callback);
	context.revision = revision;
	return this.getTiddler(title, context, userParams, callback);
};

// retrieve an individual tiddler
//# context is an object with members host and workspace
//# callback is passed the new context and userParams
adaptor.prototype.getTiddler = function(title, context, userParams, callback) {
	context = this.setContext(context, userParams, callback);
	context.title = title;
	if(context.revision) {
		var uriTemplate = "%0/%1/%2/tiddlers/%3/revisions/%4";
	} else {
		uriTemplate = "%0/%1/%2/tiddlers/%3";
	}
	if(!context.tiddler) {
		context.tiddler = new Tiddler(title);
	}
	context.tiddler.fields["server.type"] = adaptor.serverType;
	context.tiddler.fields["server.host"] = AdaptorBase.minHostName(context.host);
	context.tiddler.fields["server.workspace"] = context.workspace;
	var workspace = adaptor.resolveWorkspace(context.workspace);
	var uri = uriTemplate.format([context.host, workspace.type + "s",
		adaptor.normalizeTitle(workspace.name), adaptor.normalizeTitle(title),
		context.revision]);
	var req = httpReq("GET", uri, adaptor.getTiddlerCallback, context,
		merge({ accept: adaptor.mimeType }, context.headers), null, null, null, null, true);
	return typeof req == "string" ? req : true;
};

adaptor.getTiddlerCallback = function(status, context, responseText, uri, xhr) {
	context.status = status;
	context.statusText = xhr.statusText;
	context.httpStatus = xhr.status;
	if(status) {
		try {
			var tid = $.evalJSON(responseText);
		} catch(ex) {
			context.status = false;
			context.statusText = exceptionText(ex, adaptor.parsingErrorMessage);
			if(context.callback) {
				context.callback(context, context.userParams);
			}
			return;
		}
		var tiddler = adaptor.toTiddler(tid, context.host);
		tiddler.title = context.tiddler.title;
		tiddler.fields["server.etag"] = xhr.getResponseHeader("Etag");
		// normally we'd assign context.tiddler = tiddler here - but we can't do
		// that because of IE, which triggers getTiddler in putTiddlerCallback,
		// and since ServerSideSavingPlugin foolishly relies on persistent
		// object references, we need to merge the data into the existing object
		$.extend(context.tiddler, tiddler);
	}
	if(context.callback) {
		context.callback(context, context.userParams);
	}
};

// retrieve tiddler chronicle (all revisions)
adaptor.prototype.getTiddlerChronicle = function(title, context, userParams, callback) {
	context = this.setContext(context, userParams, callback);
	context.title = title;
	var uriTemplate = "%0/%1/%2/tiddlers/%3/revisions?fat=1";
	var workspace = adaptor.resolveWorkspace(context.workspace);
	var uri = uriTemplate.format([context.host, workspace.type + "s",
		adaptor.normalizeTitle(workspace.name), adaptor.normalizeTitle(title)]);
	var req = httpReq("GET", uri, adaptor.getTiddlerChronicleCallback,
		context, { accept: adaptor.mimeType }, null, null, null, null, true);
	return typeof req == "string" ? req : true;
};

adaptor.getTiddlerChronicleCallback = function(status, context, responseText, uri, xhr) {
	context.status = status;
	context.statusText = xhr.statusText;
	context.httpStatus = xhr.status;
	if(status) {
		context.responseText = responseText;
	}
	if(context.callback) {
		context.callback(context, context.userParams);
	}
};

// store an individual tiddler
adaptor.prototype.putTiddler = function(tiddler, context, userParams, callback) {
	context = this.setContext(context, userParams, callback);
	context.title = tiddler.title;
	context.tiddler = tiddler;
	context.host = context.host || this.fullHostName(tiddler.fields["server.host"]);
	var uriTemplate = "%0/%1/%2/tiddlers/%3";
	try {
		context.workspace = context.workspace || tiddler.fields["server.workspace"];
		var workspace = adaptor.resolveWorkspace(context.workspace);
	} catch(ex) {
		return adaptor.locationIDErrorMessage;
	}
	var uri = uriTemplate.format([context.host, workspace.type + "s",
		adaptor.normalizeTitle(workspace.name),
		adaptor.normalizeTitle(tiddler.title)]);
	var etag = adaptor.generateETag(workspace, tiddler);
	var headers = etag ? { "If-Match": etag } : null;
	var payload = {
		type: tiddler.fields["server.content-type"] || null,
		text: tiddler.text,
		tags: tiddler.tags,
		fields: $.extend({}, tiddler.fields)
	};
	delete payload.fields.changecount;
	$.each(payload.fields, function(key, value) {
		if(key.indexOf("server.") == 0) {
			delete payload.fields[key];
		}
	});
	payload = $.toJSON(payload);
	var req = httpReq("PUT", uri, adaptor.putTiddlerCallback,
		context, headers, payload, adaptor.mimeType, null, null, true);
	return typeof req == "string" ? req : true;
};

adaptor.putTiddlerCallback = function(status, context, responseText, uri, xhr) {
	context.status = [204, 1223].contains(xhr.status);
	context.statusText = xhr.statusText;
	context.httpStatus = xhr.status;
	if(context.status) {
		var loc = xhr.getResponseHeader("Location");
		var etag = xhr.getResponseHeader("Etag");
		if(loc && etag) {
			var bag = loc.split("/bags/").pop().split("/")[0];
			context.tiddler.fields["server.bag"] = bag;
			context.tiddler.fields["server.workspace"] = "bags/" + bag;
			var rev = etag.split("/").pop().split(/;|:/)[0];
			context.tiddler.fields["server.page.revision"] = rev;
			context.tiddler.fields["server.etag"] = etag;
			if(context.callback) {
				context.callback(context, context.userParams);
			}
		} else { // IE
			context.adaptor.getTiddler(context.tiddler.title, context,
				context.userParams, context.callback);
		}
	} else if(context.callback) {
		context.callback(context, context.userParams);
	}
};

// store a tiddler chronicle
adaptor.prototype.putTiddlerChronicle = function(revisions, context, userParams, callback) {
	context = this.setContext(context, userParams, callback);
	context.title = revisions[0].title;
	var headers = null;
	var uriTemplate = "%0/%1/%2/tiddlers/%3/revisions";
	var host = context.host || this.fullHostName(tiddler.fields["server.host"]);
	var workspace = adaptor.resolveWorkspace(context.workspace);
	var uri = uriTemplate.format([host, workspace.type + "s",
		adaptor.normalizeTitle(workspace.name),
		adaptor.normalizeTitle(context.title)]);
	if(workspace.type == "bag") { // generate ETag
		var etag = [adaptor.normalizeTitle(workspace.name),
			adaptor.normalizeTitle(context.title), 0].join("/"); //# zero-revision prevents overwriting existing contents
		headers = { "If-Match": '"' + etag + '"' };
	}
	var payload = $.toJSON(revisions);
	var req = httpReq("POST", uri, adaptor.putTiddlerChronicleCallback,
		context, headers, payload, adaptor.mimeType, null, null, true);
	return typeof req == "string" ? req : true;
};

adaptor.putTiddlerChronicleCallback = function(status, context, responseText, uri, xhr) {
	context.status = [204, 1223].contains(xhr.status);
	context.statusText = xhr.statusText;
	context.httpStatus = xhr.status;
	if(context.callback) {
		context.callback(context, context.userParams);
	}
};

// store a collection of tiddlers (import TiddlyWiki HTML store)
adaptor.prototype.putTiddlerStore = function(store, context, userParams, callback) {
	context = this.setContext(context, userParams, callback);
	var uriTemplate = "%0/%1/%2/tiddlers";
	var host = context.host;
	var workspace = adaptor.resolveWorkspace(context.workspace);
	var uri = uriTemplate.format([host, workspace.type + "s",
		adaptor.normalizeTitle(workspace.name)]);
	var req = httpReq("POST", uri, adaptor.putTiddlerStoreCallback,
		context, null, store, "text/x-tiddlywiki", null, null, true);
	return typeof req == "string" ? req : true;
};

adaptor.putTiddlerStoreCallback = function(status, context, responseText, uri, xhr) {
	context.status = [204, 1223].contains(xhr.status);
	context.statusText = xhr.statusText;
	context.httpStatus = xhr.status;
	if(context.callback) {
		context.callback(context, context.userParams);
	}
};

// rename an individual tiddler or move it to a different workspace -- TODO: make {from|to}.title optional
//# from and to are objects with members title and workspace (bag; optional),
//# representing source and target tiddler, respectively
adaptor.prototype.moveTiddler = function(from, to, context, userParams, callback) { // XXX: rename parameters (old/new)?
	var self = this;
	var newTiddler = store.getTiddler(from.title) || store.getTiddler(to.title); //# local rename might already have occurred
	var oldTiddler = $.extend(true, {}, newTiddler); //# required for eventual deletion
	oldTiddler.title = from.title; //# required for original tiddler's ETag
	var _getTiddlerChronicle = function(title, context, userParams, callback) {
		return self.getTiddlerChronicle(title, context, userParams, callback);
	};
	var _putTiddlerChronicle = function(context, userParams) {
		if(!context.status) {
			return callback(context, userParams);
		}
		var revisions = $.evalJSON(context.responseText); // XXX: error handling?
		// change current title while retaining previous location
		for(var i = 0; i < revisions.length; i++) {
			delete revisions[i].revision;
			if(!revisions[i].fields.origin) { // NB: origin = "<workspace>/<title>"
				revisions[i].fields.origin = ["bags", revisions[i].bag, revisions[i].title].join("/");
			}
			revisions[i].title = to.title;
		}
		// add new revision
		var rev = $.extend({}, revisions[0]);
		$.each(newTiddler, function(i, item) {
			if(!$.isFunction(item)) {
				rev[i] = item;
			}
		});
		rev.title = to.title;
		rev.created = rev.created.convertToYYYYMMDDHHMM();
		rev.modified = new Date().convertToYYYYMMDDHHMM();
		delete rev.fields.changecount;
		revisions.unshift(rev);
		if(to.workspace) {
			context.workspace = to.workspace;
		} else if(context.workspace.substring(0, 4) != "bags") { // NB: target workspace must be a bag
			context.workspace = "bags/" + rev.bag;
		}
		var subCallback = function(context, userParams) {
			if(!context.status) {
				return callback(context, userParams);
			}
			context.adaptor.getTiddler(newTiddler.title, context, userParams, _deleteTiddler);
		};
		return self.putTiddlerChronicle(revisions, context, context.userParams, subCallback);
	};
	var _deleteTiddler = function(context, userParams) {
		if(!context.status) {
			return callback(context, userParams);
		}
		$.extend(true, newTiddler, context.tiddler);
		context.callback = null;
		return self.deleteTiddler(oldTiddler, context, context.userParams, callback);
	};
	callback = callback || function() {};
	context = this.setContext(context, userParams);
	context.host = context.host || oldTiddler.fields["server.host"];
	context.workspace = from.workspace || oldTiddler.fields["server.workspace"];
	return _getTiddlerChronicle(from.title, context, userParams, _putTiddlerChronicle);
};

// delete an individual tiddler
adaptor.prototype.deleteTiddler = function(tiddler, context, userParams, callback) {
	context = this.setContext(context, userParams, callback);
	context.title = tiddler.title; // XXX: not required!?
	var uriTemplate = "%0/bags/%1/tiddlers/%2";
	var host = context.host || this.fullHostName(tiddler.fields["server.host"]);
	var bag = tiddler.fields["server.bag"];
	if(!bag) {
		return adaptor.noBagErrorMessage;
	}
	var uri = uriTemplate.format([host, adaptor.normalizeTitle(bag),
		adaptor.normalizeTitle(tiddler.title)]);
	var etag = adaptor.generateETag({ type: "bag", name: bag }, tiddler);
	var headers = etag ? { "If-Match": etag } : null;
	var req = httpReq("DELETE", uri, adaptor.deleteTiddlerCallback, context, headers,
		null, null, null, null, true);
	return typeof req == "string" ? req : true;
};

adaptor.deleteTiddlerCallback = function(status, context, responseText, uri, xhr) {
	context.status = [204, 1223].contains(xhr.status);
	context.statusText = xhr.statusText;
	context.httpStatus = xhr.status;
	if(context.callback) {
		context.callback(context, context.userParams);
	}
};

// compare two revisions of a tiddler (requires TiddlyWeb differ plugin)
//# if context.rev1 is not specified, the latest revision will be used for comparison
//# if context.rev2 is not specified, the local revision will be sent for comparison
//# context.format is a string as determined by the TiddlyWeb differ plugin
adaptor.prototype.getTiddlerDiff = function(title, context, userParams, callback) {
	context = this.setContext(context, userParams, callback);
	context.title = title;

	var tiddler = store.getTiddler(title);
	try {
		var workspace = adaptor.resolveWorkspace(tiddler.fields["server.workspace"]);
	} catch(ex) {
		return adaptor.locationIDErrorMessage;
	}
	var tiddlerRef = [workspace.type + "s", workspace.name, tiddler.title].join("/");

	var rev1 = context.rev1 ? [tiddlerRef, context.rev1].join("/") : tiddlerRef;
	var rev2 = context.rev2 ? [tiddlerRef, context.rev2].join("/") : null;

	var uriTemplate = "%0/diff?rev1=%1";
	if(rev2) {
		uriTemplate += "&rev2=%2";
	}
	if(context.format) {
		uriTemplate += "&format=%3";
	}
	var host = context.host || this.fullHostName(tiddler.fields["server.host"]);
	var uri = uriTemplate.format([host, adaptor.normalizeTitle(rev1),
		adaptor.normalizeTitle(rev2), context.format]);

	if(rev2) {
		var req = httpReq("GET", uri, adaptor.getTiddlerDiffCallback, context, null,
			null, null, null, null, true);
	} else {
		var payload = {
			title: tiddler.title,
			text: tiddler.text,
			modifier: tiddler.modifier,
			tags: tiddler.tags,
			fields: $.extend({}, tiddler.fields)
		}; // XXX: missing attributes!?
		payload = $.toJSON(payload);
		req = httpReq("POST", uri, adaptor.getTiddlerDiffCallback, context,
			null, payload, adaptor.mimeType, null, null, true);
	}
	return typeof req == "string" ? req : true;
};

adaptor.getTiddlerDiffCallback = function(status, context, responseText, uri, xhr) {
	context.status = status;
	context.statusText = xhr.statusText;
	context.httpStatus = xhr.status;
	context.uri = uri;
	if(status) {
		context.diff = responseText;
	}
	if(context.callback) {
		context.callback(context, context.userParams);
	}
};

// generate tiddler information
adaptor.prototype.generateTiddlerInfo = function(tiddler) {
	var info = {};
	var uriTemplate = "%0/%1/%2/tiddlers/%3";
	var host = this.host || tiddler.fields["server.host"]; // XXX: this.host obsolete?
	host = this.fullHostName(host);
	var workspace = adaptor.resolveWorkspace(tiddler.fields["server.workspace"]);
	info.uri = uriTemplate.format([host, workspace.type + "s",
		adaptor.normalizeTitle(workspace.name),
		adaptor.normalizeTitle(tiddler.title)]);
	return info;
};

// create Tiddler instance from TiddlyWeb tiddler JSON
adaptor.toTiddler = function(json, host) {
	var created = Date.convertFromYYYYMMDDHHMM(json.created);
	var modified = Date.convertFromYYYYMMDDHHMM(json.modified);
	var fields = json.fields;
	fields["server.type"] = adaptor.serverType;
	fields["server.host"] = AdaptorBase.minHostName(host);
	fields["server.bag"] = json.bag;
	fields["server.title"] = json.title;
	if(json.recipe) {
		fields["server.recipe"] = json.recipe;
	}
	if(json.type && json.type != "None") {
		fields["server.content-type"] = json.type;
	}
	fields["server.permissions"] = json.permissions.join(", ");
	fields["server.page.revision"] = json.revision;
	fields["server.workspace"] = "bags/" + json.bag;
	var tiddler = new Tiddler(json.title);
	tiddler.assign(tiddler.title, json.text, json.modifier, modified, json.tags,
		created, json.fields, json.creator);
	return tiddler;
};

adaptor.resolveWorkspace = function(workspace) {
	var components = workspace.split("/");
	return {
		type: components[0] == "bags" ? "bag" : "recipe",
		name: components[1] || components[0]
	};
};

adaptor.generateETag = function(workspace, tiddler) {
	var revision = tiddler.fields["server.page.revision"];
	var etag = revision == "false" ? null : tiddler.fields["server.etag"];
	if(!etag && workspace.type == "bag") {
		if(typeof revision == "undefined") {
			revision = "0";
		} else if(revision == "false") {
			return null;
		}
		etag = [adaptor.normalizeTitle(workspace.name),
			adaptor.normalizeTitle(tiddler.title), revision].join("/");
		etag = '"' + etag + '"';
	}
	return etag;
};

adaptor.normalizeTitle = function(title) {
	return encodeURIComponent(title);
};

})(jQuery);


/*
 * jQuery JSON Plugin
 * version: 1.3
 * source: http://code.google.com/p/jquery-json/
 * license: MIT (http://www.opensource.org/licenses/mit-license.php)
 */
(function($){function toIntegersAtLease(n)
{return n<10?'0'+n:n;}
Date.prototype.toJSON=function(date)
{return this.getUTCFullYear()+'-'+
toIntegersAtLease(this.getUTCMonth())+'-'+
toIntegersAtLease(this.getUTCDate());};var escapeable=/["\\\x00-\x1f\x7f-\x9f]/g;var meta={'\b':'\\b','\t':'\\t','\n':'\\n','\f':'\\f','\r':'\\r','"':'\\"','\\':'\\\\'};$.quoteString=function(string)
{if(escapeable.test(string))
{return'"'+string.replace(escapeable,function(a)
{var c=meta[a];if(typeof c==='string'){return c;}
c=a.charCodeAt();return'\\u00'+Math.floor(c/16).toString(16)+(c%16).toString(16);})+'"';}
return'"'+string+'"';};$.toJSON=function(o,compact)
{var type=typeof(o);if(type=="undefined")
return"undefined";else if(type=="number"||type=="boolean")
return o+"";else if(o===null)
return"null";if(type=="string")
{return $.quoteString(o);}
if(type=="object"&&typeof o.toJSON=="function")
return o.toJSON(compact);if(type!="function"&&typeof(o.length)=="number")
{var ret=[];for(var i=0;i<o.length;i++){ret.push($.toJSON(o[i],compact));}
if(compact)
return"["+ret.join(",")+"]";else
return"["+ret.join(", ")+"]";}
if(type=="function"){throw new TypeError("Unable to convert object of type 'function' to json.");}
var ret=[];for(var k in o){var name;type=typeof(k);if(type=="number")
name='"'+k+'"';else if(type=="string")
name=$.quoteString(k);else
continue;var val=$.toJSON(o[k],compact);if(typeof(val)!="string"){continue;}
if(compact)
ret.push(name+":"+val);else
ret.push(name+": "+val);}
return"{"+ret.join(", ")+"}";};$.compactJSON=function(o)
{return $.toJSON(o,true);};$.evalJSON=function(src)
{return eval("("+src+")");};$.secureEvalJSON=function(src)
{var filtered=src;filtered=filtered.replace(/\\["\\\/bfnrtu]/g,'@');filtered=filtered.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,']');filtered=filtered.replace(/(?:^|:|,)(?:\s*\[)+/g,'');if(/^[\],:{}\s]*$/.test(filtered))
return eval("("+src+")");else
throw new SyntaxError("Error parsing JSON, source is not valid.");};})(jQuery);
//}}}
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
!Karam Kaarak | ਕਰਮ ਕਾਰਕ
The noun or a pronoun which is affected by the action of the verb is said to be in Kurum Kaarak. The noun in this case in followed by the postposition ''ਨੂੰ'' ''nuN'' (loosely similar to the English preposition 'to'). 
!!Examples of post-position nuN <html>&nbsp;&nbsp;<embed height="30px" width="200px" autostart="false" src="http://dl.dropbox.com/u/8286741/Punjabi%20Lessons%20Audio/karam0.mp3" /></html>
!!!!Mother loves her child
<<<
|~maaN|apne bachche nuN|pyar kardee hai|<html><embed height="30px" width="200px" autostart="false" src="http://dl.dropbox.com/u/8286741/Punjabi%20Lessons%20Audio/karam1.mp3" /></html>|
|mother|her child to|love does|>|
<<<
!!!!Teacher shall teach children a lesson
<<<
|teechar|bachcheaaN nuN|paTh paRhaegee|<html><embed height="30px" width="200px" autostart="false" src="http://dl.dropbox.com/u/8286741/Punjabi%20Lessons%20Audio/karam2.mp3" /></html>|
|teacher|children to|lesson teach|>|
<<<
!!!!Did you say anything to him?
<<<
|ki tuN|us nuN|kuchh|kehaa si?|<html><embed height="30px" width="200px" autostart="false" src="http://dl.dropbox.com/u/8286741/Punjabi%20Lessons%20Audio/karam3.mp3" /></html>|
|did you|to him|anything|say?|>|

<<<
<html>
<iframe src="http://shavinder.opendrive.com/files/listen.php?file_id=OF8yMjQ2NDFfUjNXZXg&autoplay=false" height="35" width="370" style="border:0" scrolling="no" frameborder="0" allowtransparency="true"></iframe>
</html>
/*{{{*/
.tiddler .originButton div {
	display: inline-block;
}

.tiddler .spaceSiteIcon .siteIcon {
	_display: inline; /* IE doesn't like inline-block */
}

.tiddler .originButton {
	display: block;
}

.selected .tagging,
.selected .tagging:hover {
	border: none;
	background: none;
}

.tagging {
	float: none;
	background: none;
	border: none;
}

.tagging li.listTitle {
	margin-left: 0px;
}
.tagging li {
	margin: 0 8px;
}

.tagging .tiddlyLink {
	-webkit-border-radius: 3px;
	-moz-border-radius: 3px;
	-o-border-radius: 3px;
	border-radius: 3px;
	padding: 1px 2px;
	line-height: 1.2em;
}

/* for following */
#popup .siteIcon {
	float: left;
	height: 25px;
}

.content {
	width: 100%; /* IE */
	font-size: 0.9em;
}

.editorHeading {
	height: 48px;
}

.heading {
	left: 0;
	margin-bottom: 40px;
	position: relative;
	top: 32px;
}

.followButton a {
	display: block;
	margin-top: -20px;
}

.tiddler .followPlaceHolder {
	display: block;
	position: absolute;
	top: 16px;
	right: 64px;
	_right: 138px; // add width of modifierIcon
}

.tiddler .followButton {
	position: relative;
	height: 24px;
	text-align: left;
	color: #fff;
	background: [[ColorPalette::PrimaryMid]];
	padding: 10px 0px 0px 10px;
	width: 38px;
	margin: -16px -8px 24px 0;
}

/* creates the larger triangle */
.followButton:before {
	content: "\00a0";
	display: block; /* reduce the damage in FF3.0 */
	position: relative;
	bottom: -20px;
	right: 0;
	width: 0;
	height: 0;
	border-width: 0 0 20px 20px;
	border-style: solid;
	border-color: transparent [[ColorPalette::PrimaryMid]];
}

.toolbar svg {
	height: 16px;
	width: 16px;
}

.toolbar svg .glyph {
	fill: #ccc;
}

.toolbar a:hover .glyph {
	fill: black;
}

.toolbar a:active .glyph {
	fill: [[ColorPalette::Background]];
}

.originButton,
.followPlaceHolder,
.tiddler .subtitle {
	cursor: pointer;
}

.editSpaceSiteIcon .originButton {
	cursor: auto;
}

.tiddler .subtitle:hover {
	font-weight: bold;
	background: none;
}

.originButton img,
.originButton svg {
	margin-left: 0px;
}

.modifierIcon {
	position: absolute;
	width: 74px;
	top: 0px;
	right: 0px;
	_right: 74px; /* in IE6 positioning works incorrectly so use -width instead */
	text-align: right;
}

.modifierIcon img,
.modifierIcon svg {
	margin-right: 8px;
}

.tiddler .viewer {
	padding-bottom: 16px;
	margin: 0 0 0 56px;
	line-height: 1.4em;
}

.viewer pre {
	margin-left: 0;
}

.siteIcon .label {
	color: [[ColorPalette::TertiaryDark]];
}

.tiddler .spaceSiteIcon {
	float: left;
	margin-right: 0;
	margin-top: 0;
	position: relative;
	display: block;
}

.tiddler .titleBar {
	display: block;
	margin-right: 136px;
	margin-left: 56px;
}

.followButton a {
	color: [[ColorPalette::Background]];
}

.tiddler {
	position: relative;
	padding: 0;
	margin-bottom: 3em;
	border-top: 3px solid [[ColorPalette::PrimaryMid]];
	background: #fff;
}

.tiddler .editor {
	padding: 0px 8px;
}

.tiddler .heading .title {
	position: relative;
	display: block;
	word-wrap: break-word;
	font-size: 32px;
	line-height: 32px;
}
.tiddler .heading .editor.title {
	font-size: 1.7em;
	line-height: normal;
}

.tiddler .headingClear {
	clear: both;
}

.tiddler .subtitle {
	font-style: italic;
	font-size: 0.9em;
	color: #a6a59e;
	margin-top: 0;
}

.toolbar {
	position: absolute;
	padding: 0;
	top: 8px;
	right: -8px;
}

.toolbar .moreCommand.highlight {
	background: none;
}

.tiddler .toolbar .button {
	border: none;
	display: inline;
	padding: 0px;
	margin-right: 16px;
}

.tiddler .toolbar a:hover {
	background: none;
}

.tiddler .tagged .listTitle {
	display: none;
}

.revButton {
	float: right;
}

/*! EditTemplate specific*/
.tiddler .privacySettings {
	text-align: center;
}
.tiddler .privacySettings .originButton {
	display: inline;
}

.editSpaceSiteIcon, .privacyEdit {
	float: left;
}

.editSpaceSiteIcon svg,
.editSpaceSiteIcon img,
.editSpaceSiteIcon .roundelLabel {
	float: left;
}

.tagTitle {
	position: absolute;
	text-align: center;
	width: 48px;
	top: 0px;
	left: -56px;
}

.editSpaceSiteIcon .originButton img,
.editSpaceSiteIcon .originButton svg {
	height: 16px;
	margin-left: 24px;
	margin-right: 32px;
	width: 16px;
}

.tagAnnotation {
	margin-top: 8px;
	padding-bottom: 8px;
}
.annotationsBox {
	margin-top: 8px;
}

.editorFooter {
	position: relative;
	padding: 0;
	margin-top: 16px;
	margin-left: 64px;
}

.tiddler .editorFooter .editor {
	padding-left: 0px;
}

.heading .editor input {
	width: 100%;
	font-size: 1.5em;
}

.spaceSiteIcon .externalImage .image a:hover,
.modifierIcon .externalImage .image a:hover {
	background: none;
}

div.toolbar {
	visibility:hidden;
	right:-16px;
}

.selected div.toolbar {
	visibility: visible;
}

.followButton a:hover {
	background: [[ColorPalette::PrimaryMid]];
	text-decoration: underline;
}

a.image:hover {
	background: transparent;
}

@media all and (max-device-width: 480px) {
	div.toolbar {
		visibility:visible;
	}
}
@media only screen and (device-width: 768px) {
	div.toolbar {
		visibility:visible;
	}
}
@media all and (max-width: 960px) {
	.tiddler .titleBar {
		margin-left: 36px;
		margin-right: 80px;
	}

	.tiddler .heading {
		margin-bottom: 48px;
	}

	.tiddler .heading .title {
		font-size: 32px;
		line-height: 32px;
	}

	.tiddler .modifierIcon img,
	.tiddler .modifierIcon svg,
	.tiddler .spaceSiteIcon .originButton img,
	.originButton svg {
		width: 32px;
		height: 32px;
		margin-left: 0px;
		margin-right: 0px;
	}

	.tiddler .followPlaceHolder {
		right: 48px;
	}

	.tiddler .followButton {
		width: 24px;
	}

	.tiddler .viewer {
		margin: 0px 0px 0px 36px;
		padding-top: 0;
	}

	br {
		line-height: 0.5em;
	}
}
/*}}}*/
ColorPalette
StyleSheet
SiteSubtitle
GettingStarted
SiteTitle
MainMenu
SiteIcon
DefaultTiddlers
ViewTemplate
PageTemplate
SideBarOptions
EditTemplate
SiteInfo
SideBarTabs
ToolbarCommands
{{sideBarTools{<<permaview>><<newTiddler>><<newJournal "YYYY-0MM-0DD" label:"new journal" focus:title prompt:"Write a new journal entry for today" tag:Journal>>
<<closeAll>><<rB 'X close all X'>><<toolbar jump>><<rB '▲ jump to ▼'>><html><a class="tiddlyLink tiddlyLinkExisting" href="javascript:;" onclick="window.scroll(0,0);">▲ to top ▲</a></html>}}}
The title and subtitle of your space are visible to visitors and are also displayed in your browser's tabs. Click on the SiteTitle and SiteSubtitle tiddler links below to make changes.
* [[SiteTitle]]
* [[SiteSubtitle]]
<html><nowiki>
<style>
.verbConjugation table{
     border: none;
     background-color: none;
     text-align: center;
}
.verbConjugation tr{
     border: none;
     background-color: none;     
}
.verbConjugation tr th{
     background-color: #519600;
     border: 1px solid #00ff00;
}
.verbConjugation tr.singular{
     background-color: #9ff33d;
}
.verbConjugation tr.plural{
     background-color: #B5F36D; 
}

.verbConjugation tr td{
     border: 1px solid #00ff00;
     text-align: center;
}

</style>
<p> We now start with making simple sentences in Punjabi. As you know verb or verb phrase is an important and indispensable element of a sentence. In punjabi a verb or a verb phrase may change its form under effect of gender, number, person, tense, aspect, etc.

<h1>  Present Tense </h1>
<h2> ਜਾ (Go)</h2>
<h3>1. Present Imperative Tense </h3>

<table class="verbConjugation">
<tr>
    <th rowspan=2 >Subject </th>
    <th rowspan=2>Object </th>
    <th colspan=2> Verb (phrase) </th>
    <th rowspan=2> English Translation </th>
</tr>
<tr>

     <th> Masculine </th>
     <th> Feminine </th>
</tr>
<tr class="singular" >
     <td> ਮੈਂ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td colspan=2>  ਜਾਵਾਂ </td>
     <td>(Let) me go to market </td>
</tr> <tr class="plural">
     <td> ਅਸੀਂ </td>
     <td>  ਬਜ਼ਾਰ </td>
     <td colspan=2>  ਜਾਈਏ </td>
     <td> (Let) us go to market </td>
</tr><tr class="singular">
     <td> ਤੂੰ </td>
     <td> ਬਜ਼ਾਰ </td> 
     <td colspan=2> ਜਾ </td>
     <td> You go to market </td>
</tr><tr class="plural">
     <td> ਤੁਸੀਂ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td colspan=2> ਜਾਓ </td>
     <td> You (plural) go to market </td>
</tr><tr class="singular">
     <td> ਓਹ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td colspan=2> ਜਾਵੇ </td>
     <td> Let him/her go to market </td>
</tr><tr class="plural">
     <td> ਓਹ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td colspan=2> ਜਾਣ </td>
     <td> Let them go to market </td>
</tr>
</table>
<br/>
<table>
<tr>
     <td style="background-color: #9FF33d;" >Singular </td> <td style="background-color: #b5f36d;">Plural </td>
</tr>
</table>



<h3>2. Present Indefinite Tense </h3>

<table class="verbConjugation">
<tr>
    <th rowspan=2 >Subject </th>
    <th rowspan=2>Object </th>
    <th colspan=2> Verb (phrase) </th>
    <th rowspan=2> English Translation </th>
</tr>
<tr>

     <th> Masculine </th>
     <th> Feminine </th>
</tr>
<tr class="singular" >
     <td> ਮੈਂ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td>  ਜਾਂਦਾ ਹਾਂ </td>
     <td> ਜਾਂਦੀ ਹਾਂ</td>
     <td>I go to the market </td>
</tr> <tr class="plural">
     <td> ਅਸੀਂ </td>
     <td>  ਬਜ਼ਾਰ </td>
     <td>  ਜਾਂਦੇ ਹਾਂ </td>
     <td> ਜਾਂਦੀਆਂ ਹਾਂ </td>
     <td> We go to the market </td>
</tr><tr class="singular">
     <td> ਤੂੰ </td>
     <td> ਬਜ਼ਾਰ </td> 
     <td> ਜਾਂਦਾ ਹੈਂ </td>
     <td> ਜਾਂਦੀ ਹੈਂ </td>
     <td> You go to the market </td>
</tr><tr class="plural">
     <td> ਤੁਸੀਂ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਜਾਂਦੇ ਹੋ </td>
     <td> ਜਾਂਦੀਆਂ ਹੋ</td>
     <td> You (plural) go to the market </td>
</tr><tr class="singular">
     <td> ਓਹ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਜਾਂਦਾ ਹੈ </td>
     <td> ਜਾਂਦੀ ਹੈ </td>
     <td> He/She goes to the market </td>
</tr><tr class="plural">
     <td> ਓਹ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਜਾਂਦੇ ਹਨ </td>
     <td> ਜਾਂਦੀਆਂ ਹਨ </td>
     <td> They go to the market </td>
</tr>
<tr class="singular">
     <td> ਰਾਮ  </td>
     <td>ਬਜ਼ਾਰ  </td>
     <td>ਜਾਂਦਾ ਹੈ</td>
     <td>  </td>
     <td> Ram goes to the market </td>
</tr>
<tr class="singular">
     <td>ਸੀਤਾ </td>
     <td>ਬਜ਼ਾਰ </td>
     <td> </td>
     <td> ਜਾਂਦੀ ਹੈ </td>
     <td>Sita goes to the market </td>
</tr>
<tr class="plural">
     <td> ਰਾਮ ਅਤੇ ਸੀਤਾ</td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਜਾਂਦੇ ਹਨ </td>
     <td>  </td>
     <td> Ram and Sita go to the market </td>
</tr>
<tr class="plural">
     <td> ਸੀਤਾ ਅਤੇ ਗੀਤਾ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> </td>
     <td> ਜਾਂਦੀਆਂ ਹਨ </td>
     <td> Sita and Gita go to the market </td>
</tr>
</table>
<br/>
<table>
<tr>
     <td style="background-color: #9FF33d;" >Singular </td> <td style="background-color: #b5f36d;">Plural </td>
</tr>
</table>


<h3>3. Present Imperfect Continuous Tense </h3>
<table class="verbConjugation">
<tr>
    <th rowspan=2 >Subject </th>
    <th rowspan=2>Object </th>
    <th colspan=2> Verb (phrase) </th>
    <th rowspan=2> English Translation </th>
</tr>
<tr>

     <th> Masculine </th>
     <th> Feminine </th>
</tr>
<tr class="singular" >
     <td> ਮੈਂ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td>  ਜਾ ਰਿਹਾ ਹਾਂ  </td>
     <td> ਜਾ ਰਹੀ ਹਾਂ</td>
     <td>I am going to the market </td>
</tr> <tr class="plural">
     <td> ਅਸੀਂ </td>
     <td>  ਬਜ਼ਾਰ </td>
     <td>  ਜਾ ਰਹੇ ਹਾਂ </td>
     <td> ਜਾ ਰਹੀਆਂ ਹਾਂ </td>
     <td> We are going to the market </td>
</tr><tr class="singular">
     <td> ਤੂੰ </td>
     <td> ਬਜ਼ਾਰ </td> 
     <td> ਜਾ ਰਿਹਾ ਹੈਂ </td>
     <td> ਜਾ ਰਹੀ ਹੈਂ </td>
     <td> You are going to the market </td>
</tr><tr class="plural">
     <td> ਤੁਸੀਂ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਜਾ ਰਹੇ ਹੋ </td>
     <td> ਜਾ ਰਹੀਆਂ ਹੋ</td>
     <td> You (plural) are going to the market </td>
</tr><tr class="singular">
     <td> ਓਹ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਜਾ ਰਿਹਾ ਹੈ </td>
     <td> ਜਾ ਰਹੀ ਹੈ </td>
     <td> He/She is going to the market </td>
</tr><tr class="plural">
     <td> ਓਹ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਜਾ ਰਹੇ ਹਨ </td>
     <td> ਜਾ ਰਹੀਆਂ ਹਨ </td>
     <td> They are going to the market </td>
</tr>
<tr class="singular">
     <td> ਰਾਮ  </td>
     <td>ਬਜ਼ਾਰ  </td>
     <td>ਜਾ ਰਿਹਾ ਹੈ </td>
     <td> </td>
     <td> Ram is going to the market </td>
</tr>
<tr class="singular">
     <td>ਸੀਤਾ </td>
     <td>ਬਜ਼ਾਰ </td>
     <td> </td>
     <td>ਜਾ ਰਹੀ ਹੈ </td>
     <td> Sita is going to the market </td>
</tr>
<tr class="plural">
     <td> ਰਾਮ ਅਤੇ ਸੀਤਾ</td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਜਾ ਰਹੇ ਹਨ </td>
     <td>  </td>
     <td> Ram and Sita are going to the market </td>
</tr>
<tr class="plural">
     <td> ਸੀਤਾ ਅਤੇ ਗੀਤਾ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> </td>
     <td> ਜਾ ਰਹੀਆਂ ਹਨ </td>
     <td> Sita and Gita are going to the market </td>
</tr>
</table>
<br/>
<table>
<tr>
     <td style="background-color: #9FF33d;" >Singular </td> <td style="background-color: #b5f36d;">Plural </td>
</tr>
</table>

<h3>4. Present Perfect Continuous Tense </h3>
<table class="verbConjugation">
<tr>
    <th rowspan=2 >Subject </th>
    <th rowspan=2>Object </th>
    <th colspan=2> Verb (phrase) </th>
    <th rowspan=2> English Translation </th>
</tr>
<tr>

     <th> Masculine </th>
     <th> Feminine </th>
</tr>
<tr class="singular" >
     <td> ਮੈਂ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td>  ਜਾਂਦਾ ਰਿਹਾ ਹਾਂ  </td>
     <td> ਜਾਂਦੀ ਰਹੀ ਹਾਂ</td>
     <td>I have been going to the market </td>
</tr> <tr class="plural">
     <td> ਅਸੀਂ </td>
     <td>  ਬਜ਼ਾਰ </td>
     <td>  ਜਾਂਦੇ ਰਹੇ ਹਾਂ </td>
     <td> ਜਾਂਦੀਆਂ ਰਹੀਆਂ ਹਾਂ </td>
     <td> We have been going to the market </td>
</tr><tr class="singular">
     <td> ਤੂੰ </td>
     <td> ਬਜ਼ਾਰ </td> 
     <td> ਜਾਂਦਾ ਰਿਹਾ ਹੈਂ </td>
     <td> ਜਾਂਦੀ ਰਹੀ ਹੈਂ </td>
     <td> You have been going to the market </td>
</tr><tr class="plural">
     <td> ਤੁਸੀਂ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਜਾਂਦੇ ਰਹੇ ਹੋ </td>
     <td> ਜਾਂਦੀਆਂ ਰਹੀਆਂ ਹੋ</td>
     <td> You (plural) have been going to the market </td>
</tr><tr class="singular">
     <td> ਓਹ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਜਾਂਦਾ ਰਿਹਾ ਹੈ </td>
     <td> ਜਾਂਦੀ ਰਹੀ ਹੈ </td>
     <td> He/She has been going to the market </td>
</tr><tr class="plural">
     <td> ਓਹ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਜਾਂਦੇ ਰਹੇ ਹਨ </td>
     <td> ਜਾਂਦੀਆਂ ਰਹੀਆਂ ਹਨ </td>
     <td> They have been going to the market </td>
</tr>
<tr class="singular">
     <td> ਰਾਮ  </td>
     <td>ਬਜ਼ਾਰ  </td>
     <td>ਜਾਂਦਾ ਰਿਹਾ ਹੈ </td>
     <td> </td>
     <td> Ram has been going to market </td>
</tr>
<tr class="singular">
     <td>ਸੀਤਾ </td>
     <td>ਬਜ਼ਾਰ </td>
     <td> </td>
     <td>ਜਾਂਦੀ ਰਹੀ ਹੈ </td>
     <td> Sita has been going to the market </td>
</tr>
<tr class="plural">
     <td> ਰਾਮ ਅਤੇ ਸੀਤਾ</td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਜਾਂਦੇ ਰਹੇ ਹਨ </td>
     <td>  </td>
     <td> Ram and Sita have been going to the market </td>
</tr>
<tr class="plural">
     <td> ਸੀਤਾ ਅਤੇ ਗੀਤਾ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> </td>
     <td> ਜਾਂਦੀਆਂ ਰਹੀਆਂ ਹਨ </td>
     <td> Sita and Gita have been going to the market </td>
</tr>
</table>
<br/>
<table>
<tr>
     <td style="background-color: #9FF33d;" >Singular </td> <td style="background-color: #b5f36d;">Plural </td>
</tr>
</table>

<h3>5. Present Perfect indefinite</h3>
<table class="verbConjugation">
<tr>
    <th rowspan=2 >Subject </th>
    <th rowspan=2>Object </th>
    <th colspan=2> Verb (phrase) </th>
    <th rowspan=2> English Translation </th>
</tr>
<tr>

     <th> Masculine </th>
     <th> Feminine </th>
</tr>
<tr class="singular" >
     <td> ਮੈਂ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td>  ਗਿਆ ਹਾਂ  </td>
     <td> ਗਈ ਹਾਂ</td>
     <td> I have gone to the market </td>
</tr> <tr class="plural">
     <td> ਅਸੀਂ </td>
     <td>  ਬਜ਼ਾਰ </td>
     <td> ਗਏ ਹਾਂ </td>
     <td> ਗਈਆਂ ਹਾਂ </td>
     <td> We have gone to the market  </td>
</tr><tr class="singular">
     <td> ਤੂੰ </td>
     <td> ਬਜ਼ਾਰ </td> 
     <td> ਗਿਆ ਹੈਂ </td>
     <td> ਗਈ ਹੈਂ </td>
     <td> You have gone to the market  </td>
</tr><tr class="plural">
     <td> ਤੁਸੀਂ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਗਏ ਹੋ </td>
     <td> ਗਈਆਂ ਹੋ</td>
     <td> You(plural) have gone to the market  </td>
</tr><tr class="singular">
     <td> ਓਹ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਗਿਆ ਹੈ </td>
     <td> ਗਈ ਹੈ </td>
     <td> He/She has gone to the market  </td>
</tr><tr class="plural">
     <td> ਓਹ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਗਏ ਹਨ </td>
     <td> ਗਈਆਂ ਹਨ </td>
     <td> They have gone to the market  </td>
</tr>
<tr class="singular">
     <td> ਰਾਮ  </td>
     <td>ਬਜ਼ਾਰ  </td>
     <td>ਗਿਆ ਹੈ </td>
     <td> </td>
     <td> Ram has gone to the market </td>
</tr>
<tr class="singular">
     <td>ਸੀਤਾ </td>
     <td>ਬਜ਼ਾਰ </td>
     <td> </td>
     <td>ਗਈ ਹੈ </td>
     <td>Sita has gone to the market </td>
</tr>
<tr class="plural">
     <td> ਰਾਮ ਅਤੇ ਸੀਤਾ</td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਗਏ ਹਨ </td>
     <td>  </td>
     <td> Ram and Sita have gone to the market</td>
</tr>
<tr class="plural">
     <td> ਸੀਤਾ ਅਤੇ ਗੀਤਾ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> </td>
     <td> ਗਈਆਂ ਹਨ </td>
     <td> Sita and Gita have gone to the market </td>
</tr>
</table>
<br/>
<table>
<tr>
     <td style="background-color: #9FF33d;" >Singular </td> <td style="background-color: #b5f36d;">Plural </td>
</tr>
</table>

<h3>6. Present Perfect Definite </h3>
<table class="verbConjugation">
<tr>
    <th rowspan=2 >Subject </th>
    <th rowspan=2>Object </th>
    <th colspan=2> Verb (phrase) </th>
    <th rowspan=2> English Translation </th>
</tr>
<tr>

     <th> Masculine </th>
     <th> Feminine </th>
</tr>
<tr class="singular" >
     <td> ਮੈਂ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td>  ਜਾ ਚੁੱਕਾ ਹਾਂ  </td>
     <td> ਜਾ ਚੁੱਕੀ ਹਾਂ</td>
     <td> </td>
</tr> <tr class="plural">
     <td> ਅਸੀਂ </td>
     <td>  ਬਜ਼ਾਰ </td>
     <td> ਜਾ ਚੁੱਕੇ ਹਾਂ </td>
     <td> ਜਾ ਚੁੱਕੀਆਂ ਹਾਂ </td>
     <td>  </td>
</tr><tr class="singular">
     <td> ਤੂੰ </td>
     <td> ਬਜ਼ਾਰ </td> 
     <td> ਜਾ ਚੁੱਕਾਂ ਹੈਂ </td>
     <td> ਜਾ ਚੁੱਕੀ ਹੈਂ </td>
     <td>  </td>
</tr><tr class="plural">
     <td> ਤੁਸੀਂ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਜਾ ਚੁੱਕੇ ਹੋ </td>
     <td> ਜਾ ਚੁੱਕੀਆਂ ਹੋ</td>
     <td>  </td>
</tr><tr class="singular">
     <td> ਓਹ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਜਾ ਚੁੱਕਾ ਹੈ </td>
     <td> ਜਾ ਚੁੱਕੀ ਹੈ </td>
     <td>  </td>
</tr><tr class="plural">
     <td> ਓਹ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਜਾ ਚੁੱਕੇ ਹਨ </td>
     <td> ਜਾ ਚੁੱਕੀਆਂ ਹਨ </td>
     <td>  </td>
</tr>
<tr class="singular">
     <td> ਰਾਮ  </td>
     <td>ਬਜ਼ਾਰ  </td>
     <td>ਜਾ ਚੁੱਕਾ ਹੈ </td>
     <td> </td>
     <td>  </td>
</tr>
<tr class="singular">
     <td>ਸੀਤਾ </td>
     <td>ਬਜ਼ਾਰ </td>
     <td> </td>
     <td>ਜਾ ਚੁੱਕੀ ਹੈ </td>
     <td> </td>
</tr>
<tr class="plural">
     <td> ਰਾਮ ਅਤੇ ਸੀਤਾ</td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਜਾ ਚੁੱਕੇ ਹਨ </td>
     <td>  </td>
     <td> </td>
</tr>
<tr class="plural">
     <td> ਸੀਤਾ ਅਤੇ ਗੀਤਾ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> </td>
     <td> ਜਾ ਚੁੱਕੀਆਂ ਹਨ </td>
     <td> Sita and Gita  </td>
</tr>
</table>
<br/>
<table>
<tr>
     <td style="background-color: #9FF33d;" >Singular </td> <td style="background-color: #b5f36d;">Plural </td>
</tr>
</table>
<h3>7. Conditional Present Tense </h3>
<table class="verbConjugation">
<tr>
    <th rowspan=2> Conjugate </th>
    <th rowspan=2 >Subject </th>
    <th rowspan=2>Object </th>
    <th colspan=2> Verb (phrase) </th>
    <th rowspan=2> English Translation </th>
</tr>
<tr>

     <th> Masculine </th>
     <th> Feminine </th>
</tr>
<tr class="singular" >
     <td> ਜੇ </td>
     <td> ਮੈਂ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td colspan=2>  ਜਾਵਾਂ   </td>

     <td> If I go to the market </td>
</tr> <tr class="plural">
     <td> ਜੇ </td>
     <td> ਅਸੀਂ </td>
     <td>  ਬਜ਼ਾਰ </td>
     <td colspan=2> ਜਾਈਏ </td>
     <td> If we go to the market </td>
</tr><tr class="singular">
     <td> ਜੇ </td>
     <td> ਤੂੰ </td>
     <td> ਬਜ਼ਾਰ </td> 
     <td colspan=2> ਜਾਵੇਂ </td>
     <td> If you go to the market  </td>
</tr><tr class="plural">
     <td> ਜੇ </td>
     <td> ਤੁਸੀਂ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td colspan=2> ਜਾਵੋਂ </td>
     <td> If you(plural) go to the market  </td>
</tr><tr class="singular">
     <td> ਜੇ </td>
     <td> ਓਹ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td colspan=2> ਜਾਵੇ </td>
     <td> If he goes to the market  </td>
</tr><tr class="plural">
     <td> ਜੇ </td>
     <td> ਓਹ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td colspan=2> ਜਾਣ </td>
     <td> If they go to the market  </td>
</tr>
<tr class="singular">
     <td> ਜੇ </td>
     <td> ਰਾਮ  </td>
     <td>ਬਜ਼ਾਰ  </td>
     <td colspan=2>ਜਾਵੇ </td>
     <td> If Ram goes to the market  </td>
</tr>
<tr class="singular">
     <td> ਜੇ </td>
     <td>ਸੀਤਾ </td>
     <td>ਬਜ਼ਾਰ </td>
     <td colspan=2>ਜਾਵੇ </td>
     <td>If Sita goes to the market </td>
</tr>
<tr class="plural">
     <td> ਜੇ </td>
     <td> ਰਾਮ ਅਤੇ ਸੀਤਾ</td>
     <td> ਬਜ਼ਾਰ </td>
     <td colspan=2> ਜਾਣ </td>
     <td>If Ram and Sita go to the market </td>
</tr>
<tr class="plural">
     <td> ਜੇ </td>
     <td> ਸੀਤਾ ਅਤੇ ਗੀਤਾ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td colspan=2> ਜਾਣ </td>
     <td> If Sita and Gita go to the market  </td>
</tr>
</table>
<br/>
<table>
<tr>
     <td style="background-color: #9FF33d;" >Singular </td> <td style="background-color: #b5f36d;">Plural </td>
</tr>
</table>
</html>
This space provides a nice black theme with a fresh icon styling developped by http://tobibeer.tiddlyspace.com

For more information and additional plugins which will work right out of the box go to http://tobibeer.tiddlyspace.com/#tbTheme or grab the preconfigured full version at http://tbthemefull.tiddlyspace.com
Type the text for 'New Tiddler'
[[Welcome]]
<!--{{{-->
<div macro='slideRevision'></div>
<div class='heading'>
	<span class="titleBar">
		<div class='title' macro='view title text'></div>
	</span>
	<span class='modifierIcon'
		macro='view modifier SiteIcon label:no height:48 width:48 preserveAspectRatio:yes'>
	</span>
	<div class='toolbar'
		macro='toolbar [[ToolbarCommands::RevisionToolbar]] icons:yes height:48 width:48 more:popup'>
	</div>
	<div class='tagClear'></div>
</div>
<div class='content'>
	<div class='viewer' macro='view text wikified'></div>
</div>
<div class='tagInfo'>
	<div class='tidTags' macro='tags'></div>
	<div class='tagging' macro='tagging'></div>
</div>
<!--}}}-->
/***
|''Name''|GUID|
!Attribution
GUID code written by Mahemoff
 * Copyright (c) <year>, <copyright holder>
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *     * Redistributions of source code must retain the above copyright
 *      notice, this list of conditions and the following disclaimer.
 *    * Redistributions in binary form must reproduce the above copyright
 *      notice, this list of conditions and the following disclaimer in the
 *      documentation and/or other materials provided with the distribution.
 *   * Neither the name of the <organization> nor the
 *       names of its contributors may be used to endorse or promote products
 *       derived from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY <copyright holder> ''AS IS'' AND ANY
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL <copyright holder> BE LIABLE FOR ANY
 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 * TODO:
 * - Support for ISO GUID stanard
***/
//{{{
function Guid(options) {
	this.options = options || {};
	this.chars = this.options.chars || Guid.constants.alphanumerics;
	this.epoch = this.options.epoch || Guid.constants.epoch1970;
	this.counterSequenceLength = this.options.counterSequenceLength || 1;
	this.randomSequenceLength = this.options.randomSequenceLength || 2;
}

Guid.prototype.generate = function() {
	var now = (new Date()).getTime() - this.epoch;
	var guid = this.baseN(now);
	this.counterSeq = (now==this.lastTimestampUsed ? this.counterSeq+1 : 1);
	guid += this.counterSeq;
	for (var i=0; i<this.randomSequenceLength; i++) {
		guid += this.chars.charAt(Math.floor(Math.random() * this.chars.length));
	}
	this.lastTimestampUsed = now;
	return guid;
};

Guid.prototype.baseN = function(val) {
	if (val === 0) {
		return "";
	}
	var rightMost = val % this.chars.length;
	var rightMostChar = this.chars.charAt(rightMost);
	var remaining = Math.floor(val / this.chars.length);
	return this.baseN(remaining) + rightMostChar;
};

Guid.constants = {};
Guid.constants.numbers = "0123456789";
Guid.constants.alphas = "abcdefghijklmnopqrstuvwxyz";
Guid.constants.lowerAlphanumerics = "0123456789abcdefghijklmnopqrstuvwxyz";
Guid.constants.alphanumerics = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
// http://tools.ietf.org/html/rfc1924
Guid.constants.base85 = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!#$%&()*+-;<=>?@^_`{|}~";

Guid.constants.epoch1970 = (new Date(0));
Guid.constants.epoch = function(year) { 
	return (new Date("Jan 1 " + year)).getTime();
};

version.extensions.GuidPlugin = { installed: true };
if (!config.extensions) { 
	config.extensions = {};
}
config.extensions.GuidPlugin = {};

// clients may override these
config.extensions.GuidPlugin.guid = new Guid();
//}}}
<<tiddler SiteInfo>>
/***
|''Name''|TiddlySpacePublishingCommands|
|''Version''|0.8.5|
|''Status''|@@beta@@|
|''Description''|toolbar commands for drafting and publishing|
|''Author''|Jon Robson|
|''Source''|http://github.com/TiddlySpace/tiddlyspace/raw/master/src/plugins/TiddlySpacePublishingCommands.js|
|''CoreVersion''|2.6.1|
|''Requires''|TiddlySpaceConfig TiddlySpaceFilters|
!Usage
Provides changeToPrivate, changeToPublic and saveDraft commands
Provides TiddlySpacePublisher macro.
{{{<<TiddlySpacePublisher type:private>>}}} make lots of private tiddlers public.
{{{<<TiddlySpacePublisher type:public>>}}} make lots of public tiddlers public.
!TODO
* add public argument?
!Code
***/
//{{{
(function($) {

var tiddlyspace = config.extensions.tiddlyspace;
var originMacro = config.macros.tiddlerOrigin;

tiddlyspace.getTiddlerStatusType = function(tiddler) {
	var isShadow = store.isShadowTiddler(tiddler.title);
	var exists = store.tiddlerExists(tiddler.title);
	if(isShadow && !exists) {
		return "shadow";
	} else if(!exists) {
		return "missing";
	} else {
		var types = ["private", "public"];
		var type = "external";
		for(var i = 0; i < types.length; i++) {
			var t = types[i];
			type = config.filterHelpers.is[t](tiddler) ? t : type;
		}
		if(config.filterHelpers.is.unsynced(tiddler)) {
			type = type == "private" ? "unsyncedPrivate" : "unsyncedPublic";
		}
		return type;
	}
};

var cmd = config.commands.publishTiddler = {
	text: "make public",
	tooltip: "Change this private tiddler into a public tiddler",
	errorMsg: "Error publishing %0: %1",

	isEnabled: function(tiddler) {
		return !readOnly && config.filterHelpers.is["private"](tiddler);
	},
	handler: function(ev, src, title) {
		var tiddler = store.getTiddler(title);
		if(tiddler) {
			var newBag = cmd.toggleBag(tiddler.fields["server.bag"]);
			this.moveTiddler(tiddler, {
				title: tiddler.fields["publish.name"] || tiddler.title,
				fields: { "server.bag": newBag }
			});
		}
	},
	toggleBag: function(bag, to) {
		var newBag;
		if(typeof bag != typeof "") {
			var tiddler = bag;
			bag = tiddler.fields["server.bag"];
		}
		if(bag.indexOf("_private") > -1) { // should make use of endsWith
			to = to ? to : "public";
			newBag = bag.replace("_private", "_" + to);
		} else {
			to = to ? to : "private";
			newBag = bag.replace("_public", "_" + to);
		}
		return newBag;
	},
	copyTiddler: function(title, newTitle, newBag, callback) {
		var original = store.getTiddler(title);
		newTitle = newTitle ? newTitle : title;
		var adaptor = original.getAdaptor();
		var publish = function(original, callback) {
			var tiddler = $.extend(new Tiddler(newTitle), original);
			tiddler.fields = $.extend({}, original.fields, {
				"server.bag": newBag,
				"server.workspace": "bags/%0".format(newBag),
				"server.page.revision": "false"
			});
			delete tiddler.fields["server.title"];
			tiddler.title = newTitle;
			adaptor.putTiddler(tiddler, null, null, callback);
		};
		publish(original, callback);
	},
	moveTiddler: function(tiddler, newTiddler, callback) {
			var info = {
			copyContext: {},
			deleteContext: {}
		};
		var _dirty = store.isDirty();
		var adaptor = tiddler.getAdaptor();
		var newTitle = newTiddler.title;
		var oldTitle = tiddler.title;
		delete tiddler.fields["server.workspace"];
		var oldBag = tiddler.fields["server.bag"];
		var newBag = newTiddler.fields["server.bag"];
		var newWorkspace = "bags/%0".format(newBag);
		cmd.copyTiddler(oldTitle, newTitle, newBag, function(ctx) {
				info.copyContext = ctx;
				var context = {
					tiddler: tiddler,
					workspace: newWorkspace
				};
				store.addTiddler(ctx.tiddler);
				tiddler.title = oldTitle; // for cases where a rename occurs
				if(ctx.status) { // only do if a success
					if(oldBag != newBag) {
						adaptor.deleteTiddler(tiddler, context, {}, function(ctx) {
							info.deleteContext = ctx;
							var el;
							if(tiddler) {
								tiddler.fields["server.workspace"] = newWorkspace;
								tiddler.fields["server.bag"] = newBag;
							}
							el = el ? el : story.refreshTiddler(oldTitle, null, true);
							if(oldTitle != newTitle) {
								store.deleteTiddler(oldTitle);
								store.notify(oldTitle, true);
							}
							if(el) {
								story.displayTiddler(el, newTitle);
							}
							if(oldTitle != newTitle) {
								story.closeTiddler(oldTitle);
							}
							if(callback) {
								callback(info);
							}
							store.setDirty(_dirty);
						});
					} else {
						if(callback) {
							callback(info);
						}
					}
					refreshDisplay();
				}
		});
	}
};

var changeToPrivate = config.commands.changeToPrivate = {
	text: "make private",
	tooltip: "turn this public tiddler into a private tiddler",
	isEnabled: function(tiddler) {
		return !readOnly && config.filterHelpers.is["public"](tiddler);
	},
	handler: function(event, src, title) {
		var tiddler = store.getTiddler(title);
		var newBag = cmd.toggleBag(tiddler, "private");
		var newTiddler = { title: title, fields: { "server.bag": newBag }};
		cmd.moveTiddler(tiddler, newTiddler);
	}
};
config.commands.changeToPublic = cmd;

/* Save as draft command */
var saveDraftCmd = config.commands.saveDraft = {
	text: "save draft",
	tooltip: "Save as a private draft",
	isEnabled: function(tiddler) {
		return changeToPrivate.isEnabled(tiddler);
	},
	getDraftTitle: function(title) {
		var draftTitle;
		var draftNum = "";
		while(!draftTitle) {
			var suggestedTitle = "%0 [draft%1]".format(title, draftNum);
			if(store.getTiddler(suggestedTitle)) {
				draftNum = !draftNum ? 2 : draftNum + 1;
			} else {
				draftTitle = suggestedTitle;
			}
		}
		return draftTitle;
	},
	createDraftTiddler: function(title, gatheredFields) {
		var tiddler = store.getTiddler(title);
		var draftTitle = saveDraftCmd.getDraftTitle(title);
		var draftTiddler = new Tiddler(draftTitle);
		if(tiddler) {
			$.extend(true, draftTiddler, tiddler);
		} else {
			$.extend(draftTiddler.fields, config.defaultCustomFields);
		}
		for(var fieldName in gatheredFields) {
			if(TiddlyWiki.isStandardField(fieldName)) {
				draftTiddler[fieldName] = gatheredFields[fieldName];
			} else {
				draftTiddler.fields[fieldName] = gatheredFields[fieldName];
			}
		}
		var privateBag = tiddlyspace.getCurrentBag("private");
		var privateWorkspace = tiddlyspace.getCurrentWorkspace("private");
		draftTiddler.title = draftTitle;
		draftTiddler.fields["publish.name"] = title;
		draftTiddler.fields["server.workspace"] = privateWorkspace;
		draftTiddler.fields["server.bag"] = privateBag;
		draftTiddler.fields["server.title"] = draftTitle;
		draftTiddler.fields["server.page.revision"] = "false";
		delete draftTiddler.fields["server.etag"];
		return draftTiddler;
	},
	handler: function(ev, src, title) {
		var tiddler = store.getTiddler(title); // original tiddler
		var tidEl = story.getTiddler(title);
		var uiFields = {};
		story.gatherSaveFields(tidEl, uiFields);
		var tid = saveDraftCmd.createDraftTiddler(title, uiFields);
		tid = store.saveTiddler(tid.title, tid.title, tid.text, tid.modifier,
			new Date(), tid.tags, tid.fields);
		autoSaveChanges(null, [tid]);
		story.closeTiddler(title);
		story.displayTiddler(src, title);
		story.displayTiddler(src, tid.title);
	}
};

var macro = config.macros.TiddlySpacePublisher = {
	locale: {
		title: "Batch Publisher",
		changeStatusLabel: "Make %0",
		noTiddlersText: "No tiddlers to publish",
		changeStatusPrompt: "Make all the selected tiddlers %0.",
		description: "Change tiddlers from %0 to %1 in this space"
	},

	listViewTemplate: {
		columns: [
			{ name: "Selected", field: "Selected", rowName: "title", type: "Selector" },
			{ name: "Tiddler", field: "tiddler", title: "Tiddler", type: "Tiddler" },
			{ name: "Status", field: "status", title: "Status", type: "WikiText" }
		],
		rowClasses: []
	},

	changeStatus: function(tiddlers, status, callback) { // this is what is called when you click the publish button
		var publicBag;
		for(var i = 0; i < tiddlers.length; i++) {
			var tiddler = tiddlers[i];
			var newTiddler = {
				title: tiddler.title,
				fields: { "server.bag": cmd.toggleBag(tiddler, status) }
			};
			cmd.moveTiddler(tiddler, newTiddler, callback);
		}
	},
	getMode: function(paramString) {
		var params = paramString.parseParams("anon")[0];
		var status = params.type ?
			(["public", "private"].contains(params.type[0]) ? params.type[0] : "private") :
			"private";
		var newStatus = status == "public" ? "private" : "public";
		return [status, newStatus];
	},
	handler: function(place, macroName, params, wikifier, paramString, tiddler) {
		var wizard = new Wizard();
		var locale = macro.locale;
		var status = macro.getMode(paramString);
		wizard.createWizard(place, locale.title);
		wizard.addStep(macro.locale.description.format(status[0], status[1]),
			'<input type="hidden" name="markList" />');
		var markList = wizard.getElement("markList");
		var listWrapper = $("<div />").addClass("batchPublisher").
			attr("refresh", "macro").attr("macroName", macroName).
			attr("params", paramString)[0];
		markList.parentNode.insertBefore(listWrapper, markList);
		$.data(listWrapper, "wizard", wizard);
		macro.refresh(listWrapper);
	},
	getCheckedTiddlers: function(listWrapper, titlesOnly) {
		var tiddlers = [];
		$(".chkOptionInput[rowName]:checked", listWrapper).each(function(i, el) {
			var title = $(el).attr("rowName");
			if(titlesOnly) {
				tiddlers.push(title);
			} else {
				tiddlers.push(store.getTiddler(title));
			}
		});
		return tiddlers;
	},
	refresh: function(listWrapper) {
		var checked = macro.getCheckedTiddlers(listWrapper, true);
		var paramString = $(listWrapper).empty().attr("params");
		var wizard = $.data(listWrapper, "wizard");
		var locale = macro.locale;
		var params = paramString.parseParams("anon")[0];
		var publishCandidates = [];
		var status = macro.getMode(paramString);
		var pubType = status[0];
		var newPubType = status[1];
		var tiddlers = params.filter ? store.filterTiddlers(params.filter[0]) :
			store.filterTiddlers("[is[%0]]".format(pubType));
		var enabled = [];
		for(var i = 0; i < tiddlers.length; i++) {
			var tiddler = tiddlers[i];
			var title = tiddler.title;
			if(!tiddler.tags.contains("excludePublisher") && title !== "SystemSettings") {
				publishCandidates.push({ title: title, tiddler: tiddler, status: pubType});
			}
			if(checked.contains(title)) {
				enabled.push("[rowname=%0]".format(title));
			}
		}

		if(publishCandidates.length === 0) {
			createTiddlyElement(listWrapper, "em", null, null, locale.noTiddlersText);
		} else {
			var listView = ListView.create(listWrapper, publishCandidates, macro.listViewTemplate);
			wizard.setValue("listView", listView);
			var btnHandler = function(ev) {
				var tiddlers = macro.getCheckedTiddlers(listWrapper);
				var callback = function(status) {
					$(".batchPublisher").each(function(i, el) {
						macro.refresh(el);
					});
				};
				macro.changeStatus(tiddlers, newPubType, callback);
			};
			wizard.setButtons([{
				caption: locale.changeStatusLabel.format(newPubType),
				tooltip: locale.changeStatusPrompt.format(newPubType),
				onClick: btnHandler
			}]);
			$(enabled.join(",")).attr("checked", true); // retain what was checked before
		}
	}
};

})(jQuery);
//}}}
!Spaces
<<groupBy server.bag>>

!Private
<<list filter [is[private]]>>

!Public
<<list filter [is[public]]>>

!Drafts
<<list filter [is[draft]]>>
/***
|''Name''|TiddlySpaceBackstage|
|''Version''|0.8.0|
|''Description''|Provides a TiddlySpace version of the backstage and a homeLink macro|
|''Status''|@@beta@@|
|''Contributors''|Jon Lister, Jon Robson, Colm Britton|
|''Source''|http://github.com/TiddlySpace/tiddlyspace/raw/master/src/plugins/TiddlySpaceBackstage.js|
|''Requires''|TiddlySpaceConfig ImageMacroPlugin TiddlySpaceViewTypes|
!StyleSheet
.tiddler .error.annotation .button{
	display: inline-block;
}

#backstageArea {
	z-index: 49;
	color: white;
	background-color: black;
	background: -webkit-gradient(linear,left bottom,left top,color-stop(0, #222),color-stop(0.5, #333),color-stop(1, #555));
	background: -moz-linear-gradient(center bottom,#222 0%, #333 50%, #555 100%);
	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ff555555, endColorstr=#ff222222);
	-ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr=#ff555555, endColorstr=#ff222222)";
	height: 25px;
	padding: 0;
}

#backstageButton {
	overflow: hidden;
}

#backstageButton #backstageShow,
#backstageButton #backstageHide {
	margin: 0px;
	padding: 0px;
}

#backstageButton #backstageShow:hover,
#backstageButton #backstageHide:hover {
	background: none;
	color: none;
}

#backstageButton img,
#backstageButton svg {
	width: 24px;
	height: 24px;
}

#messageArea {
	top: 50px;
}

#backstageToolbar {
	position: relative;
}

#backstageArea a {
	padding: 0px;
	margin-left: 0px;
	color: white;
	background: none;
}

#backstageArea a:hover {
	background-color: white;
}

#backstage ol,
#backstage ul {
	padding: auto;
}

#backstageButton a {
	margin: 0;
}

.backstagePanelBody ul {
	padding: 5px;
	margin: 5px;
}

#backstage #backstagePanel {
	margin-left: 5%;
	padding: 0em;
	margin-right: 5%;
}

#backstageToolbar a {
	position: relative;
}

#backstageArea a.backstageSelTab,
#backstageToolbar .backstageTask {
	line-height: 25px;
	color: #767676;
}

.backstageTask .externalImage,
.backstageTask .image {
	display: inline;
}

#backstageToolbar a span {
	z-index: 2;
}

a.backstageTask {
	display: inline;
        margin-left: 1em !important;
}

.backstagePanelBody .button {
	display: inline-block;
	margin-right: 10px;
}

.backstagePanelBody {
	margin: 0 0 0 0.6em;
	padding: 0.4em 0.5em 1px 0.5em;
}

#backstage table {
	margin: auto;
}

#backstage .wizard table {
	border: 0px;
	margin: 0;
}

#backstage div  li.listLink {
	border: 0px;
	width: 78%;
	font-size: 0.7em;
}

#backstage div li.listTitle {
	font-weight: bold;
	text-decoration: underline;
	font-size: 1em;
	background: #ccc;
	width: 100%;
}

#backstage fieldset {
	border: solid 1px [[ColorPalette::Background]];
}

#backstage .viewer table,#backstage table.twtable {
	border: 0px;
}

#backstageToolbar img {
	padding: 0;
}

#backstage .wizard,
#backstage .wizardFooter {
	background: none;
}

.viewer td, .viewer tr, .twtable td, .twtable tr {
	border: 1px solid #eee;
}

#backstage .inlineList ul li {
	background-color: [[ColorPalette::Background]];
	border: solid 1px [[ColorPalette::TertiaryMid]];
	display: block;
	float: left;
	list-style: none;
	margin-right: 1em;
	padding: 0.5em;
}

.backstageClear, .inlineList form {
	clear: both;
	display: block;
	margin-top: 3em;
}

.tiddlyspaceMenu {
	text-align: center;
}

span.chunkyButton {
	display: inline-block;
	padding: 0;
	margin: 0;
	border: solid 2px #000;
	background-color: #04b;
}

span.chunkyButton a.button, span.chunkyButton a:active.button {
	white-space: nowrap;
	font-weight: bold;
	font-size: 1.8em;
	color: #fff;
	text-align: center;
	padding: 0.5em 0.5em;
	margin: 0;
	border-style: none;
	display: block;
}

span.chunkyButton:hover {
	background-color: #014;
}

span.chunkyButton a.button:hover {
	border-style: none;
	background: none;
	color: #fff;
}

#backstage .unpluggedSpaceTab .wizard,
.unpluggedSpaceTab .wizard {
	background: white;
	border: 2px solid #CCC;
	padding: 5px;
}

.syncKey .keyItem {
	border: 1px solid black;
	display: inline-block;
	margin: 0.2em;
	padding: 0.1em 0.1em 0.1em 0.1em;
}

.keyHeading {
	font-size: 2em;
	font-weight: bold;
	margin: 0.4em 0em -0.2em;
}

.unpluggedSpaceTab .putToServer,
.unpluggedSpaceTab .notChanged {
	display: none;
}

.tiddlyspaceMenu ul {
	margin: 0;
	padding: 0;
}

.tiddlyspaceMenu ul li {
	list-style: none;
}

.unsyncedChanges .unsyncedList {
	display: block;
}

.unsyncedList {
	display: none;
}
!Code
***/
//{{{
(function ($) {
    var name = "StyleSheet" + tiddler.title;
    config.shadowTiddlers[name] = "/*{{{*/\n%0\n/*}}}*/".
        format(store.getTiddlerText(tiddler.title + "##StyleSheet")); // this accesses the StyleSheet section of the current tiddler (the plugin that contains it)
    store.addNotification(name, refreshStyles);

    if (!config.extensions.tiddlyweb.status.tiddlyspace_version) { // unplugged
        config.extensions.tiddlyweb.status.tiddlyspace_version = "<unknown>";
        config.extensions.tiddlyweb.status.server_host = {
            url:config.extensions.tiddlyweb.host }; // TiddlySpaceLinkPlugin expects this
    }
    var disabled_tasks_for_nonmembers = ["tiddlers", "plugins", "batch", "sync"];

    var tweb = config.extensions.tiddlyweb;
    var tiddlyspace = config.extensions.tiddlyspace;
    var currentSpace = tiddlyspace.currentSpace.name;
    var imageMacro = config.macros.image;

    if (config.options.chkBackstage === undefined) {
        config.options.chkBackstage = false;
    }

// Set up Backstage
    config.tasks = {};
    config.tasks.status = {
        text:"status",
        tooltip:"TiddlySpace Info",
        content:"<<tiddler Backstage##Menu>>"
    };
    config.tasks.tiddlers = {
        text:"tiddlers",
        tooltip:"tiddlers control panel",
        content:"<<tiddler Backstage##BackstageTiddlers>>"
    };
    config.tasks.plugins = {
        text:"plugins",
        tooltip:"Manage installed plugins",
        content:"<<tiddler Backstage##Plugins>>"
    };
    config.tasks.batch = {
        text:"batch",
        tooltip:"Batch manage public/private tiddlers",
        content:"<<tiddler Backstage##BatchOps>>"
    };
    config.tasks.tweaks = {
        text:"tweaks",
        tooltip:"Tweak TiddlyWiki behaviors",
        content:"<<tiddler Backstage##Tweaks>>"
    };
    config.tasks.exportTiddlers = {
        text:"import/export",
        tooltip:"Import/export tiddlers from/to a TiddlyWiki",
        content:"<<tiddler Backstage##ImportExport>>"
    };
    config.tasks.sync = {
        text:"sync",
        tooltip:"Check Sync status",
        content:"<<tiddler Backstage##SpaceUnplugged>>"
    };

    if (window.location.protocol === "file:") {
        config.unplugged = true;
    }

    config.backstageTasks = ["status", "tiddlers", "plugins",
        "batch", "tweaks", "exportTiddlers", "sync"];

    config.messages.backstage.prompt = "";
// initialize state
    var _show = backstage.show;
    backstage.show = function () {
        // selectively hide backstage tasks and tabs based on user status
        var tasks = $("#backstageToolbar .backstageTask").show();
        var bs = backstage.tiddlyspace;
        if (!config.unplugged) {
            tweb.getUserInfo(function (user) {
                if (user.anon) {
                    jQuery.each(disabled_tasks_for_nonmembers, function (i, task) {
                        var taskIndex = config.backstageTasks.indexOf(task);
                        if (taskIndex !== -1) {
                            config.backstageTasks.splice(taskIndex, 1);
                        }
                    });
                    config.messages.memberStatus = bs.locale.loggedout;
                } else {
                    config.messages.memberStatus = readOnly ?
                        bs.locale.nonmember : bs.locale.member;
                }
            });
        } else {
            config.messages.memberStatus = bs.locale.unplugged;
        }

        // display backstage
        return _show.apply(this, arguments);
    };
    if (readOnly) {
        jQuery.each(disabled_tasks_for_nonmembers, function (i, task) {
            var taskIndex = config.backstageTasks.indexOf(task);
            if (taskIndex !== -1) {
                config.backstageTasks.splice(taskIndex, 1);
            }
        });
    }

    var tasks = config.tasks;
    var commonUrl = "/bags/common/tiddlers/%0";

    backstage.tiddlyspace = {
        locale:{
            member:"You are a member of this space.",
            nonmember:"You are not a member of this space.",
            loggedout:"You are currently logged out of TiddlySpace.",
            unplugged:"You are unplugged."
        },
        showButton:function () {
            var showBtn = $("#backstageShow")[0];
            var altText = $(showBtn).text();
            $(showBtn).empty();
            imageMacro.renderImage(showBtn, "backstage.svg",
                { altImage:commonUrl.format("backstage.png"), alt:altText});
        },
        hideButton:function () {
            var hideBtn = $("#backstageHide")[0];
            var altText = $(hideBtn).text();
            $(hideBtn).empty();
            imageMacro.renderImage(hideBtn, "close.svg",
                { altImage:commonUrl.format("close.png"), alt:altText, width:24, height:24 });
        }
    };

    var _init = backstage.init;
    backstage.init = function () {
        _init.apply(this, arguments);
        var init = function (user) {
            var bs = backstage.tiddlyspace;
            bs.showButton();
            bs.hideButton();
        };
        tweb.getUserInfo(init);
    };

    var home = config.macros.homeLink = {
        locale:{
            linkText:"your home space"
        },
        handler:function (place) {
            var container = $("<span />").appendTo(place)[0];
            tweb.getUserInfo(function (user) {
                if (!user.anon && user.name !== currentSpace) {
                    createSpaceLink(container, user.name, null, home.locale.linkText);
                }
            });
        }
    };

    config.macros.exportSpace = {
        handler:function (place, macroName, params) {
            var filename = params[0] ||
                "/tiddlers.wiki?download=%0.html".format(currentSpace);
            $('<a class="button">download</a>').// XXX: i18n
                attr("href", filename).appendTo(place);
        }
    };

}(jQuery));
//}}}
/***
|''Name''|RevisionsCommandPlugin|
|''Description''|provides access to tiddler revisions|
|''Author''|FND|
|''Contributors''|Martin Budden|
|''Version''|0.3.3|
|''Status''|@@beta@@|
|''Source''|http://svn.tiddlywiki.org/Trunk/association/plugins/RevisionsCommandPlugin.js|
|''CodeRepository''|http://svn.tiddlywiki.org/Trunk/association/plugins/|
|''License''|[[BSD|http://www.opensource.org/licenses/bsd-license.php]]|
|''CoreVersion''|2.6.0|
|''Keywords''|serverSide|
!Usage
Extend [[ToolbarCommands]] with {{{revisions}}}.
!Revision History
!!v0.1 (2009-07-23)
* initial release (renamed from experimental ServerCommandsPlugin)
!!v0.2 (2010-03-04)
* suppressed wikification in diff view
!!v0.3 (2010-04-07)
* restored wikification in diff view
* added link to side-by-side diff view
!To Do
* strip server.* fields from revision tiddlers
* resolve naming conflicts
* i18n, l10n
* code sanitizing
* documentation
!Code
***/
//{{{
(function($) {

jQuery.twStylesheet(".diff { white-space: pre, font-family: monospace }",
	{ id: "diff" });

var cmd = config.commands.revisions = {
	type: "popup",
	hideShadow: true,
	text: "revisions",
	tooltip: "display tiddler revisions",
	revTooltip: "", // TODO: populate dynamically?
	loadLabel: "loading...",
	loadTooltip: "loading revision list",
	selectLabel: "select",
	selectTooltip: "select revision for comparison",
	selectedLabel: "selected",
	compareLabel: "compare",
	linkLabel: "side-by-side view",
	revSuffix: " [rev. #%0]",
	diffSuffix: " [diff: #%0 #%1]",
	dateFormat: "YYYY-0MM-0DD 0hh:0mm",
	listError: "revisions could not be retrieved",

	handlePopup: function(popup, title) {
		title = this.stripSuffix("rev", title);
		title = this.stripSuffix("diff", title);
		var tiddler = store.getTiddler(title);
		var type = _getField("server.type", tiddler);
		var adaptor = new config.adaptors[type]();
		var limit = null; // TODO: customizable
		var context = {
			host: _getField("server.host", tiddler),
			workspace: _getField("server.workspace", tiddler)
		};
		var loading = createTiddlyButton(popup, cmd.loadLabel, cmd.loadTooltip);
		var params = { popup: popup, loading: loading, origin: title };
		adaptor.getTiddlerRevisionList(title, limit, context, params, this.displayRevisions);
	},

	displayRevisions: function(context, userParams) {
		removeNode(userParams.loading);
		if(context.status) {
			var callback = function(ev) {
				var e = ev || window.event;
				var revision = resolveTarget(e).getAttribute("revision");
				context.adaptor.getTiddlerRevision(tiddler.title, revision, context,
					userParams, cmd.displayTiddlerRevision);
			};
			var table = createTiddlyElement(userParams.popup, "table");
			for(var i = 0; i < context.revisions.length; i++) {
				var tiddler = context.revisions[i];
				var row = createTiddlyElement(table, "tr");
				var timestamp = tiddler.modified.formatString(cmd.dateFormat);
				var revision = tiddler.fields["server.page.revision"];
				var cell = createTiddlyElement(row, "td");
				createTiddlyButton(cell, timestamp, cmd.revTooltip, callback, null,
					null, null, { revision: revision });
				cell = createTiddlyElement(row, "td", null, null, tiddler.modifier);
				cell = createTiddlyElement(row, "td");
				createTiddlyButton(cell, cmd.selectLabel, cmd.selectTooltip,
					cmd.revisionSelected, null, null, null,
					{ index:i, revision: revision, col: 2 });
				cmd.context = context; // XXX: unsafe (singleton)!?
			}
		} else {
			$("<li />").text(cmd.listError).appendTo(userParams.popup);
		}
	},

	revisionSelected: function(ev) {
		var e = ev || window.event;
		e.cancelBubble = true;
		if(e.stopPropagation) {
			e.stopPropagation();
		}
		var n = resolveTarget(e);
		var index = n.getAttribute("index");
		var col = n.getAttribute("col");
		while(!index || !col) {
			n = n.parentNode;
			index = n.getAttribute("index");
			col = n.getAttribute("col");
		}
		cmd.revision = n.getAttribute("revision");
		var table = n.parentNode.parentNode.parentNode;
		var rows = table.childNodes;
		for(var i = 0; i < rows.length; i++) {
			var c = rows[i].childNodes[col].firstChild;
			if(i == index) {
				if(c.textContent) {
					c.textContent = cmd.selectedLabel;
				} else {
					c.text = cmd.selectedLabel;
				}
			} else {
				if(c.textContent) {
					c.textContent = cmd.compareLabel;
				} else {
					c.text = cmd.compareLabel;
				}
				c.onclick = cmd.compareSelected;
			}
		}
	},

	compareSelected: function(ev) {
		var e = ev || window.event;
		var n = resolveTarget(e);
		var context = cmd.context;
		context.rev1 = n.getAttribute("revision");
		context.rev2 = cmd.revision;
		context.tiddler = context.revisions[n.getAttribute("index")];
		context.format = "unified";
		context.adaptor.getTiddlerDiff(context.tiddler.title, context,
			context.userParams, cmd.displayTiddlerDiffs);
	},

	displayTiddlerDiffs: function(context, userParams) {
		var tiddler = context.tiddler;
		tiddler.title += cmd.diffSuffix.format([context.rev1, context.rev2]);
		tiddler.text = "{{diff{\n" + context.diff + "\n}}}";
		tiddler.tags = ["diff"];
		tiddler.fields.doNotSave = "true"; // XXX: correct?
		if(!store.getTiddler(tiddler.title)) {
			store.addTiddler(tiddler);
		}
		var src = story.getTiddler(userParams.origin);
		var tiddlerEl = story.displayTiddler(src, tiddler);
		var uri = context.uri.replace("format=unified", "format=horizontal");
		var link = $('<a target="_blank" />').attr("href", uri).text(cmd.linkLabel);
		$(".viewer", tiddlerEl).prepend(link);
	},

	displayTiddlerRevision: function(context, userParams) {
		var tiddler = context.tiddler;
		tiddler.title += cmd.revSuffix.format([tiddler.fields["server.page.revision"]]);
		tiddler.fields.doNotSave = "true"; // XXX: correct?
		if(!store.getTiddler(tiddler.title)) {
			store.addTiddler(tiddler);
		}
		var src = story.getTiddler(userParams.origin);
		story.displayTiddler(src, tiddler);
	},

	stripSuffix: function(type, title) {
		var str = cmd[type + "Suffix"];
		var i = str.indexOf("%0");
		i = title.indexOf(str.substr(0, i));
		if(i != -1) {
			title = title.substr(0, i);
		}
		return title;
	}
};

var _getField = function(name, tiddler) {
	return tiddler.fields[name] || config.defaultCustomFields[name];
};

})(jQuery);
//}}}
/***
|''Description''|Sanitisation for dynamically pulling tiddlers into your space and displaying them|
!Notes
Works both inside and outside TiddlyWiki. Uses the HTML Sanitizer provided by the Google Caja project
(see http://code.google.com/p/google-caja/wiki/JsHtmlSanitizer for more on this), which is licensed under
an Apache License (see http://www.apache.org/licenses/LICENSE-2.0).
!Code
***/
//{{{
(function($) {

var cleanURL = function(url) {
	var regexp = /^(?:http|https|mailto|ftp|irc|news):\/\//;
	return (regexp.test(url)) ? url : null;
};

$.sanitize = function(html) {
	return html_sanitize(html, cleanURL);
};

/*
 * HTML Sanitizer, provided by Google Caja
 */

/* Copyright Google Inc.
 * Licensed under the Apache Licence Version 2.0
 * Autogenerated at Tue May 17 17:39:24 BST 2011
 * @provides html4
 */var html4={};html4.atype={NONE:0,URI:1,URI_FRAGMENT:11,SCRIPT:2,STYLE:3,ID:4,IDREF:5,IDREFS:6,GLOBAL_NAME:7,LOCAL_NAME:8,CLASSES:9,FRAME_TARGET:10},html4.ATTRIBS={"*::class":9,"*::dir":0,"*::id":4,"*::lang":0,"*::onclick":2,"*::ondblclick":2,"*::onkeydown":2,"*::onkeypress":2,"*::onkeyup":2,"*::onload":2,"*::onmousedown":2,"*::onmousemove":2,"*::onmouseout":2,"*::onmouseover":2,"*::onmouseup":2,"*::style":3,"*::title":0,"a::accesskey":0,"a::coords":0,"a::href":1,"a::hreflang":0,"a::name":7,"a::onblur":2,"a::onfocus":2,"a::rel":0,"a::rev":0,"a::shape":0,"a::tabindex":0,"a::target":10,"a::type":0,"area::accesskey":0,"area::alt":0,"area::coords":0,"area::href":1,"area::nohref":0,"area::onblur":2,"area::onfocus":2,"area::shape":0,"area::tabindex":0,"area::target":10,"bdo::dir":0,"blockquote::cite":1,"br::clear":0,"button::accesskey":0,"button::disabled":0,"button::name":8,"button::onblur":2,"button::onfocus":2,"button::tabindex":0,"button::type":0,"button::value":0,"canvas::height":0,"canvas::width":0,"caption::align":0,"col::align":0,"col::char":0,"col::charoff":0,"col::span":0,"col::valign":0,"col::width":0,"colgroup::align":0,"colgroup::char":0,"colgroup::charoff":0,"colgroup::span":0,"colgroup::valign":0,"colgroup::width":0,"del::cite":1,"del::datetime":0,"dir::compact":0,"div::align":0,"dl::compact":0,"font::color":0,"font::face":0,"font::size":0,"form::accept":0,"form::action":1,"form::autocomplete":0,"form::enctype":0,"form::method":0,"form::name":7,"form::onreset":2,"form::onsubmit":2,"form::target":10,"h1::align":0,"h2::align":0,"h3::align":0,"h4::align":0,"h5::align":0,"h6::align":0,"hr::align":0,"hr::noshade":0,"hr::size":0,"hr::width":0,"iframe::align":0,"iframe::frameborder":0,"iframe::height":0,"iframe::marginheight":0,"iframe::marginwidth":0,"iframe::width":0,"img::align":0,"img::alt":0,"img::border":0,"img::height":0,"img::hspace":0,"img::ismap":0,"img::name":7,"img::src":1,"img::usemap":11,"img::vspace":0,"img::width":0,"input::accept":0,"input::accesskey":0,"input::align":0,"input::alt":0,"input::autocomplete":0,"input::checked":0,"input::disabled":0,"input::ismap":0,"input::maxlength":0,"input::name":8,"input::onblur":2,"input::onchange":2,"input::onfocus":2,"input::onselect":2,"input::readonly":0,"input::size":0,"input::src":1,"input::tabindex":0,"input::type":0,"input::usemap":11,"input::value":0,"ins::cite":1,"ins::datetime":0,"label::accesskey":0,"label::for":5,"label::onblur":2,"label::onfocus":2,"legend::accesskey":0,"legend::align":0,"li::type":0,"li::value":0,"map::name":7,"menu::compact":0,"ol::compact":0,"ol::start":0,"ol::type":0,"optgroup::disabled":0,"optgroup::label":0,"option::disabled":0,"option::label":0,"option::selected":0,"option::value":0,"p::align":0,"pre::width":0,"q::cite":1,"select::disabled":0,"select::multiple":0,"select::name":8,"select::onblur":2,"select::onchange":2,"select::onfocus":2,"select::size":0,"select::tabindex":0,"table::align":0,"table::bgcolor":0,"table::border":0,"table::cellpadding":0,"table::cellspacing":0,"table::frame":0,"table::rules":0,"table::summary":0,"table::width":0,"tbody::align":0,"tbody::char":0,"tbody::charoff":0,"tbody::valign":0,"td::abbr":0,"td::align":0,"td::axis":0,"td::bgcolor":0,"td::char":0,"td::charoff":0,"td::colspan":0,"td::headers":6,"td::height":0,"td::nowrap":0,"td::rowspan":0,"td::scope":0,"td::valign":0,"td::width":0,"textarea::accesskey":0,"textarea::cols":0,"textarea::disabled":0,"textarea::name":8,"textarea::onblur":2,"textarea::onchange":2,"textarea::onfocus":2,"textarea::onselect":2,"textarea::readonly":0,"textarea::rows":0,"textarea::tabindex":0,"tfoot::align":0,"tfoot::char":0,"tfoot::charoff":0,"tfoot::valign":0,"th::abbr":0,"th::align":0,"th::axis":0,"th::bgcolor":0,"th::char":0,"th::charoff":0,"th::colspan":0,"th::headers":6,"th::height":0,"th::nowrap":0,"th::rowspan":0,"th::scope":0,"th::valign":0,"th::width":0,"thead::align":0,"thead::char":0,"thead::charoff":0,"thead::valign":0,"tr::align":0,"tr::bgcolor":0,"tr::char":0,"tr::charoff":0,"tr::valign":0,"ul::compact":0,"ul::type":0},html4.eflags={OPTIONAL_ENDTAG:1,EMPTY:2,CDATA:4,RCDATA:8,UNSAFE:16,FOLDABLE:32,SCRIPT:64,STYLE:128},html4.ELEMENTS={a:0,abbr:0,acronym:0,address:0,applet:16,area:2,b:0,base:18,basefont:18,bdo:0,big:0,blockquote:0,body:49,br:2,button:0,canvas:0,caption:0,center:0,cite:0,code:0,col:2,colgroup:1,dd:1,del:0,dfn:0,dir:0,div:0,dl:0,dt:1,em:0,fieldset:0,font:0,form:0,frame:18,frameset:16,h1:0,h2:0,h3:0,h4:0,h5:0,h6:0,head:49,hr:2,html:49,i:0,iframe:4,img:2,input:2,ins:0,isindex:18,kbd:0,label:0,legend:0,li:1,link:18,map:0,menu:0,meta:18,nobr:0,noframes:20,noscript:20,object:16,ol:0,optgroup:0,option:1,p:1,param:18,pre:0,q:0,s:0,samp:0,script:84,select:0,small:0,span:0,strike:0,strong:0,style:148,sub:0,sup:0,table:0,tbody:1,td:1,textarea:8,tfoot:1,th:1,thead:1,title:24,tr:1,tt:0,u:0,ul:0,"var":0},html4.ueffects={NOT_LOADED:0,SAME_DOCUMENT:1,NEW_DOCUMENT:2},html4.URIEFFECTS={"a::href":2,"area::href":2,"blockquote::cite":0,"body::background":1,"del::cite":0,"form::action":2,"img::src":1,"input::src":1,"ins::cite":0,"q::cite":0},html4.ltypes={UNSANDBOXED:2,SANDBOXED:1,DATA:0},html4.LOADERTYPES={"a::href":2,"area::href":2,"blockquote::cite":2,"body::background":1,"del::cite":2,"form::action":2,"img::src":1,"input::src":1,"ins::cite":2,"q::cite":2};var html=function(a){function x(b,c,d){var e=[];w(function(b,e){for(var f=0;f<e.length;f+=2){var g=e[f],h=e[f+1],i=null,j;if((j=b+"::"+g,a.ATTRIBS.hasOwnProperty(j))||(j="*::"+g,a.ATTRIBS.hasOwnProperty(j)))i=a.ATTRIBS[j];if(i!==null)switch(i){case a.atype.NONE:break;case a.atype.SCRIPT:case a.atype.STYLE:h=null;break;case a.atype.ID:case a.atype.IDREF:case a.atype.IDREFS:case a.atype.GLOBAL_NAME:case a.atype.LOCAL_NAME:case a.atype.CLASSES:h=d?d(h):h;break;case a.atype.URI:h=c&&c(h);break;case a.atype.URI_FRAGMENT:h&&"#"===h.charAt(0)?(h=d?d(h):h,h&&(h="#"+h)):h=null;break;default:h=null}else h=null;e[f+1]=h}return e})(b,e);return e.join("")}function w(b){var c,d;return v({startDoc:function(a){c=[],d=!1},startTag:function(e,f,g){if(!d){if(!a.ELEMENTS.hasOwnProperty(e))return;var h=a.ELEMENTS[e];if(h&a.eflags.FOLDABLE)return;if(h&a.eflags.UNSAFE){d=!(h&a.eflags.EMPTY);return}f=b(e,f);if(f){h&a.eflags.EMPTY||c.push(e),g.push("<",e);for(var i=0,j=f.length;i<j;i+=2){var k=f[i],l=f[i+1];l!==null&&l!==void 0&&g.push(" ",k,'="',r(l),'"')}g.push(">")}}},endTag:function(b,e){if(d)d=!1;else{if(!a.ELEMENTS.hasOwnProperty(b))return;var f=a.ELEMENTS[b];if(!(f&(a.eflags.UNSAFE|a.eflags.EMPTY|a.eflags.FOLDABLE))){var g;if(f&a.eflags.OPTIONAL_ENDTAG)for(g=c.length;--g>=0;){var h=c[g];if(h===b)break;if(!(a.ELEMENTS[h]&a.eflags.OPTIONAL_ENDTAG))return}else for(g=c.length;--g>=0;)if(c[g]===b)break;if(g<0)return;for(var i=c.length;--i>g;){var h=c[i];a.ELEMENTS[h]&a.eflags.OPTIONAL_ENDTAG||e.push("</",h,">")}c.length=g,e.push("</",b,">")}}},pcdata:function(a,b){d||b.push(a)},rcdata:function(a,b){d||b.push(a)},cdata:function(a,b){d||b.push(a)},endDoc:function(a){for(var b=c.length;--b>=0;)a.push("</",c[b],">");c.length=0}})}function v(c){return function(d,e){d=String(d);var f=null,g=!1,h=[],j=void 0,l=void 0,m=void 0;c.startDoc&&c.startDoc(e);while(d){var n=d.match(g?t:u);d=d.substring(n[0].length);if(g){if(n[1]){var o=b(n[1]),p;if(n[2]){var q=n[3];switch(q.charCodeAt(0)){case 34:case 39:q=q.substring(1,q.length-1)}p=k(i(q))}else p=o;h.push(o,p)}else if(n[4]){l!==void 0&&(m?c.startTag&&c.startTag(j,h,e):c.endTag&&c.endTag(j,e));if(m&&l&(a.eflags.CDATA|a.eflags.RCDATA)){f===null?f=b(d):f=f.substring(f.length-d.length);var r=f.indexOf("</"+j);r<0&&(r=d.length),l&a.eflags.CDATA?c.cdata&&c.cdata(d.substring(0,r),e):c.rcdata&&c.rcdata(s(d.substring(0,r)),e),d=d.substring(r)}j=l=m=void 0,h.length=0,g=!1}}else if(n[1])c.pcdata&&c.pcdata(n[0],e);else if(n[3])m=!n[2],g=!0,j=b(n[3]),l=a.ELEMENTS.hasOwnProperty(j)?a.ELEMENTS[j]:void 0;else if(n[4])c.pcdata&&c.pcdata(n[4],e);else if(n[5]&&c.pcdata)switch(n[5]){case"<":c.pcdata("&lt;",e);break;case">":c.pcdata("&gt;",e);break;default:c.pcdata("&amp;",e)}}c.endDoc&&c.endDoc(e)}}function s(a){return a.replace(m,"&amp;$1").replace(n,"&lt;").replace(o,"&gt;")}function r(a){return a.replace(l,"&amp;").replace(n,"&lt;").replace(o,"&gt;").replace(p,"&#34;").replace(q,"&#61;")}function k(a){return a.replace(j,g)}function i(a){return a.replace(h,"")}function g(a,b){return f(b)}function f(a){a=b(a);if(c.hasOwnProperty(a))return c[a];var f=a.match(d);if(f)return String.fromCharCode(parseInt(f[1],10));if(!!(f=a.match(e)))return String.fromCharCode(parseInt(f[1],16));return""}var b;"script"==="SCRIPT".toLowerCase()?b=function(a){return a.toLowerCase()}:b=function(a){return a.replace(/[A-Z]/g,function(a){return String.fromCharCode(a.charCodeAt(0)|32)})};var c={lt:"<",gt:">",amp:"&",nbsp:"240",quot:'"',apos:"'"},d=/^#(\d+)$/,e=/^#x([0-9A-Fa-f]+)$/,h=/\0/g,j=/&(#\d+|#x[0-9A-Fa-f]+|\w+);/g,l=/&/g,m=/&([^a-z#]|#(?:[^0-9x]|x(?:[^0-9a-f]|$)|$)|$)/gi,n=/</g,o=/>/g,p=/\"/g,q=/\=/g,t=new RegExp("^\\s*(?:(?:([a-z][a-z-]*)(\\s*=\\s*(\"[^\"]*\"|'[^']*'|(?=[a-z][a-z-]*\\s*=)|[^>\"'\\s]*))?)|(/?>)|[\\s\\S][^a-z\\s>]*)","i"),u=new RegExp("^(?:&(\\#[0-9]+|\\#[x][0-9a-f]+|\\w+);|<!--[\\s\\S]*?-->|<!\\w[^>]*>|<\\?[^>*]*>|<(/)?([a-z][a-z0-9]*)|([^<&>]+)|([<&>]))","i");return{escapeAttrib:r,makeHtmlSanitizer:w,makeSaxParser:v,normalizeRCData:s,sanitize:x,unescapeEntities:k}}(html4),html_sanitize=html.sanitize

// stop here if we're not in TiddlyWiki
// XXX: is this the correct way of checking for TiddlyWiki?
if (!window.TiddlyWiki || !window.store || !store instanceof TiddlyWiki) {
	return;
}

var tiddlyspace = config.extensions.tiddlyspace;

var _subWikify = Wikifier.prototype.subWikify;

var cleanedTitle = 'This section has been cleaned of any potentially harmful code';

var replaceFunctions = {
	html: function(w) {
		var sanitizedHTML, spanEl;
		this.lookaheadRegExp.lastIndex = w.matchStart;
		var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
		if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {
			sanitizedHTML = $.sanitize(lookaheadMatch[1]);
			spanEl = createTiddlyElement(w.output, 'span', null, 'sanitized');
			spanEl.innerHTML = sanitizedHTML;
			spanEl.setAttribute('title', cleanedTitle);
			w.nextMatch = this.lookaheadRegExp.lastIndex;
		}
	},
	customFormat: function(w) {
		switch(w.matchText) {
			case '@@':
				var e = createTiddlyElement(w.output, 'span');
				var styles = config.formatterHelpers.inlineCssHelper(w);
				if (styles.length === 0) {
					e.className = 'marked';
				}
				w.subWikifyTerm(e, /(@@)/mg);
				break;
			case '{{':
				var lookaheadRegExp = /\{\{[\s]*([\w]+[\s\w]*)[\s]*\{(\n?)/mg;
				lookaheadRegExp.lastIndex = w.matchStart;
				var lookaheadMatch = lookaheadRegExp.exec(w.source);
				if(lookaheadMatch) {
					w.nextMatch = lookaheadRegExp.lastIndex;
					e = createTiddlyElement(w.output,lookaheadMatch[2] == "\n" ? "div" : "span",null,lookaheadMatch[1]);
					w.subWikifyTerm(e,/(\}\}\})/mg);
				}
				break;
		}
	}
};

Wikifier.prototype.subWikify = function(output, terminator) {
	var tid = this.tiddler,
		spaceName = tiddlyspace.currentSpace.name,
		tidSpace, recipeName, stripped;
	try {
		recipeName = tid.fields['server.recipe'] ||
			tid.fields['server.workspace'];
		tidSpace = tiddlyspace.resolveSpaceName(recipeName);
		if (tidSpace !== spaceName) {
			// external tiddler, so replace dangerous formatters
			stripped = stripHTML(tid, this.formatter);
		}
	} catch(e) {
		// do nothing. There's no tiddler, so assume it's safe (?!?!?)
	}

	_subWikify.apply(this, arguments);

	if (stripped) {
		// change back to the original function
		unstripHTML(stripped, this.formatter);
	}
};

// replace potentially unsafe formatters with versions that strip bad HTML/CSS
var stripHTML = function(tid, formatter) {
	var popped = {}, _handler;
	for (var i = 0; i < formatter.formatters.length; i++) {
		var f = formatter.formatters[i];
		if (replaceFunctions[f.name]) {
			_handler = f.handler;
			popped[f.name] = _handler;
			f.handler = replaceFunctions[f.name];
		}
	};

	return popped;
};

// put the original formatters back where they belong
var unstripHTML = function(stripped, formatter) {
	for (var i = 0; i < formatter.formatters.length; i++) {
		var f = formatter.formatters[i];
		if (stripped[f.name]) {
			f.handler = stripped[f.name];
		}
	};
};

})(jQuery);
//}}}
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
<html><nowiki>
<style>
.verbConjugation table{
     border: none;
     background-color: none;
     text-align: center;
}
.verbConjugation tr{
     border: none;
     background-color: none;     
}
.verbConjugation tr th{
     background-color: #519600;
     border: 1px solid #00ff00;
}
.verbConjugation tr.singular{
     background-color: #9ff33d;
}
.verbConjugation tr.plural{
     background-color: #B5F36D; 
}

.verbConjugation tr td{
     border: 1px solid #00ff00;
     text-align: center;
}

</style>
<p> We now start with making simple sentences in Punjabi. As you know verb or verb phrase is an important and indispensable element of a sentence. In punjabi a verb or a verb phrase may change its form under effect of gender, number, person, tense, aspect, etc.

<h1>  Present Tense </h1>
<h2> ਜਾ (Go)</h2>
<h3>1. Present Imperative Tense </h3>

<table class="verbConjugation">
<tr>
    <th rowspan=2 >Subject </th>
    <th rowspan=2>Object </th>
    <th colspan=2> Verb (phrase) </th>
    <th rowspan=2> English Translation </th>
</tr>
<tr>

     <th> Masculine </th>
     <th> Feminine </th>
</tr>
<tr class="singular" >
     <td> ਮੈਂ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td colspan=2>  ਜਾਵਾਂ </td>
     <td>(Let) me go to market </td>
</tr> <tr class="plural">
     <td> ਅਸੀਂ </td>
     <td>  ਬਜ਼ਾਰ </td>
     <td colspan=2>  ਜਾਈਏ </td>
     <td> (Let) us go to market </td>
</tr><tr class="singular">
     <td> ਤੂੰ </td>
     <td> ਬਜ਼ਾਰ </td> 
     <td colspan=2> ਜਾ </td>
     <td> You go to market </td>
</tr><tr class="plural">
     <td> ਤੁਸੀਂ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td colspan=2> ਜਾਓ </td>
     <td> You (plural) go to market </td>
</tr><tr class="singular">
     <td> ਓਹ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td colspan=2> ਜਾਵੇ </td>
     <td> Let him/her go to market </td>
</tr><tr class="plural">
     <td> ਓਹ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td colspan=2> ਜਾਣ </td>
     <td> Let them go to market </td>
</tr>
</table>
<br/>
<table>
<tr>
     <td style="background-color: #9FF33d;" >Singular </td> <td style="background-color: #b5f36d;">Plural </td>
</tr>
</table>



<h3>2. Present Indefinite Tense </h3>

<table class="verbConjugation">
<tr>
    <th rowspan=2 >Subject </th>
    <th rowspan=2>Object </th>
    <th colspan=2> Verb (phrase) </th>
    <th rowspan=2> English Translation </th>
</tr>
<tr>

     <th> Masculine </th>
     <th> Feminine </th>
</tr>
<tr class="singular" >
     <td> ਮੈਂ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td>  ਜਾਂਦਾ ਹਾਂ </td>
     <td> ਜਾਂਦੀ ਹਾਂ</td>
     <td>I go to the market </td>
</tr> <tr class="plural">
     <td> ਅਸੀਂ </td>
     <td>  ਬਜ਼ਾਰ </td>
     <td>  ਜਾਂਦੇ ਹਾਂ </td>
     <td> ਜਾਂਦੀਆਂ ਹਾਂ </td>
     <td> We go to the market </td>
</tr><tr class="singular">
     <td> ਤੂੰ </td>
     <td> ਬਜ਼ਾਰ </td> 
     <td> ਜਾਂਦਾ ਹੈਂ </td>
     <td> ਜਾਂਦੀ ਹੈਂ </td>
     <td> You go to the market </td>
</tr><tr class="plural">
     <td> ਤੁਸੀਂ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਜਾਂਦੇ ਹੋ </td>
     <td> ਜਾਂਦੀਆਂ ਹੋ</td>
     <td> You (plural) go to the market </td>
</tr><tr class="singular">
     <td> ਓਹ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਜਾਂਦਾ ਹੈ </td>
     <td> ਜਾਂਦੀ ਹੈ </td>
     <td> He/She goes to the market </td>
</tr><tr class="plural">
     <td> ਓਹ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਜਾਂਦੇ ਹਨ </td>
     <td> ਜਾਂਦੀਆਂ ਹਨ </td>
     <td> They go to the market </td>
</tr>
<tr class="singular">
     <td> ਰਾਮ  </td>
     <td>ਬਜ਼ਾਰ  </td>
     <td>ਜਾਂਦਾ ਹੈ</td>
     <td>  </td>
     <td> Ram goes to the market </td>
</tr>
<tr class="singular">
     <td>ਸੀਤਾ </td>
     <td>ਬਜ਼ਾਰ </td>
     <td> </td>
     <td> ਜਾਂਦੀ ਹੈ </td>
     <td>Sita goes to the market </td>
</tr>
<tr class="plural">
     <td> ਰਾਮ ਅਤੇ ਸੀਤਾ</td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਜਾਂਦੇ ਹਨ </td>
     <td>  </td>
     <td> Ram and Sita go to the market </td>
</tr>
<tr class="plural">
     <td> ਸੀਤਾ ਅਤੇ ਗੀਤਾ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> </td>
     <td> ਜਾਂਦੀਆਂ ਹਨ </td>
     <td> Sita and Gita go to the market </td>
</tr>
</table>
<br/>
<table>
<tr>
     <td style="background-color: #9FF33d;" >Singular </td> <td style="background-color: #b5f36d;">Plural </td>
</tr>
</table>


<h3>3. Present Imperfect Continuous Tense </h3>
<table class="verbConjugation">
<tr>
    <th rowspan=2 >Subject </th>
    <th rowspan=2>Object </th>
    <th colspan=2> Verb (phrase) </th>
    <th rowspan=2> English Translation </th>
</tr>
<tr>

     <th> Masculine </th>
     <th> Feminine </th>
</tr>
<tr class="singular" >
     <td> ਮੈਂ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td>  ਜਾ ਰਿਹਾ ਹਾਂ  </td>
     <td> ਜਾ ਰਹੀ ਹਾਂ</td>
     <td>I am going to the market </td>
</tr> <tr class="plural">
     <td> ਅਸੀਂ </td>
     <td>  ਬਜ਼ਾਰ </td>
     <td>  ਜਾ ਰਹੇ ਹਾਂ </td>
     <td> ਜਾ ਰਹੀਆਂ ਹਾਂ </td>
     <td> We are going to the market </td>
</tr><tr class="singular">
     <td> ਤੂੰ </td>
     <td> ਬਜ਼ਾਰ </td> 
     <td> ਜਾ ਰਿਹਾ ਹੈਂ </td>
     <td> ਜਾ ਰਹੀ ਹੈਂ </td>
     <td> You are going to the market </td>
</tr><tr class="plural">
     <td> ਤੁਸੀਂ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਜਾ ਰਹੇ ਹੋ </td>
     <td> ਜਾ ਰਹੀਆਂ ਹੋ</td>
     <td> You (plural) are going to the market </td>
</tr><tr class="singular">
     <td> ਓਹ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਜਾ ਰਿਹਾ ਹੈ </td>
     <td> ਜਾ ਰਹੀ ਹੈ </td>
     <td> He/She is going to the market </td>
</tr><tr class="plural">
     <td> ਓਹ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਜਾ ਰਹੇ ਹਨ </td>
     <td> ਜਾ ਰਹੀਆਂ ਹਨ </td>
     <td> They are going to the market </td>
</tr>
<tr class="singular">
     <td> ਰਾਮ  </td>
     <td>ਬਜ਼ਾਰ  </td>
     <td>ਜਾ ਰਿਹਾ ਹੈ </td>
     <td> </td>
     <td> Ram is going to the market </td>
</tr>
<tr class="singular">
     <td>ਸੀਤਾ </td>
     <td>ਬਜ਼ਾਰ </td>
     <td> </td>
     <td>ਜਾ ਰਹੀ ਹੈ </td>
     <td> Sita is going to the market </td>
</tr>
<tr class="plural">
     <td> ਰਾਮ ਅਤੇ ਸੀਤਾ</td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਜਾ ਰਹੇ ਹਨ </td>
     <td>  </td>
     <td> Ram and Sita are going to the market </td>
</tr>
<tr class="plural">
     <td> ਸੀਤਾ ਅਤੇ ਗੀਤਾ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> </td>
     <td> ਜਾ ਰਹੀਆਂ ਹਨ </td>
     <td> Sita and Gita are going to the market </td>
</tr>
</table>
<br/>
<table>
<tr>
     <td style="background-color: #9FF33d;" >Singular </td> <td style="background-color: #b5f36d;">Plural </td>
</tr>
</table>

<h3>4. Present Perfect Continuous Tense </h3>
<table class="verbConjugation">
<tr>
    <th rowspan=2 >Subject </th>
    <th rowspan=2>Object </th>
    <th colspan=2> Verb (phrase) </th>
    <th rowspan=2> English Translation </th>
</tr>
<tr>

     <th> Masculine </th>
     <th> Feminine </th>
</tr>
<tr class="singular" >
     <td> ਮੈਂ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td>  ਜਾਂਦਾ ਰਿਹਾ ਹਾਂ  </td>
     <td> ਜਾਂਦੀ ਰਹੀ ਹਾਂ</td>
     <td>I have been going to the market </td>
</tr> <tr class="plural">
     <td> ਅਸੀਂ </td>
     <td>  ਬਜ਼ਾਰ </td>
     <td>  ਜਾਂਦੇ ਰਹੇ ਹਾਂ </td>
     <td> ਜਾਂਦੀਆਂ ਰਹੀਆਂ ਹਾਂ </td>
     <td> We have been going to the market </td>
</tr><tr class="singular">
     <td> ਤੂੰ </td>
     <td> ਬਜ਼ਾਰ </td> 
     <td> ਜਾਂਦਾ ਰਿਹਾ ਹੈਂ </td>
     <td> ਜਾਂਦੀ ਰਹੀ ਹੈਂ </td>
     <td> You have been going to the market </td>
</tr><tr class="plural">
     <td> ਤੁਸੀਂ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਜਾਂਦੇ ਰਹੇ ਹੋ </td>
     <td> ਜਾਂਦੀਆਂ ਰਹੀਆਂ ਹੋ</td>
     <td> You (plural) have been going to the market </td>
</tr><tr class="singular">
     <td> ਓਹ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਜਾਂਦਾ ਰਿਹਾ ਹੈ </td>
     <td> ਜਾਂਦੀ ਰਹੀ ਹੈ </td>
     <td> He/She has been going to the market </td>
</tr><tr class="plural">
     <td> ਓਹ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਜਾਂਦੇ ਰਹੇ ਹਨ </td>
     <td> ਜਾਂਦੀਆਂ ਰਹੀਆਂ ਹਨ </td>
     <td> They have been going to the market </td>
</tr>
<tr class="singular">
     <td> ਰਾਮ  </td>
     <td>ਬਜ਼ਾਰ  </td>
     <td>ਜਾਂਦਾ ਰਿਹਾ ਹੈ </td>
     <td> </td>
     <td> Ram has been going to market </td>
</tr>
<tr class="singular">
     <td>ਸੀਤਾ </td>
     <td>ਬਜ਼ਾਰ </td>
     <td> </td>
     <td>ਜਾਂਦੀ ਰਹੀ ਹੈ </td>
     <td> Sita has been going to the market </td>
</tr>
<tr class="plural">
     <td> ਰਾਮ ਅਤੇ ਸੀਤਾ</td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਜਾਂਦੇ ਰਹੇ ਹਨ </td>
     <td>  </td>
     <td> Ram and Sita have been going to the market </td>
</tr>
<tr class="plural">
     <td> ਸੀਤਾ ਅਤੇ ਗੀਤਾ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> </td>
     <td> ਜਾਂਦੀਆਂ ਰਹੀਆਂ ਹਨ </td>
     <td> Sita and Gita have been going to the market </td>
</tr>
</table>
<br/>
<table>
<tr>
     <td style="background-color: #9FF33d;" >Singular </td> <td style="background-color: #b5f36d;">Plural </td>
</tr>
</table>

<h3>5. Present Perfect indefinite</h3>
<table class="verbConjugation">
<tr>
    <th rowspan=2 >Subject </th>
    <th rowspan=2>Object </th>
    <th colspan=2> Verb (phrase) </th>
    <th rowspan=2> English Translation </th>
</tr>
<tr>

     <th> Masculine </th>
     <th> Feminine </th>
</tr>
<tr class="singular" >
     <td> ਮੈਂ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td>  ਗਿਆ ਹਾਂ  </td>
     <td> ਗਈ ਹਾਂ</td>
     <td> I have gone to the market </td>
</tr> <tr class="plural">
     <td> ਅਸੀਂ </td>
     <td>  ਬਜ਼ਾਰ </td>
     <td> ਗਏ ਹਾਂ </td>
     <td> ਗਈਆਂ ਹਾਂ </td>
     <td> We have gone to the market  </td>
</tr><tr class="singular">
     <td> ਤੂੰ </td>
     <td> ਬਜ਼ਾਰ </td> 
     <td> ਗਿਆ ਹੈਂ </td>
     <td> ਗਈ ਹੈਂ </td>
     <td> You have gone to the market  </td>
</tr><tr class="plural">
     <td> ਤੁਸੀਂ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਗਏ ਹੋ </td>
     <td> ਗਈਆਂ ਹੋ</td>
     <td> You(plural) have gone to the market  </td>
</tr><tr class="singular">
     <td> ਓਹ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਗਿਆ ਹੈ </td>
     <td> ਗਈ ਹੈ </td>
     <td> He/She has gone to the market  </td>
</tr><tr class="plural">
     <td> ਓਹ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਗਏ ਹਨ </td>
     <td> ਗਈਆਂ ਹਨ </td>
     <td> They have gone to the market  </td>
</tr>
<tr class="singular">
     <td> ਰਾਮ  </td>
     <td>ਬਜ਼ਾਰ  </td>
     <td>ਗਿਆ ਹੈ </td>
     <td> </td>
     <td> Ram has gone to the market </td>
</tr>
<tr class="singular">
     <td>ਸੀਤਾ </td>
     <td>ਬਜ਼ਾਰ </td>
     <td> </td>
     <td>ਗਈ ਹੈ </td>
     <td>Sita has gone to the market </td>
</tr>
<tr class="plural">
     <td> ਰਾਮ ਅਤੇ ਸੀਤਾ</td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਗਏ ਹਨ </td>
     <td>  </td>
     <td> Ram and Sita have gone to the market</td>
</tr>
<tr class="plural">
     <td> ਸੀਤਾ ਅਤੇ ਗੀਤਾ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> </td>
     <td> ਗਈਆਂ ਹਨ </td>
     <td> Sita and Gita have gone to the market </td>
</tr>
</table>
<br/>
<table>
<tr>
     <td style="background-color: #9FF33d;" >Singular </td> <td style="background-color: #b5f36d;">Plural </td>
</tr>
</table>

<h3>6. Present Perfect Definite </h3>
<table class="verbConjugation">
<tr>
    <th rowspan=2 >Subject </th>
    <th rowspan=2>Object </th>
    <th colspan=2> Verb (phrase) </th>
    <th rowspan=2> English Translation </th>
</tr>
<tr>

     <th> Masculine </th>
     <th> Feminine </th>
</tr>
<tr class="singular" >
     <td> ਮੈਂ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td>  ਜਾ ਚੁੱਕਾ ਹਾਂ  </td>
     <td> ਜਾ ਚੁੱਕੀ ਹਾਂ</td>
     <td> </td>
</tr> <tr class="plural">
     <td> ਅਸੀਂ </td>
     <td>  ਬਜ਼ਾਰ </td>
     <td> ਜਾ ਚੁੱਕੇ ਹਾਂ </td>
     <td> ਜਾ ਚੁੱਕੀਆਂ ਹਾਂ </td>
     <td>  </td>
</tr><tr class="singular">
     <td> ਤੂੰ </td>
     <td> ਬਜ਼ਾਰ </td> 
     <td> ਜਾ ਚੁੱਕਾਂ ਹੈਂ </td>
     <td> ਜਾ ਚੁੱਕੀ ਹੈਂ </td>
     <td>  </td>
</tr><tr class="plural">
     <td> ਤੁਸੀਂ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਜਾ ਚੁੱਕੇ ਹੋ </td>
     <td> ਜਾ ਚੁੱਕੀਆਂ ਹੋ</td>
     <td>  </td>
</tr><tr class="singular">
     <td> ਓਹ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਜਾ ਚੁੱਕਾ ਹੈ </td>
     <td> ਜਾ ਚੁੱਕੀ ਹੈ </td>
     <td>  </td>
</tr><tr class="plural">
     <td> ਓਹ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਜਾ ਚੁੱਕੇ ਹਨ </td>
     <td> ਜਾ ਚੁੱਕੀਆਂ ਹਨ </td>
     <td>  </td>
</tr>
<tr class="singular">
     <td> ਰਾਮ  </td>
     <td>ਬਜ਼ਾਰ  </td>
     <td>ਜਾ ਚੁੱਕਾ ਹੈ </td>
     <td> </td>
     <td>  </td>
</tr>
<tr class="singular">
     <td>ਸੀਤਾ </td>
     <td>ਬਜ਼ਾਰ </td>
     <td> </td>
     <td>ਜਾ ਚੁੱਕੀ ਹੈ </td>
     <td> </td>
</tr>
<tr class="plural">
     <td> ਰਾਮ ਅਤੇ ਸੀਤਾ</td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਜਾ ਚੁੱਕੇ ਹਨ </td>
     <td>  </td>
     <td> </td>
</tr>
<tr class="plural">
     <td> ਸੀਤਾ ਅਤੇ ਗੀਤਾ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> </td>
     <td> ਜਾ ਚੁੱਕੀਆਂ ਹਨ </td>
     <td> Sita and Gita  </td>
</tr>
</table>
<br/>
<table>
<tr>
     <td style="background-color: #9FF33d;" >Singular </td> <td style="background-color: #b5f36d;">Plural </td>
</tr>
</table>
<h3>7. Conditional Present Tense </h3>
<table class="verbConjugation">
<tr>
    <th rowspan=2> Conjugate </th>
    <th rowspan=2 >Subject </th>
    <th rowspan=2>Object </th>
    <th colspan=2> Verb (phrase) </th>
    <th rowspan=2> English Translation </th>
</tr>
<tr>

     <th> Masculine </th>
     <th> Feminine </th>
</tr>
<tr class="singular" >
     <td> ਜੇ </td>
     <td> ਮੈਂ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td colspan=2>  ਜਾਵਾਂ   </td>

     <td> If I go to the market </td>
</tr> <tr class="plural">
     <td> ਜੇ </td>
     <td> ਅਸੀਂ </td>
     <td>  ਬਜ਼ਾਰ </td>
     <td colspan=2> ਜਾਈਏ </td>
     <td> If we go to the market </td>
</tr><tr class="singular">
     <td> ਜੇ </td>
     <td> ਤੂੰ </td>
     <td> ਬਜ਼ਾਰ </td> 
     <td colspan=2> ਜਾਵੇਂ </td>
     <td> If you go to the market  </td>
</tr><tr class="plural">
     <td> ਜੇ </td>
     <td> ਤੁਸੀਂ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td colspan=2> ਜਾਵੋਂ </td>
     <td> If you(plural) go to the market  </td>
</tr><tr class="singular">
     <td> ਜੇ </td>
     <td> ਓਹ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td colspan=2> ਜਾਵੇ </td>
     <td> If he goes to the market  </td>
</tr><tr class="plural">
     <td> ਜੇ </td>
     <td> ਓਹ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td colspan=2> ਜਾਣ </td>
     <td> If they go to the market  </td>
</tr>
<tr class="singular">
     <td> ਜੇ </td>
     <td> ਰਾਮ  </td>
     <td>ਬਜ਼ਾਰ  </td>
     <td colspan=2>ਜਾਵੇ </td>
     <td> If Ram goes to the market  </td>
</tr>
<tr class="singular">
     <td> ਜੇ </td>
     <td>ਸੀਤਾ </td>
     <td>ਬਜ਼ਾਰ </td>
     <td colspan=2>ਜਾਵੇ </td>
     <td>If Sita goes to the market </td>
</tr>
<tr class="plural">
     <td> ਜੇ </td>
     <td> ਰਾਮ ਅਤੇ ਸੀਤਾ</td>
     <td> ਬਜ਼ਾਰ </td>
     <td colspan=2> ਜਾਣ </td>
     <td>If Ram and Sita go to the market </td>
</tr>
<tr class="plural">
     <td> ਜੇ </td>
     <td> ਸੀਤਾ ਅਤੇ ਗੀਤਾ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td colspan=2> ਜਾਣ </td>
     <td> If Sita and Gita go to the market  </td>
</tr>
</table>
<br/>
<table>
<tr>
     <td style="background-color: #9FF33d;" >Singular </td> <td style="background-color: #b5f36d;">Plural </td>
</tr>
</table>
</html>
<!--{{{-->
<link rel="shortcut icon" href="/recipes/punjabi_public/tiddlers/favicon.ico" />
<link href="/bags/punjabi_public/tiddlers.atom" rel="alternate"
	type="application/atom+xml" title="punjabi's public feed" />
<!--}}}-->
|!Letter|!Name|!Pron.|!Letter|!Name|!Pron.|!Letter|!Name|!Pron.|!Letter|!Name|!Pron.|!Letter|!Name|!Pron.|
|ੳ|>|Ura|ਅ|>|Aira|ੲ|>|Iri|ਸ|Sussa|Sa|ਹ|Haha|Ha|
|ਕ|Kakka|Ka|ਖ|Khukha|Kha|	ਗ|Gugga|Ga|ਘ|Ghugga|Gha|ਙ|Ungga|Nga|
|ਚ|Chuchaa|Ca|ਛ|Chhuchha|Cha|ਜ|Jujja|Ja|ਝ|Jhujja|Jha|ਞ|Neya|Nya|
|ਟ|Tainka|Tta|ਠ|Thutha|Ttha|ਡ|Dudda|Dda|ਢ|Dhudda|Ddha|ਣ|Nahnha|Nna|
|ਤ|Tutta|Ta|ਥ|Thutha|Tha|ਦ|Duda|Da|ਧ|Dhuda|Dha|ਨ|Nunna|Na|
|ਪ|Puppa|Pa|ਫ|Phupha|Pha|ਬ|Bubba|Ba|ਭ|Bhubba|Bha|ਮ|Mumma|Ma|
|ਯ|Yaiyya|Ya|ਰ|Rara|Ra|ਲ|Lalla|La|ਵ|Vava|Va|ੜ|Rharha|Rha|


| !Consonants and their pronounciation |>|>|>|>|>|>|>|>|>|
| --ੳ <br> Ura-- | | --ਅ<br>Aira-- | | --ੲ<br>Iri-- | | !ਸ <br> Sussa | Alveolar | !ਹ <br> Haha | Glottal |
|~|~|~|~|~|~|~| Fricative |~| Fricative |
| Velar |>|>|>|>|>|>|>|>|>|
| !ਕ <br> (Kakka) |  Plos <br> Vcls Uasp | !ਖ <br> (Khukha) | Plos <br> Vcls Asp | !ਗ <br> (Gugga) | Plos <br> Vc Uasp | !ਘ <br> (Ghugga) | Plos <br> Vc Asp | !ਙ <br> (Ungga) | Plos <br> Nasal |
|~|k|~|k^^h^^|~|g|~||~|ŋ|
| Palatal |>|>|>|>|>|>|>|>|>|
| !ਚ <br> Chuchaa | Affr <br> Vcls Unasp | !ਛ <br> Chhuchha | Affr <br> Vcls Asp | !ਜ <br> Jujja | Affr <br>Voiced Unasp | !ਝ <br> Jhujja | Affr <br> Vc Asp | !ਞ <br> Nenya | Nasal |
| Retroflex |>|>|>|>|>|>|>|>|>|
| !ਟ <br> Tainka | Plos <br> Vcls Unasp | !ਠ <br> Thutha | Plos <br> Vcls Asp | !ਡ <br> Dudda | Plos <br> Vc Unasp | !ਢ <br> Dhudda | Plos <br> Vc Asp | !ਣ <br> Nahnha | Plos <br> Nasal |
| Dental |>|>|>|>|>|>|>|>|>|
| !ਤ <br> Tutta | Plos <br> Vcls Unasp | !ਥ <br> Thutha | Plos <br> Vcls Asp | !ਦ <br> Duda | Plos<br> Vc Unasp | !ਧ <br> Dhuda | Plos<br> Vc Asp | !ਨ <br> Nunna | Plos <br> Nasal |
| Bilabial |>|>|>|>|>|>|>|>|>|
| !ਪ<br>Puppa | Plos<br>Vcls Unasp | !ਫ<br>Phupha | Plos<br>Vcls Asp | !ਬ<br>Bubba | Plos<br>Vc Unas | !ਭ<br>Bhubba | Plos<br>Vc Asp | !ਮ<br>Mumma | Plos<br>Nasal |
| !ਯ <br> Yaiyya | Palatal | !ਰ <br> Rara| Alveolar | !ਲ <br> Lalla| Alveolar | !ਵ <br> Vava| Labio-dental | !ੜ <br> Rharha | Retroflex |
|~| Semi-vowel |~| Roller |~| Lateral |~| Semi-vowel |~| Flapped |

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
/***
|''Name''|BinaryTiddlersPlugin|
|''Description''|renders base64-encoded binary tiddlers as images or links|
|''Author''|FND|
|''Version''|0.3.2|
|''Status''|@@beta@@|
|''Source''|http://svn.tiddlywiki.org/Trunk/association/plugins/BinaryTiddlersPlugin.js|
|''License''|[[BSD|http://www.opensource.org/licenses/bsd-license.php]]|
|''CoreVersion''|2.5|
!Code
***/
//{{{
(function($) {

"use strict";

var ctfield = "server.content-type";

var plugin = config.extensions.BinaryTiddlersPlugin = {
	isWikiText: function(tiddler) {
		var ctype = tiddler.fields[ctfield];
		if(ctype) {
			if (ctype === 'text/x-tiddlywiki') {
				return true;
			}
			return !this.isBinary(tiddler) && !this.isTextual(ctype);
		} else {
			return true;
		}
	},
	// NB: pseudo-binaries are considered non-binary here
	isBinary: function(tiddler) {
		var ctype = tiddler.fields[ctfield];
		return ctype ? !this.isTextual(ctype) : false;
	},
	isTextual: function(ctype) {
		return ctype.indexOf("text/") === 0
			|| this.endsWith(ctype, "+xml")
			|| ctype === 'application/json'
			|| ctype === 'application/javascript';
	},
	endsWith: function(str, suffix) {
		return str.length >= suffix.length &&
			str.substr(str.length - suffix.length) === suffix;
	},
	isLink: function(tiddler) {
		return this.isBinary(tiddler) && tiddler.text.indexOf("<html>") !== -1;
	}
};

// Disable edit for linked tiddlers (for now)
// This will be changed to a GET then PUT
config.commands.editTiddler.isEnabled = function(tiddler) {
    var existingTest = config.commands.editTiddler.isEnabled;
    if (existingTest) {
        return existingTest && !plugin.isLink(tiddler);
    } else {
        return !plugin.isLink(tiddler);
    }
};

// hijack text viewer to add special handling for binary tiddlers
var _view = config.macros.view.views.wikified;
config.macros.view.views.wikified = function(value, place, params, wikifier,
		paramString, tiddler) {
	var ctype = tiddler.fields["server.content-type"];
	if(params[0] === "text" && ctype && ctype !== 'text/x-tiddlywiki' &&
			!tiddler.tags.contains("systemConfig") && !plugin.isLink(tiddler)) {
		var el;
		if(plugin.isBinary(tiddler)) {
			var uri = "data:%0;base64,%1".format([ctype, tiddler.text]); // TODO: fallback for legacy browsers
			if(ctype.indexOf("image/") === 0) {
				el = $("<img />").attr("alt", tiddler.title).attr("src", uri);
			} else {
				el = $("<a />").attr("href", uri).text(tiddler.title);
			}
		} else {
			el = $("<pre />").text(tiddler.text);
		}
		el.appendTo(place);
	} else {
		_view.apply(this, arguments);
	}
};

// hijack edit macro to disable editing of binary tiddlers' body
var _editHandler = config.macros.edit.handler;
config.macros.edit.handler = function(place, macroName, params, wikifier,
		paramString, tiddler) {
	if(params[0] === "text" && plugin.isBinary(tiddler)) {
		return false;
	} else {
		_editHandler.apply(this, arguments);
	}
};

// hijack autoLinkWikiWords to ignore binary tiddlers
var _autoLink = Tiddler.prototype.autoLinkWikiWords;
Tiddler.prototype.autoLinkWikiWords = function() {
	return plugin.isWikiText(this) ? _autoLink.apply(this, arguments) : false;
};

}(jQuery));
//}}}
/***
|''Name''|ImageMacroPlugin|
|''Version''|0.9.4|
|''Description''|Allows the rendering of svg images in a TiddlyWiki|
|''Author''|Osmosoft|
|''License''|[[BSD|http://www.opensource.org/licenses/bsd-license.php]]|
|''Notes''|Currently only works in modern browsers (not IE)|
|''Requires''|BinaryTiddlersPlugin|
!Usage
{{{<<image SVG>>}}} will render the text of the tiddler with title SVG as an SVG image (but not in ie where it will fail silently)
!!Parameters
width/height: specify width/height parameters
link: make the image link to a given location
tiddlyLink: link to a tiddler

!Notes
Binary tiddlers in TiddlyWeb when passed through the wikifier will be shown as images.
eg. {{{<<view text wikified>>}}} on a binary tiddler will show the image.
{{{<<view fieldname image>>}}}
will render the value of the tiddler field 'fieldname' as an image. This field can contain a tid
{{{<<image SiteIcon>>}}}
will create an image tag where the tiddler has content type beginning image and not ending +xml
will attempt to create svg object in other scenarios
{{{<<image /photos/x.jpg>>}}}
will create an image tag with src /photos/x.jpg as long as there is not a tiddler called /photos/x.jpg in 
which case it will render that tiddler as an image. Note for the case of svg files it will attempt to render as an svg if possible via the image
tag. It doesn't embed the svg in the dom for security reasons as svg code can contain javascript.
!Code
***/
//{{{
(function($) {

var macro = config.macros.image = {
	shim: "/bags/common/tiddlers/shim",
	ieVersion: config.browser.isIE ? parseInt(config.browser.ieVersion[1], 10) : false,
	svgns: "http://www.w3.org/2000/svg",
	xlinkns: "http://www.w3.org/1999/xlink", 
	svgAvailable: document.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure", "1.1"),
	_fixPrefix: 1,
	_external_cache: {},
	_image_tag_cache: {},
	_image_dimensions: {},
	locale: {
		badImage: "This image cannot be displayed."
	},
	handler: function(place, macroName, params, wikifier, paramString, tiddler){
		var imageSource = params[0];
		// collect named arguments
		var args = macro.getArguments(paramString, params);
		this.renderImage(place, imageSource, args);
	},
	init: function() {
		var startupImages = store.getTaggedTiddlers("systemImage");
		var place = $("<div />").attr("id", "systemImageArea").appendTo("body").hide()[0];
		for(var i = 0; i < startupImages.length; i++) {
			var image = startupImages[i];
			macro.renderImage(place, image.title, { idPrefix: "" });
		}
		var data = new Image();
		data.onload = function() {
			// note ie 8 only supports data uris up to 32k so cannot be relied on
			macro.supportsDataUris = this.width != 1 || this.height != 1 ? false : true;
			macro.supportsDataUris = macro.ieVersion && macro.ieVersion < 9 ? false : macro.supportsDataUris;
		};
		data.onerror = data.onload;
		data.src = "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw==";
	},
	refreshImage: function(src) {
		var elements = macro._image_tag_cache[src] ? macro._image_tag_cache[src] : [];
		if(macro._image_dimensions[src]) {
			macro._image_dimensions[src] = false;
		}
		for(var i = 0; i < elements.length; i++) {
			var el = $(elements[i]);
			var newSrc = "%0?nocache=%1".format(src, Math.random());
			el.attr("src", newSrc); // force reload
		}
	},
	isBinaryImageType: function(contentType) {
		return (contentType && contentType.indexOf("image") === 0 &&
			contentType.indexOf("+xml") != contentType.length - 4) ? true : false;
	},
	isImageTiddler: function(tiddler) {
		return macro.isSVGTiddler(tiddler) || macro.isBinaryImageTiddler(tiddler);
	},
	isSVGTiddler: function(tiddler) {
		var type = tiddler ? tiddler.fields['server.content-type'] : false;
		return type == "image/svg+xml";
	},
	isBinaryImageTiddler: function(tiddler) {
		return macro.isBinaryImageType(tiddler.fields['server.content-type']);
	},
	renderImage: function(place, imageSource, options) {
		var imageTiddler = store.getTiddler(imageSource);
		var container;
		var classes = ["image"];
		if(options.link) {
			classes = classes.concat(["imageLink", "externalLink"]);
			container = $("<a />").attr("href", options.link).appendTo(place)[0];
		} else if(options.tiddlyLink) {
			classes.push("imageLink");
			container = createTiddlyLink(place, options.tiddlyLink, false);
		} else {
			container = $("<span />").appendTo(place)[0];
		}
		$(container).addClass(classes.join(" "));

		options = options ? options : {};
		if(imageTiddler && macro.isBinaryImageTiddler(imageTiddler)) { // handle the case where we have an image url
			return macro._renderBinaryImageTiddler(container, imageTiddler, options);
		} else if(imageTiddler){ // handle the case where we have a tiddler
			return macro._renderSVGTiddler(container, imageTiddler, options);
		} else { // we have a string representing a url
			return macro._renderBinaryImageUrl(container, imageSource, options);
		}
	},
	_renderAlternateText: function(container, options) {
		var img;
		var src = options.src || "";
		if(options.width && options.height) {
			img = $("<img />").attr("src", src).addClass("svgImageText").attr("width", options.width).
				attr("height", options.height).appendTo(container);
		}
		var alt = options.alt;
		if(img && alt) {
			img.attr("alt", alt).attr("title", alt);
		} else if(alt) {
			$(container).addClass("svgImageText").text(alt);
		}
		macro._image_tag_cache[src] = img;
	},
	_renderSVGTiddler: function(place, tiddler, options) {
		if(!options) {
			options = {};
		}
		merge(options, { tiddler: tiddler, fix: true});

		if(macro.svgAvailable) {
			this._importSVG(place, options); // display the svg
		} else if(options.altImage) {
			var image = options.altImage;
			delete options.altImage;
			this._renderBinaryImageUrl(place, image, options);
		} else {
			this._renderAlternateText(place, options); // instead of showing the image show the alternate text.
		}
	},
	_renderBinaryImageTiddler: function(place, tiddler, options) {
		var resourceURI;
		var fields = tiddler.fields;
		if(fields["server.type"] == "tiddlyweb") { // construct an accurate url for the resource
			resourceURI = "%0/%1/tiddlers/%2".format(config.defaultCustomFields["server.host"],
				fields["server.workspace"], encodeURI(fields["server.title"]));
		} else { // guess the url for the resource
			resourceURI = tiddler.title;
		}
		var ctype = fields["server.content-type"] || tiddler.type;
		var text = tiddler.text;
		if(macro.supportsDataUris && ctype && text.indexOf("<html") == -1) {
			var uri = "data:%0;base64,%1".format(ctype, text);
			options.src = resourceURI;
			return macro._renderBinaryImageUrl(place, uri, options);
		} else if(options.src) {
			return macro._renderBinaryImageUrl(place, options.src, options);
		} else {
			return macro._renderBinaryImageUrl(place, resourceURI, options);
		}
	},
	_renderImageTag: function(container, src, width, height, options) {
		var img;
		img = $("<img />").appendTo(container);
		if(height) {
			img.attr("height", height);
		}
		if(width) {
			img.attr("width", width);
		}
		if(macro.ieVersion && macro.ieVersion < 7 && macro.shim && options.ie6png) {
			$(img).css({width: userW, height: userH,
					filter: "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='%0', sizingMethod='scale')".format(src)
				}).attr("src", macro.shim);
		} else {
			img.attr("src", src);
		}
		if(!macro._image_tag_cache[options.srcUrl]) {
			macro._image_tag_cache[options.srcUrl] = [];
		}
		img = $(img).addClass(options.imageClass)[0];
		macro._image_tag_cache[options.srcUrl].push(img);
		return img;
	},
	_getDimensions: function(realDimensions, reqDimensions, preserve) {
		var w = realDimensions.width;
		var h = realDimensions.height;
		var reqh = reqDimensions.height;
		var reqw = reqDimensions.width;
		var finalw = w, finalh = h;
		var ratiow = reqw / w, ratioh = reqh / h;
		var scaledw = ratioh * w;
		var scaledh = ratiow * h;
		if(!reqw && reqh) {
			finalw = scaledw;
			finalh = reqh;
		} else if(reqw && !reqh) {
			finalw = reqw;
			finalh = scaledh;
		} else if(reqh && reqw) {
			var preserveWidth = w > h ? true : false;
			if(preserve) {
				if(preserveWidth && scaledh < reqh) {
					finalh = scaledh;
					finalw = reqw;
				} else {
					finalh = reqh;
					finalw = scaledw;
				}
			} else {
				finalw = reqw;
				finalh = reqh;
			}
		}
		return { width: parseInt(finalw, 10), height: parseInt(finalh, 10) };
	},
	_renderBinaryImageUrl: function(container, src, options) {
		var srcUrl = options.src ? options.src : src;
		srcUrl = srcUrl.indexOf("/") === -1 ? "/%0".format(srcUrl) : srcUrl; // for IE. 
		var image_dimensions = macro._image_dimensions[srcUrl];
		var image = new Image(); // due to weird scaling issues where you use just a width or just a height
		var createImageTag = function(dimensions, error) {
			if(error) {
				var altImage = options.altImage;
				if(altImage) {
					delete options.altImage;
					macro._renderBinaryImageUrl(container, altImage, options);
				} else {
					options.src = src;
					macro._renderAlternateText(container, options);
				}
			} else {
				var dim = macro._getDimensions(dimensions, { 
					width: options.width, height: options.height }, options.preserveAspectRatio);
				options.srcUrl = srcUrl;
				macro._renderImageTag(container, src, dim.width, dim.height, options);
			}
		};

		if(!image_dimensions) {
			image.onload = function() {
				var dimensions = { width: image.width, height: image.height};
				macro._image_dimensions[srcUrl] = dimensions;
				createImageTag(dimensions);
			};
			image.onerror = function() {
				createImageTag(null, true);
			};
			image.src = src;
		} else {
			createImageTag(image_dimensions);
		}
	},
	_generateIdPrefix: function(){
		return "twsvgfix_" + (this._fixPrefix++).toString() + "_";
	},
	_fixSVG: function(childNodes, idPrefix) {
		var urlPattern = /url\(\#([^\)]*)\)*/ig;
		var fixes = [
		{ attr: "id", pattern: /^(.*)$/ig },
		{ attr: "href", namespace: macro.xlinkns, pattern: /^#(.*)$/ig }
		];
		var url_fixes = ["filter", "fill", "mask", "stroke", "style"];
		for(var i = 0; i < url_fixes.length; i++) {
			fixes.push({ attr: url_fixes[i], pattern: urlPattern });
		}
		for(var t = 0; t < childNodes.length; t++) {
			var node = childNodes[t];
			for(var a = 0; a < fixes.length; a++) {
				var fix = fixes[a];
				var attr = fix.attr;
				var ns = fix.namespace || "";
				if(node.hasAttributeNS && node.hasAttributeNS(ns, attr)) {
					var v = node.getAttributeNS(ns, attr);
					fix.pattern.lastIndex = 0;
					var match = fix.pattern.exec(v);
					if(match) {
						// Make sure replacement string doesn't contain any single dollar signs
						var toReplace = match[1];
						if(toReplace.indexOf(idPrefix) !== 0 && toReplace.indexOf("twglobal_") !== 0) {
							var replacement = (idPrefix + toReplace).replace("$", "$$$$"); 
							v = v.replace(match[1], replacement);
						}
						node.setAttributeNS(ns, attr,v);
					}
				}
			}
			var children = node.childNodes;
			if(children.length > 0) {
				this._fixSVG(children, idPrefix);
			}
		}
	},
	_importSVG: function(place, options){
		options = options ? options : {};
		var svgDoc, tiddlerText = options.tiddler.text;
		if (window.DOMParser) {
			svgDoc = new DOMParser().parseFromString(tiddlerText, "application/xml").documentElement;
			var idPrefix = options.idPrefix || this._generateIdPrefix();
			this._fixSVG([svgDoc], idPrefix);
			var el = document.importNode(svgDoc, true);
			var svgHolder = document.createElementNS(macro.svgns,"svg");
			var width = options.width;
			var height = options.height;
			if(width || height) {
				if(width && height) { // set view box of containing svg element based on the svg viewbox and width and height.
					var viewBox = el.getAttribute("viewBox");
					var topLeft = "0 0";
					if(viewBox) {
						topLeft = viewBox.replace(/([0-9]*) +([0-9]*) +([0-9]*) +([0-9]*) */gi,"$1 $2");
					}
					svgHolder.setAttributeNS(macro.svgns, "viewBox", "0 0 %0 %1".format(width, height));
				} else {
					if(!width) {
						width = el.getAttribute("width");
					}
					if(!height) {
						height = el.getAttribute("height");
					}
				}
				svgHolder.setAttribute("width", width);
				svgHolder.setAttribute("height", height);

				el.setAttribute("width", "100%");
				el.setAttribute("height", "100%");
				svgHolder.setAttribute("class", "svgImage svgIcon %0".format(options.imageClass || ""));
				svgHolder.appendChild(el);
				place.appendChild(svgHolder);
			}
			else {
				var existing = el.className ? el.className.baseVal : "";
				el.setAttribute("class","svgImage %0".format(existing));
				place.appendChild(el);
			}
			// if a tiddler attribute is set this is read as a link
			$("[tiddler], [tiddlyLink]", place).attr("refresh", "link").click(function(ev) {
				var tiddler = $(ev.target).attr("tiddlyLink");
				if(tiddler) {
					story.displayTiddler(ev.target, tiddler);
				}
			});
		}
	},
	getArguments: function(paramString, params) {
		var args = paramString.parseParams("name", null, true, false, true)[0];
		var options = {};
		for(var id in args) {
			if(true) {
				var p = args[id];
				if(id == "def") {
					options[id] = p;
				} else {
					options[id] = p[0];
				}
			}
		}
		var width = isNaN(params[1]) ? false : parseInt(params[1], 10);
		var height = isNaN(params[2]) ? false : parseInt(params[2], 10);

		options.width = macro.lookupArgument(options, "width", width);
		options.height = macro.lookupArgument(options, "height", height);
		options.preserveAspectRatio = args.preserveAspectRatio && 
			args.preserveAspectRatio[0] == "yes" ? true : false;
		options.tiddlyLink = macro.lookupArgument(options, "tiddlyLink", false);
		options.link = macro.lookupArgument(options, "link", false);
		return options;
	},
	lookupArgument: function(args, id, ifEmpty) {
		return args[id] ? args[id] : ifEmpty;
	}
};

// update views
var _oldwikifiedview = config.macros.view.views.wikified;
// update wikifier to check tiddler type before rendering
merge(config.macros.view.views, {
	wikified: function(value, place, params, wikifier, paramString, tiddler) {
		if(macro.isImageTiddler(tiddler) && params[0] == "text") {
			var newplace = $("<div />").addClass("wikifiedImage").appendTo(place)[0];
			macro.renderImage(newplace, tiddler.title, { alt: macro.locale.badImage });
		} else {
			_oldwikifiedview.apply(this, arguments);
		}
	},
	image: function(value, place, params, wikifier, paramString, tiddler) {
		// a field can point to another tiddler whereas text is the current tiddler.
		var title = params[0] == "text" ? tiddler.title : value;
		var args = macro.getArguments(paramString, params);
		macro.renderImage(place, title, args);
	}
});
config.shadowTiddlers.StyleSheetImageMacro = [".wikifiedImage svg, .wikifiedImage .image { width: 80%; }",
	".svgImageText { background-color:[[ColorPalette::Error]]; color:#ddd; display: inline-block; }",
	"span.svgImageText { display: inline-block; overflow: hidden; }"
].join("");
store.addNotification("StyleSheetImageMacro", refreshStyles);

})(jQuery);
//}}}
Type the text for 'New Tiddler'
<html><nowiki>
<h1> The Gurmukhi Script </h1>
<h2></h2>
<p>
I this topic we shall learn about the Gurmukhi script, which is the primary script used for writing Punjabi. It has a basic set of 35 letters and 6 more in an extended set. Besides this it has 9 more symbols called lagas which are used for defining vowel sounds associated with the letters. Last but no the least there are 3 symbols for depicting nasal and conjunct sounds.
</p>
<h2>Basic Gurmukhi Alphabet</h2>
<table class="blueTable" title="Gurmukhi Consonants"><tr><th colspan="10">
Punjabi Consonants &nbsp;&nbsp;&nbsp;&nbsp;  ਪੰਜਾਬੀ ਵਿਅੰਜਨ
</th></tr><tr><th> 
          Letter 
</th><th> 
          Pron 
</th><th> 
          Letter 
</th><th> 
          Pron 
</th><th> 
          Letter 
</th><th> 
          Pron 
</th><th> 
          Letter 
</th><th> 
          Pron 
</th><th> 
          Letter 
</th><th> 
          Pron 
</th> </tr><tr><td class="key">
        <b> ੳ</b> <br>(Oorha) 
</td><td class="value"> -- </td>
    <td class="key"><b> ਅ </b><br>(Airha) </td>
    <td class="value"> -- </td>
    <td class="key"> <b>ੲ</b> <br>(Eirhi) </td>
    <td class="value"> -- </td>
    <td class="key"><b> ਸ</b> <br>(Sussa) </td>
    <td class="value"> s </td>
    <td class="key"><b> ਹ</b> <br>(Haha) </td>
    <td class="value"> ɦ </td>
  </tr><tr>
    <td class="key"> <b>ਕ</b> <br>(Kukka) </td>
    <td class="value"> k </td>
    <td class="key"> <b>ਖ</b> <br>(Khukkha) </td>
    <td class="value"> kʰ </td>
    <td class="key"> <b>ਗ</b> <br>(Gugga) </td>
    <td class="value"> g </td>
    <td class="key"> <b>ਘ</b> <br>(Ghugga) </td>
    <td class="value"><  </td>
    <td class="key"><b> ਙ</b> <br> (Ungga) </td>
    <td class="value"> ŋ </td>
  </tr><tr>
    <td class="key"> <b>ਚ</b> <br>(Chucha) </td>
    <td class="value"> ʧ </td>
    <td class="key"><b> ਛ</b> <br>(Chhuchhaa)</td>
    <td class="value"> ʧʰ </td>
    <td class="key"><b> ਜ</b> <br>(Jujja) </td>
    <td class="value"> ʤ </td>
    <td class="key"> <b>ਝ</b> <br>(Jhujhaa) </td>
    <td class="value"> -- </td>
    <td class="key"> <b>ਞ</b> <br>(Nynya) </td>
    <td class="value"> ɲ </td>
  <tr></tr>
    <td class="key"> <b>ਟ</b> <br>(Tainka) </td>
    <td class="value"> ʈ </td>
    <td class="key"> <b>ਠ</b> <br>(Thutha) </td>
    <td class="value"> ʈʰ </td>
    <td class="key"> <b>ਡ</b> <br>(Dudda) </td>
    <td class="value"> ɖ </td>
    <td class="key"> <b>ਢ</b> <br>(Dhudha) </td>
    <td class="value"> -- </td>
    <td class="key"> <b>ਣ</b> <br>(Nahna) </td>
    <td class="value"> ɳ </td>
  </tr><tr>
    <td class="key"> <b>ਤ</b> <br>(Tutta) </td>
    <td class="value"> t̪ </td>
    <td class="key"> <b>ਥ</b> <br>(Thutha) </td>
    <td class="value"> t̪ʰ </td>
    <td class="key"> <b>ਦ</b> <br>(dudda) </td>
    <td class="value"> d̪ </td>
    <td class="key"> <b>ਧ</b> <br>(dhudha) </td>
    <td class="value"> -- </td>
    <td class="key"> <b>ਨ</b> <br>(Nunna) </td>
    <td class="value"> n </td>
  </tr><tr>
    <td class="key"> <b>ਪ</b> <br>(Puppa) </td>
    <td class="value"> p </td>
    <td class="key"> <b>ਫ</b> <br>(Phuppa) </td>
    <td class="value"> pʰ </td>
    <td class="key"> <b>ਬ</b> <br>(Bubba)</td>
    <td class="value"> b </td>
    <td class="key"> <b>ਭ</b> <br>(Bhubha)</td>
    <td class="value"> -- </td>
    <td class="key"> <b>ਮ </b> <br>(Mumma) </td>
    <td class="value"> m </td>
  </tr><tr>
    <td class="key"> <b>ਯ</b> <br> (Yayya) </td>
    <td class="value"> j </td>
    <td class="key"> <b>ਰ</b> <br> (Rara) </td>
    <td class="value"> ɾ </td>
    <td class="key"> <b> ਲ</b> <br>(Lulla) </td>
    <td class="value"> l </td>
    <td class="key"> <b>ਵ</b> <br>(Vava) </td>
    <td class="value"> ʋ </td>
    <td class="key"> <b>ੜ</b> <br>(Rharha) </td>
    <td class="value"> ɽʱ </td>
  </tr><tr>
    <td class="key"> <b>ਸ਼</b> </td>
    <td class="value"> ʃ </td>
    <td class="key"> <b> ਖ਼</b> </td>
    <td class="value"> -- </td>
    <td class="key"> <b>ਗ਼</b> </td>
    <td class="value"> -- </td>
    <td class="key"> <b>ਜ਼</b> </td>
    <td class="value"> z </td>
    <td class="key"><b> ਫ਼</b> </td>
    <td class="value"> f </td>
  </tr><tr>
    <td class="key"> <b>ਲ਼</b> </td>
    <td class="value"> ɽ </td>
    <td class="value" colspan="8"></td>
  </tr>
</table>




<h2> Lugas or Matras in Gurmukhi </h2>

<p> Punjabi language has 10 vowel sounds. These vowels are represented by using the 9 lugas/Matras and 3 letter of the Gurmukhi script. These lagas are not written independently but are used in conjunction with various letters.</p>
<p> The 3 letter which are used for writing vowel sounds are: </p>
<table class="blueTable">
<tr>
     <td class="key">ੳ (Oorha)</td>
     <td class="key">ਅ (Airha)</td>
     <td class="key">ੲ (Eirhi)</td>
</tr>
</table>
<p>
These three letter are not used independently but along with the 9 lug/Matras to represent the vowel sounds:
</p>

<table class="blueTable">
     <tr>
       <td class="key"> Mukta  </td> <td class="value"> A letter which is not accompanied by any lug/Matra is said to be in Mukta state.</td>
     </tr><tr>
       <td class="key"> <b>ਾ </b> (Kunna) </td> <td class="value"> ਾ </td>
     </tr><tr>
       <td class="key"> <b>ਿ</b> (Sihari)  </td> <td class="value"> ਿ </td>
     </tr><tr>
       <td class="key"><b>ੀ</b> (Bihari)  </td> <td class="value"> ੀ </td>
     </tr><tr>
       <td class="key"><b>ੁ</b> (Aunkarh)  </td> <td class="value"> ੁ </td>
     </tr><tr>
       <td class="key"> <b>ੂ</b> (Dulainkarh)  </td> <td class="value"> ੂ </td>
     </tr><tr>
       <td class="key"><b>ੇ</b> (Laan)  </td> <td class="value"> ੇ </td>
     </tr><tr>
       <td class="key"><b>ੈ</b> (Dulaan) </td> <td class="value"> ੈ </td>
     </tr><tr>
       <td class="key"><b>ੋ</b> (Horha) </td> <td class="value"> ੋ </td>
     </tr><tr>
       <td class="key"><b>ੌ</b> (Kanaurha)  </td> <td class="value"> ੌ </td>
     </tr><tr>
</table>
<p>
 Following table explains vowels and how they are written
 </p>
<p><small>
Please note that pronunciation of the English words used here are not be the original native pronunciation of English language but the ones which are used by Punjabi speakers. For example the word 'Colour' would be pronounced by native english speakers as /kʌlə/ but Punjabis pronounce it as /kələr/ so thats the one that is chosen for this lesson.
</small></p>

<table class="blueTable"><tr>
<th> Vowel </th><th> letter and symbol </th>
<th> Usage </th>
</tr><tr>
       <td class="key"> ə </td><td class="key"><b> ਅ </b></td> <td class="value"> The vowel /ə/ is written using the second letter ਅ of the Gurmukhi alphabet. In the word 'absurd', the first part of the word, 'ab' would be written in Gurmukhi script as ਅਬ representing the sound /əb/. Here the letter ਅ represents the /ə/ vowel sound. But when the vowel sound /ə/ comes in the middle of the word it usually occurs in conjunction with a consonant. In this situation the consonant itself includes an implied /ə/ sound and does not require ਅ or any other symbol. So when the word 'gun' is written in Gurmukhi it would be ਗਨ /gən/. The vowel sound /ə/ is not written explicitly, it is implied in the consonant letter ਗ. </td>
     </tr><tr>
       <td class="key"> ɑː </td><td class="key"><b>ਅ, ਾ </b></td> <td class="value"> Written using kunna,ਾ  preceded with a letter.  Occuring at the beginning of the word, it is written as ਆ which is a combination of the letter ਅ and a kunna ਾ . Occuring in the middle or at the end of a word it is written using a kunna, ਾ preceded with the relevant consonant letter. The word 'bar' can be written as ਬਾਰ /bɑːr/.
       </td>
     </tr>
     <tr>
       <td class="key"> i  </td><td class="key"><b> ੲ, ੀ</b></td> <td class="value"> Written using a Sihari, ਿ succeeded with a letter.  Occuring at the beginning of the word, it is written as ਇ which is a combination of a Sihari, ਿ and the letter ੲ for example name Ivan /ivɑːn/ can be written as ਇਵਾਨ. Occuring in the middle or at the end of a word it is written using a Sihari, ਿ succeeded with the relevant consonant letter. 'Nick' /nik/ can be written as ਨਿਕ .
       </td>
     </tr>
     <tr>
       <td class="key"> iː </td><td class="key"><b> ੲ, ੀ </b></td> <td class="value"> Written using a Bihari, ੀ preceded with a letter. Occuring at the beginning of the word it is written as ਈ which is a combination of the letter ੲ and a Bihari ੀ , for example the word 'even' /iːvn/ can be written as ਇਵਨ . Occuring in the middle or at the end of a word it is written using a Bihari, ੀ preceded with the relevant consonant letter. 'Keep' /kiːp/ can be written as ਕੀਪ . 
       </td>
     </tr><tr>
       <td class="key"> u </td> <td class="key"><b> ੳ, ੁ </b></td><td class="value"> Written by attaching an Aunkarh, ੁ at the base of the relevant letter. In the beginning of the word it is written as ਉ which is a combination of the letter ੳ and the laga ੁ , for example ---- . Occuring in the middle or at the end it is written by placing an Aunkarh at the base of the relevant consonant letter. 'Put' /put/ can be written as written as ਪੁਟ .
       </td>
     </tr>
     <tr>
       <td class="key"> uː </td><td class="key"><b>ੳ,ੂ </b></td> <td  class="value">Written by attaching a Dulainkarh , ੂ  at the base of the relevant letter. In the beginning of the word it is written as ਊ which is a combination of the letter ੳ and a Dulainkarh, ੂ , for example --- . Occuring in the middle or at the end it is written by placing a Dulainkarh at the base of the relevant consonant letter. 'Cool' /kuːl/ can be written as ਕੂਲ
     </tr>
     <tr>
       <td class="key"> eː </td><td class="key"><b>ੲ, ੇ </b></td> <td class="value"> Written by attaching a Laan, ੇ atop the relevant letter. In the beginning of the word it is written as ਏ which is a combination of the letter ੲ and a laan, ੇ, for example, the word 'Ace' /eːs /can be written as ਏਸ . Occuring in the middle or at the end it is written by attaching a Laan, ੇ at the top of the relevant letter. 'Make' /meːk/ can be written as ਮੇਕ.  </td>
     </tr><tr>
        <td class="key"> ɛː </td><td class="key"><b>ੲ, ੈ </b></td>
        <td class="value"> Written by attaching a ੈ atop the relevant letter. In the beginning of the word it is written as ਐ which is a combination of the letter ਅ and a dulaan ੈ , for example 'Ash' /ɛːsh/  can be written as ਐਸ਼. Occuring in the middle or the end it is written by placing a Dulaan ੈ atop the relevant letter. 'Bat' /bɛːt/ can be written as ਬੈਟ  </td>
     </tr><tr>
       <td class="key"> ɔː </td><td class="key"><b>ਓ, ੋ </b></td> <td class="value"> Occuring in the beginning or end(when preceded with a another vowel) of the word it is written as ਓ, which is a combination of ੳ and a Horha, ੋ, for example 'Oak' /ɔːk/ can be written as ਓਕ. Occurring at the middle and end(when preceded with a consonant sound) of a word it is written by attaching a Horha, ੋ atop the relevant letter. 'Cope' /ɔːp/ can be written as ਕੋਪ </td>
     </tr>
     <tr>
       <td class="key">oː </td> <td class="key"><b>ਅ, ੌ </b></td> <td class="value"> Occuring at the beginning of the word it is written as ਔ, which is a combination of ਅ and kunaurha ੌ, for example the word 'Odd' /oːd/ can be written as ਔਡ. Occuring at the middle or end of the word it is written by attaching a kanaurha, ੋ  at the top of the relevant letter. 'Knot' /oːt/ can be written as ਨੌਟ </td>
     </tr>
</table>
<h2> Lugakhar - symbols for nasal and conjunct sounds  </h2>

<table class="blueTable">
     <tr>
       <td class="key"> ਂ Bindi </td> <td class="value"> Bindi is a dot placed over a letter along with a lug/matra to denote a nasal sound. Bindi is used along with kanna, bihari, laan, dulaan, horha, kanaurha.<br>
       Aunt/ɑːnt/- ਆਂਟ 
       </td>
     </tr>
     <tr>
       <td class="key"> ੰ  Tippi </td> <td class="value"> Tippi is an inverted semi-circle placed in top of a letter to denote a nasal sound. It is used with a mukta consonant(one which does not have any other lug/matra), sihari, aunkarh and dulainkarh  <br>
        Bunk/bənk/ - ਬੰਕ <br>
       Sing /sing/ - ਸਿੰਗ 
       </td>
     </tr>
     <tr>
       <td class="key"> ੱ Uddhak </td> <td class="value"> 
        Addhak is used to denote stress on the consonant sound following the addhak.<br>
       Chuck- ਚੱਕ <br>
       kick- ਕਿੱਕ
       </td>
     </tr>

</table>


<h2> Some English Words in Gurmukhi </h2>
<p>
Now that you have the knowledge of the basics of Gurmukhi lets start by writing some English words in Gurmukhi:
</p>
<h3> Mukta </h3>
<p> The following words contains Mukta letters; so called due to the fact that they do not have any Lug/matra attached with them.</p>
<table class="">
<tr> 
     <td class="key"> Color  </td> 
     <td class="value"> ਕਲਰ /kələr/ </td> 
</tr>
<tr> 
     <td class="key"> Come </td> 
     <td class="value"> ਕਮ /kəm/ </td> 
</tr>
<tr> 
     <td class="key"> Bug </td> 
     <td class="value"> ਬਗ /bəg/</td> 
</tr>
<tr> 
     <td class="key"> Button  </td> 
     <td class="value">ਬਟਨ /bəʈən/</td> 
</tr>
<tr> 
     <td class="key"> Cover </td> 
     <td class="value"> ਕਵਰ /kəvəɾ/ </td> 
</tr>
<tr> 
     <td class="key">Hum  </td> 
     <td class="value"> ਹਮ /həm/ </td> 
</tr>

<tr> 
     <td class="value">  Fur  </td> 
     <td class="key"> ਫ਼ਰ /fəɾ/</td> 
</tr>
<tr> 
     <td class="key"> Couple / kəpəl/</td> 
     <td class="value"> ਕਪਲ </td> 
</tr>

</table>
<h3>Kunna (ਾ ) </h3>
<p>The following table contains examples of words that use a kunna for denoting the /ɑː/ vowel sound.</p>
<table>
<tr>
     <td class="key">Bar </td>
     <td class="value"> ਬਾਰ /bɑːɾ/ </td>
</tr>
<tr>
     <td class="key">Car </td>
     <td class="value"> ਕਾਰ /kɑːɾ/</td>
</tr>
<tr>
     <td class="key">Carl </td>
     <td class="value"> ਕਾਰਲ /kɑːɾl/</td>
</tr>
<tr>
     <td class="key">Garden </td>
     <td class="value"> ਗਾਰਡਨ /gɑːɾɖən/ </td>
</tr>
<tr>
     <td class="key">Bazaar </td>
     <td class="value"> ਬਜ਼ਾਰ /bəzɑːɾ/</td>
</tr>
</table>
<h3>Sihari (ਿ) </h3>
<p>Here are some examples of words with a sihari for denoting the /i/ vowel sound.</p>

<table>
<tr>
     <td class="key"> Bill</td>
     <td class="value"> ਬਿਲ /bil/</td>
</tr>
<tr>
     <td class="key">Sid </td>
     <td class="value"> ਸਿਡ /sid/ </td>
</tr>
<tr>
     <td class="key">Lisp </td>
     <td class="value"> ਲਿਸਪ /lisp/</td>
</tr>
<tr>
     <td class="key">Winner </td>
     <td class="value"> ਵਿਨਰ /vinəɾ/ </td>
</tr>
<tr>
     <td class="key"> Mimic </td>
    <td class="value"> ਮਿਮਿਕ /mimik/</td>
</tr>
<tr>
     <td class="key"> Elixir </td>
    <td class="value"> ਇਲਿਕਸਰ /iliksəɾ/</td>
</tr>
</table>
<h3> Bihari (ੀ) </h3>
<p>Here are some examples of words with a bihari for denoting the /iː/ vowel sound.</p>

<table>
<tr>
     <td class="key">Beep </td>
     <td class="value">ਬੀਪ /biːp/</td>
</tr>
<tr>
     <td class="key"> Weak </td>
     <td class="value">ਵੀਕ /ʋiːk/ </td>
</tr>
<tr>
     <td class="key"> Sleep </td>
     <td class="value">ਸਲੀਪ /sliːp/ </td>
</tr>
<tr>
     <td class="key"> Meagre</td>
     <td class="value">ਮੀਗਰ /miːgɾ/ </td>
</tr>
<tr>
     <td class="key">Bulky </td>
     <td class="value">ਬਲਕੀ /bəlkiː/ </td>
</tr>
</table>

<h3> Aunkarh (ੁ) </h3>
<p>Here are some examples of words with an aunkarh  for denoting the /u/ vowel sound.</p>
<Table>
<tr>
     <td class="key"> Cook </td>
     <td class="value"> ਕੁਕ /kuk/</td>
</tr><tr>
     <td class="key"> Put </td>
     <td class="value"> ਪੁਟ /puʈ/</td>
</tr><tr>
     <td class="key"> Wool </td>
     <td class="value"> ਵੁਲ /ʋul/ </td>
</tr><tr>
     <td class="key"> Took   </td>
     <td class="value"> ਟੁਕ /ʈuk/ </td>
</tr>
</table>

<h3> Dulainkarh (ੂ) </h3>
<p>Here are some examples of words with a dulainkarh  for denoting the /uː/ vowel sound.</p>
<table>
<tr>
     <td class="key"> Cool </td>
     <td class="value">ਕੂਲ /kuːl/</td>
</tr><tr>
     <td class="key"> Juice </td>
     <td class="value">ਜੂਸ /ʤuːs/ </td>
</tr><tr>
     <td class="key"> Tool</td>
     <td class="value">ਟੂਲ /ʈuːl/</td>
</tr><tr>
     <td class="key"> Fool</td>
     <td class="value">ਫ਼ੂਲ /fuːl/</td>
</tr><tr>
     <td class="key"> Booth</td>
     <td class="value"> ਬੂਥ /buːt̪ʰ/ </td>
</tr>
</table>
<h3> Laan (ੇ) </h3>
<p>Here are some examples of words with a laan for denoting the /eː/ vowel sound.</p>
<table>
<tr>
     <td class="key"> Cake </td>
     <td class="value">ਕੇਕ /keːk/ </td>
</tr><tr>
     <td class="key"> Gate </td>
     <td class="value"> ਗੇਟ /geːʈ/</td>
</tr><tr>
     <td class="key"> Fail </td>
     <td class="value"> ਫ਼ੇਲ /feːl/ </td>
</tr><tr>
     <td class="key"> Made </td>
     <td class="value"> ਮੇਡ /meːɖ/ </td>
</tr><tr>
     <td class="key"> Blade </td>
     <td class="value">ਬਲੇਡ /bleːɖ/  </td>
</tr>
</table>

<h3>Dulaan (ੈ) </h3>
<p>Here are some examples of words with a dulaan for denoting the /ɛː/ vowel sound.</p>
<table>
<tr>
     <td class="key"> Back </td>
     <td class="value"> ਬੈਕ /bɛːk/</td>
</tr><tr>
     <td class="key"> Chat</td>
     <td class="value"> ਚੈਟ /ʧɛːʈ /</td>
</tr><tr>
     <td class="key"> Pan </td>
     <td class="value"> ਪੈਨ /pɛːn/ </td>
</tr><tr>
     <td class="key"> Dad </td>
     <td class="value">ਡੈਡ /ɖɛːɖ / </td>
</tr>
</table>

<h3>Horha (ੋ) </h3>
<p>Here are some examples of words with a horha for denoting the /ɔː/ vowel sound.</p>
<table>
<tr>
     <td class="key"> Hole </td>
     <td class="value">ਹੋਲ /ɦɔːl/</td>
</tr><tr>
     <td class="key"> Pope</td>
     <td class="value"> ਪੋਪ /pɔːp/ </td>
</tr><tr>
     <td class="key"> Joke </td>
     <td class="value"> ਜੋਕ /ʤɔːk/ </td>
</tr><tr>
     <td class="key"> Store </td>
     <td class="value">ਸਟੋਰ /sʈɔːɾ/ </td>
</tr><tr>
     <td class="key"> Glow </td>
     <td class="value">ਗਲੋ /bəɾɔː/ </td>
</tr>
</table>

<h3> Kanaurha (ੌ) </h3>
<p>Here are some examples of words with a kanaurha for denoting the /oː/ vowel sound.</p>
<table>
<tr>
     <td class="key"> Job </td>
     <td class="value"> ਜੌਬ /ʤoːb/</td>
</tr><tr>
     <td class="key"> Fog</td>
     <td class="value"> ਫ਼ੌਗ /foːg/ </td>
</tr><tr>
     <td class="key"> Block</td>
     <td class="value"> ਬਲੌਕ /bloːk/</td>
</tr><tr>
     <td class="key"> Bottle </td>
     <td class="value">ਬੌਟਲ /boːʈl/</td>
</tr><tr>
     <td class="key"> Oscar </td>
     <td class="value"> ਔਸਕਰ /oːskəɾ/</td>
</tr>
</table>
</html>
{{{
Background:#FAFAFA
Foreground:#000
PrimaryPale:#999
PrimaryLight:#777
PrimaryMid:#111
PrimaryDark:#000
SecondaryPale:#CCF
SecondaryLight:#9AF
SecondaryMid:#69C
SecondaryDark:#05A
TertiaryPale:#EEE
TertiaryLight:#CCC
TertiaryMid:#999
TertiaryDark:#333
Error:#F88
}}}
Unless you're delighted with the default theme you can make some quick changes by generating a new random color palette, hit this button to cycle through some alternatives.

<<RandomColorPaletteButton saturation_pale:0.67 saturation_light:0.53
saturation_mid:0.43 saturation_dark:0.06 pale:0.99 light:0.85 mid:0.5 dark:0.31>>

You can also change the look and feel completely by installing a new theme. To do this, find one you like in the @themes space, note down the name, and include it in this space by going to the space menu. You can reach the space menu by clicking on the blue and pink circle at the top-right of the page and chooshing "THIS SPACE". Here are a few to check out:
* @pip
* @caspian-ii
* @basalt
* @simplicity
* @cheesecake
* @jelly-doughnut

(//Note that if you are using a custom TiddlySpace install, these themes may not be present.//)
Type the text for 'New Tiddler'
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->

<svg
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:cc="http://creativecommons.org/ns#"
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:svg="http://www.w3.org/2000/svg"
   xmlns="http://www.w3.org/2000/svg"
   xmlns:xlink="http://www.w3.org/1999/xlink"
   version="1.1"
   width="14pt"
   height="14pt"
   viewBox="918 510 14 14"
   id="svg3070">
  <metadata
     id="metadata3089">
    <rdf:RDF>
      <cc:Work
         rdf:about="">
        <dc:format>image/svg+xml</dc:format>
        <dc:type
           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
        <dc:title></dc:title>
      </cc:Work>
    </rdf:RDF>
  </metadata>
  <defs
     id="defs3072">
    <radialGradient
       cx="0"
       cy="0"
       r="1"
       id="Gradient"
       gradientUnits="userSpaceOnUse">
      <stop
         id="stop3075"
         style="stop-color:#ffffff;stop-opacity:1"
         offset="0" />
      <stop
         id="stop3077"
         style="stop-color:#2b2b2b;stop-opacity:1"
         offset="1" />
    </radialGradient>
    <radialGradient
       id="Obj_Gradient"
       xlink:href="#Gradient"
       gradientTransform="matrix(11.473944,0,0,11.473944,922.3752,513.7837)" />
  </defs>
  <g
     id="g3080"
     style="fill:none;stroke:none">
    <g
       id="g3082">
      <path
         d="m 929.6952,512.9018 c -2.5384,-2.53843 -6.654,-2.53843 -9.1924,0 -2.5384,2.5384 -2.5384,6.654 0,9.19238 2.5384,2.53839 6.654,2.53839 9.1924,0 2.5384,-2.53838 2.5384,-6.65398 0,-9.19238 m -4.5962,2.8407 2.07733,-2.07734 1.75547,1.75549 -2.0773,2.07735 2.0773,2.07732 -1.75547,1.75548 -2.07733,-2.07732 -2.07733,2.07732 -1.75547,-1.75548 2.0773,-2.07732 -2.0773,-2.07735 1.75547,-1.75549 z"
         id="path3084"
         style="fill:url(#Obj_Gradient)" />
      <path
         d="m 927.61447,515.38354 a 4.51205,4.2590378 0 1 1 -9.0241,0 4.51205,4.2590378 0 1 1 9.0241,0 z"
         transform="matrix(1.0218069,0,0,1.0462046,-18.063694,-21.648443)"
         id="path2394"
         style="fill:#000000;fill-opacity:0;fill-rule:evenodd;stroke:none;stroke-width:5;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
    </g>
  </g>
</svg>
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
<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="100%" width="100%" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" viewBox="0 0 40 40"><metadata><rdf:RDF><cc:Work rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/><dc:title/></cc:Work></rdf:RDF></metadata><defs><linearGradient id="lG3826" x1="7.0996" gradientUnits="userSpaceOnUse" y1="18.829" gradientTransform="matrix(1.5858347,0,0,1.8078238,1098.1851,351.13716)" x2="1.5461" y2="-0.95166"><stop stop-color="#000" offset="0"/><stop stop-color="#9c9b99" offset="1"/></linearGradient><linearGradient id="lG3828" y2="372.44" gradientUnits="userSpaceOnUse" y1="375.7" x2="1111.7" x1="1097.7"><stop style="stop-color:#ac9393;" offset="0"/><stop style="stop-color:#c8b7b7;" offset="1"/></linearGradient></defs><g transform="translate(-1080.9375,-357.3329)"><path style="stroke-width:0;stroke-miterlimit:4;fill:url(#lG3826);" d="m1080.9,357.32,39.996-0.0426-0.01,40.008c-15.507-25.519-15.36-25.95-39.988-39.965z"/><path style="stroke-dashoffset:0;stroke:#7aa3be;stroke-linecap:round;stroke-miterlimit:4;stroke-width:1.49999988;fill:#c1e6fd;" d="m1091.9,363.55c6.5716-6.4925,16.576-7.3925,23.147-0.90003,6.5717,6.4925,6.5717,17.019,0,23.511-4.4424-8.6113-12.288-15.713-23.147-22.611z"/><path style="stroke-dashoffset:0;stroke:#ce81b0;stroke-linecap:round;stroke-miterlimit:4;stroke-width:1.5;fill:#f4c4e2;" d="m1110.2,367.62c3.217,3.2168,3.217,8.4323,0,11.649-3.8194-4.2357-8.3307-8.1824-11.649-11.649,3.217-3.2168,8.4325-3.2168,11.649-0.00002z"/><path style="stroke-linejoin:bevel;stroke:#000000;stroke-linecap:round;stroke-dasharray:none;stroke-miterlimit:4;stroke-width:0.80000001;fill:url(#lG3828);" d="m1081,357.34c18.79,6.4752,32.53,16.56,39.894,39.892-11.19-17.028-14.878-19.19-27.352-14.96,6.2984-12.098,3.9371-13.19-12.542-24.932z"/></g></svg>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xl="http://www.w3.org/1999/xlink" version="1.1" viewBox="506 234 68 36" width="30" height="30"><metadata xmlns:dc="http://purl.org/dc/elements/1.1/"><dc:date>2010-09-16 14:51Z</dc:date><!-- Produced by OmniGraffle Professional 5.2.3 --></metadata><defs></defs><g stroke="none" stroke-opacity="1" stroke-dasharray="none" fill="none" fill-opacity="1"><rect width="1118" height="783"/><g><path d="M 538.68195 244.31807 C 540.43927 246.07547 540.43927 248.9247 538.68195 250.68204 C 536.92456 252.4394 534.07532 252.4394 532.318 250.68204 C 530.5606 248.9247 530.5606 246.07547 532.318 244.31807 C 534.07532 242.56075 536.92456 242.56075 538.68195 244.31807 M 511.12607 257.99356 C 511.26108 258.13019 511.39728 258.26608 511.53473 258.40121 C 527.2556 273.86606 552.74414 273.86606 568.46515 258.40121 C 568.60248 258.26617 568.73853 258.13037 568.87354 257.9938 C 568.8736 257.99374 568.8736 257.99371 568.8736 257.99362 C 568.87366 257.99371 568.87366 257.9938 568.87372 257.9939 C 570.72504 256.12051 572.35046 254.11153 573.74994 252 C 573.74994 251.99997 573.74994 251.99994 573.74994 251.99992 C 572.35046 249.8884 570.72504 247.87938 568.87372 246.00606 C 568.87366 246.00613 568.87366 246.00621 568.8736 246.00627 C 568.73865 245.86966 568.60254 245.73383 568.46515 245.5987 C 552.74414 230.13387 527.2556 230.13387 511.53473 245.5987 C 511.39728 245.73383 511.26108 245.86974 511.12613 246.00635 C 511.126 246.00624 511.126 246.00616 511.12595 246.00606 C 509.2748 247.87938 507.64954 249.88837 506.24994 251.9998 L 506.24994 251.99983 C 506.24994 251.9999 506.25 251.99992 506.25 251.99997 C 506.25 252 506.24994 252.00005 506.24994 252.00009 L 506.24994 252.00012 C 507.64954 254.11157 509.2748 256.12051 511.12595 257.9939 C 511.126 257.99377 511.126 257.99365 511.12607 257.99359 Z M 515.44916 252 C 515.8548 251.55469 516.27502 251.11778 516.71014 250.68985 C 522.16632 245.32257 529.06055 242.23206 536.17273 241.41824 C 534.6662 241.96199 533.2525 242.83762 532.04498 244.04512 C 527.65155 248.43852 527.65155 255.56163 532.04498 259.95502 C 533.2522 261.16226 534.6656 262.03778 536.17175 262.58154 C 529.05988 261.76761 522.16608 258.6771 516.71014 253.31009 C 516.2751 252.88219 515.85486 252.44528 515.44922 252 Z M 564.55054 251.99995 C 564.14502 252.44525 563.7248 252.88217 563.28973 253.31009 C 557.83368 258.67712 550.93988 261.76764 543.828 262.58157 C 545.33423 262.03781 546.74756 261.1623 547.9549 259.95502 C 552.34833 255.56163 552.34833 248.43852 547.9549 244.04512 C 546.74744 242.83765 545.33374 241.96202 543.82715 241.41824 C 550.9394 242.23206 557.83356 245.3226 563.28973 250.68985 C 563.7248 251.11775 564.14502 251.55467 564.55054 251.99995 Z M 568.8736 257.99362 C 570.7249 256.12033 572.35028 254.11139 573.74988 252.00002" fill="black" class="glyph"/></g></g></svg>
@@Please do not modify this tiddler; it was created automatically upon space creation.@@
/***
|Name|PlayerPlugin|
|Source|http://www.TiddlyTools.com/#PlayerPlugin|
|Version|1.1.4|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|plugin|
|Description|Embed a media player in a tiddler|
!!!!!Usage
<<<
{{{<<player [id=xxx] [type] [URL] [width] [height] [autoplay|true|false] [showcontrols|true|false] [extras]>>}}}

''id=xxx'' is optional, and specifies a unique identifier for each embedded player.  note: this is required if you intend to display more than one player at the same time.

''type'' is optional, and is one of the following: ''windows'', ''realone'', ''quicktime'', ''flash'', ''image'' or ''iframe''.  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 displays an error message.

''URL'' is the location of the media content

''width'' and ''height'' are the dimensions of the video display area (in pixels)

''autoplay'' or ''true'' or ''false'' is optional, and specifies whether the media content should begin playing as soon as it is loaded, or wait for the user to press the "play" button.  Default is //not// to autoplay.

''showcontrols'' or ''true'' or ''false'' is optional, and specifies whether the embedded media player should display its built-in control panel (e.g., play, pause, stop, rewind, etc), if any.  Default is to display the player controls.

''extras'' are optional //pairs// of parameters that can be passed to the embedded player, using the {{{<param name=xxx value=yyy>}}} HTML syntax.

''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.
<<<
!!!!!Configuration
<<<
Default player size:
width: <<option txtPlayerDefaultWidth>> height: <<option txtPlayerDefaultHeight>>
<<<
!!!!!Examples
<<<
+++[Windows Media]...
Times Square Live Webcam
{{{<<player id=1 http://www.earthcam.com/usa/newyork/timessquare/asx/tsq_stream.asx>>}}}
<<player id=1 http://www.earthcam.com/usa/newyork/timessquare/asx/tsq_stream.asx>>
===
+++[RealOne]...
BBC London: Live and Recorded news
{{{<<player id=2 http://www.bbc.co.uk/london/realmedia/news/tvnews.ram>>}}}
<<player id=2 http://www.bbc.co.uk/london/realmedia/news/tvnews.ram>>
===
+++[Quicktime]...
America Free TV: Classic Comedy
{{{<<player id=3 http://www.americafree.tv/unicast_mov/AmericaFreeTVComedy.mov>>}}}
<<player id=3 http://www.americafree.tv/unicast_mov/AmericaFreeTVComedy.mov>>
===
+++[Flash]...
Asteroids arcade game
{{{<<player id=4 http://www.80smusiclyrics.com/games/asteroids/asteroids.swf 400 300>>}}}
<<player id=4 http://www.80smusiclyrics.com/games/asteroids/asteroids.swf 400 300>>
Google Video
{{{<<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>>}}}
<<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>>
YouTube Video
{{{<<player id=6 flash http://www.youtube.com/v/OdT9z-JjtJk 400 300>>}}}
<<player id=6 flash http://www.youtube.com/v/OdT9z-JjtJk 400 300>>
===
+++[Still Images]...
GIF (best for illustrations, animations, diagrams, etc.)
{{{<<player id=7 image images/meow.gif auto auto>>}}}
<<player id=7 image images/meow.gif auto auto>>
JPG (best for photographs, scanned images, etc.)
{{{<<player id=8 image images/meow2.jpg 200 150>>}}}
<<player id=8 image images/meow2.jpg 200 150>>
===
<<<
!!!!!Revisions
<<<
2008.05.10 [1.1.4] in handlers(), immediately return if no params (prevents error in macro).  Also, refactored auto-detect code to make type mapping configurable.
2007.10.15 [1.1.3] in loadURL(), add recognition for .PNG (still image), fallback to iframe for unrecognized media types
2007.08.31 [1.1.2] added 'click-through' link for JPG/GIF images
2007.06.21 [1.1.1] changed "hidecontrols" param to "showcontrols" and recognize true/false values in addition to 'showcontrols', added "autoplay" param (also recognize true/false values), allow "auto" as value for type param
2007.05.22 [1.1.0] added support for type=="iframe" (displays src URL in an IFRAME)
2006.12.06 [1.0.1] in handler(), corrected check for config.macros.attach (instead of config.macros.attach.getAttachment) so that player plugin will work when AttachFilePlugin is NOT installed.  (Thanks to Phillip Ehses for bug report)
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
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.
2006.01.27 [0.6.0] added support for 'extra' macro params to pass through to object parameters
2006.01.19 [0.5.0] Initial ALPHA release
2005.12.23 [0.0.0] Started
<<<
!!!!!Code
***/
//{{{
version.extensions.PlayerPlugin= {major: 1, minor: 1, revision: 4, date: new Date(2008,5,10)};

config.macros.player = {};
config.macros.player.html = {};
config.macros.player.handler= function(place,macroName,params) {
	if (!params.length) return; // missing parameters - do nothing
	var id=null;
	if (params[0].substr(0,3)=="id=") id=params.shift().substr(3);
	var type="";
	if (!params.length) return; // missing parameters - do nothing
	var p=params[0].toLowerCase();
	if (p=="auto" || p=="windows" || p=="realone" || p=="quicktime" || p=="flash" || p=="image" || p=="iframe")
		type=params.shift().toLowerCase();
	var url=params.shift(); if (!url || !url.trim().length) url="";
	if (url.length && config.macros.attach!=undefined) // if AttachFilePlugin is installed
		if ((tid=store.getTiddler(url))!=null && tid.isTagged("attachment")) // if URL is attachment
			url=config.macros.attach.getAttachment(url); // replace TiddlerTitle with URL
	var width=params.shift();
	var height=params.shift();
	var autoplay=false;
	if (params[0]=='autoplay'||params[0]=='true'||params[0]=='false')
		autoplay=(params.shift()!='false');
	var show=true;
	if (params[0]=='showcontrols'||params[0]=='true'||params[0]=='false')
		show=(params.shift()!='false');
	var extras="";
	while (params[0]!=undefined)
		extras+="<param name='"+params.shift()+"' value='"+params.shift()+"'> ";
	this.loadURL(place,id,type,url,width,height,autoplay,show,extras);
}

if (config.options.txtPlayerDefaultWidth==undefined) config.options.txtPlayerDefaultWidth="100%";
if (config.options.txtPlayerDefaultHeight==undefined) config.options.txtPlayerDefaultHeight="480"; // can't use "100%"... player height doesn't stretch right :-(

config.macros.player.typeMap={
	windows: ['mms', '.asx', '.wvx', '.wmv', '.mp3'],
	realone: ['rtsp', '.ram', '.rpm', '.rm', '.ra'],
	quicktime: ['.mov', '.qt'],
	flash: ['.swf', '.flv'],
	image: ['.jpg', '.gif', '.png'],
	iframe: ['.htm', '.html', '.shtml', '.php']
};

config.macros.player.loadURL=function(place,id,type,url,width,height,autoplay,show,extras) {

	if (id==undefined) id="tiddlyPlayer";
	if (!width) var width=config.options.txtPlayerDefaultWidth;
	if (!height) var height=config.options.txtPlayerDefaultHeight;
	if (url && (!type || !type.length || type=="auto")) { // determine type from URL
		u=url.toLowerCase();
		var map=config.macros.player.typeMap;
		for (var t in map) for (var i=0; i<map[t].length; i++)
			if (u.indexOf(map[t][i])!=-1) var type=t;
	}
	if (!type || !config.macros.player.html[type]) var type="none";
	if (!url) var url="";
	if (show===undefined) var show=true;
	if (!extras) var extras="";
	if (type=="none" && url.trim().length) type="iframe"; // fallback to iframe for unrecognized media types

	// adjust parameter values for player-specific embedded HTML
	switch (type) {
		case "windows":
			autoplay=autoplay?"1":"0"; // player-specific param value
			show=show?"1":"0"; // player-specific param value
			break;
		case "realone":
			autoplay=autoplay?"true":"false";
			show=show?"block":"none";
			height-=show?60:0; // leave room for controls
			break;
		case "quicktime":
			autoplay=autoplay?"true":"false";
			show=show?"true":"false";
			break;
		case "image":
			show=show?"block":"none";
			break;
		case "iframe":
			show=show?"block":"none";
			break;
	}

	// create containing div for player HTML
	// and add or replace player in TW DOM structure
	var newplayer = document.createElement("div");
	newplayer.playerType=type;
	newplayer.setAttribute("id",id+"_div");
	var existing = document.getElementById(id+"_div");
	if (existing && !place) place=existing.parentNode;
	if (!existing)
		place.appendChild(newplayer);
	else {
		if (place==existing.parentNode) place.replaceChild(newplayer,existing)
		else { existing.parentNode.removeChild(existing); place.appendChild(newplayer); }
	}

	var html=config.macros.player.html[type];
	html=html.replace(/%i%/mg,id);
	html=html.replace(/%w%/mg,width);
	html=html.replace(/%h%/mg,height);
	html=html.replace(/%u%/mg,url);
	html=html.replace(/%a%/mg,autoplay);
	html=html.replace(/%s%/mg,show);
	html=html.replace(/%x%/mg,extras);
	newplayer.innerHTML=html;
}
//}}}

// // Player-specific API functions: isReady(id), isPlaying(id), toggleControls(id), showControls(id,flag)

//{{{
// status values:
// Windows: 0=Undefined, 1=Stopped, 2=Paused, 3=Playing, 4=ScanForward, 5=ScanReverse
//          6=Buffering, 7=Waiting, 8=MediaEnded, 9=Transitioning, 10=Ready, 11=Reconnecting
// RealOne: 0=Stopped, 1=Contacting, 2=Buffering, 3=Playing, 4=Paused, 5=Seeking
// QuickTime: 'Waiting', 'Loading', 'Playable', 'Complete', 'Error:###'
// Flash: 0=Loading, 1=Uninitialized, 2=Loaded, 3=Interactive, 4=Complete
config.macros.player.isReady=function(id)
{
	var d=document.getElementById(id+"_div"); if (!d) return false;
	var p=document.getElementById(id); if (!p) return false;
	if (d.playerType=='windows') return !((p.playState==0)||(p.playState==7)||(p.playState==9)||(p.playState==11));
	if (d.playerType=='realone') return (p.GetPlayState()>1);
	if (d.playerType=='quicktime') return !((p.getPluginStatus()=='Waiting')||(p.getPluginStatus()=='Loading'));
	if (d.playerType=='flash') return (p.ReadyState>2);
	return true;
}
config.macros.player.isPlaying=function(id)
{
	var d=document.getElementById(id+"_div"); if (!d) return false;
	var p=document.getElementById(id); if (!p) return false;
	if (d.playerType=='windows') return (p.playState==3);
	if (d.playerType=='realone') return (p.GetPlayState()==3);
	if (d.playerType=='quicktime') return (p.getPluginStatus()=='Complete');
	if (d.playerType=='flash') return (p.ReadyState<4);
	return false;
}
config.macros.player.showControls=function(id,flag) {
	var d=document.getElementById(id+"_div"); if (!d) return false;
	var p=document.getElementById(id); if (!p) return false;
	if (d.playerType=='windows') { p.ShowControls=flag; p.ShowStatusBar=flag; }
	if (d.playerType=='realone') { alert('show/hide controls not available'); }
	if (d.playerType=='quicktime')      // if player not ready, retry in one second
		{ if (this.isReady(id)) p.setControllerVisible(flag); else setTimeout('config.macros.player.showControls("'+id+'",'+flag+')',1000); }
	if (d.playerType=='flash') { alert('show/hide controls not available'); }
}
config.macros.player.toggleControls=function(id) {
	var d=document.getElementById(id+"_div"); if (!d) return false;
	var p=document.getElementById(id); if (!p) return false;
	if (d.playerType=='windows') var flag=!p.ShowControls;
	if (d.playerType=='realone') var flag=true; // TBD
	if (d.playerType=='quicktime') var flag=!p.getControllerVisible();
	if (d.playerType=='flash') var flag=true; // TBD
	this.showControls(id,flag);
}
config.macros.player.fullScreen=function(id) {
	var d=document.getElementById(id+"_div"); if (!d) return false;
	var p=document.getElementById(id); if (!p) return false;
	if (d.playerType=='windows') p.DisplaySize=3;
	if (d.playerType=='realone') p.SetFullScreen();
	if (d.playerType=='quicktime') { alert('full screen not available'); }
	if (d.playerType=='flash') { alert('full screen not available'); }
}
//}}}

// // Player HTML

//{{{
// placeholder (no player)
config.macros.player.html.none=' \
	<table id="%i%" width="%w%" height="%h%" style="background-color:#111;border:0;margin:0;padding:0;"> \
	<tr style="background-color:#111;border:0;margin:0;padding:0;"> \
	<td width="%w%" height="%h%" style="background-color:#111;color:#ccc;border:0;margin:0;padding:0;text-align:center;"> \
	&nbsp; \
	%u% \
	&nbsp; \
	</td></tr></table>';
//}}}

//{{{
// JPG/GIF/PNG still images
config.macros.player.html.image='\
	<a href="%u%" target="_blank"><img width="%w%" height="%h%" style="display:%s%;" src="%u%"></a>';
//}}}

//{{{
// IFRAME web page viewer
config.macros.player.html.iframe='\
	<iframe id="%i%" width="%w%" height="%h%" style="display:%s%;background:#fff;" src="%u%"></iframe>';
//}}}

//{{{
// Windows Media Player
// v7.1 ID: classid=CLSID:6BF52A52-394A-11d3-B153-00C04F79FAA6
// v9	ID: classid=CLSID:22d6f312-b0f6-11d0-94ab-0080c74c7e95
config.macros.player.html.windows=' \
	<object id="%i%" width="%w%" height="%h%" style="margin:0;padding:0;width:%w%;height:%h%px;" \
		classid="CLSID:22d6f312-b0f6-11d0-94ab-0080c74c7e95" \
		codebase="http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=6,4,5,715" \
		align="baseline" border="0" \
		standby="Loading Microsoft Windows Media Player components..." \
		type="application/x-oleobject"> \
		<param name="FileName" value="%u%"> <param name="ShowControls" value="%s%"> \
		<param name="ShowPositionControls" value="1"> <param name="ShowAudioControls" value="1"> \
		<param name="ShowTracker" value="1"> <param name="ShowDisplay" value="0"> \
		<param name="ShowStatusBar" value="1"> <param name="AutoSize" value="1"> \
		<param name="ShowGotoBar" value="0"> <param name="ShowCaptioning" value="0"> \
		<param name="AutoStart" value="%a%"> <param name="AnimationAtStart" value="1"> \
		<param name="TransparentAtStart" value="0"> <param name="AllowScan" value="1"> \
		<param name="EnableContextMenu" value="1"> <param name="ClickToPlay" value="1"> \
		<param name="InvokeURLs" value="1"> <param name="DefaultFrame" value="datawindow"> \
		%x% \
		<embed src="%u%" style="margin:0;padding:0;width:%w%;height:%h%px;" \
			align="baseline" border="0" width="%w%" height="%h%" \
			type="application/x-mplayer2" \
			pluginspage="http://www.microsoft.com/windows/windowsmedia/download/default.asp" \
			name="%i%" showcontrols="%s%" showpositioncontrols="1" \
			showaudiocontrols="1" showtracker="1" showdisplay="0" \
			showstatusbar="%s%" autosize="1" showgotobar="0" showcaptioning="0" \
			autostart="%a%" autorewind="0" animationatstart="1" transparentatstart="0" \
			allowscan="1" enablecontextmenu="1" clicktoplay="0" invokeurls="1" \
			defaultframe="datawindow"> \
		</embed> \
	</object>';
//}}}

//{{{
// RealNetworks' RealOne Player
config.macros.player.html.realone=' \
	<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;"> \
	<object id="%i%" width="%w%" height="%h%" style="margin:0;padding:0;" \
		CLASSID="clsid:CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA"> \
		<PARAM NAME="CONSOLE" VALUE="player"> \
		<PARAM NAME="CONTROLS" VALUE="ImageWindow"> \
		<PARAM NAME="AUTOSTART" Value="%a%"> \
		<PARAM NAME="MAINTAINASPECT" Value="true"> \
		<PARAM NAME="NOLOGO" Value="true"> \
		<PARAM name="BACKGROUNDCOLOR" VALUE="#333333"> \
		<PARAM NAME="SRC" VALUE="%u%"> \
		%x% \
		<EMBED width="%w%" height="%h%" controls="ImageWindow" type="audio/x-pn-realaudio-plugin" style="margin:0;padding:0;" \
			name="%i%" \
			src="%u%" \
			console=player \
			maintainaspect=true \
			nologo=true \
			backgroundcolor=#333333 \
			autostart=%a%> \
		</OBJECT> \
	</td></tr><tr style="border:0;margin:0;padding:0;"><td style="border:0;margin:0;padding:0;"> \
	<object id="%i%_controls" width="%w%" height="60" style="margin:0;padding:0;display:%s%" \
		CLASSID="clsid:CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA"> \
		<PARAM NAME="CONSOLE" VALUE="player"> \
		<PARAM NAME="CONTROLS" VALUE="All"> \
		<PARAM NAME="NOJAVA" Value="true"> \
		<PARAM NAME="MAINTAINASPECT" Value="true"> \
		<PARAM NAME="NOLOGO" Value="true"> \
		<PARAM name="BACKGROUNDCOLOR" VALUE="#333333"> \
		<PARAM NAME="SRC" VALUE="%u%"> \
		%x% \
		<EMBED WIDTH="%w%" HEIGHT="60" NOJAVA="true" type="audio/x-pn-realaudio-plugin" style="margin:0;padding:0;display:%s%" \
			controls="All" \
			name="%i%_controls" \
			src="%u%" \
			console=player \
			maintainaspect=true \
			nologo=true \
			backgroundcolor=#333333> \
		</OBJECT> \
	</td></tr></table>';
//}}}

//{{{
// QuickTime Player
config.macros.player.html.quicktime=' \
	<OBJECT ID="%i%" WIDTH="%w%" HEIGHT="%h%" style="margin:0;padding:0;" \
		CLASSID="clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B" \
		CODEBASE="http://www.apple.com/qtactivex/qtplugin.cab"> \
		<PARAM name="SRC" VALUE="%u%"> \
		<PARAM name="AUTOPLAY" VALUE="%a%"> \
		<PARAM name="CONTROLLER" VALUE="%s%"> \
		<PARAM name="BGCOLOR" VALUE="#333333"> \
		<PARAM name="SCALE" VALUE="aspect"> \
		<PARAM name="SAVEEMBEDTAGS" VALUE="true"> \
		%x% \
		<EMBED name="%i%" WIDTH="%w%" HEIGHT="%h%" style="margin:0;padding:0;" \
			SRC="%u%" \
			AUTOPLAY="%a%" \
			SCALE="aspect" \
			CONTROLLER="%s%" \
			BGCOLOR="#333333" \
			EnableJavaSript="true" \
			PLUGINSPAGE="http://www.apple.com/quicktime/download/"> \
		</EMBED> \
	</OBJECT>';
//}}}

//{{{
// Flash Player
config.macros.player.html.flash='\
	<object id="%i%" width="%w%" height="%h%" style="margin:0;padding:0;" \
		classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" \
		codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,29,0"> \
		<param name="movie" value="%u%"> \
		<param name="quality" value="high"> \
		<param name="SCALE" value="exactfit"> \
		<param name="bgcolor" value="333333"> \
		%x% \
		<embed name="%i%" src="%u%" style="margin:0;padding:0;" \
			height="%h%" width="%w%" quality="high" \
			pluginspage="http://www.macromedia.com/go/getflashplayer" \
			type="application/x-shockwave-flash" scale="exactfit"> \
		</embed> \
	</object>';
//}}}
There are a lot of interesting people using ~TiddlySpace that you might like to keep track of and interact with. There are a number of ways of doing this.

If you see a number in the speech bubble in one of your tiddlers, it means that someone is writing about the same thing as you. You can find out what they're saying by clicking on it. Likewise, if you see something interesting in someone else's space, you can respond to it and write up your own thoughts on the subject by clicking "Reply to this tiddler".

Additionally, if you find anyone interesting, or you find an interesting looking space and you'd like to know when it's changed, you can "follow" that space. To do this, simply create a tiddler with the title: {{{@space-name}}} and tag it {{{follow}}}. If you want, you can store some notes about that space in the body of the tiddler.

If you then want to know what happening, simply [[include|How do I include/exclude spaces?]]@docs the @tivity space and then visit your activity stream at [[/activity|/activity]], or just visit the @tapas space directly.

!Not sure who to follow?
Here's a few suggestions:
* @fnd
* @cdent
* @pmario
* @bengillies
* @dickon
/***
|''Name''|TiddlySpaceFollowingPlugin|
|''Version''|0.7.1|
|''Description''|Provides a following macro|
|''Author''|Jon Robson|
|''Requires''|TiddlySpaceConfig TiddlySpaceTiddlerIconsPlugin ErrorHandler|
|''License''|[[BSD|http://www.opensource.org/licenses/bsd-license.php]]|
!Usage
Tag a tiddler with "follow" to express a list of followers.
Using the {{{<<followTiddlers X>>}}}
will reveal the number of tiddlers with name X in the set of spaces the *current* user viewing your space follows.
{{{<<following jon>>}}} will list all the users following Jon.
{{{<<followers jon>>}}} will list all the followers of jon.
{{{<linkedTiddlers>>}}} will list all tiddlers across TiddlySpace linked to the current tiddler
{{{<linkedTiddlers follow:yes>>}}} will list all tiddlers across TiddlySpace that come from your list of followers
adds spaceLink view type {{{<<view server.bag spaceLink>>}}} creates a link to the space described in server.bag
{{{<<view server.bag spaceLink title>>}}} makes a link to the tiddler with title expressed in the field title in space server.bag
If no name is given eg. {{{<<following>>}}} or {{{<<follow>>}}} it will default the current user.
!StyleSheet
.followTiddlersList li {
	list-style:none;
}

.followButton {
	width: 2em;
}

.followTiddlersList li .siteIcon {
	height:48px;
	width: 48px;
}

#sidebarTabs .followers li a,
.followers .siteIcon,
.followers .siteIcon div {
	display: inline;
}

.followTiddlersList li .externalImage, .followTiddlersList li .image {
	display: inline;
}

.scanResults li {
	list-style: none;
}
!Code
***/
//{{{
(function($) {
var LIMIT_FOLLOWING = 100;

var tweb = config.extensions.tiddlyweb;
var tiddlyspace = config.extensions.tiddlyspace;
var currentSpace = tiddlyspace.currentSpace.name;

var shadows = config.shadowTiddlers;
config.annotations.ScanTemplate = "This tiddler is the default template used in the display of tiddlers founding using the tsScan macro. To access attributes use the view macro e.g. {{{<<view title text>>}}}";
shadows.ScanTemplate = "<<view modifier SiteIcon width:24 height:24 spaceLink:yes label:no>> <<view title link>>";
shadows.FollowersTemplate = "<<view server.bag SiteIcon width:24 height:24 spaceLink:yes label:no>> <<view server.bag spaceLink>>";
shadows.FollowingTemplate = "<<view title SiteIcon width:24 height:24 spaceLink:yes label:no>> <<view title spaceLink>>";
shadows.FollowTiddlersBlackList = "";
shadows.FollowTiddlersHeading = "There are tiddlers in spaces you follow using the follow tag which use the title <<view title text>>";
shadows.FollowTiddlersTemplate = ["* <<view server.space SiteIcon width:24 height:24 spaceLink:yes label:no>> ",
	"<<view server.space spaceLink title external:no>> modified by <<view modifier spaceLink>> ",
	"in the <<view server.space spaceLink>> space (<<view modified date>> @ <<view modified date 0hh:0mm>>).\n"].join("");

var name = "StyleSheetFollowing";
shadows[name] = "/*{{{*/\n%0\n/*}}}*/".
	format(store.getTiddlerText(tiddler.title + "##StyleSheet"));
store.addNotification(name, refreshStyles);

// provide support for sucking in tiddlers from the server
tiddlyspace.displayServerTiddler = function(src, title, workspace, callback) {
	var adaptor = store.getTiddlers()[0].getAdaptor();
	var localTitle = tiddlyspace.getLocalTitle(title, workspace);
	var tiddler = new Tiddler(localTitle);
	tiddler.text = "Please wait while this tiddler is retrieved...";
	tiddler.fields.doNotSave = "true";
	store.addTiddler(tiddler);
	src = story.displayTiddler(src || null, tiddler.title);
	tweb.getStatus(function(status) {
		var context = {
			host: tweb.host, // TODO: inherit from source tiddler?
			workspace: workspace,
			headers: { "X-ControlView": "false" }
		};
		var getCallback = function(context, userParams) {
			var tiddler = context.tiddler;
			tiddler.title = localTitle;
			store.addTiddler(tiddler);
			story.refreshTiddler(localTitle, null, true); // overriding existing allows updating
			if(callback) {
				callback(src, tiddler);
			}
		};
		adaptor.getTiddler(title, context, null, getCallback);
	});
};

tiddlyspace.scroller = {
	runHandler: function(title, top, bottom, height) {
		var i;
		var handlers = tiddlyspace.scroller.handlers;
		var tidEl = story.getTiddler(title);
		if(tidEl) {
			var topEl = $(tidEl).offset().top + 20;
			if(top === false || (topEl > top && topEl < bottom)) {
				var h = handlers[title];
				for(i = 0; i < h.length; i++) {
					h[i]();
				}
				tiddlyspace.scroller.clearHandlers(title);
			}
		} else {
			tiddlyspace.scroller.clearHandlers(title);
		}
	},
	clearHandlers: function(title) {
		tiddlyspace.scroller.handlers[title] = [];
	},
	registerIsVisibleEvent: function(title, handler) {
		tiddlyspace.scroller.handlers[title] = tiddlyspace.scroller.handlers[title] || [];
		tiddlyspace.scroller.handlers[title].push(handler);
	},
	init: function() {
		this.handlers = {};
		this.interval = window.setInterval(function() {
			var top = $(window).scrollTop();
			var height = $(window).height();
			var bottom = top + height;
			var title;
			for(title in tiddlyspace.scroller.handlers) {
				if(title) {
					tiddlyspace.scroller.runHandler(title, top, bottom, height);
				}
			}
		}, 2000); // every 2 seconds check scroll position
	}
};
tiddlyspace.scroller.init();

var followMacro = config.macros.followTiddlers = {
	locale: {
		followListHeader: "Here are tiddlers from spaces you follow using the follow tag which use this title.",
		noTiddlersFromFollowers: "None of the spaces you follow contain a tiddler with this name.",
		errorMessage: "There was a problem retrieving tiddlers from the server. Please try again later."
	},
	init: function() {
		followMacro.lookup = {};
	},
	followTag: "follow",
	getHosts: function(callback) {
		tweb.getStatus(function(status) {
			callback(tweb.host, tiddlyspace.getHost(status.server_host, "%0"));
		});
	},
	getBlacklist: function() {
		return store.getTiddlerText("FollowTiddlersBlackList").split("\n");
	},
	handler: function(place, macroName, params, wikifier, paramString, tiddler) {
		var args = paramString.parseParams("anon")[0];
		var containingTiddler = story.findContainingTiddler(place).getAttribute('tiddler');
		var title = (args.anon && args.anon[0]) || tiddler.fields["server.title"] || tiddler.title;
		var tid = store.getTiddler(title);
		var user = params[1] || false;
		if(tid) {
			followMacro.makeButton(place, {
				url: "/search?q=title:%22" + encodeURIComponent(title) + "%22",
				containingTiddler: containingTiddler,
				blacklisted: followMacro.getBlacklist(), title: title, user: user,
				consultFollowRelationship: (args.follow &&
					args.follow[0] === 'false') ? false : true });
		}
	},
	makeButton: function(place, options) { // this is essentially the same code in TiddlySpaceFollowingPlugin
		var title = options.title;
		var blacklisted = options.blacklisted;
		var tiddler = store.getTiddler(title);
		var btn = $('<div class="followButton" />').addClass("notLoaded").appendTo(place)[0];
		if(blacklisted.contains(title)) {
			$(btn).remove();
			return;
		} else {
			var user = options.user;
			window.setTimeout(function() { // prevent multiple calls due to refresh
				tiddlyspace.scroller.registerIsVisibleEvent(options.containingTiddler, function() {
					var mkButton = function(followers, ignore) {
						if(!followers && !ignore) {
							$(btn).remove();
						} else {
							$("<a />").appendTo(btn);
							var scanOptions = { url: options.url,
								spaceField: options.spaceField || "bag", template: null, sort: "-modified",
								callback: function(tiddlers) {
									$(btn).removeClass("notLoaded");
									followMacro.constructInterface(btn, tiddlers);
								}
							};
							if(!ignore) {
								scanOptions.showBags = followMacro._getFollowerBags(followers);
							}
							scanOptions.hideBags = [tiddler.fields["server.bag"]];
							scanMacro.scan(null, scanOptions, user);
						}
					};
					if(options.consultFollowRelationship) {
						followMacro.getFollowers(mkButton);
					} else {
						mkButton([], true);
					}
				});
			}, 1000);
		}
	},
	constructInterface: function(container, tiddlers) {
		var txt = tiddlers.length;
		var className = txt > 0 ? "hasReplies" : "noReplies";
		var el = $(story.findContainingTiddler(container));
		$(container).empty().addClass(className);
		var btn = $("<a />").addClass("followedTiddlers").text(txt).
			click(function(ev) {
				followMacro.followingOnClick(ev);
			}).appendTo('<div class="followedTiddlers" />').appendTo(container)[0];
		$.data(btn, "tiddlers", tiddlers);
	},
	followingOnClick: function(ev) {
		var target = ev.target;
		var locale = followMacro.locale;
		var el = $('<div class="followTiddlersList" />')[0];
		var popup = Popup.create(target,"div");
		$(popup).addClass("taggedTiddlerList followList").click(function(ev) { // make it so only clicking on the document outside the popup removes the popup
			if(ev.target.parentNode != document) {
				ev.stopPropagation();
			}
		}).append(el);
		var tiddlers = $.data(target, "tiddlers") || [];
		scanMacro.template(el, tiddlers.slice(0,1), "FollowTiddlersHeading");
		scanMacro.template(el, tiddlers, "FollowTiddlersTemplate");
		if(tiddlers.length === 0) {
			$("<li />").text(locale.noTiddlersFromFollowers).appendTo(el);
		}
		Popup.show();
		ev.stopPropagation();
		return popup;
	},
	_getFollowerBags: function(followers) { // XXX: private or not?
		return $.map(followers, function(name, i) {
			return name != currentSpace ? "%0_public".format(name) : null;
		});
	},
	getFollowers: function(callback, username) {
		// returns a list of spaces being followed by the existing space
		var followersCallback = function(user) {
			if(!user.anon) {
				scanMacro.scan(null, { 
					url: "/search?q=bag:%0_public tag:%1 _limit:%2".format(user.name, followMacro.followTag, LIMIT_FOLLOWING),
					spaceField: "title", template: null, cache: true,
					callback: function(tiddlers) {
						var followers = [];
						for(var i = 0; i < tiddlers.length; i++) {
							followers.push(tiddlyspace.resolveSpaceName(tiddlers[i].title));
						}
						callback(followers);
					}
				});
			} else {
				callback(false);
			}
		};
		return !username ? tweb.getUserInfo(followersCallback) : followersCallback({ name: username });
	}
};

var scanMacro = config.macros.tsScan = {
	init: function () {
		this.scanned = {};
	},
	_tiddlerfy: function(jsontiddlers, options) {
		var tiddlers = [];
		var spaceField = options.spaceField || "bag"; // TODO: phase out use view types instead
		$.each(jsontiddlers, function(i, t) {
			var use = false;
			if(!options.showBags || (options.showBags && options.showBags.contains(t.bag))) {
				use = true;
			}
			if(options.hideBags && options.hideBags.contains(t.bag)) {
				use = false;
			}
			if(use) {
				var spaceName = t[spaceField];
				var tiddler = config.adaptors.tiddlyweb.toTiddler(t, tweb.host);
				tiddler.fields["server.space"] = tiddlyspace.resolveSpaceName(spaceName);
				tiddlers.push(tiddler);
			}
		});
		return tiddlers;
	},
	_scanCallback: function(place, jsontiddlers, options) {
		var locale = followersMacro.locale;
		var tiddlers = scanMacro._tiddlerfy(jsontiddlers, options);
		
		if(options.sort) {
			tiddlers = store.sortTiddlers(tiddlers, options.sort);
		}
		if(options.filter) {
			var _store = new TiddlyWiki();
			config.lastStore = _store;
			for(var i = 0; i < tiddlers.length; i++) {
				var clone = tiddlers[i];
				clone.title = tiddlyspace.getLocalTitle(clone.title, clone.fields['server.workspace']);
				_store.addTiddler(clone);
			}
			tiddlers = _store.filterTiddlers(options.filter);
		}
		if(place) {
			$(place).empty();
			var list = $("<ul />").appendTo(place)[0];
			scanMacro.template(list, tiddlers, options.template);
			if(tiddlers.length === 0) {
				$("<li />").text(options.emptyMessage || locale.noone).appendTo(list);
				$(list).addClass("emptyList");
			}
		}
		if(options.callback) {
			options.callback(tiddlers);
		}
	},
	constructSearchUrl: function(host, options) {
		if(options.url) {
			return options.url;
		}
		var inputs = options.searchValues;
		var tag = options.tag;
		var searchField = options.searchField || "title";
		var searchQuery = [];
		for(var i = 0; i < inputs.length; i++) {
			searchQuery.push('%0:"%1"'.format(searchField, inputs[i]));
		}
		var query = searchQuery.join(" OR ");
		query = tag ? "(%0) AND tag:%1".format(query, tag) : query;
		query = options.query ? "%0;%1;".format(query, options.query) : query;
		query = options.fat ? "%0&fat=1".format(query) : query;
		return '%0/search?q=%1'.format(host, query);
	},
	scan: function(place, options) { // TODO: make use of list macro with url filter
		var locale = followersMacro.locale;
		options.template = options.template ? options.template : "ScanTemplate";
		followMacro.getHosts(function(host, tsHost) {
			$(place).text(followersMacro.locale.pleaseWait);
			options = options ? options: {};
			var url = scanMacro.constructSearchUrl(host, options);
			if(options.cache && scanMacro.scanned[url]) {
				var tiddlers = scanMacro.scanned[url].tiddlers;
				var run = function(tiddlers) {
					scanMacro._scanCallback(place, tiddlers, options);
				};
				if(tiddlers) {
					run(tiddlers);
				} else {
					scanMacro.scanned[url].callbacks.push(run);
				}
			} else {
				var callback = function(tiddlers) {
					scanMacro._scanCallback(place, tiddlers, options);
				};
				if(scanMacro.scanned[url] && scanMacro.scanned[url].callbacks) {
					scanMacro.scanned[url].callbacks.push(callback);
				} else {
					scanMacro.scanned[url] = {
						callbacks: [callback]
					};
				}
				ajaxReq({
					url: url,
					dataType: "json",
					success: function(tiddlers) {
						scanMacro.scanned[url].tiddlers = tiddlers;
						var callbacks = scanMacro.scanned[url].callbacks;
						while(callbacks.length > 0) {
							callbacks.pop()(tiddlers);
						}
					},
					error: function(xhr) {
						$(place).empty();
						$("<span />").addClass("annotation error").text(locale.error.format(xhr.status)).appendTo(place);
					}
				});
			}
		});
	},
	template: function(place, tiddlers, template) { // TODO: make use of list macro.
		for(var i = 0; i < tiddlers.length; i++) {
			var tiddler = tiddlers[i];
			var item = $('<li class="spaceName" />').appendTo(place)[0];
			var spaceName = tiddler.fields["server.space"] || "";
			var templateText = store.getTiddlerText(template).replace(/\$1/mg, spaceName);
			wikify(templateText, item, null, tiddler);
		}
	},
	getOptions: function(paramString, tiddler) {
		var args = paramString.parseParams("name", null, true, false, true)[0];
		var options = { query: false, sort: false, tag: false, template: false, showBags: args.show || false,
			hideBags: args.hide || false, filter: false, spaceField: "bag", searchField: "title", fat: false,
			emptyMessage: false };
		for(var name in args) {
			if(name != "name") {
				if(name == "fat") {
					options[name] = true;
				} else {
					options[name] = args[name][0];
				}
			}
		}
		// if user has set searchField to modifier, then use the modifiers value if available otherwise use searchValues.
		var searchField = options.searchField;
		var searchValues = args[searchField] ? args[searchField] : args.searchValues;
		// if neither of those were used use the first parameter
		var defaultValues = tiddler ? [ tiddler.title ] : [];
		options.searchValues = searchValues ? searchValues : ( args.name ? [args.name[0]] : defaultValues);
		return options;
	},
	handler: function(place, macroName, params, wikifier, paramString, tiddler) {
		var container = $("<div />").addClass("scanResults resultsArea").appendTo(place)[0];
		var options = scanMacro.getOptions(paramString, tiddler);
		scanMacro.scan(container, options);
	}
};

var followersMacro = config.macros.followers = {
	locale: {
		loggedOut: "Please login to see the list of followers",
		noSupport: "We were unable to retrieve followers as your browser does not support following.",
		pleaseWait: "Please wait while we look this up...",
		error: "Error %0 occurred whilst retrieving data from server",
		noone: "None."
	},
	handler: function(place, macroName, params, wikifier, paramString, tiddler) {
		var locale = followersMacro.locale;
		var args = paramString.parseParams("name", null, true, false, true)[0];
		var username = args.name ? args.name[0] : false;
		var container = $('<div class="followers" />').text(locale.pleaseWait).
			appendTo(place)[0];
		var followersCallback = function(user) {
			if(user.anon) {
				$("<span />").text(locale.loggedOut).appendTo(container);
			} else {
				var options = scanMacro.getOptions(paramString);
				$.extend(options, {
					url: "/search?q=title:@%0 OR title:%0 tag:%1 _limit:%2".
						format(user.name, followMacro.followTag, LIMIT_FOLLOWING),
					spaceField: "bag",
					template: options.template ? options.template : "FollowersTemplate"
				});
				scanMacro.scan(container, options);
			}
		};
		return !username ? followersCallback({ name: currentSpace }) : followersCallback({ name: username });
	}
};

var followingMacro = config.macros.following = {
	locale: {
		pleaseWait: followersMacro.locale.pleaseWait,
		loggedOut: "Please login to see who you are following",
		noSupport: followersMacro.locale.noSupport,
		error: followersMacro.locale.error,
		noone: followersMacro.locale.noone
	},
	handler: function(place, macroName, params, wikifier, paramString, tiddler) {
		var locale = followingMacro.locale;
		var args = paramString.parseParams("name", null, true, false, true)[0];
		var fat = args.fat ? true : false;
		var username = args.name ? args.name[0] : false;
		var container = $('<div class="following" />').text(locale.pleaseWait).
			appendTo(place)[0];
		var followingCallback = function(user) {
			if(user.anon) {
				$("<span />").text(locale.loggedOut).appendTo(container);
			} else {
				var options = scanMacro.getOptions(paramString);
				$.extend(options, {
					url: "/search?q=bag:%0_public tag:%1 _limit:%2".format(user.name, followMacro.followTag, LIMIT_FOLLOWING),
					spaceField: "title",
					template: options.template ? options.template : "FollowingTemplate"
				});
				scanMacro.scan(container, options);
			}
		};
		return !username ? followingCallback({ name: currentSpace }) : followingCallback({ name: username });
	}
};

var linkedMacro = config.macros.linkedTiddlers = {
	handler: function(place, macroName, params, wikifier, paramString, tiddler) {
		var args = paramString.parseParams("anon")[0];
		var title = params[0] || tiddler.fields["server.title"] || tiddler.title;
		var tid = store.getTiddler(title);
		var containingTiddler = story.findContainingTiddler(place).getAttribute('tiddler');
		if(tid) {
			followMacro.makeButton(place, {
				spaceField: "recipe",
				url: "/bags/%0/tiddlers/%1/backlinks".format(tid.fields['server.bag'],
					encodeURIComponent(tid.title)),
				blacklisted: followMacro.getBlacklist(),
				title: title,
				containingTiddler: containingTiddler,
				user: params[1] || false,
				consultFollowRelationship: args.follow ? true : false });
		}
	}
};

if(config.options.chkFollowTiddlersIsLinkedTiddlers) {
	merge(config.macros.followTiddlers, config.macros.linkedTiddlers);
	config.shadowTiddlers.FollowTiddlersHeading = "These are the other tiddlers that link to this tiddler.";
}

})(jQuery);
//}}}
Type the text for 'New Tiddler'
This site is a collection of tutorials, articles, poems and essays on Punjabi as well as in Punjabi. Punjabi is the native language of the Punjab region in India and Pakistan. It is written in [[Gurmukhi |B. Gurmukhi Script]] script. According to [[wikipedia|http://en.wikipedia.org/wiki/Punjabi_language]] :
<<<
Punjabi is the most spoken language in Pakistan and 11th most spoken language in India and 3rd most spoken language in South Asia. According to the Ethnologue 2005 estimate, there are 88 million native speakers of the Punjabi language, which makes it approximately the 11th most widely spoken language in the world. According to the 2008 Census of Pakistan, there are approximately 76,335,300 native speakers of Punjabi in Pakistan, and according to the Census of India, there are over 29,102,477 Punjabi speakers in India
<<<
Enjoy your visit
[[Shavinder]]
/*{{{*/
body {
	font-size: 1em;
	font-family: helvetica, arial, sans-serif;
	background-color: #fff;
	color: [[ColorPalette::Foreground]];
}

body ul { margin: 0; }

#popup {
	background-color: [[ColorPalette::TertiaryPale]];
}

#popup.confirmationPopup, .followList {
	font-size: 0.8em;
	padding: 1em;
	border: solid 1px [[ColorPalette::SecondaryMid]];
	background-color: [[ColorPalette::SecondaryPale]];
}

.followList .listTitle {
	text-decoration: underline;
}

#popup .followTiddlersList a {
	display: inline;
	padding: 0;
}

#popup li a {
	color: [[ColorPalette::PrimaryMid]];
	font-weight: bold;
}

#popup li a:hover {
	color: [[ColorPalette::PrimaryPale]];
	background: [[ColorPalette::PrimaryMid]];
}

#popup li.listTitle {
	border-bottom: 1px solid #000;
	font-weight: bold;
	margin-bottom: 10px;
}

#popup.followList {
	margin-left: 50px;
	margin-top: -30px;
}

.followTiddlersList .label {
	display: block;
	left: 10px;
	top: 0px;
	line-height: 16px;
	position: relative;
}

#popup .followTiddlersList .siteIcon{
	height: auto;
}

#popup .followTiddlersList li{
	clear: both;
	display: block;
	height: 48px;
	margin-bottom: 8px;
	position: relative;
}

#popup .followTiddlersList a{
	display: inline;
}

#displayArea {
	margin: 0;
	top: 0px;
	left: 0px;
	width: 100%;
	position: relative;
}

.revisionCloak {
	position: absolute;
	position: fixed !important;
	height: 100%;
	width: 100%;
	top: 0;
	left: 0;
	border: 0;
	margin: 0;
	padding: 0;
	opacity: 0.5;
	filter: alpha(opacity=50);
	background-color: #000;
}

/* *** Header *** */
.header {
	position: relative;
	background-color: [[ColorPalette::PrimaryMid]];
	_width: 100%; /* ie 6 demands */
}

.headerForeground {
	background-color: [[ColorPalette::PrimaryMid]];
	float: left;
	margin: 24px 16px 0px 72px;
	padding: 0;
	position: relative;
	top: 0;
	_width: 70%; /*ie6: needed for the background to actually be transparent*/
	_background-color: transparent; /*ie6: needed to show the search box*/
}

.clearFloat {
	clear: both;
}

#contentWrapper {
	position: relative;
	padding-top: 1px;
	top: -1px;
}

#tiddlerDisplay {
	_position: relative; /* ie 6*/
}

.siteTitle {
	clear: both;
	display: block;
	font-size: 32px;
	font-weight: bold;
	line-height: 32px;
}

.siteSubtitle {
	display: block;
	font-size: 14px;
	height: 16px;
	margin-bottom: 8px;
}

#sidebarSearch {
	padding: 0;
	position: absolute;
	right: 80px;
	top: 8px;
	width: 176px;
}

#sidebarSearch .txtOptionInput {
	width: 100%;
	margin-top: 5px;
	_color: #bbb; /* ie6 danger */
}

#sidebarSearch .txtOptionInput:focus {
	color: #000;
}

#sidebarSearch .searchButton {
	display: none;
}

/* *** Menu Bar *** */

#mainMenu {
	position: static;
	text-align: left;
	margin-left: 72px;
	float: left;
	width: auto;
	padding: 0;
	font-size: 1em;
	line-height: normal;
}

#mainMenu a {
	color: #fff;
	padding: 8px;
	font-size: 0.9em;
	margin-right: 16px;
}

#mainMenu a:hover {
	background-color: [[ColorPalette::PrimaryMid]];
	color: [[ColorPalette::Background]]
}

#sidebarOptions {
	margin-right: 72px;
	float: right;
	font-size: 1.1em;
	line-height: 1.6em;
	min-height: 1em;
	padding-top: 0;
}

#sidebarOptions a {
	margin-right: 8px;
}

.confirmationPopup .button,
#sidebarOptions .button {
	cursor: pointer;
	line-height: 1.4em;
	text-align: center;
	margin-right: 8px;
	margin-left:-2px;
}

.confirmationPopup .button {
	font-size: 0.9em;
	padding: 2px;
}

#sidebarOptions .button {
	font-size: 0.7em;
	float: left;
	width: 80px;
	padding: 0px;
        color: #fff;
}

.confirmationPopup a.button,
#sidebarOptions a {
	border: none;
	margin: 0 0.2em;
	padding: 0.6em 0.25em;
	display: inline;
	color: #666;
}

.confirmationPopup a.button:hover,
#sidebarOptions a:hover {
	color: #000;
}

.confirmationPopup a.button:active,
#sidebarOptions a:active {
	border: solid 1px [[ColorPalette::PrimaryMid]];
	background-color: #fff;
	background: -webkit-gradient( linear, left bottom, left top, color-stop(0.1,rgb(200,200,200)), color-stop(1, rgb(100,100,100)));
	background: -moz-linear-gradient(center bottom , rgb(200,200,200) 10%,rgb(100,100,100) 100%) repeat scroll 0 0 transparent;
}
/* *** Sidebar *** */

#sidebar .wizard table {
	margin: 0px;
}

.tabContents .listTitle:first-child {
	margin-top: 0px;
}

#menuBar {
	background: [[ColorPalette::PrimaryLight]];
	left: 0;
	right: 0;
	position: relative;
	margin: 0;
	padding: 0.5em 0 0.5em 0;
	min-height: 1em;
	overflow: hidden;
	_width: 100%; /* for ie 6 */
}

#sidebarOptions a.button:hover {
	color: [[ColorPalette::PrimaryPale]];
    background: [[ColorPalette::PrimaryMid]];
}

#tiddlerDisplay, #searchResults {
	margin: 16px 448px 0 72px;
}

#sidebarTabs {
	position: absolute;
	right: 72px;
	width: 352px;
	top: 0;
}

#sidebarTabs .tabsetWrapper .tabset {
	width: 87px;
	border-top: 1px solid [[ColorPalette::PrimaryPale]];
	border-left: 1px solid [[ColorPalette::PrimaryPale]];
	border-bottom: 1px solid [[ColorPalette::PrimaryPale]];
	height: auto;
	float: left;
	word-wrap: break-word;
	top: 0;
	padding: 0;
}

#sidebarTabs .tabsetWrapper .tabContents {
	background-color: [[ColorPalette::PrimaryPale]];
	border: 3px solid [[ColorPalette::PrimaryMid]];
	width: 242px;
	_width: 238px;
	left: -3px;
	_left: -5px;
	position: relative;
	min-height: 34em;
	padding: 8px;
	font-size: 0.8em;
}

/* ---- Side style --- */

#sidebarTabs .tabsetWrapper .tabset .tab {
	font-size: 0.9em;
	padding: 0.7em 8px 0.5em;
	color: #fff;
	background: [[ColorPalette::PrimaryLight]];
	border: none;
	line-height: 16px;
	position: relative;
	display: block;
	margin: 0;
}

#sidebarTabs .tabsetWrapper .tabset .tabSelected {
	color: [[ColorPalette::PrimaryMid]];
	background: [[ColorPalette::PrimaryPale]];
	border-top: 3px solid [[ColorPalette::PrimaryMid]];
	border-bottom: 3px solid [[ColorPalette::PrimaryMid]];
	border-left: 3px solid [[ColorPalette::PrimaryMid]];
	z-index: 10;
	margin-top: -1px;
	font-weight: bold;
}

#sidebarTabs .tabContents li {
	border: none;
	margin-left: 0;
	word-wrap: break-word;
}

.tabContents .timeline {
	background: [[ColorPalette::PrimaryPale]];
	margin-bottom: 8px;
}

#sidebarTabs .timeline li.listTitle {
	color: #132E43;
	margin-left: 8px 0;
	padding: 0.3em 0.11em;
	font-size: 1em;
	border-bottom: none;
}

#sidebarTabs .tabContents li a {
	display: block;
	text-align: left;
	margin: 0 0 1px 0;
	padding: 0.3em 1em;
	background: [[ColorPalette::PrimaryPale]];
}

#sidebarTabs .tabsetWrapper .tabset a:hover,
#sidebarTabs .tabContents li a:hover {
	color: [[ColorPalette::PrimaryPale]];
	background: [[ColorPalette::PrimaryMid]];
}

/* Activity Stream */
#sidebarTabs .tabContents .activityStream .feedItem a {
	display: inline-block;
	padding: 0;
	background: none;
}

/* ---- Tagging box --- */
.tagInfo {
	border: 1px solid #cccccc;
	padding: 10px 15px;
	-moz-box-shadow: 0 2px 2px rgba(0, 0, 0, 0.2);
	box-shadow: 0 2px 2px rgba(0,0,0,0.2);
	color: [[ColorPalette::TertiaryMid]];
	background: -moz-linear-gradient(100% 100% 90deg, #f4f4f4, #e5e5e5);
	background: -webkit-gradient(linear, left top, right top, from(#e5e5e5), to(#f4f4f4));
	margin-top: 1em;
	font-size: 13px;
	margin: 0 0 0 56px;
}

.tagInfo ul {
	list-style: none;
	padding-left: 2.2em;
}

.tagInfo ul li {
	display: inline;
}

.tagInfo ul li.listTitle,
.tagInfo .tagging ul li.listTitle {
	color: [[ColorPalette::PrimaryMid]];
	font-size: 13px;
}

.tagInfo ul li a {
	border: none;
}

.tagInfo .tagging ul li {
	float: none;
	display: inline-block;
}

.tagInfo .tagging {
	padding: 0;
}

.viewRevision .toolbar {
	right: 48px;
	top: 8px;
}

.viewRevision .modifierIcon img,
.viewRevision .modifierIcon svg {
	margin-right: 8px;
}

.viewRevision .toolbar svg {
	width: 32px;
	height: 32px;
}

/* --- IE hacks from lattice --- */

/* ie hacks */
* html #menuBar {
	margin-bottom: 8px;
}
.toolbar .svgIconText {
	*display: inline;
}

div.tiddler .toolbar a {
	cursor: pointer;
	float: left\9;
	display: inline\9;
}

* html .toolbar {
	right: 8px;
}
* html .followButton a {
	margin-top: 0px;
	margin-right: 8px;
}
* html #tiddlerDisplay {
	margin-top: 0px;
}

/* for printing purposes */
@media print {
	#mainMenu,
	#sidebar,
	#messageArea,
	.toolbar,
	.followPlaceHolder,
	#backstageButton,
	#backstageArea,
	#sidebarTabs,
	#sidebarSearch .txtOptionInput,
	#sidebarOptions {
		display: none !important;
	}
	#displayArea {
		margin: 1em 1em 0em;
	}
	noscript {
		display:none; /* Fixes a feature in Firefox 1.5.0.2 where print preview displays the noscript content */
	}
	#tiddlerDisplay {
		margin: 16px 16px;
	}
}

@media all and (max-width: 960px){
	#tiddlerDisplay,
	#searchResults {
		margin: 16px 366px 0 16px;
	}

	#mainMenu {
		margin-left: 16px;
	}

	.headerForeground {
		margin-left: 16px;
	}

	#sidebarSearch {
		right: 16px;
	}

	#sidebarOptions {
		margin-right: 16px;
	}

	#sidebarTabs {
		right: 16px;
		width: 326px;
	}

	#sidebarTabs .tabsetWrapper .tabset {
		font-size: 0.9em;
		width: 77px;
	}

	#sidebarTabs .tabsetWrapper .tabContents {
		width: 226px;
		_width: 222px;
	}

	#sidebarTabs .tabContents li a {
		font-size: 0.9em;
	}
}
/*}}}*/
[[StyleSheetTiddler]]
//{{{
//macro to rename buttons

var cm=config.macros;
cm.rB={handler:function(place,macroName,params,wikifier,paramString,tiddler){
  if(place.lastChild&&place.lastChild.tagName!="BR"){
    var p1=params.shift().split("#");
    var name=p1[0];
    var id=p1[1];
    var title=params[0];
    el=place.lastChild;
    if(el.tagName&&el.tagName.toUpperCase()!="A")el=el.firstChild;
    el.firstChild.data=name;
    if(id)el.setAttribute('id',id);
    if(title)el.title=title;
  }
}}
//}}}
(function() {
var getCSRFToken = function(window) {
	// XXX: should not use RegEx - cf.
	// http://www.quirksmode.org/js/cookies.html
	// https://github.com/TiddlySpace/tiddlyspace/commit/5f4adbe009ed4bda3ce39058a3fb07de1420358d
	var regex = /^(?:.*; )?csrf_token=([^(;|$)]*)(?:;|$)/;
	var match = regex.exec(document.cookie);
	var csrf_token = null;
	if (match && (match.length === 2)) {
		csrf_token = match[1];
	}

	return csrf_token;
};

if (typeof config !== 'undefined' && config.extensions &&
		config.extensions.tiddlyspace &&
		config.extensions.tiddlyspace.getCSRFToken === null) {
	config.extensions.tiddlyspace.getCSRFToken = getCSRFToken;
} else {
	window.getCSRFToken = getCSRFToken;
}
})(window);
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xl="http://www.w3.org/1999/xlink" version="1.1" viewBox="434 218 68 68"
width="30" height="30">
<g stroke="none" stroke-opacity="1" stroke-dasharray="none" fill="none" fill-opacity="1">
	<g>
		<path d="M 478.39694 232.53705 L 478.39694 232.53705 
		C 477.1145 231.85132 475.77875 231.30147 474.41058 230.88734 L 474.41058 218.24994 L 461.58942 218.24994 
		L 461.58942 230.88734 C 460.22125 231.30147 458.8855 231.85132 457.60306 232.53705 L 448.66824 223.60214 
		L 439.6022 232.66814 L 448.53717 241.60304 C 447.8515 242.8854 447.30157 244.22116 446.88745 245.58936 
		L 434.25 245.58936 L 434.25 258.41052 L 446.88745 258.41052 
		C 447.30157 259.77869 447.8515 261.11447 448.53717 262.39688 L 439.6022 271.33173 L 448.66824 280.3978 
		L 457.60306 271.46283 C 458.8855 272.14862 460.22125 272.69846 461.58942 273.11252 L 461.58942 285.74988 
		L 474.41058 285.74988 L 474.41058 273.11252 C 475.77875 272.69846 477.1145 272.14862 478.39694 271.46283 
		L 487.33176 280.3978 L 496.39767 271.33173 L 487.46286 262.39688 
		C 488.14853 261.11447 488.69836 259.77869 489.11255 258.41052 L 501.74988 258.41052 L 501.74988 245.58936 
		L 489.11255 245.58936 C 488.69836 244.22116 488.14853 242.8854 487.46286 241.60304 L 496.39767 232.66814 
		L 487.33176 223.60214 Z M 475.3328 244.66714 C 479.3825 248.71698 479.3825 255.2829 475.3328 259.33273 
		C 471.28296 263.3826 464.71704 263.3826 460.66724 259.33273 
		C 456.61737 255.2829 456.61737 248.71698 460.66724 244.66714 
		C 464.71704 240.61734 471.28296 240.61734 475.3328 244.66714" fill="#111"
		class="glyph"/>
	</g>
</g>
</svg>
Type the text for 'New Tiddler'
/***
|''Name:''|PunjabiTranslationPlugin|
|''Description:''|Translation of TiddlyWiki into Punjabi|
|''Author:''|Shavinder Singh (shavinderpalsingh (at) gmail (dot) com)|
|''CodeRepository:''|http://punjabi.tiddlyspot.com/#PunjabiTranslationPlugin|
|''Version:''|0.0.1|
|''Date:''|Feb 5, 2012|
|''Comments:''|Please make comments at http://groups.google.com/group/tiddlywiki|
|''License:''|[[Creative Commons Attribution-ShareAlike 3.0 License|http://creativecommons.org/licenses/by-sa/3.0/]] |
|''~CoreVersion:''|2.6.1|
***/

//{{{
//--
//-- Translateable strings
//--

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

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

if (config.options.txtUserName == 'YourName') // do not translate this line, but do translate the next line
	merge(config.options,{txtUserName: "ਤੁਹਾਡਾਨਾਮ"});

merge(config.tasks,{
	save: {text: "ਸੇਵ", tooltip: "ਇਸ ਟਿਡਲੀਵਿਕੀ ਦੇ ਬਦਲਾਓ ਸੇਵ ਕਰੋ", action: saveChanges},
	sync: {text: "ਸੁਮੇਲੋ", tooltip: "ਬਦਲਾਵਾਂ ਨੂ ਬਾਕੀ ਟਿਡਲੀਵਿਕੀ ਫਾਈਲਾਂ ਤੇ ਸਰਵਰਾਂ ਨਾਲ ਸੁਮੇਲੋ", content: '<<sync>>'},
	importTask: {text: "ਇੰਪੋਰਟ", tooltip: "ਟਿਡਲਰਾਂ ਅਤੇ ਪਲੱਗਿਨਾਂ ਨੂੰ ਦੂਜੀਆਂ ਟਿਡਲੀਵਿਕੀ ਫਾਈਲਾਂ ਅਤੇ ਸਰਵਰਾਂ ਤੋਂ ਇੰਪੋਰਟ ਕਰੋ", content: '<<importTiddlers>>'},
	tweak: {text: "ਟ੍ਵੀਕ", tooltip: "ਟਿਡਲੀਵਿਕੀ ਦੀ ਦਿਖ ਅਤੇ ਵਿਓਹਾਰ ਨੂੰ ਟ੍ਵੀਕੋ", content: '<<options>>'},
	upgrade: {text: "ਅਪਗ੍ਰੇਡ", tooltip: "ਟਿਡਲੀਵਿਕੀ ਦੇ ਕੋਰ-ਕੋਡ ਨੂੰ ਅਪਗ੍ਰੇਡ ਕਰੋ", content: '<<upgrade>>'},
	plugins: {text: "ਪਲੱਗਿਨ", tooltip: "ਇੰਸਟਾਲ ਹੋਏ ਹੋਏ ਪਲੱਗਿਨਾਂ ਨੂੰ ਮੈਨੇਜ ਕਰੋ", content: '<<plugins>>'}
});

// Options that can be set in the options panel and/or cookies
merge(config.optionsDesc,{
	txtUserName: "ਤੁਹਾਡੇ ਸੰਪਾਦਨਾਂ ਲਈ ਯੂਜ਼ਰ-ਨੇਮ",
	chkRegExpSearch: "ਖੋਜਾਂ ਲਈ ਰੈਗੂਲਰ-ਐਕਸਪ੍ਰੈਸ਼ਨ ਚਾਲੂ ਕਰੋ",
	chkCaseSensitiveSearch: "ਕੇਸ-ਸੰਵੇਦਨਸ਼ੀਲ ਖੋਜ",
	chkIncrementalSearch: "ਅੱਖਰ-ਅੱਖਰ ਵ੍ਰਿਦੀਸ਼ੀਲ ਖੋਜ",
	chkAnimate: "ਐਨੀਮੇਸ਼ਨ ਚਾਲੂ ਕਰੋ",
	chkSaveBackups: "ਬਦਲਾਓ ਸੇਵ ਕਰਨ ਵੇਲੇ ਬੈਕਅਪ ਫਾਈਲ ਰੱਖੋ",
	chkAutoSave: "ਆਪਣੇ ਆਪ ਬਦਲਾਓ ਸੇਵ ਕਰੋ",
	chkGenerateAnRssFeed: "ਬਦਲਾਓ ਸੇਵ ਕਰਣ ਵੇਲੇ RSS ਫੀਡ ਪੈਦਾ ਕਰੋ",
	chkSaveEmptyTemplate: "ਬਦਲਾਓ ਸੇਵ ਕਰਣ ਵੇਲੇ ਖਾਲੀ ਟੈਂਪਲੇਟ ਪੈਦਾ ਕਰੋ",
	chkOpenInNewWindow: "ਬਾਹਰਲੇ ਲਿੰਕ ਨਵੀਂ ਖਿੜਕੀ ਵਿਚ ਖੋਲੋ",
	chkToggleLinks: "ਟਿਡਲਰ ਖੋਲਣ ਵਾਲੇ ਲਿੰਕਾਂ ਤੇ ਕਲਿਕ ਕਰਣ ਨਾਲ ਓਹ ਬੰਦ ਹੋ ਜਾਣ",
	chkHttpReadOnly: "HTTP ਰਾਹੀ ਦੇਖੇ ਜਾਣ ਵੇਲੇ ਸੰਪਾਦਨ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਛੁਪਾ ਦੇਓ",
	chkForceMinorUpdate: "ਟਿਡਲਰਾਂ ਦੇ ਸੰਪਾਦਨ ਵੇਲੇ ਸੰਪਾਦਕ ਯੂਜ਼ਰ-ਨੇਮ  ਅਤੇ ਤਰੀਕ ਨੂੰ ਨਵੀਨ ਨਾ ਕਰੋ",
	chkConfirmDelete: "ਟਿਡਲਰਾਂ ਨੂੰ ਮਿਟਾਉਣ ਤੋਂ ਪਹਿਲਾਂ ਪੁਸ਼ਟੀ ਦੀ ਲੋੜ ਕਰੋ",
	chkInsertTabs: "ਟੈਬ ਕੀਅ ਦਾ ਪ੍ਰਯੋਗ ਫੀਲਡਾਂ ਵਿਚਾਲੇ ਚਲਣ ਦੀ ਬਜਾਏ ਟੈਬ ਅੱਖਰ ਪਾਉਣ ਲਈ ਕਰੋ",
	txtBackupFolder: "ਬੈਕਅਪਾਂ ਵਾਸਤੇ ਪ੍ਰਯੋਗ ਕੀਤੇ ਜਾਣ ਵਾਲੇ ਫੋਲਡਰ ਦਾ ਨਾਮ",
	txtMaxEditRows: "ਸੰਪਾਦਨ ਖਾਨਿਆਂ ਵਿਚ ਵਧ ਤੋਂ ਵਧ ਸਤਰਾਂ",
	txtTheme: "ਪ੍ਰਯੋਗ ਹੋਣ ਵਾਲੇ ਥੀਮ ਦਾ ਨਾਮ",
	txtFileSystemCharSet: "ਬਦਲਾਵ ਸੇਵ ਕਰਣ ਲਈ ਡਿਫਾਲਟ ਕਰੈਕਟਰ-ਸੈੱਟ (ਕੇਵਲ ਫਾਇਰਫਾਕਸ/ਮੌਜੀਲਾ ਲਈ)"});

merge(config.messages,{
	customConfigError: "ਪਲੱਗਿਨ ਲੋਡ ਕਰਦਿਆਂ ਸਮੱਸਿਆਵਾਂ ਦਾ ਸਾਹਮਣਾ ਹੋਇਆ. ਵੇਰਵੇ ਲਈ ਪਲੱਗਿਨ-ਮਨੇਜਰ ਦੇਖੋ",
	pluginError: "ਐਰਰ: %0",
	pluginDisabled: "ਐਗਜ਼ੀਕਿਊਟ ਨਹੀਂ ਕੀਤਾ ਗਿਆ ਕਿਉਂਕਿ 'systemConfigDisable' ਟੈਗ ਨਾਲ ਕਿਰਿਆਹੀਣ ਕੀਤਾ ਗਿਆ",
	pluginForced: "'systemConfigForce' ਟੈਗ ਦ੍ਵਾਰਾ ਜ਼ਬਰਨ ਐਗਜ਼ੀਕਿਊਟ ਕੀਤਾ ਗਿਆ",
	pluginVersionError: "ਐਗਜ਼ੀਕਿਊਟ ਨਹੀਂ ਕੀਤਾ ਗਿਆ ਕਿਉਂਕਿ ਇਸ ਪਲੱਗਿਨ ਨੂੰ ਟਿਡਲੀਵਿਕੀ ਦੀ ਨਵੀਨ ਵਰਜ਼ਨ ਦੀ ਲੋੜ ਹੈ",
	nothingSelected: "ਕੁਝ ਵੀ ਚੁਣਿਆ ਨਹੀਂ ਹੋਇਆ. ਤੁਹਾਨੂੰ ਪਹਿਲਾਂ ਇਕ ਜਾਂ ਵਧ ਆਈਟਮਾਂ ਨੂੰ ਚੁਣਨਾ ਹੋਵੇਗਾ.",
	savedSnapshotError: "ਇੰਜ ਲਗਦਾ ਹੈ ਕੀ ਟਿਡਲੀਵਿਕੀ ਸਹੀ ਸੇਵ ਨਹੀਂ ਕੀਤੀ ਗਈ. ਕਿਰਪਾ ਕਰਕੇ ਵੇਰਵੇ ਲਈ http://www.tiddlywiki.com/#Download ਦੇਖੋ.",
	subtitleUnknown: "(ਅਗਿਆਤ)",
	undefinedTiddlerToolTip: "'%0' ਟਿਡਲਰ ਹਾਲੇ ਹੋਂਦ ਵਿਚ ਨਹੀਂ ਹੈ",
	shadowedTiddlerToolTip: "ਟਿਡਲਰ '%0' ਹੋਂਦ ਵਿਚ ਨਹੀਂ ਹੈ, ਪਰ ਉਸਦੀ ਇਕ ਪੂਰਵ-ਨਿਸ਼ਚਿਤ ਕੀਮਤ ਹੈ",
	tiddlerLinkTooltip: "%0 - %1, %2",
	externalLinkTooltip: "%0 ਦਾ ਬਾਹਰਲਾ ਲਿੰਕ",
	noTags: "ਕੋਈ ਵੀ ਟੈਗ ਹੋਏ ਟਿਡਲਰ ਨਹੀਂ ਹਨ",
	notFileUrlError: "ਬਦਲਾਓ ਸੇਵ ਕਰਣ ਤੋਂ ਪਹਿਲਾਂ ਤੁਹਾਨੂੰ ਪਹਿਲਾਂ ਇਸ ਟਿਡਲੀਵਿਕੀ ਨੂੰ ਇਕ ਫਾਈਲ ਰੂਪ'ਚ ਸੇਵ ਕਰਨਾ ਪਵੇਗਾ",
	cantSaveError: "ਬਦਲਾਓ ਸੇਵ ਕਰਨਾ ਸੰਭਵ ਨਹੀਂ ਹੈ. ਸੰਭਵ ਕਾਰਣਾਂ 'ਚ ਸ਼ਾਮਿਲ ਹਨ:\n ਤੁਹਾਡਾ ਬ੍ਰਾਉਜ਼ਰ ਸੇਵ ਕਰਣ ਨੂੰ ਸਪੋਰਟ ਨਹੀਂ ਕਰਦਾ (ਫਾਇਰਫੋਕਸ, ਇੰਟ੍ਰਨੈਟ ਐਕਸਪਲੋਰਰ, ਸਫਾਰੀ, ਔਪੇਰਾ ਸਾਰੇ ਸਹੀ ਕਨਫਿਗਰ ਕੀਤੇ ਹੋਣ ਤੇ ਕੰਮ ਕਰਦੇ ਹਨ)\n- ਤੁਹਾਡੀ ਟਿਡਲੀਵਿਕੀ ਦੇ ਪਾਥਨੇਮ ਵਿਚ ਗੈਰ-ਕਾਨੂੰਨੀ ਅੱਖਰ ਸ਼ਾਮਿਲ ਹਨ\n- ਟਿਡਲੀਵਿਕੀ HTML ਫਾਈਲ ਸਥਾਨਾਂਤਰਿਤ ਜਾਂ ਨਾਮਾਂਤ੍ਰਿਤ ਕੀਤੀ ਗਈ ਹੈ",
	invalidFileError: "ਮੂਲ ਫਾਈਲ %0 ਵੈਧ ਟਿਡਲੀਵਿਕੀ ਨਹੀਂ ਜਾਪਦੀ",
	backupSaved: "ਬੈਕੱਪ ਸੇਵ ਕਰ ਲਿਆ ਗਿਆ",
	backupFailed: "ਬੈਕੱਪ ਫਾਈਲ ਸੇਵ ਕਰਨਾ ਅਸਫਲ ਰਿਹਾ",
	rssSaved: "RSS ਫੀਡ ਸੇਵ ਕਰ ਲਈ ਗਈ",
	rssFailed: "RSS ਫੀਡ ਫਾਈਲ ਸੇਵ ਕਰਨਾ ਅਸਫਲ ਰਿਹਾ",
	emptySaved: "ਖਾਲੀ ਖਾਕਾ ਸੇਵ ਕਰ ਲਿਆ ਗਿਆ",
	emptyFailed: "ਖਾਲੀ ਖਾਕਾ ਸੇਵ ਕਰਨਾ ਅਸਫਲ ਰਿਹਾ",
	mainSaved: "ਮੁੱਖ ਟਿਡਲੀਵਿਕੀ ਫਾਈਲ ਸੇਵ ਕਰ ਲਈ ਗਈ",
	mainFailed: "ਮੁੱਖ ਟਿਡਲੀਵਿਕੀ  ਫਾਈਲ ਸੇਵ ਕਰਨਾ ਅਸਫਲ ਰਿਹਾ. ਤੁਹਾਡੀਆਂ ਤਬਦੀਲੀਆਂ ਸੇਵ ਨਹੀਂ ਹੋਈਆਂ",
	macroError: "ਮੈਕਰੋ ਵਿਚ ਐਰਰ <<\%0>>",
	macroErrorDetails: "ਮੈਕਰੋ ਐਗਜ਼ੀਕਿਊਟ ਕਰਣ ਦੌਰਾਨ ਐਰਰ <<\%0>>:\n%1",
	missingMacro: "ਅਜਿਹਾ ਕੋਈ ਮੈਕਰੋ ਨਹੀਂ",
	overwriteWarning: "'%0' ਨਾਮੀ ਟਿਡਲਰ ਪਹਿਲਾਂ ਹੀ ਹੋਂਦ ਵਿਚ ਹੈ. ਉਸਨੂੰ ਅਧਿਲੇਖਿਤ ਕਰਣ ਲਈ OK ਕਰੋ",
	unsavedChangesWarning: "ਚੇਤਾਵਨੀ! ਟਿਡਲੀਵਿਕੀ ਵਿਚ ਸੇਵ ਨਾ ਕੀਤੇ ਹੋਏ ਬਦਲਾਓ ਹਨ\n\nਸੇਵ ਕਰਣ ਲਈ OK ਚੁਣੋ\nਰੱਦ ਕਰਣ ਲਈ CANCEL ਚੁਣੋ",
	confirmExit: "--------------------------------\n\nਟਿਡਲੀਵਿਕੀ ਵਿਚ ਸੇਵ ਨਾ ਕੀਤੇ ਹੋਏ ਬਦਲਾਓ ਹਨ. ਜੇ ਤੁਸੀਂ ਜਾਰੀ ਰੱਖਿਆ ਤਾਂ ਓਹ ਬਦਲਾਓ ਗੁਆ ਲਵੋਂਗੇ\n\n--------------------------------",
	saveInstructions: "ਬਦਲਾਓ ਸੇਵ ਕਰੋ",
	unsupportedTWFormat: "ਅਣਸਮਰਥਿਤ ਟਿਡਲੀਵਿਕੀ ਫੌਰਮੈਟ '%0'",
	tiddlerSaveError: "ਟਿਡਲਰ ਸੇਵ ਕਰਦਿਆਂ ਐਰਰ '%0'",
	tiddlerLoadError: "ਟਿਡਲਰ ਲੋਡ ਕਰਦਿਆਂ ਐਰਰ '%0'",
	wrongSaveFormat: "'%0' ਸਟੋਰੇਜ ਫੌਰਮੈਟ ਵਿਚ ਸੇਵ ਨਹੀ ਕੀਤਾ ਜਾ ਸਕਦਾ. ਸੇਵ ਕਰਣ ਲਈ ਸਟੈਂਡਰਡ ਫੋਰਮੈਟ ਨੂੰ ਪ੍ਰਯੋਗ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ.",
	invalidFieldName: "ਅਵੈਧ ਫੀਲਡ ਨਾਮ %0",
	fieldCannotBeChanged: "ਫੀਲਡ '%0' ਨੂੰ ਬਦਲਿਆ ਨਹੀਂ ਜਾ ਸਕਦਾ",
	loadingMissingTiddler: "'%0' ਟਿਡਲਰ ਨੂੰ '%3' ਵਰਕਸਪੇਸ ਵਿਚੋਂ ਅਤੇ '%2' ਤੇ ਸਥਿਤ '%1' ਸਰਵਰ ਤੋਂ ਪੁਨ-ਪ੍ਰਾਪਤ ਕਰਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ",
	upgradeDone: "%0 ਵਰਜ਼ਨ ਤੱਕ ਅਪਗ੍ਰੇਡ ਹੁਣ ਸਮਪੂਰਣ ਹੋ ਗਿਆ\n\nਨਵੀਂ ਅਤੇ ਅਪਗ੍ਰੇਡ ਹੋਈ ਟਿਡਲੀਵਿਕੀ ਨੂੰ ਪੁਨਰ-ਲੋਡ ਕਰਣ ਲਈ 'OK' ਦੱਬੋ",
	invalidCookie: "ਅਵੈਧ ਕੁਕੀ '%0'"});

merge(config.messages.messageClose,{
	text: "ਬੰਦ",
	tooltip: "ਇਸ ਸੁਨੇਹੇ ਸਥਾਨ ਨੂੰ ਬੰਦ ਕਰੋ"});

config.messages.backstage = {
	open: {text: "ਬੈਕ ਸਟੇਜ", tooltip: "ਬੈਕ ਸਟੇਜ ਏਰੀਏ ਨੂੰ ਲੇਖਣ ਅਤੇ ਸੰਪਾਦਨ ਕਾਰਜਾਂ ਵਾਸਤੇ ਖੋਲੋ"},
	close: {text: "ਬੰਦ", tooltip: "ਬੈਕ ਸਟੇਜ ਏਰੀਏ ਨੂੰ ਬੰਦ ਕਰੋ"},
	prompt: "ਬੈਕ ਸਟੇਜ: ",
	decal: {
		edit: {text: "ਸੰਪਾਦਨ", tooltip: "'%0' ਟਿਡਲਰ ਨੂੰ ਸੰਪਾਦਿਤ ਕਰੋ"}
	}
};

config.messages.listView = {
	tiddlerTooltip: "ਇਸ ਟਿਡਲਰ ਦੇ ਪੂਰਨ ਪਾਠ ਲਈ ਕਲਿੱਕ ਕਰੋ",
	previewUnavailable: "(ਪ੍ਰੀਵਿਊ ਪ੍ਰਾਪਤ ਨਹੀਂ ਹੈ)"
};

config.messages.dates.months = ["ਜਨਵਰੀ", "ਫਰਵਰੀ", "ਮਾਰਚ", "ਅਪ੍ਰੈਲ", "ਮਈ", "ਜੂਨ", "ਜੁਲਾਈ", "ਅਗਸਤ", "ਸਤੰਬਰ", "ਅਕਤੂਬਰ", "ਨਵੰਬਰ","ਦਿਸੰਬਰ"];
config.messages.dates.days = ["ਐਤਵਾਰ", "ਸੋਮਵਾਰ", "ਮੰਗਲਵਾਰ", "ਬੁਧਵਾਰ", "ਵੀਰਵਾਰ", "ਸ਼ੁਕਰਵਾਰ", "ਸ਼ਨੀਵਾਰ"];
config.messages.dates.shortMonths = ["ਜਨ", "ਫਰ", "ਮਾਰ", "ਅਪ੍ਰੈ", "ਮਈ", "ਜੂਨ", "ਜੁਲਾ", "ਅਗ", "ਸਤੰ", "ਅਕ", "ਨਵੰ", "ਦਿਸੰ"];
config.messages.dates.shortDays = ["ਐਤ", "ਸੋਮ", "ਮੰਗਲ", "ਬੁਧ", "ਵੀਰ", "ਸ਼ੁਕਰ", "ਸ਼ਨੀ"];
// suffixes for dates, eg "1st","2nd","3rd"..."30th","31st"
config.messages.dates.daySuffixes = ["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""];
config.messages.dates.am = "am";
config.messages.dates.pm = "pm";

merge(config.messages.tiddlerPopup,{
	});

merge(config.views.wikified.tag,{
	labelNoTags: "ਕੋਈ ਟੈਗ ਨਹੀਂ",
	labelTags: "ਟੈਗ: ",
	openTag: "'%0' ਟੈਗ ਖੋਲੋ",
	tooltip: "'%0' ਨਾਲ ਟੈਗ ਕੀਤੇ ਟਿਡਲਰ ਦਿਖਾਓ",
	openAllText: "ਸਾਰੇ ਖੋਲੋ",
	openAllTooltip: "ਇਹ ਸਾਰੇ ਟਿਡਲਰ ਖੋਲੋ",
	popupNone: "'%0' ਨਾਲ ਟੈਗ ਕੀਤੇ ਹੋਰ ਕੋਈ ਟਿਡਲਰ ਨਹੀਂ ਹਨ"});

merge(config.views.wikified,{
	defaultText: "'%0'ਟਿਡਲਰ ਹਾਲੇ ਹੋਂਦ ਵਿਚ ਨਹੀਂ ਹੈ. ਸਿਰਜਣ ਵਾਸਤੇ ਡਬਲ-ਕਲਿੱਕ ਕਰੋ.",
	defaultModifier: "(ਲਾਪਤਾ)",
	shadowModifier: "(ਅੰਤਰ-ਨਿਰਮਿਤ ਪਰਛਾਵਾਂ ਟਿਡਲਰ)",
	dateFormat: "DD MMM YYYY", // use this to change the date format for your locale, eg "YYYY MMM DD", do not translate the Y, M or D
	createdPrompt: "ਸਿਰਜਿਆ"});

merge(config.views.editor,{
	tagPrompt: "ਖਾਲੀ ਥਾਂ ਨਾਲ ਵਿਛੋੜ ਕੇ ਟੈਗ ਟਾਈਪ ਕਰੋ, ਲੋੜ ਪਵੇ ਤਾਂ [[ ਡਬਲ ਬਰੈਕਟ ]] ਦੀ ਵਰਤੋਂ ਕਰੋ , ਜਾਂ ਮੌਜੂਦਾ ਟੈਗਸ ਨੂੰ ਸ਼ਾਮਿਲ ਕਰੋ",
	defaultText: "'%0' ਲਈ ਟੈਕਸਟ ਟਾਈਪ ਕਰੋ"});

merge(config.views.editor.tagChooser,{
	text: "ਟੈਗ",
	tooltip: "ਇਸ ਟਿਡਲਰ ਨੂੰ ਲਾਉਣ ਲਈ ਮੌਜੋਦਾ ਟੈਗ ਚੁਣੋ",
	popupNone: "ਕੋਈ ਵੀ ਟੈਗ ਪਰਿਭਾਸ਼ਿਤ ਨਹੀਂ",
	tagTooltip: "'%0' ਟੈਗ ਲਾਓ"});

merge(config.messages,{
	sizeTemplates:
		[
		{unit: 1024*1024*1024, template: "%0\u00a0GB"},
		{unit: 1024*1024, template: "%0\u00a0MB"},
		{unit: 1024, template: "%0\u00a0KB"},
		{unit: 1, template: "%0\u00a0B"}
		]});

merge(config.macros.search,{
	label: "ਖੋਜ",
	prompt: "ਇਸ ਟਿਡਲੀਵਿਕੀ ਵਿਚ ਖੋਜੋ",
	accessKey: "F",
	successMsg: "%1 ਨਾਲ ਰਲਦੇ %0 ਟਿਡਲਰ ਮਿਲੇ",
	failureMsg: "%0 ਨਾਲ ਰਲਦਾ ਕੋਈ ਟਿਡਲਰ ਨਹੀਂ ਮਿਲਿਆ"});

merge(config.macros.tagging,{
	label: "ਟੈਗ ਕਰਦਾ ਹੈ: ",
	labelNotTag: "ਟੈਗ ਨਹੀ ਕਰਦਾ",
	tooltip: "'%0' ਨਾਲ ਟੈਗ ਕੀਤੇ ਟਿਡਲਰਾਂ ਦੀ ਸੂਚੀ"});

merge(config.macros.timeline,{
	dateFormat: "DD MMM YYYY"});// use this to change the date format for your locale, eg "YYYY MMM DD", do not translate the Y, M or D

merge(config.macros.allTags,{
	tooltip: "'%0' ਨਾਲ ਟੈਗ ਕੀਤੇ ਟਿਡਲਰ ਦਿਖਾਓ",
	noTags: "ਕੋਈ ਵੀ ਟੈਗ ਕੀਤੇ ਟਿਡਲਰ ਪ੍ਰਾਪਤ ਨਹੀਂ ਹਨ"});

config.macros.list.all.prompt = "ਸਾਰੇ ਟਿਡਲਰ ਵਰਣਕਰਮ ਅਨੁਸਾਰ";
config.macros.list.missing.prompt = "ਟਿਡਲਰ ਜਿਹਨਾਂ ਦੇ ਲਿੰਕ ਪ੍ਰਾਪਤ ਹਨ ਪਰ ਪਰਿਭਾਸ਼ਿਤ ਨਹੀਂ ਕੀਤੇ ਹੋਏ";
config.macros.list.orphans.prompt = "ਟਿਡਲਰ ਜਿਹੜੇ ਕਿਸੇ ਵੀ ਹੋਰ ਟਿਡਲਰ ਤੋ ਲਿੰਕ ਨਹੀ ਕੀਤੇ ਹੋਏ";
config.macros.list.shadowed.prompt = "ਟਿਡਲਰ ਜਿਹੜੇ ਡਿਫਾਲਟ ਸਮਗਰੀ ਨਾਲ ਪਰਛਾਵਾਂ-ਯੁਕਤ ਕੀਤੇ ਹੋਏ ਹਨ";
config.macros.list.touched.prompt = "ਟਿਡਲਰ ਜਿਹੜੇ ਸਥਾਨਕ ਪਧਰ ਤੇ ਪਰਿਵਰਤਿਤ ਕੀਤੇ ਗਏ ਹਨ";

merge(config.macros.closeAll,{
	label: "ਸਾਰੇ ਬੰਦ ਕਰੋ",
	prompt: "ਸਾਰੇ ਪ੍ਰਦਰਸ਼ਿਤ ਟਿਡਲਰ ਬੰਦ ਕਰੋ (ਸੰਪਾਦਿਤ ਕੀਤੇ ਜਾ ਰਹਿਆਂ ਨੂੰ ਛੱਡ ਕੇ )"});

merge(config.macros.permaview,{
	label: "ਸਥਾਈ-ਦ੍ਰਿਸ਼ ",
	prompt: "ਇਸ ਵਕਤ ਪ੍ਰਦਰਸ਼ਿਤ ਟਿਡਲਰਾਂ ਨੂੰ ਪ੍ਰਾਪਤ ਕਰਣ ਲਈ URL ਲਿੰਕ"});

merge(config.macros.saveChanges,{
	label: "ਬਦਲਾਓ ਸੇਵ ਕਰੋ",
	prompt: "ਸਾਰੇ ਟਿਡਲਰਾਂ ਨੂੰ ਇੱਕ ਨਵੀਂ ਟਿਡਲੀਵਿਕੀ 'ਚ ਸੇਵ ਕਰੋ",
	accessKey: "S"});

merge(config.macros.newTiddler,{
	label: "ਨਵਾਂ ਟਿਡਲਰ",
	prompt: "ਨਵਾਂ ਟਿਡਲਰ ਸਿਰਜੋ",
	title: "ਨਵਾਂ ਟਿਡਲਰ",
	accessKey: "N"});

merge(config.macros.newJournal,{
	label: "ਨਵਾਂ ਰੋਜ਼ਨਾਮਚਾ",
	prompt: "ਇਸ ਵਕਤ ਦੀ ਮਿਤੀ ਤੇ ਸਮੇਂ ਤੋਂ ਨਵਾਂ ਟਿਡਲਰ ਸਿਰਜੋ",
	accessKey: "J"});

merge(config.macros.options,{
	wizardTitle: "ਅਗਲੇਰੇ ਵਿਕਲਪ ਟ੍ਵੀਕੋ",
	step1Title: "ਇਹ ਵਿਕਲਪ ਤੁਹਾਡੇ ਬਰਾਉਸਰ ਵਿਚ ਕੂਕੀਜ਼ ਵਿਚ ਸੇਵ ਕੀਤੇ ਜਾਂਦੇ ਹਨ",
	step1Html: "<input type='hidden' name='markList'></input><br><input type='checkbox' checked='false' name='chkUnknown'>ਅਗਿਆਤ ਵਿਕਲਪ ਦਿਖਾਓ </input>",
	unknownDescription: "//(ਅਗਿਆਤ)//",
	listViewTemplate: {
		columns: [
			{name: 'Option', field: 'option', title: "Option", type: 'String'},
			{name: 'Description', field: 'description', title: "Description", type: 'WikiText'},
			{name: 'Name', field: 'name', title: "Name", type: 'String'}
			],
		rowClasses: [
			{className: 'lowlight', field: 'lowlight'}
			]}
	});

merge(config.macros.plugins,{
	wizardTitle: "ਪਲੱਗਿਨਾਂ ਨੂੰ ਮੈਨੇਜ ਕਰੋ",
	step1Title: "ਇਸ ਵਕਤ ਲੋਡ ਕੀਤੇ ਹੋਏ ਪਲੱਗਿਨ",
	step1Html: "<input type='hidden' name='markList'></input>", // DO NOT TRANSLATE
	skippedText: "(ਇਹ ਪਲੱਗਿੰਨ ਐਗਜ਼ੀਕਿਊਟ ਨਹੀਂ ਹੋਇਆ ਕਿਉਂਕਿ ਇਹ ਸਟਾਰਟ-ਅੱਪ ਪਿੱਛੋ ਸ਼ਾਮਿਲ ਕੀਤਾ ਗਿਆ ਹੈ)",
	noPluginText: "ਕੋਈ ਪਲੱਗਿਨ ਇੰਸਟਾਲ ਨਹੀਂ ਕੀਤਾ ਹੈ",
	confirmDeleteText: "ਕੀ ਤੁਸੀਂ ਨਿਸ਼ਚਿਤ ਹੀ ਇਹਨਾਂ ਪਲੱਗਿਨਾਂ ਨੂੰ ਡਿਲੀਟ ਕਰਨਾਂ ਚਾਹੁੰਦੇ ਹੋਂ ?:\n\n%0",
	removeLabel: "systemConfig ਟੈਗ ਹਟਾਓ",
	removePrompt: "systemConfig ਟੈਗ ਹਟਾਓ",
	deleteLabel: "ਡਿਲੀਟ",
	deletePrompt: "ਇਹਨਾਂ ਟਿਡਲਰਾਂ ਨੂੰ ਸਦਾ ਲਈ ਡਿਲੀਟ ਕਰੋ",
	listViewTemplate: {
		columns: [
			{name: 'Selected', field: 'Selected', rowName: 'title', type: 'Selector'},
			{name: 'Tiddler', field: 'tiddler', title: "Tiddler", type: 'Tiddler'},
			{name: 'Description', field: 'Description', title: "Description", type: 'String'},
			{name: 'Version', field: 'Version', title: "Version", type: 'String'},
			{name: 'Size', field: 'size', tiddlerLink: 'size', title: "Size", type: 'Size'},
			{name: 'Forced', field: 'forced', title: "Forced", tag: 'systemConfigForce', type: 'TagCheckbox'},
			{name: 'Disabled', field: 'disabled', title: "Disabled", tag: 'systemConfigDisable', type: 'TagCheckbox'},
			{name: 'Executed', field: 'executed', title: "Loaded", type: 'Boolean', trueText: "Yes", falseText: "No"},
			{name: 'Startup Time', field: 'startupTime', title: "Startup Time", type: 'String'},
			{name: 'Error', field: 'error', title: "Status", type: 'Boolean', trueText: "Error", falseText: "OK"},
			{name: 'Log', field: 'log', title: "Log", type: 'StringList'}
			],
		rowClasses: [
			{className: 'error', field: 'error'},
			{className: 'warning', field: 'warning'}
			]}
	});

merge(config.macros.toolbar,{
	moreLabel: "ਜ਼ਿਆਦਾ",
	morePrompt: "ਵਧੇਰੀਆਂ ਕਮਾਂਡਾਂ ਦਿਖਾਓ",
	lessLabel: "ਥੋੜਾ",
	lessPrompt: "ਵਧੇਰੀਆਂ ਕਮਾਂਡਾਂ ਛੁਪਾਓ",
	separator: "|"
	});

merge(config.macros.refreshDisplay,{
	label: "ਰਿਫਰੈਸ਼",
	prompt: "ਪੂਰੇ ਟਿਡਲੀਵਿਕੀ ਪ੍ਰਦਰਸ਼ਨ ਨੂੰ ਪੁਨਰ-ਚਿਤ੍ਰਿਤ ਕਰੋ"
	});

merge(config.macros.importTiddlers,{
	readOnlyWarning: "ਤੁਸੀਂ ਕੇਵਲ-ਪੜ੍ਹਨ ਵਾਲੀ ਟਿਡਲੀਵਿਕੀ ਵਿਚ ਇਮਪੋਰਟ ਨਹੀਂ ਕਰ ਸਕਦੇ. file:// URL ਤੋਂ ਉਸਨੂੰ ਖੋਲਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰਕੇ ਵੇਖ ਲਵੋ",
	wizardTitle: "ਕਿਸੇ ਹੋਰ ਫਾਈਲ ਜਾਂ ਸਰਵਰ ਤੋਂ ਟਿਡਲਰ ਇਮਪੋਰਟ ਕਰੋ",
	step1Title: "ਪਹਿਲਾ ਚਰਣ (੧): ਸਰਵਰ ਜਾਂ ਟਿਡਲੀਵਿਕੀ ਫਾਈਲ ਦਾ ਸਥਾਨ ਨਿਰਧਾਰਨ ਕਰੋ",
	step1Html: "ਸਰਵਰ ਦੀ ਕਿਸਮ ਨਿਦ੍ਰਿਸ਼ਟ ਕਰੋ: <select name='selTypes'><option value=''>Choose...</option></select><br>ਇਥੇ URL ਜਾਂ ਪਾਥ-ਨਾਮ ਦਰਜ ਕਰੋ: <input type='text' size=50 name='txtPath'><br>...ਜਾਂ ਫਾਈਲ ਲਈ ਫਰੋਲ ਕਰੋ: <input type='file' size=50 name='txtBrowse'><br><hr>...ਜਾਂ ਪੂਰਵ-ਪਰਿਭਾਸ਼ਿਤ ਫੀਡ ਚੁਣੋ: <select name='selFeeds'><option value=''>ਚੁਣੋ...</option></select>",
	openLabel: "ਖੋਲੋ",
	openPrompt: "ਇਸ ਫਾਈਲ ਜਾਂ ਸਰਵਰ ਨੂੰ ਕੁਨੈਕਸ਼ਨ ਖੋਲੋ",
	statusOpenHost: "ਹੋਸਟ ਨੂੰ ਖੋਲਿਆ ਜਾ ਰਿਹਾ ਹੈ",
	statusGetWorkspaceList: "ਉਪਲਬਧ ਵਰਕਸਪੇਸਾਂ ਦੀ ਸੂਚੀ ਪ੍ਰਾਪਤ ਕੀਤੀ ਜਾ ਰਾਹੀ ਹੈ",
	step2Title: "ਦੂਸਰਾ ਚਰਣ: ਵਰਕਸਪੇਸ ਚੁਣੋ",
	step2Html: "ਵਰਕਸਪੇਸ ਦਾ ਨਾਮ ਪਾਓ: <input type='text' size=50 name='txtWorkspace'><br>...ਜਾਂ ਵਰਕਸਪੇਸ ਚੁਣੋ: <select name='selWorkspace'><option value=''>ਚੁਣੋ...</option></select>",
	cancelLabel: "ਰੱਦ",
	cancelPrompt: "ਇਸ ਇਮਪੋਰਟ ਨੂੰ ਰੱਦ ਕਰੋ",
	statusOpenWorkspace: "ਵਰਕਸਪੇਸ ਖੋਲੀ ਜਾ ਰਹੀ ਹੈ",
	statusGetTiddlerList: "ਉਪਲਬਧ ਟਿਡਲਰਾਂ ਦੀ ਸੂਚੀ ਪ੍ਰਾਪਤ ਕੀਤੀ ਜਾ ਰਾਹੀ ਹੈ",
	errorGettingTiddlerList: "ਟਿਡਲਰਾਂ ਦੀ ਸੂਚੀ ਪ੍ਰਾਪਤ ਕਰਣ ਵਿਚ ਐਰਰ, ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰਣ ਲਈ ਕੈਂਸਲ ਕਲਿੱਕ ਕਰੋ",
	step3Title: "ਤੀਸਰਾ ਚਰਣ: ਇਮਪੋਰਟ ਕਰਣ ਵਾਸਤੇ ਟਿਡਲਰ ਚੁਣੋ",
	step3Html: "<input type='hidden' name='markList'></input><br><input type='checkbox' checked='true' name='chkSync'>ਇਹਨਾਂ ਟਿਡਲਰਾਂ ਨੂੰ ਇਸ ਸਰਵਰ ਨਾਲ ਲਿੰਕ ਕਰੀ ਰੱਖੋ ਤਾਂ ਜੋ ਤੁਸੀਂ ਅਨੁਵਰਤੀ ਬਦਲਾਵਾਂ ਨਾਲ ਸੁਮੇਲ ਕਰ ਸਕੋਂ </input><br><input type='checkbox' name='chkSave'>ਇਸ ਸਰਵਰ ਦਾ ਵੇਰਵਾ ਇਸ ਨਾਮਕ ਇੱਕ 'systemServer' ਟਿਡਲਰ ਵਿਚ ਸੇਵ ਕਰੋ:</input> <input type='text' size=25 name='txtSaveTiddler'>",
	importLabel: "ਇਮਪੋਰਟ",
	importPrompt: "ਇਹਨਾਂ ਟਿਡਲਰਾਂ ਨੂੰ ਇਮਪੋਰਟ ਕਰੋ",
	confirmOverwriteText: "ਕੀ ਤੁਸੀਂ ਨਿਸ਼ਚਿਤ ਹੀ ਇਹਨਾਂ ਟਿਡਲਰਾਂ ਨੂੰ ਅਧਿਲੇਖਿਤ(overwrite) ਕਰਣਾ ਚਾਹੁੰਦੇ ਹੋ:\n\n%0",
	step4Title: "ਚੌਥਾ ਚਰਣ: %0 ਟਿਡਲਰ ਇਮਪੋਰਟ ਕੀਤੇ ਜਾ ਰਹੇ ਹਨ",
	step4Html: "<input type='hidden' name='markReport'></input>", // DO NOT TRANSLATE
	doneLabel: "ਮੁਕੰਮਲ",
	donePrompt: "ਇਸ ਵਿਜ਼ਰਡ ਨੂੰ ਬੰਦ ਕਰੋ",
	statusDoingImport: "ਟਿਡਲਰ ਇਮਪੋਰਟ ਹੋ ਰਹੇ ਹਨ",
	statusDoneImport: "ਸਾਰੇ ਟਿਡਲਰ ਇਮਪੋਰਟ ਹੋ ਗਏ",
	systemServerNamePattern: "%2 on %1",
	systemServerNamePatternNoWorkspace: "%1",
	confirmOverwriteSaveTiddler: "'%0' ਟਿਡਲਰ ਪਹਿਲਾਂ ਹੀ ਮੌਜੂਦ ਹੈ. ਉਸ ਨੂੰ ਇਸ ਸਰਵਰ ਦੇ ਵੇਰਵੇ ਨਾਲ ਅਧਿਲੇਖਿਤ(overwrite) ਕਰਣ ਲਈ 'OK' ਕਲਿੱਕ ਕਰੋ. ਉਸ ਨੂੰ ਜਿਓਂ ਦਾ ਤਿਉਂ ਛੱਡਣ ਲਈ 'Cancel' ਕਲਿੱਕ ਕਰੋ",
	serverSaveTemplate: "|''Type:''|%0|\n|''URL:''|%1|\n|''Workspace:''|%2|\n\nThis tiddler was automatically created to record the details of this server",
	serverSaveModifier: "(System)",
	listViewTemplate: {
		columns: [
			{name: 'Selected', field: 'Selected', rowName: 'title', type: 'Selector'},
			{name: 'Tiddler', field: 'tiddler', title: "Tiddler", type: 'Tiddler'},
			{name: 'Size', field: 'size', tiddlerLink: 'size', title: "Size", type: 'Size'},
			{name: 'Tags', field: 'tags', title: "Tags", type: 'Tags'}
			],
		rowClasses: [
			]}
	});

merge(config.macros.upgrade,{
	wizardTitle: "ਟਿਡਲੀਵਿਕੀ ਦੇ ਕੋਰ-ਕੋਡ ਨੂੰ ਅਪਗ੍ਰੇਡ ਕਰੋ",
	step1Title: "ਇਸ ਟਿਡਲੀਵਿਕੀ ਨੂੰ ਨਵੀਨਤਮ ਪ੍ਰਕਾਸ਼ਨ ਮੁਤਾਬਿਕ ਅਪਡੇਟ ਜਾਂ ਰਿਪੇਅਰ ਕਰੋ",
	step1Html: "ਤੁਸੀਂ ਟਿਡਲੀਵਿਕੀ ਦੇ ਕੋਰ-ਕੋਡ ਦੇ ਨਵੀਨਤਮ ਪ੍ਰਕਾਸ਼ਨ ਤੱਕ ਅਪਗ੍ਰੇਡ ਕਰਣ ਜਾ ਰਹੇ ਹੋ (from <a href='%0' class='externalLink' target='_blank'>%1</a>). ਤੁਹਾਡੀ ਸਮੱਗਰੀ ਅਪਗ੍ਰੇਡ ਦੇ ਪਾਰ ਵੀ ਸੁਰੱਖਿਅਤ ਰਹੇਗੀ.<br><br>ਧਿਆਨ ਦਿਓ, ਕੋਰ ਅਪਗ੍ਰੇਡ ਦਾ ਪੁਰਾਣੇ ਪਲੱਗਿੰਨਾਂ ਦੇ ਚੱਲਣ ਵਿੱਚ ਕਈ ਵਾਰੀ ਵਿਘਨਕਾਰੀ ਹੋਣ ਦਾ ਪਤਾ ਲਗਦਾ ਹੈ. ਜੇ ਅਪਗ੍ਰੇਡ ਕੀਤੀ ਹੋਈ ਫਾਈਲ ਨਾਲ ਸਮੱਸਿਆ ਆਵੇ ਤਾਂ ਇਥੇ ਦੇਖੋ: <a href='http://www.tiddlywiki.org/wiki/CoreUpgrades' class='externalLink' target='_blank'>http://www.tiddlywiki.org/wiki/CoreUpgrades</a>",
	errorCantUpgrade: "ਇਸ ਟਿਡਲੀਵਿਕੀ ਨੂੰ ਅਪਗ੍ਰੇਡ ਕਰਣ ਤੋਂ ਅਸਮਰਥ. ਤੁਸੀਂ ਕੇਵਲ ਸਥਾਨਕ ਤਲ ਤੇ ਸਾਂਭੀ ਟਿਡਲੀਵਿਕੀ ਫਾਈਲ ਨੂੰ ਹੀ ਅਪਗ੍ਰੇਡ ਕਰ ਸਕਦੇ ਹੋ.",
	errorNotSaved: "ਅਪਗ੍ਰੇਡ ਕਰਣ ਤੋਂ ਪਹਿਲਾਂ ਤੁਹਾਨੂੰ ਬਦਲਾਓ ਸੇਵ ਕਰਣੇ ਪੈਣਗੇ",
	step2Title: "ਅਪਗ੍ਰੇਡ ਦੇ ਵੇਰਵੇ ਦੀ ਪੁਸ਼ਟੀ ਕਰੋ",
	step2Html_downgrade: "ਤੁਸੀਂ ਟਿਡਲੀਵਿਕੀ ਪ੍ਰਕਾਸ਼ਨ ਨੰ %0 ਤੋਂ %1 ਵੱਲ ਡਾਊਨ-ਗ੍ਰੇਡ ਕਰਣ ਜਾ ਰਹੇ ਹੋਂ. <br><br>ਕੋਰ-ਕੋਡ ਨੂੰ ਪਹਿਲੇ ਪ੍ਰਕਾਸ਼ਨ ਵੱਲ ਡਾਉਨ-ਗ੍ਰੇਡ ਕਰਣ ਦੀ ਸਿਫਾਰਿਸ਼ ਨਹੀਂ ਕੀਤੀ ਜਾਂਦੀ",
	step2Html_restore: "ਇੰਜ ਲਗਦਾ ਹੈ ਕੀ ਇਹ ਟਿਡਲੀਵਿਕੀ ਪਹਿਲਾਂ ਹੀ ਕੋਰ -ਕੋਡ ਦੇ ਨਵੀਨਤਮ ਪ੍ਰਕਾਸ਼ਨ ਨੂੰ ਵਰਤ ਰਹੀ ਹੈ (%0).<br><br>ਤੁਸੀਂ ਫਿਰ ਵੀ ਕੋਰ-ਕੋਡ ਦੇ ਭ੍ਰਸ਼ਟ ਜਾਂ ਸ਼ਤੀਗ੍ਰਸਤ ਹੋਣ ਦੀ ਸ਼ੰਕਾ ਦੂਰ ਕਰਣ ਲਈ ਅਪਗ੍ਰੇਡ ਜਾਰੀ ਰੱਖ ਸਕਦੇ ਹੋਂ",
	step2Html_upgrade: "ਤੁਸੀਂ ਟਿਡਲੀਵਿਕੀ ਪ੍ਰਕਾਸ਼ਨ ਨੰ  %0 ਤੋਂ %1 ਤੱਕ ਅਪਗ੍ਰੇਡ ਕਰਣ ਜਾ ਰਹੇ ਹੋਂ",
	upgradeLabel: "ਅਪਗ੍ਰੇਡ",
	upgradePrompt: "ਅਪਗ੍ਰੇਡ ਪ੍ਰਕਿਰਿਆ ਲਈ ਤਿਆਰੀ",
	statusPreparingBackup: "ਬੈਕ-ਅੱਪ ਦੀ ਤਿਆਰੀ ਕੀਤੀ ਜਾ ਰਹੀ ਐ",
	statusSavingBackup: "ਬੈਕ -ਅੱਪ ਫਾਈਲ ਸੇਵ ਕੀਤਾ ਜਾ ਰਿਹਾ ਐ",
	errorSavingBackup: "ਬੈਕ - ਅੱਪ ਫਾਈਲ ਸੇਵ ਕਰਣ ਵਿੱਚ ਸਮੱਸਿਆ ਆਈ",
	statusLoadingCore: "ਕੋਰ-ਕੋਡ ਨੂੰ ਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ",
	errorLoadingCore: "ਕੋਰ -ਕੋਡ ਨੂੰ ਲੋਡ ਕਰਣ ਵਿੱਚ ਐਰਰ",
	errorCoreFormat: "ਨਵੇਂ ਕੋਰ -ਕੋਡ ਵਿਚ ਐਰਰ",
	statusSavingCore: "ਨਵੇਂ ਕੋਰ -ਕੋਡ ਨੂੰ ਸੇਵ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ",
	statusReloadingCore: "ਨਵੇਂ ਕੋਰ-ਕੋਡ ਨੂੰ ਪੁਨਰ-ਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ",
	startLabel: "ਸ਼ੁਰੂ ਕਰੋ",
	startPrompt: "ਅਪਗ੍ਰੇਡ ਪ੍ਰਕਿਰਿਆ ਸ਼ੁਰੂ ਕਰੋ",
	cancelLabel: "ਕੈਂਸਲ",
	cancelPrompt: "ਅਪਗ੍ਰੇਡ ਪ੍ਰਕਿਰਿਆ ਕੈਂਸਲ ਕਰੋ",
	step3Title: "ਅਪਗ੍ਰੇਡ ਕੈਂਸਲ ਕਰ ਦਿੱਤਾ ਗਿਆ",
	step3Html: "ਤੁਸੀਂ ਅਪਗ੍ਰੇਡ ਪ੍ਰਕਿਰਿਆ ਕੈਂਸਲ ਕਰ ਦਿੱਤੀ ਹੈ"
	});

merge(config.macros.sync,{
	listViewTemplate: {
		columns: [
			{name: 'Selected', field: 'selected', rowName: 'title', type: 'Selector'},
			{name: 'Tiddler', field: 'tiddler', title: "Tiddler", type: 'Tiddler'},
			{name: 'Server Type', field: 'serverType', title: "Server type", type: 'String'},
			{name: 'Server Host', field: 'serverHost', title: "Server host", type: 'String'},
			{name: 'Server Workspace', field: 'serverWorkspace', title: "Server workspace", type: 'String'},
			{name: 'Status', field: 'status', title: "Synchronisation status", type: 'String'},
			{name: 'Server URL', field: 'serverUrl', title: "Server URL", text: "View", type: 'Link'}
			],
		rowClasses: [
			],
		buttons: [
			{caption: "ਇਹਨਾਂ ਟਿਡਲਰਾਂ ਨੂੰ ਸੁਮੇਲੋ", name: 'sync'}
			]},
	wizardTitle: "ਬਾਹਰਲੇ ਸਰਵਰ ਤੇ ਫਾਈਲ ਨਾਲ ਸੁਮੇਲ ਕਰੋ",
	step1Title: "ਸੁਮੇਲਣ ਲਈ ਟਿਡਲਰ ਚੁਣੋ",
	step1Html: "<input type='hidden' name='markList'></input>", // DO NOT TRANSLATE
	syncLabel: "ਸੁਮੇਲੋ",
	syncPrompt: "ਇਹਨਾਂ ਟਿਡਲਰਾਂ ਨੂੰ ਸੁਮੇਲੋ",
	hasChanged: "Changed while unplugged",
	hasNotChanged: "Unchanged while unplugged",
	syncStatusList: {
		none: {text: "...", display:null, className:'notChanged'},
		changedServer: {text: "Changed on server", display:null, className:'changedServer'},
		changedLocally: {text: "Changed while unplugged", display:null, className:'changedLocally'},
		changedBoth: {text: "Changed while unplugged and on server", display:null, className:'changedBoth'},
		notFound: {text: "Not found on server", display:null, className:'notFound'},
		putToServer: {text: "Saved update on server", display:null, className:'putToServer'},
		gotFromServer: {text: "Retrieved update from server", display:null, className:'gotFromServer'}
		}
	});

merge(config.commands.closeTiddler,{
	text: "ਬੰਦ",
	tooltip: "ਇਸ ਟਿਡਲਰ ਨੂੰ ਬੰਦ ਕਰੋ"});

merge(config.commands.closeOthers,{
	text: "ਬਾਕੀ ਬੰਦ",
	tooltip: "ਬਾਕੀ ਟਿਡਲਰਾਂ ਨੂੰ ਬੰਦ ਕਰੋ"});

merge(config.commands.editTiddler,{
	text: "ਸੰਪਾਦਨ",
	tooltip: "ਇਸ ਟਿਡਲਰ ਦਾ ਸੰਪਾਦਨ ਕਰੋ",
	readOnlyText: "ਦੇਖੋ",
	readOnlyTooltip: "ਇਸ ਟਿਡਲਰ ਦੇ ਸੋਰਸ ਨੂੰ ਦੇਖੋ"});

merge(config.commands.saveTiddler,{
	text: "ਮੁਕੰਮਲ",
	tooltip: "ਇਸ ਟਿਡਲਰ ਦੇ ਬਦਲਾਓ ਸੇਵ ਕਰੋ"});

merge(config.commands.cancelTiddler,{
	text: "ਕੈਂਸਲ",
	tooltip: "ਇਸ ਟਿਡਲਰ ਦੇ ਬਦਲਾਓ ਰੱਦ ਕਰੋ",
	warning: "ਕੀ ਤੁਸੀਂ ਨਿਸ਼ਚਿਤ ਹੀ ਇਸ ਟਿਡਲਰ ਦੇ ਬਦਲਾਵਾਂ ਨੂੰ ਰੱਦ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋਂ : '%0'?",
	readOnlyText: "ਮੁਕੰਮਲ",
	readOnlyTooltip: "ਇਸ ਟਿਡਲਰ ਨੂੰ ਸਧਾਰਨ ਤੋਰ ਤੇ ਦੇਖੋ"});

merge(config.commands.deleteTiddler,{
	text: "ਡਿਲੀਟ",
	tooltip: "ਇਸ ਟਿਡਲਰ ਨੂੰ ਮਿਟਾਓ",
	warning: "ਕੀ ਤੁਸੀਂ ਨਿਸ਼ਚਿਤ ਹੀ ਇਸ ਟਿਡਲਰ ਨੂੰ ਡਿਲੀਟ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋਂ :'%0'?"});

merge(config.commands.permalink,{
	text: "ਸਥਾਈ-ਲਿੰਕ",
	tooltip: "ਇਸ ਟਿਡਲਰ ਦਾ ਸਥਾਈ ਲਿੰਕ"});

merge(config.commands.references,{
	text: "ਹਵਾਲੇ",
	tooltip: "ਇਸ ਟਿਡਲਰ ਨੂੰ ਲਿੰਕ ਹੁੰਦੇ ਟਿਡਲਰ ਦਿਖਾਓ",
	popupNone: "ਕੋਈ ਹਵਾਲੇ ਨਹੀਂ"});

merge(config.commands.jump,{
	text: "ਛਾਲ ਮਾਰੋ",
	tooltip: "ਹੋਰ ਖੁੱਲੇ ਹੋਏ ਟਿਡਲਰ ਵੱਲ ਛਾਲ ਮਾਰੋ"});

merge(config.commands.syncing,{
	text: "ਸੁਮੇਲ",
	tooltip: "ਇਸ ਟਿਡਲਰ ਦੀ ਕਿਸੇ ਸਰਵਰ ਜਾਂ ਬਾਹਰਲੀ ਫਾਈਲ ਨਾਲ ਸੁਮੇਲ ਕੰਟ੍ਰੋਲ ਕਰੋ",
	currentlySyncing: "<div>ਇਸ ਵਕਤ ਇਸ ਰਾਹੀ ਸੁਮੇਲ ਹੋ ਰਿਹਾ ਹੈ: <span class='popupHighlight'>'%0'</span> to:</"+"div><div>host: <span class='popupHighlight'>%1</span></"+"div><div>workspace: <span class='popupHighlight'>%2</span></"+"div>", // Note escaping of closing <div> tag
	notCurrentlySyncing: "ਇਸ ਵਕਤ ਸੁਮੇਲ ਨਹੀਂ ਹੋ ਰਿਹਾ",
	captionUnSync: "ਇਸ ਟਿਡਲਰ ਦੇ ਸੁਮੇਲ ਨੂੰ ਰੋਕੋ",
	chooseServer: "ਇਸ ਟਿਡਲਰ ਨੂੰ ਕਿਸੇ ਹੋਰ ਸਰਵਰ ਨਾਲ ਸੁਮੇਲੋ:",
	currServerMarker: "\u25cf ",
	notCurrServerMarker: "  "});

merge(config.commands.fields,{
	text: "ਫੀਲਡ",
	tooltip: "ਇਸ ਟਿਡਲਰ ਦੇ ਵਿਸਤਾਰਿਤ ਫੀਲਡ ਦਿਖਾਓ",
	emptyText: "ਇਸ ਟਿਡਲਰ ਦੇ ਕੋਈ ਵਿਸਤਾਰਿਤ ਫੀਲਡ ਨਹੀਂ ਹਨ",
	listViewTemplate: {
		columns: [
			{name: 'Field', field: 'field', title: "Field", type: 'String'},
			{name: 'Value', field: 'value', title: "Value", type: 'String'}
			],
		rowClasses: [
			],
		buttons: [
			]}});

merge(config.shadowTiddlers,{
	DefaultTiddlers: "[[TranslatedGettingStarted]]",
	MainMenu: "[[TranslatedGettingStarted]]\n\n\n^^~ਟਿਡਲੀਵਿਕੀ ਪ੍ਰਕਾਸ਼ਨ ਨੰ: <<version>>\n© 2010 [[UnaMesa|http://www.unamesa.org/]]^^",
	TranslatedGettingStarted: "ਇਸ ਟਿਡਲੀਵਿਕੀ ਤੇ ਕੰਮ ਸ਼ੁਰੂ ਕਰਣ ਤੋਂ ਪਹਿਲਾਂ ਤੁਹਾਨੂੰ ਇਹਨਾਂ ਟਿਡਲਰਾਂ ਨੂੰ ਬਦਲਣ ਦੀ ਲੋੜ ਪਵੇਗੀ:\n* SiteTitle & SiteSubtitle: ਇਸ ਸਾਈਟ ਦਾ ਸਿਰਨਾਵਾਂ ਤੇ ਉਪ-ਸਿਰਨਾਵਾਂ, ਜਿਵੇਂ ਉੱਪਰ ਨਜ਼ਰ ਆ ਰਿਹਾ ਹੈ ( ਸੇਵ ਕਰਣ ਪਿੱਛੋਂ, ਇਹ ਬ੍ਰਾਉਜ਼ਰ ਦੇ ਟਾਈਟਲ ਬਾਰ ਵਿਚ ਵੀ ਨਜ਼ਰ ਆਉਣਗੇ )\n* MainMenu: ਮੈਨ੍ਯੂ (ਆਮ ਤੌਰ ਤੇ ਖੱਬੇ ਪਾਸੇ )\n* DefaultTiddlers: ਇਸ ਵਿਚ ਉਹਨਾਂ ਟਿਡਲਰਾਂ ਦੇ ਨਾਮ ਦਰਜ ਹਨ ਜੋ ਤੁਸੀਂ ਟਿਡਲੀਵਿਕੀ ਖੁਲਣ ਤੇ ਪ੍ਰਦਰਸ਼ਿਤ ਕਰਣਾ ਚਾਹੁੰਦੇ ਹੋਂ \nਤੁਹਾਨੂੰ ਆਪਣੇ ਸੰਪਾਦਨਾਂ ਤੇ ਹਸਤਾਖਰ ਕਰਣ ਲਈ ਆਪਣਾ ਯੂਜ਼ਰ-ਨੇਮ ਵੀ ਪਾਉਣਾ ਪਵੇਗਾ: <<option txtUserName>>",
	SiteTitle: "ਮੇਰੀ ਟਿਡਲੀਵਿਕੀ",
	SiteSubtitle: "ਇੱਕ ਮੁੜ ਵਰਤੀ ਜਾ ਸਕਦੀ, ਗੈਰ ਰੈਖਿਕ, ਨਿਜੀ ਵੈੱਬ ਨੋਟਬੁੱਕ",
	SiteUrl: "",
	OptionsPanel: "ਟਿਡਲੀਵਿਕੀ ਨੂੰ ਅਨੁਕੂਲਿਤ ਕਰਣ ਵਾਲੇ ਇਹ ਇੰਟਰਫੇਸ ਵਿਕਲਪ ਤੁਹਾਡੇ ਬ੍ਰਾਉਜ਼ਰ ਵਿਚ ਸੇਵ ਕੀਤੇ ਜਾਂਦੇ ਹਨ \n\n ਤੁਹਾਡੇ ਸੰਪਾਦਨਾਂ ਨੂੰ ਹਸ੍ਤਾਖ੍ਰਿਤ ਕਰਣ ਲਈ ਤੁਹਾਡਾ ਯੂਜ਼ਰ ਨੇਮ. ਇਸ ਨੂੰ ਵਿਕੀਵਰਡ ਦੇ ਤੌਰ ਤੇ ਲਿਖੋ (ਜਿਵੇਂ: JoeBloggs)\n<<option txtUserName>>\n\n<<option chkSaveBackups>> ਬੈਕ-ਅੱਪ ਸੇਵ ਕਰੋ \n<<option chkAutoSave>> ਸਵੈ-ਸੇਵ \n<<option chkRegExpSearch>> Regexp ਖੋਜ\n<<option chkCaseSensitiveSearch>> ਕੇਸ-ਸੰਵੇਦਨਸ਼ੀਲ ਖੋਜ\n<<option chkAnimate>> ਐਨੀਮੇਸ਼ਨਾਂ ਚਾਲੂ ਕਰੋ\n\n----\nAlso see [[TranslatedAdvancedOptions|AdvancedOptions]]",
	SideBarOptions: '<<search>><<closeAll>><<permaview>><<newTiddler>><<newJournal "DD MMM YYYY" "journal">><<saveChanges>><<slider chkSliderOptionsPanel OptionsPanel "ਵਿਕਲਪ \u00bb" "ਟਿਡਲੀਵਿਕੀ ਦੇ ਅਗਲੇਰੇ ਵਿਕਲਪ ਬਦਲੋ">>',
	SideBarTabs: '<<tabs txtMainTab "ਸਮੇ ਰੇਖਾ" "ਸਮੇ ਰੇਖਾ" TabTimeline "ਸਭ" "ਸਾਰੇ ਟਿਡਲਰ" TabAll "ਟੈਗ" "ਸਾਰੇ ਟੈਗ" TabTags "ਹੋਰ" "ਹੋਰ ਸੂਚੀਆਂ" TabMore>>',
	TabMore: '<<tabs txtMoreTab "ਲਾਪਤਾ" "ਲਾਪਤਾ ਟਿਡਲਰ" TabMoreMissing "ਅਨਾਥ" "ਅਨਾਥ ਟਿਡਲਰ" TabMoreOrphans "ਪਰਛਾਵੇਂ" "ਪਰਛਾਵੇਂ ਟਿਡਲਰ" TabMoreShadowed>>'
	});

merge(config.annotations,{
	AdvancedOptions: "ਇਹ ਪਰਛਾਵਾਂ ਟਿਡਲਰ ਕਈ ਸਾਰੇ ਅਗਲੇਰੇ ਵਿਕਲਪਾਂ ਲਈ ਪ੍ਰਵੇਸ਼ ਦਿੰਦਾ ਹੈ",
	ColorPalette: "ਇਸ ਟਿਡਲਰ ਵਿਚਲੀਆਂ ਕੀਮਤਾਂ ਟਿਡਲੀਵਿਕੀ ਯੂਜ਼ਰ-ਇੰਟਰਫੇਸ ਦੀ ਰੰਗ ਯੋਜਨਾ ਨਿਸ਼ਚਿਤ ਕਰਦੀਆਂ ਹਨ ",
	DefaultTiddlers: "ਇਸ ਪਰਛਾਵੇਂ ਟਿਡਲਰ ਵਿਚ ਸੂਚਿਤ ਟਿਡਲਰ ਟਿਡਲੀਵਿਕੀ ਸ਼ੁਰੂ ਹੋਣ ਤੇ ਆਪੇ ਹੀ ਪ੍ਰਦਰਸ਼ਿਤ ਹੋ ਜਾਣਗੇ",
	EditTemplate: "ਇਸ ਪਰਛਾਵੇਂ ਟਿਡਲਰ ਵਿਚਲਾ HTML ਖਾਕਾ ਇਹ ਨਿਸ਼ਚਿਤ ਕਰਦਾ ਹੈ ਕਿ ਸੰਪਾਦਨ ਕਰਣ ਵੇਲੇ ਟਿਡਲਰ ਕਿਹੋ ਜਿਹੇ ਲਗਦੇ ਹਨ",
	GettingStarted: "ਇਹ ਪਰਛਾਵਾਂ ਟਿਡਲਰ ਬੁਨਿਆਦੀ ਵਰਤੋਂ ਨਿਰਦੇਸ਼ ਪ੍ਰਦਾਨ ਕਰਦਾ ਹੈ",
	ImportTiddlers: "ਇਹ ਪਰਛਾਵਾਂ ਟਿਡਲਰ ਟਿਡਲਰ ਇਮਪੋਰਟ ਕਰਣ ਲਈ ਪ੍ਰਵੇਸ਼ ਦਿੰਦਾ ਹੈ",
	MainMenu: "ਇਹ ਪਰਛਾਵਾਂ ਟਿਡਲਰ, ਸਕ੍ਰੀਨ ਦੇ ਖੱਬੇ ਹਥ ਕੌਲਮ ਵਿਚਲੇ ਮੇਨ ਮੈਨ੍ਯੂ ਦੀ ਸਮੱਗਰੀ ਲਈ ਵਰਤਿਆ ਜਾਂਦਾ ਹੈ",
	MarkupPreHead: "ਇਸ ਟਿਡਲਰ ਨੂੰ ਟਿਡਲੀਵਿਕੀ HTML  ਫਾਈਲ ਦੇ <head> ਹਿੱਸੇ ਦੇ ਉੱਤੇ ਸੰਮਿਲਤ ਕੀਤਾ ਜਾਂਦਾ ਹੈ",
	MarkupPostHead: "ਇਸ ਟਿਡਲਰ ਨੂੰ ਟਿਡਲੀਵਿਕੀ HTML  ਫਾਈਲ ਦੇ <head> ਹਿੱਸੇ ਦੇ ਹੇਠਾਂ ਸੰਮਿਲਤ ਕੀਤਾ ਜਾਂਦਾ ਹੈ",
	MarkupPreBody: "ਇਸ ਟਿਡਲਰ ਨੂੰ ਟਿਡਲੀਵਿਕੀ HTML  ਫਾਈਲ ਦੇ <body> ਹਿੱਸੇ ਦੇ ਉੱਤੇ ਸੰਮਿਲਤ ਕੀਤਾ ਜਾਂਦਾ ਹੈ",
	MarkupPostBody: "ਇਸ ਟਿਡਲਰ ਨੂੰ ਟਿਡਲੀਵਿਕੀ HTML  ਫਾਈਲ ਦੇ <head> ਹਿੱਸੇ ਦੇ ਹੇਠਾਂ, script ਹਿੱਸੇ ਤੋਂ ਇੱਕਦਮ ਪਿੱਛੋਂ ਸੰਮਿਲਤ ਕੀਤਾ ਜਾਂਦਾ ਹੈ",
	OptionsPanel: "ਇਸ ਪਰਛਾਵੇਂ ਟਿਡਲਰ ਨੂੰ ਸੱਜੇ-ਹਥ ਸਾਇਡਬਾਰ ਵਿਚਲੇ ਵਿਕਲਪ ਪੈਨਲ ਸਲਾਈਡਰ ਦੀ ਸਮੱਗਰੀ ਲਈ ਵਰਤਿਆ ਜਾਂਦਾ ਹੈ",
	PageTemplate: "ਇਸ ਪਰਛਾਵੇਂ ਟਿਡਲਰ ਵਿਚਲਾ HTML ਖਾਕਾ ਟਿਡਲੀਵਿਕੀ ਦੇ ਸਮੁੱਚੇ ਨਕਸ਼ੇ ਨੂੰ ਨਿਸ਼ਚਿਤ ਕਰਦਾ ਹੈ",
	PluginManager: "ਇਹ ਪਰਛਾਵਾਂ ਟਿਡਲਰ ਪਲੱਗਿੰਨ ਮਨੇਜਰ ਤੱਕ ਪ੍ਰਵੇਸ਼ ਪ੍ਰਦਾਨ ਕਰਦਾ ਹੈ",
	SideBarOptions: "ਇਸ ਪਰਛਾਵੇਂ ਟਿਡਲਰ ਨੂੰ ਸੱਜੇ ਹਥ ਸਾਇਡਬਾਰ ਵਿਚਲੇ ਵਿਕਲਪ ਪੈਨਲ ਦੀ ਸਮੱਗਰੀ ਲਈ ਵਰਤਿਆ ਜਾਂਦਾ ਹੈ",
	SideBarTabs: "ਇਸ ਪਰਛਾਵੇਂ ਟਿਡਲਰ ਨੂੰ ਸੱਜੇ ਹਥ ਸਾਇਡਬਾਰ ਵਿਚਲੇ ਟੈਬ ਪੈਨਲ ਦੀ ਸਮੱਗਰੀ ਲਈ ਵਰਤਿਆ ਜਾਂਦਾ ਹੈ",
	SiteSubtitle: "ਇਸ ਪਰਛਾਵੇਂ ਟਿਡਲਰ ਨੂੰ ਪੇਜ ਸਿਰਨਾਵੇਂ ਦੇ ਪਿਛਲੇ ਹਿੱਸੇ ਦੇ ਤੌਰ ਤੇ ਵਰਤਿਆ ਜਾਂਦਾ ਹੈ",
	SiteTitle: "ਇਸ ਪਰਛਾਵੇਂ ਟਿਡਲਰ ਨੂੰ ਪੇਜ ਸਿਰਨਾਵੇਂ ਦੇ ਪਹਿਲੇ ਹਿੱਸੇ ਦੇ ਤੌਰ ਤੇ ਵਰਤਿਆ ਜਾਂਦਾ ਹੈ",
	SiteUrl: "ਇਸ ਪਰਛਾਵੇਂ ਟਿਡਲਰ ਵਿਚ ਸਾਈਟ ਦੇ ਪ੍ਰਕਾਸ਼ਨ ਵਾਸਤੇ ਪੂਰਾ URL ਪਾਉਣਾ ਹੁੰਦਾ ਹੈ",
	StyleSheetColors: "ਇਸ ਪਰਛਾਵੇਂ ਟਿਡਲਰ ਵਿਚ ਪੇਜ ਦੇ ਤੱਤਾਂ ਦੇ ਰੰਗਾਂ ਨਾਲ ਸੰਬੰਧਿਤ CSS ਪਰਿਭਾਸ਼ਾਵਾਂ ਹੁੰਦੀਆਂ ਹਨ.  ''ਇਸ ਟਿਡਲਰ ਦਾ ਸੰਪਾਦਨ ਨਾ ਕਰੋ !'', ਸਗੋਂ StyleSheet ਪਰਛਾਵੇਂ ਟਿਡਲਰ ਵਿਚ ਆਪਣੇ ਬਦਲਾਓ ਕਰੋ",
	StyleSheet: "ਇਸ ਪਰਛਾਵੇਂ ਟਿਡਲਰ ਵਿਚ ਮਰਜ਼ੀ ਦੀਆਂ CSS ਪਰਿਭਾਸ਼ਾਵਾਂ ਆ ਸਕਦੀਆਂ ਹਨ",
	StyleSheetLayout: "ਇਸ ਪਰਛਾਵੇਂ ਟਿਡਲਰ ਵਿਚ ਪੇਜ ਦੇ ਤੱਤਾਂ ਦੇ ਨਕਸ਼ੇ ਨਾਲ ਸੰਬੰਧਿਤ CSS ਪਰਿਭਾਸ਼ਾਵਾਂ ਹੁੰਦੀਆਂ ਹਨ.  ''ਇਸ ਟਿਡਲਰ ਦਾ ਸੰਪਾਦਨ ਨਾ ਕਰੋ !'', ਸਗੋਂ StyleSheet ਪਰਛਾਵੇਂ ਟਿਡਲਰ ਵਿਚ ਆਪਣੇ ਬਦਲਾਓ ਕਰੋ",
	StyleSheetLocale: "ਇਸ ਪਰਛਾਵੇਂ ਟਿਡਲਰ ਵਿਚ ਅਨੁਵਾਦ ਖੇਤਰ ਨਾਲ ਸੰਬੰਧਿਤ CSS ਪਰਿਭਾਸ਼ਾਵਾਂ ਸੰਮਿਲਿਤ ਹਨ",
	StyleSheetPrint: "ਇਸ ਪਰਛਾਂਵੇ ਟਿਡਲਰ ਵਿਚ ਪ੍ਰਿੰਟਿੰਗ ਨਾਲ ਸੰਬੰਧਿਤ CSS ਪਰਿਭਾਸ਼ਾ ਸੰਮਿਲਿਤ ਹਨ",
	TabAll: "ਇਸ ਪਰਛਾਵੇਂ ਟਿਡਲਰ ਵਿਚ ਸੱਜੇ ਹਥ ਦੇ ਸਾਇਡਬਾਰ ਵਿਚਲੇ 'ਸਭ' ਟੈਬ ਦੀ ਸਮੱਗਰੀ ਸੰਮਿਲਿਤ ਹੈ",
	TabMore: "ਇਸ ਪਰਛਾਵੇਂ ਟਿਡਲਰ ਵਿਚ ਸੱਜੇ ਹਥ ਦੇ ਸਾਇਡਬਾਰ ਵਿਚਲੇ 'ਹੋਰ' ਟੈਬ ਦੀ ਸਮੱਗਰੀ ਸੰਮਿਲਿਤ ਹੈ",
	TabMoreMissing: "ਇਸ ਪਰਛਾਵੇਂ ਟਿਡਲਰ ਵਿਚ ਸੱਜੇ ਹਥ ਦੇ ਸਾਇਡਬਾਰ ਵਿਚਲੇ 'ਲਾਪਤਾ' ਟੈਬ ਦੀ ਸਮੱਗਰੀ ਸੰਮਿਲਿਤ ਹੈ",
	TabMoreOrphans: "ਇਸ ਪਰਛਾਵੇਂ ਟਿਡਲਰ ਵਿਚ ਸੱਜੇ ਹਥ ਦੇ ਸਾਇਡਬਾਰ ਵਿਚਲੇ 'ਅਨਾਥ' ਟੈਬ ਦੀ ਸਮੱਗਰੀ ਸੰਮਿਲਿਤ ਹੈ",
	TabMoreShadowed: "ਇਸ ਪਰਛਾਵੇਂ ਟਿਡਲਰ ਵਿਚ ਸੱਜੇ ਹਥ ਦੇ ਸਾਇਡਬਾਰ ਵਿਚਲੇ 'ਪਰਛਾਂਵੇ' ਟੈਬ ਦੀ ਸਮੱਗਰੀ ਸੰਮਿਲਿਤ ਹੈ",
	TabTags: "ਇਸ ਪਰਛਾਵੇਂ ਟਿਡਲਰ ਵਿਚ ਸੱਜੇ ਹਥ ਦੇ ਸਾਇਡਬਾਰ ਵਿਚਲੇ 'ਟੈਗ' ਟੈਬ ਦੀ ਸਮੱਗਰੀ ਸੰਮਿਲਿਤ ਹੈ",
	TabTimeline: "ਇਸ ਪਰਛਾਵੇਂ ਟਿਡਲਰ ਵਿਚ ਸੱਜੇ ਹਥ ਦੇ ਸਾਇਡਬਾਰ ਵਿਚਲੇ 'ਸਮੇ ਰੇਖਾ' ਟੈਬ ਦੀ ਸਮੱਗਰੀ ਸੰਮਿਲਿਤ ਹੈ",
	ToolbarCommands: "ਇਹ ਪਰਛਾਵਾਂ ਟਿਡਲਰ ਇਹ ਨਿਸ਼ਚਿਤ ਕਰਦਾ ਹੈ ਕਿ ਟਿਡਲਰ ਟੂਲਬਾਰ ਵਿਚ ਕਿਹੜੀਆਂ ਕਮਾਂਡਾਂ ਪ੍ਰਦਰਸ਼ਿਤ ਹੁੰਦੀਆਂ ਹਨ",
	ViewTemplate: "ਇਸ ਪਰਛਾਵੇਂ ਟਿਡਲਰ ਵਿਚਲਾ HTML ਖਾਕਾ ਟਿਡਲਰਾਂ ਦੀ ਦਿੱਖ ਨਿਸ਼ਚਿਤ ਕਰਦਾ ਹੈ"
	});

//}}}
<html><nowiki>
<h1>Pronouns | ਪੜਨਾਂਵ</h1>
<p>In this lesson we are going to learn about the pronouns used in Punjabi. The pronouns in Punjabi change their form according to the Number and Kaaruk but <b>not</b> according to the Gender of the nouns they represent. In order to know Gender of the represented noun one has to see the accompanying verb, which changes according to the Gender of absent noun.</p>
<h2>First Person | ਪਹਿਲਾ ਪੁਰਖ</h2>
<p>The basic first person pronoun are  ਮੈਂ (singular) and ਅਸੀਂ (plural). These pronouns change form according to Noun cases as follows:</p>

<table>
<tr>
 <th>Case/Kaaruk</th>
 <th>Singular</th>
 <th>Plural</th>
</tr><tr>
 <th>Kurtaa <br> (Subjective) </th>
 <td><u>ਮੈਂ</u> <br>
<ul>
<li>ਮੈਂ ਗੁਰਦੁਆਰੇ ਜਾਂਦਾ ਹਾਂ <br> [I] [gurudwara] [go to] <br> I go to gurudwara</li>
</ul>
</td>
 <td>
<u>ਅਸੀਂ, ਆਪਾਂ </u><br>
<ul>
<li>ਅਸੀਂ ਅੰਮ੍ਰਿਤਸਰ ਗਏ ਸੀ <br> [we] [Amritsar] [went to] <br> We went to Amritsar</li>
<li>ਆਪਾਂ ਨੂੰ ਅੰਮ੍ਰਿਤਸਰ ਜਾਣਾ ਚਾਹੀਦਾ ਹੈ <br> [we] [Amritsar] [should go to] <br> We should go to Amritsar </li>
</ul>
</td>
</tr><tr>
 <th>Kurum <br> (Objective) </th>
 <td>
<u>ਮੈਨੂੰ </u><br>
<ul>
<li>ਰਮੇਸ਼ ਨੇ ਮੈਨੂੰ ਕਿਹਾ <br> [Ramesh] [said to me] <br> Ramesh said to me</li>
</ul>
</td>
 <td>
<u>ਸਾਨੂੰ, ਆਪਾਂ ਨੂੰ </u><br>
<ul>
<li>ਸਾਨੂੰ ਖ਼ਬਰ ਮਿਲੀ <br> [we] [news] [heard] <br> We heard the news</li>
<li>ਆਪਾਂ ਨੂੰ ਪਤਾ ਹੀ ਨਹੀਂ ਸੀ <br> [We] [know] [did not] <br> We did not know</li>
</td>
</tr><tr>
 <th>Kurun <br>(Instrumental)</th>
 <td>
<u> ਮੈਂਥੋਂ, ਮੇਰੇ ਰਾਹੀਂ, ਮੇਰੇ ਦੁਆਰਾ </u>
<ul>
<li>ਮੈਥੋਂ ਕਿਹਾ ਗਿਆ <br>[From me] [ was said] <br> It was (inadvertantly) said by me</li>
<li>ਮੇਰੇ ਰਾਹੀਂ ਕੰਮ ਹੋਇਆ <br> [through me] [work was done] <br> Work was done through me</li>
</ul>
</td>
 <td> 
<u> ਸਾਥੋਂ, ਆਪਾਂ ਤੋਂ </u><br>
<ul>
<li>ਸਾਥੋਂ ਕੀ ਭਾਲਦਾ ਹੈਂ? <br> [from us] [what do (you) look for?] <br> What do you want from us?</li>
<li>ਆਪਾਂ ਜੇ ਇਹ ਨਾ ਕਰੀਏ ਤਾਂ ਚੰਗਾ ਹੈ <br> [we] [if (ਜੇ)] [do not do this] [then (ਤਾਂ)] [will be good] <br> It will be good if we do not do this</li>
</ul>
</td>
</tr><tr>
<th>Sumpurdaan <br> (Dative)</th>
 <td>
<u> ਮੈਨੂੰ, ਮੇਰੇ ਲਈ, ਮੇਰੇ ਵਾਸਤੇ </u><br>
<ul>
<li>ਲੜਕੀ ਨੇ ਮੈਨੂੰ ਪਾਣੀ ਪਿਲਾਇਆ <br> [Girl] [to me] [water] [gave to drink] <br> Girl gave me water to drink</li>
<li>ਲੜਕੀ ਮੇਰੇ ਲਈ ਪਾਣੀ ਲੈਕੇ ਆਈ <br> [Girl] [for me] [water] [brought] <br> Girl brought water for me</li>
<li>ਮੇਰੇ ਵਾਸਤੇ ਰਾਹ ਬਣਾਇਆ <br> [for me] [way] [made] <br> Way was made for me</li>
</ul>
</td>
 <td> 
<u> ਸਾਨੂੰ, ਸਾਡੇ ਲਈ, ਸਾਡੇ ਵਾਸਤੇ </u><br>
<ul>
<li>ਪਿੰਡ ਦੇ ਲੋਕਾਂ ਨੇ ਸਾਨੂੰ ਸੁਗਾਤਾਂ ਦਿੱਤੀਆਂ <br>[people of the village] [to us] [gifts] [gave] <br> People of the village gave gifts to us. </li>
<li>ਰਮੇਸ਼ ਆਪਾਂ ਨੂੰ ਪੈਸੇ ਜ਼ਰੂਰ ਦੇਵੇਗਾ <br> [Ramesh] [to us] [money] [would surely give] <br> Ramesh would surely give us the money </li>
<li>ਮਾਤਾ ਜੀ ਨੇ ਸਾਡੇ ਲਈ ਪਰੌਂਠੇ ਪਕਾਏ <br> [Mother] [for us] [Paraunthe made] <br> Mother made praunthe for us </li>
<li>ਉਹ ਸਾਡੇ ਵਾਸਤੇ ਦਰਵਾਜਾ ਖੋਲਣ ਆਈ <br> [She] [for us] [door] [came to open] <br> She came to open door for us</li>
</ul>
</td>
</tr><tr>
 <th>Upaadaan <br> (Ablative)</th>
 <td>
<u> ਮੈਥੋਂ, ਮੇਰੇ ਕੋਲ਼ੋ, ਮੇਰੇ ਉੱਤੋਂ, ਮੇਰੇ ਲਾਗਿਓਂ </u><br>
<ul>
<li>ਕਿਤਾਬ ਮੈਥੋਂ ਗਿਰ ਗਈ <br> [Book] [from me] [feel down] <br> Book fell down from me </li>
<li>ਗੱਡੀ ਮੇਰੇ ਕੋਲੋਂ ਲੰਘੀ <br> [Car/vehicle] [by me] [passed] <br> Vehicle passed by me </li>
<li>ਮੇਰੇ ਉੱਤੋਂ ਭਾਰ ਲਹਿ ਗਿਆ <br> [from me] [weight] [lifted off] <br> Weight lifted off me</li>
<li>ਮੇਰੇ ਲਾਗਿਓਂ ਇਕ ਬੰਦਾ ਉਠਿਆ <br> [near me] [a man] [got up] <br> A man got up from near me </li>
</ul>
</td>
 <td>
<u> ਸਾਥੋਂ, ਸਾਡੇ ਕੋਲੋਂ, ਸਾਡੇ ਉੱਤੋਂ, ਸਾਡੇ ਲਾਗਿਓਂ</u><br>
<ul>
<li>ਉਹ ਸਾਥੋਂ ਦੂਰ ਚਲਾ ਗਿਆ <br>[He] [from us] [far] [went away] <br> He went far away from us</li>
<li>ਸਾਡੇ ਕੋਲੋ ਪੈਸੇ ਗਿਰ ਗਏ <br> [From us] [money] [fell down] <br> Money fell down from us</li>
<li>ਗੱਡੀਆਂ ਸਾਡੇ ਲਾਗਿਓਂ ਲੰਘੀਆਂ <br> [Vehicles] [from near us] [passed] <br> Vehicles passed us by</li>
</ul>
</td>
</tr><tr>
 <th>Sumbundh <br> (Relational)</th>
 <td>
<u>ਮੇਰਾ, ਮੇਰੇ, ਮੇਰੀ, ਮੇਰੀਆਂ, ਮੇਰਿਆਂ </u><br>
<ul>
<li>ਮੇਰਾ ਸਾਈਕਲ(masc. sing.) <br> My bicyle</li>
<li>ਮੇਰੇ ਸਾਈਕਲ(masc. plu.) <br> My bicycles</li>
<li>ਮੇਰੀ ਜੈਕੇਟ(fem. sing.) <br> My jacket</li>
<li>ਮੇਰੀਆਂ ਜੈਕੇਟਾਂ(fem. plu.)<br> My jackets</li>
<hr>
<li>ਮੇਰਿਆਂ ਭਰਾਵਾਂ --??ਦਾ ਪਿਆਰ</li>
</ul>

</td>
 <td> <u> ਸਾਡਾ, ਸਾਡੀ, ਸਾਡੇ, ਸਾਡੀਆਂ, ਅਪਣਾ, ਅਪਣੀ, ਅਪਣੇ, ਅਪਣੀਆਂ </u>
<ul>
<li>ਸਾਡਾ ਘਰ (masc. sing.) <br> Our home</li>
<li>ਸਾਡੀ ਕੋਠੀ(fem. sing.) <br> Our house/mansion</li>
<li>ਸਾਡੇ ਰਿਸ਼ਤੇਦਾਰ(masc. plu.) <br> Our relatives</li>
<li>ਸਾਡੀਆਂ ਜ਼ਿੰਦਗੀਆਂ(fem. plu.) <br> Our lives</li>
<li>ਅਪਣਾ ਪਿੰਡ(masc. sing.) <br> Our village</li>
<li>ਅਪਣੀ ਦੋਸਤੀ(fem. sing.) <br> Our friendship</li>
<li>ਅਪਣੇ ਪੁਰਖੇ(masc. plu.) <br> Our ancestors</li>
<li>ਅਪਣੀਆਂ ਰੀਤਾਂ-ਰਸਮਾਂ(fem. plu.) <br> Our customs and rituals</li>
</ul>
</td>
</tr><tr>
 <th>Udhikurun <br> (Locative)</th>
 <td><u> ਮੇਰੇ ਉੱਤੇ, ਮੇਰੇ ਵਿੱਚ, ਮੇਰੇ ਕੋਲ਼, ਮੇਰੇ ਲਾਗੇ </u>
<ul>
<li>ਮਾਤਾ ਜੀ ਨੇ ਮੇਰੇ ਉੱਤੇ ਰਜਾਈ ਦਿੱਤੀ <br> [Mother] [on me] [quilt] [gave]</li>
<li>ਮੇਰੇ ਵਿੱਚ ਇਕ ਜੋਸ਼ ਭਰ ਗਿਆ <br> [In me] [a fervour] [filled] <br> I was filled with a fervour</li>
<li>ਮੇਰੇ ਕੋਲ ਕੇਵਲ ਦੋ ਕਮੀਜ਼ਾਂ ਸਨ <br> [with me] [just] [two shirts] [were] <br> There were just two shirts with me </li>
<li>ਮੇਰੇ ਲਾਗੇ ਇਕ ਬਕਸਾ ਪਿਆ ਸੀ <br> [Near me] [a box] [was lying]. A box was lying near me.</li>
</ul>
</td>
 <td><u> ਸਾਡੇ ਉੱਤੇ, ਸਾਡੇ ਵਿੱਚ, ਸਾਡੇ ਕੋਲ਼, ਸਾਡੇ ਲਾਗੇ, ਅਪਣੇ ਉੱਤੇ, ਅਪਣੇ ਵਿੱਚ, ਅਪਣੇ ਕੋਲ਼, ਅਪਣੇ ਲਾਗੇ </u>
<ul>
<li>ਸਾਡੇ ਉਤੇ ਪਾਣੀ ਪੈ ਗਿਆ <br> [On us] [water] [fell] <br> Water fell on us </li>
<li>ਸਾਡੇ ਵਿੱਚ ਕਈ ਗਾਉਣ ਵਾਲੇ ਸਨ <br> [Amongst us] [many singers] [were] <br> Many singers were amongst us </li>
<li>ਸਾਡੇ ਕੋਲ ਹਥਿਆਰ ਸਨ <br> [With us] [weapons] [were] <br> We had weapons with us</li>
<li>ਸਾਡੇ ਲਾਗੇ ਇਕ ਤਾਲਾਬ ਹੈ <br> [Near us] [a pond] [is] <br> (There) is a pond near us </li>
</ul>
</td>
</tr><tr>
<th>Sumbodhan</th>
 <td> </td>
 <td> </td>
</tr>
</table>


<h2>Second Person | ਦੂਜਾ ਪੁਰਖ</h2>
<p>The Second person pronoun are  ਤੂੰ (singular) and ਤੁਸੀਂ (plural). These pronouns change form according to Noun cases as follows:</p>
<table>
<tr>
 <th>Case/Kaaruk</th>
 <th>Singular</th>
 <th>Plural</th>
</tr><tr>
 <th>Kurtaa <br> (Subjective) </th>
 <td><u>ਤੂੰ</u> <br>
<ul>
<li>ਤੂੰ ਬਹੁਤ ਮਿਹਨਤ ਕਰਦੀ ਹੈਂ <br> [You] [very hard work] [do] <br> You(girl) work very hard </li>
</ul>
</td>
 <td>
<u>ਤੁਸੀਂ, ਤੁਸਾਂ </u><br>
<ul>
<li>ਤੁਸੀਂ ਪਿੰਡ ਪਹੁੰਚ ਕੇ ਮੈਨੂੰ ਫੋਨ ਕਰਿਓ <br> [You] [village] [upon reaching] [to me] [call] <br> (you) call me upon reaching the village</li>
</ul>
</td>
</tr><tr>
 <th>Kurum <br> (Objective) </th>
 <td>
<u>ਤੈਨੂੰ </u><br>
<ul>
<li>ਦੋਸਤਾਂ ਨੇ ਤੈਨੂੰ ਵਧਾਈ ਦਿੱਤੀ <br>[Friends] [to you] [congratulations] [gave] <br> Friends congratulated you </li>
</ul>
</td>
 <td>
<u>ਤੁਹਾਨੂੰ </u><br>
<ul>
<li>ਤੁਹਾਨੂੰ ਪੂਰੀ ਮਦਦ ਮਿਲੇਗੀ <br>[You] [full help] [will receive] <br> You will receive full help</li>
</td>
</tr><tr>
 <th>Kurun <br>(Instrumental)</th>
 <td>
<u> ਤੈਥੋਂ, ਤੇਰੇ ਰਾਹੀਂ, ਤੇਰੇ ਦੁਆਰਾ </u>
<ul>
<li> ਤੇਰੇ ਰਾਹੀਂ ਉਹਦਾ ਸਾਰਾ ਕੰਮ ਹੋ ਗਿਆ </li>
</ul>
</td>
 <td> 
<u> ਤੁਹਾਥੋਂ,ਤੁਹਾਡੇ ਤੋਂ, ਤੁਹਾਡੇ ਰਾਹੀਂ </u><br>
<ul>
<li>ਓਹਨਾਂ ਨੂੰ ਤੁਹਾਡੇ ਤੋਂ ਤਿਆਰ ਹੋਇਆ ਪ੍ਰੌਜੈਕਟ ਪਸੰਦ ਆਵੇਗਾ <br> [to them] [from you] [prepared] [project] [will like] <br> They will like a project prepared by you.</li>
<li>ਉਹਨਾਂ ਨੇ ਤੁਹਾਥੋਂ ਏਨਾ ਕੰਮ ਕਰਵਾਇਆ <br>[They] [from you] [this much work] [got done] <br> They got so much work done from you </li>
</ul>
</td>
</tr><tr>
<th>Sumpurdaan <br> (Dative)</th>
 <td>
<u> ਤੈਨੂੰ, ਤੇਰੇ ਲਈ, ਤੇਰੇ ਵਾਸਤੇ </u><br>
<ul>
<li>ਤੈਨੂੰ ਚੰਗਾ ਸਬਕ ਮਿਲਿਆ <br> [You] [good lesson] [received] <br> You received a good lesson</li>
<li>ਪਿਤਾਜੀ ਨੇ ਤੇਰੇ ਲਈ ਨਵੇਂ ਕਪੜੇ ਖਰੀਦੇ ਹਨ <br> [Father] [for you] [new clothes] [has bought] <br> Father has bought new clothes for you </li>
</ul>
</td>
 <td> 
<u>ਤੁਹਾਨੂੰ, ਤੁਹਾਡੇ ਲਈ, ਤੁਹਾਡੇ ਵਾਸਤੇ </u><br>
<ul>
<li>ਤੁਹਾਨੂੰ ਬੇਸ਼ੁਮਾਰ ਦੌਲਤ ਪ੍ਰਾਪਤ ਹੋਈ <br>[you] [great wealth] [received] <br> You received great wealth </li>
<li>ਮੈਂ ਤੁਹਾਡੇ ਵਾਸਤੇ ਕੁਝ ਖਾਸ ਲੈਕੇ ਆਇਆਂ ਹਾਂ <br> [I] [for you] [something special] [have brought] <br> I have brought something special for you</li>
</ul>
</td>
</tr><tr>
 <th>Upaadaan <br> (Ablative)</th>
 <td>
<u> ਤੈਥੋਂ, ਤੇਰੇ ਕੋਲ਼ੋ, ਤੇਰੇ ਉੱਤੋਂ, ਤੇਰੇ ਲਾਗਿਓਂ </u><br>
<ul>
<li>ਤੇਰੇ ਕੋਲੋਂ ਮਿਲੇ ਪੈਸੇ ਮੇਰੇ ਬਹੁਤ ਕੰਮ ਆਏ <br>[From you] [got money] [to me] [helped a lot] <br> The money I got from you helped me a lot</li>
<li>ਤੇਰੇ ਕੋਲੋਂ ਸੁਣ ਕੇ ਉਸਨੇ ਮੈਨੂੰ ਦੱਸ ਦਿੱਤਾ <br> [From you] [upon listening] [he/she] [to me] [told] <br> He told it to me upon hearing it from you  </li>
</ul>
</td>
 <td>
<u> ਤੁਹਾਥੋਂ, ਤੁਹਾਡੇ ਕੋਲੋਂ, ਤੁਹਾਡੇ ਲਾਗਿਓਂ</u><br>
<ul>
<li>ਤੁਹਾਡੇ ਕੋਲੋਂ ਪਿਆਰ ਪਾ ਕੇ ਮੇਰੀ ਜਿੰਦਗੀ ਬਦਲ ਗਈ <br> [From you] [getting love] [my life] [changed] <br> My life changed on getting love from you</li>
</ul>
</td>
</tr><tr>
 <th>Sumbundh <br> (Relational)</th>
 <td>
<u>ਤੇਰਾ, ਤੇਰੇ, ਤੇਰੀ, ਤੇਰੀਆਂ, ਤੇਰਿਆਂ </u><br>
<ul>
<li>ਤੇਰਾ ਸਾਈਕਲ(masc. sing.) <br> Your bicyle</li>
<li>ਤੇਰੇ ਸਾਈਕਲ(masc. plu.) <br> Your bicycles</li>
<li>ਤੇਰੀ ਜੈਕੇਟ(fem. sing.) <br> Your Jacket</li>
<li>ਤੇਰੀਆਂ ਜੈਕੇਟਾਂ(fem. plu.) <br> Your Jackets</li>
<hr>
<li>ਤੇਰਿਆਂ ਭਰਾਵਾਂ ਦਾ ਸਹਾਰਾ ਤੈਨੂੰ ਹਮੇਸ਼ਾ ਮਿਲੇਗਾ <br> [Your brothers's] [support] [to you] [will always get] <br> You will always get your brothers' support</li>
</ul>

</td>
 <td> <u> ਤੁਹਾਡਾ, ਤੁਹਾਡੀ, ਤੁਹਾਡੇ, ਤੁਹਾਡੀਆਂ </u>
<ul>
<li>ਤੁਹਾਡਾ ਅਸ਼ੀਰਵਾਦ ਮੇਰੇ ਸਿਰ ਤੇ ਹੈ <br>[Your blessing] [mine head] [on] [is] <br> You blessing is always with me </li>
<li>ਤੁਹਾਡੀ ਗੱਲ ਮੈਨੂੰ ਸਦਾ ਯਾਦ ਰਹੇਗੀ <br>[Your words] [to me] [always] [will remember] <br> I will always remember your words </li>
<li>ਤੁਹਾਡੇ ਹੱਥ ਬੜੇ ਕੋਮਲ ਹਨ <br> [Your hands] [very soft] [are] <br> Your hands are very soft</li>
<li>ਤੁਹਾਡੀਆਂ ਅੱਖਾਂ ਬੜੀਆਂ ਸੁਹਣੀਆਂ ਹਨ <br>[Your eyes] [very beautiful] [are] <br> Your eyes are very beautiful</li>
</ul>
</td>
</tr><tr>
 <th>Udhikurun <br> (Locative)</th>
 <td><u> ਤੇਰੇ ਉੱਤੇ, ਤੇਰੇ ਵਿੱਚ, ਤੇਰੇ ਕੋਲ਼, ਤੇਰੇ ਲਾਗੇ </u>
<ul>
<li>ਤੇਰੇ ਉੱਤੇ ਲੱਖਾਂ ਦਾ ਕਰਜ਼ਾ ਹੈ <br>{upon you] [of lakhs] [debt] [is] <br> There is debt of lakhs of rupees on you</li>
<li>ਤੇਰੇ ਵਿੱਚ ਜੋ ਗੁਣ ਹੈ ਉਹ ਹੋਰ ਕਿਸੇ ਕੋਲ ਨਹੀਂ <br> [In you] [which] [merit/virtue] [have] [that] [with any other(person)] [not(is)] <br> The virtue which you have is not present in any other person </li>
<li>ਕੀ ਤੇਰੇ ਕੋਲ ਨਿਤਨੇਮ ਦਾ ਗੁਟਕਾ ਹੈ? <br>[do] [with you] [book of Nitnem (Sikh daily prayers)] [have?] <br> Do you have the book of Nitnem with you?</li>
</ul>
</td>
 <td><u> ਤੁਹਾਡੇ ਉੱਤੇ, ਤੁਹਾਡੇ ਵਿੱਚ, ਤੁਹਾਡੇ ਕੋਲ਼, ਤੁਹਾਡੇ ਲਾਗੇ </u>
<ul>
<li>ਤੁਹਾਡੇ ਉੱਤੇ ਕੋਈ ਇਲਜ਼ਾਮ ਨਾ ਆਵੇ <br>[Upon you] [any blame] [(may) not come] <br> May no blame come upon you </li>
<li>ਤੁਹਾਡੇ ਕੋਲ ਲਿਖਣ ਲਈ ਪੈੱਨ ਹੈ? <br> [With you] [for writing] [pen] [is?] <br> Do you have a pen for writing?</li>
<li>ਤੁਹਾਡੇ ਲਾਗੇ ਇਕ ਨੀਲਾ ਕਪੜਾ ਪਿਆ ਹੈ [Near you] [one/a blue cloth] [is lying] <br> There is a blue cloth lying near you</li>
</ul>
</td>
</tr><tr>
<th>Sumbodhan</th>
 <td> </td>
 <td> </td>
</tr>
</table>


<h2>Third Person | ਤੀਜਾ ਪੁਰਖ</h2>
<p>The Third person pronouns are ਉਹ and ਇਹ. ਉਹ is used for both singular and plural masculine as well as feminine nouns. The pronoun ਇਹ is used instead of ਉਹ when the noun being talked about is located near the speaker. On the other hand if the noun is located far from the speaker ਉਹ is used. For example if some one is standing far away from me I can say this about him: ਉਹ ਬੜਾ ਵਧੀਆ ਗਾਉਂਦਾ ਹੈ (He sings very well). But if that someone is standing close to me I would say: ਇਹ ਬੜਾ ਵਧੀਆ ਗਾਉਂਦਾ ਹੈ (He sings very well) </p>
<table>
<tr>
 <th>Case/Kaaruk</th>
 <th>Singular</th>
 <th>Plural</th>
</tr><tr>
 <th>Kurtaa <br> (Subjective) </th>
 <td><u>ਇਹ, ਉਹ, ਇਹਨੇ, ਉਹਨੇ, ਇਸਨੇ, ਉਸਨੇ</u> <br>
<ul>
<li>ਮੈਂ ਅਪਣੇ ਭਰਾ ਨਾਲ ਆਇਆ ਹਾਂ । ਇਹ ਸਕੂਲ ਵਿਚ ਪੜ੍ਹਦਾ ਹੈ। ਇਹਨੇ ਕੰਪਿਊਟਰ ਦਾ ਕੰਮ ਸਿੱਖਿਆ ਹੋਇਆ ਹੈ। <br>[I] [my brother] [with] [have come]. [He] [in school] [studies] <br> I have come with my brother. He studies in school.</li>
<li>ਮੇਰਾ ਦੋਸਤ ਅਮਰੀਕਾ ਗਿਆ ਹੋਇਆ ਹੈ। ਉਹ ਓਥੇ ਇਕ ਕੰਪਨੀ ਵਿਚ ਮੈਨੇਜਰ ਹੈ। ਉਹਨੇ ਅਗਲੇ ਮਹੀਨੇ ਇੰਡੀਆ ਵਾਪਿਸ ਆਉਣਾ ਹੈ। [My friend] [America] [has gone]. [He] [there] [in a company] [manager] [is] <br> My friend has gone to America. He is a manager in a company there.</li>
</ul>
</td>
 <td>
<u>ਇਹ, ਉਹ, ਇਹਨਾਂ ਨੇ, ਉਹਨਾਂ ਨੇ </u><br>
<ul>
<li>ਮੇਰੇ ਨਾਲ ਕੁਝ ਦੋਸਤ ਆਏ ਹਨ। ਇਹ ਮੇਰਾ ਘਰ ਦੇਖਣਾ ਚਾਹੁੰਦੇ ਹਨ। ਇਹਨਾ ਦੀ ਮੇਰੇ ਨਾਲ ਗੂੜ੍ਹੀ ਦੋਸਤੀ ਹੈ। [with me] [some friends] [have come]. [They] [my home] [want to see]. <br> Some friends have come with me. They wish to see my home</li>
<li>ਦੁਕਾਨ ਤੇ ਗ੍ਰਾਹਕਾਂ ਦੀ ਭੀੜ ਲੱਗੀ ਸੀ। ਉਹ ਸੇਲ ਦਾ ਫਾਇਦਾ ਲੈਣਾ ਚਾਹੁੰਦੇ ਸਨ। ਉਹਨਾਂ ਨੇ ਬਹੁਤ ਸਾਮਾਨ ਖਰੀਦਿਆ। <br> [On/at shop] [customers's crowd] [was there]. [They] [benefit of a discount-sale] [wanted to take].[They][lot of things][bought].<br> There was a crowd of customers at the shop. They wanted to benefit from the sale. They bought a lot of things</li>
</ul>
</td>
</tr><tr>
 <th>Kurum <br> (Objective) </th>
 <td>
<u>ਇਹਨੂੰ, ਉਹਨੂੰ, ਇਸ ਨੂੰ, ਉਸ ਨੂੰ </u><br>
<ul>
<li>ਮੈਂ ਆਪਣੀ ਭੈਣ ਨੂੰ ਲੈਕੇ ਆਇਆ ਹਾਂ । ਇਹਨੂੰ ਵੀ ਸੰਗੀਤ ਦੀ ਸਿੱਖਿਆ ਦਿਓ। <br> [I] [with my sister] [have come]. [her too] [training of music] [give] <br> I have come with my sister. Give music training to her too.</li>
<li>ਰਵੀ ਤੁਹਾਡੇ ਕੋਲ ਆਏਗਾ, ਉਹਨੂੰ ਪੈਸੇ ਦੇ ਦਿਓ। [Ravi] [to you] [shall come], [to him] [ money] [give] <br> Ravi shall come to you. Give him the money.</li>
</ul>
</td>
 <td>
<u>ਇਹਨਾਂ ਨੂੰ, ਉਹਨਾਂ ਨੂੰ </u><br>
<ul>
<li>ਸਾਹਮਣੇ ਦੇਖੋ! ਬੱਚੇ ਬਾਰਿਸ਼ ਵਿਚ ਨ੍ਹਾ ਰਹੇ ਹਨ। ਇਹਨਾਂ ਨੂੰ ਠੰਡ ਲਗਣ ਦਾ ਡਰ ਨਹੀਂ ਹੈ। [Look ahead] [children] [in rain] [are bathing]. [To them] [fear of catching cold] [is not] <br> Look over there! children are bathing in rain. They have no fear of catching cold.</li>
<li>ਦਰਵਾਜੇ ਤੇ ਕੁਝ ਬੰਦੇ ਆਏ ਹਨ। ਉਹਨਾਂ ਨੂੰ ਕੀ ਚਾਹੀਦਾ ਹੈ? <br> [On/at door] [some people] [have come]. [They][what][need is] <br> There are some people at the door. What do they need?</li>
</td>
</tr><tr>
 <th>Kurun <br>(Instrumental)</th>
 <td>
<u> ਇਸ ਨਾਲ, ਉਸ ਨਾਲ, ਇਹਦੇ ਰਾਹੀਂ, ਉਹਦੇ ਰਾਹੀਂ </u>
<ul>
<li>ਸੁਖਪ੍ਰੀਤ ਮੇਰੇ ਕੋਲ ਹੀ ਹੈ। ਮੈਂ ਇਸ ਨਾਲ ਬਾਜ਼ਾਰ ਚਲੀ ਜਾਵਾਂਗੀ। <br>[Sukhpreet][with me] [is only].[I] [with her][market] [shall go].<br>Sukhpreet is with me only. I shall go to the market with her. </li>
<li>ਰਵੀ ਦਾ ਸੁਭਾਅ ਚੰਗਾ ਨਹੀਂ ਹੈ। ਉਸ ਨਾਲ ਕੰਮ ਕਰਨਾ ਬਹੁਤ ਔਖਾ ਹੈ। <br>[Nature of Ravi] [good] [is not].[with him] [to work] [is very difficult]<br> Ravi's nature is not good. Its difficult to work with him.</li>

</ul>
</td>
 <td> 
<u>ਇਹਨਾਂ ਨਾਲ, ਉਹਨਾਂ ਨਾਲ, ਇਹਨਾਂ ਰਾਹੀਂ, ਉਹਨਾਂ ਰਾਹੀਂ  </u><br>
<ul>
<li>ਇਹ ਮੇਰੀਆਂ ਬਣਾਈਆਂ ਤਸਵੀਰਾਂ ਹਨ। ਇਹਨਾਂ ਨਾਲ ਮੈਂ ਕਈ ਘੰਟੇ ਗੁਜ਼ਾਰ ਸਕਦਾਂ ਹਾਂ । <br>[These][my made paintings][are].[with these][I][many hours][can spend/pass]. <br>These paintings are made by me. I can spend many hours with them. </li>
<li>ਸਾਨੂੰ ਰਸੋਈ ਵਿਚੋਂ ਕੁਝ ਰੋਟੀਆਂ ਮਿਲ ਗਈਆਂ । ਉਹਨਾਂ ਨਾਲ ਸਾਡੀ ਭੁੱਖ ਮਿਟ ਗਈ। <br>[we][from kitchen][some rotis][found].[with those][our hunger][was satiated]<br> We found some rotis from the kitchen. Our hunger was satiated with them. </li>

</ul>
</td>
</tr><tr>
<th>Sumpurdaan <br> (Dative)</th>
 <td>
<u>ਇਹਨੂੰ, ਉਹਨੂੰ, ਇਹਦੇ ਲਈ, ਉਹਦੇ ਲਈ, ਇਹਦੇ ਵਾਸਤੇ, ਉਹਦੇ ਵਾਸਤੇ </u><br>
<ul>
<li>ਇਹ ਮੇਰਾ ਕੁੱਤਾ ਡਿਊਕ ਹੈ। ਮੈਂ ਇਹਨੂੰ ਖੇਡਣ ਲਈ ਗੇਂਦ ਦਿੱਤੀ ਹੈ। ਇਹਦੇ ਲਈ ਕਈ ਹੋਰ ਚੀਜ਼ਾਂ ਵੀ ਹਨ। <br>[This][my dog Duke][is].[I][to him][for playing][ball][have given]. This is my dog Duke. I have given him a ball to play.</li>
<li>ਪਹਿਲਾ ਮੇਰੇ ਕੋਲ ਇਕ ਘੋੜਾ ਹੁੰਦਾ ਸੀ। ਉਹਨੁੰ ਕਈ ਇਨਾਮ ਮਿਲੇ ਸਨ। ਉਹਦੇ ਲਈ ਇਕ ਟ੍ਰੇਨਰ ਆਉਂਦਾ ਹੁੰਦਾ ਸੀ।<br>[Earlier][with me][a horse][had].[To him][many prizes][had got].<br> Earlier I had a horse. He had received many prizes.</li>
</ul>
</td>
 <td> 
<u> ਇਹਨਾਂ ਨੂੰ, ਉਹਨਾਂ ਨੂੰ, ਇਹਨਾਂ ਲਈ, ਉਹਨਾਂ ਲਈ, ਇਹਨਾਂ ਵਾਸਤੇ, ਉਹਨਾਂ ਵਾਸਤੇ  </u><br>
<ul>
<li>ਮੇਰੇ ਬੂਟ ਗੰਦੇ ਹੋ ਗਏ ਹਨ। ਇਹਨਾਂ ਨੂੰ ਧੋਣਾ ਪਵੇਗਾ।<br>[Mine boots][dirty][have become].[to these][wash][will have to].<br>My boots have become dirty. These will have to be washed.</li>
<li>ਗਰਮੀ ਵਿੱਚ ਬੂਟੇ ਸੁੱਕ ਕੇ ਮਰ ਗਏ। ਉਹਨਾਂ ਨੂੰ ਕਿਸੇ ਨੇ ਪਾਣੀ ਨਹੀਂ ਦਿੱਤਾ। <br>[In heat][plants][on drying up][died].[To them][nobody][water][did not give].<br> Plants dried up and died in the heat. Nobody watered them.</li>
</ul>
</td>
</tr><tr>
 <th>Upaadaan <br> (Ablative)</th>
 <td>
<u> ਇਸ ਤੋਂ, ਉਸ ਤੋਂ, ਇਹਦੇ ਕੋਲ਼ੋ, ਉਹਦੇ ਕੋਲ਼ੋ </u><br>
<ul>
<li> ਕ੍ਰਿਕਿਟ ਦਾ ਕ੍ਰੇਜ਼ ਸਭ ਪਾਸੇ ਫੈਲਿਆ ਹੋਇਆ ਹੈ। ਇਸ ਤੋਂ ਬਚਣਾ ਮੁਸ਼ਕਿਲ ਹੈ। <br>[craze of Cricket][all over][has spread].[from this][escape][is difficult].<br>Craze of Cricket is spread all around. Its difficult to escape from it. </li>
<li> ਮੇਰੇ ਨਾਲ ਮੇਰਾ ਦੋਸਤ ਆਇਆ ਹੈ। ਇਸ ਤੋਂ ਸਾਮਾਨ ਫੜ ਲੈ। <br>[with me][my friend][has come],[from him][luggage/bags][take].<br> My friend has come with me. Take his bags from him.</li>
</ul>
</td>
 <td>
<u> ਇਹਨਾਂ ਤੋਂ, ਉਹਨਾਂ ਤੋਂ, ਇਹਨਾਂ ਕੋਲੋਂ, ਉਹਨਾਂ ਕੋਲੋਂ, ਇਹਨਾਂ ਲਾਗਿਓਂ, ਉਹਨਾਂ ਲਾਗਿਓਂ  </u><br>
<ul>
<li> ਬਾਲਟੀ ਦੇ ਥੱਲੇ'ਚ ਗਲੀਆਂ ਹੋ ਗਈਆਂ ਹਨ। ਇਹਨਾਂ' ਚੋਂ ਪਾਣੀ ਚੋ ਰਿਹਾ ਹੈ। <br>[On bottom of bucket][holes][have appeared].[from these][water][is leaking]<br>Holes have appeared on the bottom of the bucket. Water is leaking from these.</li>
<li> ਇੰਟਰਵਿਯੂ ਲਈ ਬਹੁਤ ਕੁੜੀਆਂ ਆਈਆਂ। ਉਹਨਾਂ 'ਚੋਂ ਦੋ ਨੂੰ ਚੁਣ ਲਿਆ ਗਿਆ। <br>[for interview][many girls][came].[Out of those][two][were selected]. <br> Many girls came for the interview. Two were selected out of them.</li>
</ul>
</td>
</tr><tr>
 <th>Sumbundh <br> (Relational)</th>
 <td>
<u>ਇਹਦਾ, ਉਹਦਾ, ਇਹਦੀ, ਉਹਦੀ, ਇਹਦੇ, ਉਹਦੇ, ਇਹਦੀਆਂ, ਉਹਦੀਆਂ </u><br>
<ul>
<li>ਇਹਦਾ ਸਾਈਕਲ(masc. sing.) <br>His bicycle</li>
<li>ਇਹਦੇ ਸਾਈਕਲ(masc. plu.) <br>His bicycles</li>
<li>ਇਹਦੀ ਜੈਕੇਟ (fem. sing.) <br>His jacket</li>
<li>ਇਹਦੀਆਂ ਜੈਕੇਟਾਂ(fem. plu.)His jackets</li>
<hr>
<li>ਮੇਰਿਆਂ ਭਰਾਵਾਂ --??ਦਾ ਪਿਆਰ</li>
</ul>

</td>
 <td> <u> ਇਹਨਾਂ ਦਾ, ਉਹਨਾਂ ਦਾ, ਇਹਨਾਂ ਦੀ, ਉਹਨਾਂ ਦੀ, ਇਹਨਾਂ ਦੇ, ਉਹਨਾਂ ਦੇ, ਇਹਨਾਂ ਦੀਆਂ, ਉਹਨਾਂ ਦੀਆਂ </u>
<ul>
<li> ਸਭ ਖਿਡਾਰੀ ਆਰਾਮ ਕਰ ਰਹੇ ਹਨ। ਇਹਨਾਂ ਦਾ ਮੈਚ ਕੱਲ ਨੂੰ ਹੈ। <br>[All player][are resting].[match of these][is tomorrow]<br>All the players are resting. There match is tomorrow</li>
<li> ਸਭ ਮਜ਼ਦੂਰ ਹੜਤਾਲ ਤੇ ਹਨ। ਉਹਨਾਂ ਦੀਆਂ ਕਈ ਮੰਗਾਂ ਹਨ। <br>[All labourers][are on strike].[of there][many demands are]<br> All labourers are on strike. They have many demands.</li>
</ul>
</td>
</tr><tr>
 <th>Udhikurun <br> (Locative)</th>
 <td><u> ਇਹਦੇ ਕੋਲ, ਉਹਦੇ ਕੋਲ, ਇਹਦੇ ਲਾਗੇ, ਉਹਦੇ ਲਾਗੇ </u>
<ul>
<li>ਮੋਹਨ ਅਕਸਰ ਲਿਖਦਾ ਰਹਿੰਦਾ ਹੈ, ਇਹਦੇ ਕੋਲ ਪੈੱਨ ਜ਼ਰੂਰ ਹੋਇਗਾ <br>[Mohun][often][is writing].[with him][pen][must have].<br>Mohun writes often. He must have a pen with him.</li>
<li>ਜਸਬੀਰ ਮੇਰੀ ਕਾਰ ਲੈਕੇ ਗਿਆ ਹੈ ਕਿਉਂਕਿ ਉਹਦੇ ਕੋਲ ਕਾਰ ਨਹੀਂ ਹੈ <br>[Jasbir][my car][has taken][because][with him][car][is not].<br>Jasbir has taken my car as he does not have a car.</li>
</ul>
</td>
 <td><u> ਇਹਨਾਂ ਕੋਲ, ਉਹਨਾਂ ਕੋਲ, ਇਹਨਾਂ ਲਾਗੇ, ਉਹਨਾਂ ਲਾਗੇ   </u>
<ul>
<li>ਇਥੇ ਰਹਿਣ ਵਾਲੇ ਲੋਕ ਗਰੀਬ ਹਨ। ਇਹਨਾਂ ਕੋਲ ਪੈਸੇ ਨਹੀਂ ਹਨ। <br>[people living here][are poor].[with them][money][are not].<br> People living here are poor. They do not have money </li>
<li> ਸ਼ਹਿਰ ਦੇ ਲੋਕ ਪੜ੍ਹੇ ਲਿਖੇ ਹੁੰਦੇ ਹਨ, ਉਹਨਾਂ ਕੋਲ ਗਿਆਨ ਦੀ ਤਾਕਤ ਹੁੰਦੀ ਹੈ <br>[People of city][educated][are].[with them][power of knowledge][is there].<br> People of cities are educated. They have the power of knowledge.</li>
</ul>
</td>
</tr><tr>
<th>Sumbodhan</th>
 <td> </td>
 <td> </td>
</tr>
</table>


</html>
<<evalify [[var t=story.findContainingTiddler(place);t=t?t.getAttribute('tiddler'):'';'<<newTiddler "New tiddler" tag:[['+t+']\]>\>']]>><<rB "New" "Add a new tiddler tagging to this one">>
<<closeAll>><<permaview>><<newTiddler>>
/***
|Name|SearchOptionsPlugin|
|Source|http://www.TiddlyTools.com/#SearchOptionsPlugin|
|Documentation|http://www.TiddlyTools.com/#SearchOptionsPluginInfo|
|Version|3.0.10|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|plugin|
|Description|extend core search function with additional user-configurable options|
Adds extra options to core search function including selecting which data items to search, enabling/disabling incremental key-by-key searches, and generating a ''list of matching tiddlers'' instead of immediately displaying all matches.  This plugin also adds syntax for rendering 'search links' within tiddler content to embed one-click searches using pre-defined 'hard-coded' search terms.
!!!!!Documentation
>see [[SearchOptionsPluginInfo]]
!!!!!Configuration
<<<
<<tiddler SearchOptions>>
<<option chkSearchResultsOptions>> Include {{{options...}}} slider in "search again" form
<<<
!!!!!Revisions
<<<
2011.04.08 3.0.10 fixed typo in CSS in formatSearchResults_buttons().  Restore missing options in Configuration section.
|please see [[SearchOptionsPluginInfo]] for additional revision details|
2005.10.18 1.0.0 Initial Release
<<<
!!!!!Code
***/
//{{{
version.extensions.SearchOptionsPlugin= {major: 3, minor: 0, revision: 10, date: new Date(2011,3,18)};
//}}}
//{{{
var defaults={
	chkSearchTitles:	true,
	chkSearchText:		true,
	chkSearchTags:		true,
	chkSearchFields:	true,
	chkSearchTitlesFirst:	true,
	chkSearchList:		true,
	chkSearchHighlight:	true,
	chkSearchListTiddler:	false,
	chkSearchByDate:	false,
	chkIncrementalSearch:	true,
	chkSearchShadows:	true,
	chkSearchOpenTiddlers:	false,
	chkSearchResultsOptions:true,
	chkSearchExcludeTags:	true,
	txtSearchExcludeTags:	'excludeSearch',
	txtIncrementalSearchDelay:	500,
	txtIncrementalSearchMin:	3
}; for (var id in defaults) if (config.options[id]===undefined)
	config.options[id]=defaults[id];
if (config.macros.search.reportTitle==undefined)
	config.macros.search.reportTitle="SearchResults"; // note: not a cookie!
config.macros.search.label+="\xa0"; // a little bit of space just because it looks better
//}}}
// // searchLink: {{{[search[text to find]] OR [search[text to display|text to find]]}}}
//{{{
config.formatters.push( {
	name: "searchLink",
	match: "\\[search\\[",
	lookaheadRegExp: /\[search\[(.*?)(?:\|(.*?))?\]\]/mg,
	prompt: "search for: '%0'",
	handler: function(w)
	{
		this.lookaheadRegExp.lastIndex = w.matchStart;
		var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
		if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {
			var label=lookaheadMatch[1];
			var text=lookaheadMatch[2]||label;
			var prompt=this.prompt.format([text]);
			var btn=createTiddlyButton(w.output,label,prompt,
				function(){story.search(this.getAttribute("searchText"))},"searchLink");
			btn.setAttribute("searchText",text);
			w.nextMatch = this.lookaheadRegExp.lastIndex;
		}
	}
});
//}}}
// // incremental search uses option settings instead of hard-coded delay and minimum input values
//{{{
var fn=config.macros.search.onKeyPress;
fn=fn.toString().replace(/500/g, "config.options.txtIncrementalSearchDelay||500");
fn=fn.toString().replace(/> 2/g, ">=(config.options.txtIncrementalSearchMin||3)");
eval("config.macros.search.onKeyPress="+fn);
//}}}
// // REPLACE story.search() for option to "show search results in a list"
//{{{
Story.prototype.search = function(text,useCaseSensitive,useRegExp)
{
	var co=config.options; // abbrev
	var re=new RegExp(useRegExp ? text : text.escapeRegExp(),useCaseSensitive ? "mg" : "img");
	if (config.options.chkSearchHighlight) highlightHack=re;
	var matches = store.search(re,co.chkSearchByDate?"modified":"title","");
	if (co.chkSearchByDate) matches=matches.reverse(); // most recent first
	var q = useRegExp ? "/" : "'";
	clearMessage();
	if (!matches.length) {
		if (co.chkSearchListTiddler) discardSearchResults();
		displayMessage(config.macros.search.failureMsg.format([q+text+q]));
	} else {
		if (co.chkSearchList||co.chkSearchListTiddler) 
			reportSearchResults(text,matches);
		else {
			var titles = []; for(var t=0; t<matches.length; t++) titles.push(matches[t].title);
			this.closeAllTiddlers(); story.displayTiddlers(null,titles);
			displayMessage(config.macros.search.successMsg.format([matches.length, q+text+q]));
		}
	}
	highlightHack = null;
}
//}}}
// // REPLACE store.search() for enhanced searching/sorting options
//{{{
TiddlyWiki.prototype.search = function(searchRegExp,sortField,excludeTag,match)
{
	var co=config.options; // abbrev
	var tids = this.reverseLookup("tags",excludeTag,!!match,sortField);
	var opened=[]; story.forEachTiddler(function(tid,elem){opened.push(tid);});

	// eliminate tiddlers tagged with excluded tags
	if (co.chkSearchExcludeTags&&co.txtSearchExcludeTags.length) {
		var ex=co.txtSearchExcludeTags.readBracketedList();
		var temp=[]; for(var t=tids.length-1; t>=0; t--)
			if (!tids[t].tags.containsAny(ex)) temp.push(tids[t]);
		tids=temp;
	}

	// scan for matching titles first...
	var results = [];
	if (co.chkSearchTitles) {
		for(var t=0; t<tids.length; t++) {
			if (co.chkSearchOpenTiddlers && !opened.contains(tids[t].title)) continue; 
			if(tids[t].title.search(searchRegExp)!=-1) results.push(tids[t]);
		}
		if (co.chkSearchShadows)
			for (var t in config.shadowTiddlers) {
				if (co.chkSearchOpenTiddlers && !opened.contains(t)) continue; 
				if ((t.search(searchRegExp)!=-1) && !store.tiddlerExists(t))
					results.push((new Tiddler()).assign(t,config.shadowTiddlers[t]));
			}
	}
	// then scan for matching text, tags, or field data
	for(var t=0; t<tids.length; t++) {
		if (co.chkSearchOpenTiddlers && !opened.contains(tids[t].title)) continue; 
		if (co.chkSearchText && tids[t].text.search(searchRegExp)!=-1)
			results.pushUnique(tids[t]);
		if (co.chkSearchTags && tids[t].tags.join(" ").search(searchRegExp)!=-1)
			results.pushUnique(tids[t]);
		if (co.chkSearchFields && store.forEachField!=undefined)
			store.forEachField(tids[t],
				function(tid,field,val) {
					if (val.search(searchRegExp)!=-1) results.pushUnique(tids[t]);
				},
				true); // extended fields only
	}
	// then check for matching text in shadows
	if (co.chkSearchShadows)
		for (var t in config.shadowTiddlers) {
			if (co.chkSearchOpenTiddlers && !opened.contains(t)) continue; 
			if ((config.shadowTiddlers[t].search(searchRegExp)!=-1) && !store.tiddlerExists(t))
				results.pushUnique((new Tiddler()).assign(t,config.shadowTiddlers[t]));
		}

	// if not 'titles first', or sorting by modification date,
	// re-sort results to so titles, text, tag and field matches are mixed together
	if(!sortField) sortField = "title";
	var bySortField=function(a,b){
		if(a[sortField]==b[sortField])return(0);else return(a[sortField]<b[sortField])?-1:+1;
	}
	if (!co.chkSearchTitlesFirst || co.chkSearchByDate) results.sort(bySortField);

	return results;
}
//}}}
// // HIJACK core {{{<<search>>}}} macro to add "report" and "simple inline" output
//{{{
config.macros.search.SOP_handler=config.macros.search.handler;
config.macros.search.handler = function(place,macroName,params)
{
	// if "report", use SearchOptionsPlugin report generator for inline output
	if (params[1]&&params[1].substr(0,6)=="report") {
		var keyword=params[0];
		var options=params[1].split("=")[1]; // split "report=option+option+..."
		var heading=params[2]?params[2].unescapeLineBreaks():"";
		var matches=store.search(new RegExp(keyword.escapeRegExp(),"img"),"title","excludeSearch");
		if (matches.length) wikify(heading+window.formatSearchResults(keyword,matches,options),place);
	} else if (params[1]) {
		var keyword=params[0];
		var heading=params[1]?params[1].unescapeLineBreaks():"";
		var seperator=params[2]?params[2].unescapeLineBreaks():", ";
		var matches=store.search(new RegExp(keyword.escapeRegExp(),"img"),"title","excludeSearch");
		if (matches.length) {
			var out=[];
			for (var m=0; m<matches.length; m++) out.push("[["+matches[m].title+"]]");
			wikify(heading+out.join(seperator),place);
		}
	} else
		config.macros.search.SOP_handler.apply(this,arguments);
};
//}}}
// // SearchResults panel handling
//{{{
setStylesheet(".searchResults { padding:1em 1em 0 1em; }","searchResults"); // matches std tiddler padding

config.macros.search.createPanel=function(text,matches,body) {

	function getByClass(e,c) { var d=e.getElementsByTagName("div");
		for (var i=0;i<d.length;i++) if (hasClass(d[i],c)) return d[i]; }
	var panel=createTiddlyElement(null,"div","searchPanel","searchPanel");
	this.renderPanel(panel,text,matches,body);
	var oldpanel=document.getElementById("searchPanel");
	if (!oldpanel) { // insert new panel just above tiddlers
		var da=document.getElementById("displayArea");
		da.insertBefore(panel,da.firstChild);
	} else { // if panel exists
		var oldwrap=getByClass(oldpanel,"searchResults");
		var newwrap=getByClass(panel,"searchResults");
		// if no prior content, just insert new content
		if (!oldwrap) oldpanel.insertBefore(newwrap,null);
		else {	// swap search results content but leave containing panel intact
			oldwrap.style.display='block'; // unfold wrapper if needed
			var i=oldwrap.getElementsByTagName("input")[0]; // get input field
			if (i) { var pos=this.getCursorPos(i); i.onblur=null; } // get cursor pos, ignore blur
			oldpanel.replaceChild(newwrap,oldwrap);
			panel=oldpanel; // use existing panel
		} 
	}
	this.showPanel(true,pos);
	return panel;
}

config.macros.search.renderPanel=function(panel,text,matches,body) {

	var wrap=createTiddlyElement(panel,"div",null,"searchResults");
	wrap.onmouseover = function(e){ addClass(this,"selected"); }
	wrap.onmouseout = function(e){ removeClass(this,"selected"); }
	// create toolbar: "open all", "fold/unfold", "close"
	var tb=createTiddlyElement(wrap,"div",null,"toolbar");
	var b=createTiddlyButton(tb, "open all", "open all matching tiddlers", function() {
		story.displayTiddlers(null,this.getAttribute("list").readBracketedList()); return false; },"button");
	var list=""; for(var t=0;t<matches.length;t++) list+='[['+matches[t].title+']] ';
	b.setAttribute("list",list);
	var b=createTiddlyButton(tb, "fold", "toggle display of search results", function() {
		config.macros.search.foldPanel(this); return false; },"button");
	var b=createTiddlyButton(tb, "close", "dismiss search results",	function() {
		config.macros.search.showPanel(false); return false; },"button");
	createTiddlyText(createTiddlyElement(wrap,"div",null,"title"),"Search for: "+text); // title
	wikify(body,createTiddlyElement(wrap,"div",null,"viewer")); // report
	return panel;
}

config.macros.search.showPanel=function(show,pos) {
	var panel=document.getElementById("searchPanel");
	var i=panel.getElementsByTagName("input")[0];
	i.onfocus=show?function(){config.macros.search.stayFocused(true);}:null;
	i.onblur=show?function(){config.macros.search.stayFocused(false);}:null;
	if (show && panel.style.display=="block") { // if shown, grab focus, restore cursor
		if (i&&this.stayFocused()) { i.focus(); this.setCursorPos(i,pos); }
		return;
	}
	if(!config.options.chkAnimate) {
		panel.style.display=show?"block":"none";
		if (!show) { removeChildren(panel); config.macros.search.stayFocused(false); }
	} else {
		var s=new Slider(panel,show,false,show?"none":"children");
		s.callback=function(e,p){e.style.overflow="visible";}
		anim.startAnimating(s);
	}
	return panel;
}

config.macros.search.foldPanel=function(button) {
	var d=document.getElementById("searchPanel").getElementsByTagName("div");
	for (var i=0;i<d.length;i++) if (hasClass(d[i],"viewer")) var v=d[i]; if (!v) return;
	var show=v.style.display=="none";
	if(!config.options.chkAnimate)
		v.style.display=show?"block":"none";
	else {
		var s=new Slider(v,show,false,"none");
		s.callback=function(e,p){e.style.overflow="visible";}
		anim.startAnimating(s);
	}
	button.innerHTML=show?"fold":"unfold";
	return false;
}

config.macros.search.stayFocused=function(keep) { // TRUE/FALSE=set value, no args=get value
	if (keep===undefined) return this.keepReportInFocus;
	this.keepReportInFocus=keep;
	return keep
}	

config.macros.search.getCursorPos=function(i) {
	var s=0; var e=0; if (!i) return { start:s, end:e };
	try {
		if (i.setSelectionRange) // FF
			{ s=i.selectionStart; e=i.selectionEnd; }
		if (document.selection && document.selection.createRange) { // IE
			var r=document.selection.createRange().duplicate();
			var len=r.text.length; s=0-r.moveStart('character',-100000); e=s+len;
		}
	}catch(e){};
	return { start:s, end:e };
}
config.macros.search.setCursorPos=function(i,pos) {
	if (!i||!pos) return; var s=pos.start; var e=pos.end;
	if (i.setSelectionRange) //FF
		i.setSelectionRange(s,e);
	if (i.createTextRange) // IE
		{ var r=i.createTextRange(); r.collapse(true); r.moveStart("character",s); r.select(); }
}
//}}}
// // SearchResults report generation
// note: these functions are defined globally, so they can be more easily redefined to customize report formats//
//{{{
if (!window.reportSearchResults) window.reportSearchResults=function(text,matches)
{
	var cms=config.macros.search; // abbrev
	var body=window.formatSearchResults(text,matches);
	if (!config.options.chkSearchListTiddler) // show #searchResults panel
		window.scrollTo(0,ensureVisible(cms.createPanel(text,matches,body)));
	else { // write [[SearchResults]] tiddler
		var title=cms.reportTitle;
		var who=config.options.txtUserName;
		var when=new Date();
		var tags="excludeLists excludeSearch temporary";
		var tid=store.getTiddler(title); if (!tid) tid=new Tiddler();
		tid.set(title,body,who,when,tags);
		store.addTiddler(tid);
		story.closeTiddler(title);
		story.displayTiddler(null,title);
	}
}

if (!window.formatSearchResults) window.formatSearchResults=function(text,matches,opt)
{
	var body='';
	var title=config.macros.search.reportTitle
	var q = config.options.chkRegExpSearch ? "/" : "'";
	if (!opt) var opt="all";
	var parts=opt.split("+");
	for (var i=0; i<parts.length; i++) { var p=parts[i].toLowerCase();
		if (p=="again"||p=="all")   body+=window.formatSearchResults_again(text,matches);
		if (p=="summary"||p=="all") body+=window.formatSearchResults_summary(text,matches);
		if (p=="list"||p=="all")    body+=window.formatSearchResults_list(text,matches);
		if (p=="buttons"||p=="all") body+=window.formatSearchResults_buttons(text,matches);
	}
	return body;
}

if (!window.formatSearchResults_again) window.formatSearchResults_again=function(text,matches)
{
	var title=config.macros.search.reportTitle
	var body='';
	// search again
	body+='{{span{<<search "'+text.replace(/"/g,'&#x22;')+'">> /%\n';
	body+='%/<html><input type="button" value="search again"';
	body+=' onclick="var t=this.parentNode.parentNode.getElementsByTagName(\'input\')[0];';
	body+=' config.macros.search.doSearch(t); return false;">';
	if (!config.options.chkSearchResultsOptions) // omit "options..."
		body+='</html>';
	else {
		body+=' <a href="javascript:;" onclick="';
		body+=' var e=this.parentNode.nextSibling;';
		body+=' var show=e.style.display!=\'block\';';
		body+=' if(!config.options.chkAnimate) e.style.display=show?\'block\':\'none\';';
		body+=' else anim.startAnimating(new Slider(e,show,false,\'none\'));';
		body+=' return false;">options...</a>';
		body+='</html>@@display:none;border-left:1px dotted;margin-left:1em;padding:0;padding-left:.5em;font-size:90%;/%\n';
		body+='	%/<<tiddler SearchOptions>>@@';
	};
	body+='}}}\n\n';
	return body;
}

if (!window.formatSearchResults_summary) window.formatSearchResults_summary=function(text,matches)
{
	// summary: nn tiddlers found matching '...', options used
	var body='';
	var co=config.options; // abbrev
	var title=config.macros.search.reportTitle
	var q = co.chkRegExpSearch ? "/" : "'";
	body+="''"+config.macros.search.successMsg.format([matches.length,q+"{{{"+text+"}}}"+q])+"''\n";
	var opts=[];
	if (co.chkSearchTitles) opts.push("titles");
	if (co.chkSearchText) opts.push("text");
	if (co.chkSearchTags) opts.push("tags");
	if (co.chkSearchFields) opts.push("fields");
	if (co.chkSearchShadows) opts.push("shadows");
	if (co.chkSearchOpenTiddlers) body+="^^//search limited to displayed tiddlers only//^^\n";
	body+="~~&nbsp; searched in "+opts.join(" + ")+"~~\n";
	body+=(co.chkCaseSensitiveSearch||co.chkRegExpSearch?"^^&nbsp; using ":"")
		+(co.chkCaseSensitiveSearch?"case-sensitive ":"")
		+(co.chkRegExpSearch?"pattern ":"")
		+(co.chkCaseSensitiveSearch||co.chkRegExpSearch?"matching^^\n":"");
	return body;
}

if (!window.formatSearchResults_list) window.formatSearchResults_list=function(text,matches)
{
	// bullet list of links to matching tiddlers
	var body='';
	var co=config.options; // abbrev
	var pattern=co.chkRegExpSearch?text:text.escapeRegExp();
	var sensitive=co.chkCaseSensitiveSearch?"mg":"img";
	var link='{{tiddlyLinkExisting{<html><nowiki><a href="javascript:;" onclick="'
		+'if(config.options.chkSearchHighlight)'
		+'	highlightHack=new RegExp(\x27'+pattern+'\x27.escapeRegExp(),\x27'+sensitive+'\x27);'
		+'story.displayTiddler(null,\x27%0\x27);'
		+'highlightHack = null; return false;'
		+'" title="%2">%1</a></html>}}}';
	for(var t=0;t<matches.length;t++) {
		body+="* ";
		if (co.chkSearchByDate)
			body+=matches[t].modified.formatString('YYYY.0MM.0DD 0hh:0mm')+" ";
		var title=matches[t].title;
		var fixup=title.replace(/'/g,"\\x27").replace(/"/g,"\\x22");
		var tid=store.getTiddler(title);
		var tip=tid?tid.getSubtitle():''; tip=tip.replace(/"/g,"&quot;");
		body+=link.format([fixup,title,tip])+'\n';
	}
	return body;
}

if (!window.formatSearchResults_buttons) window.formatSearchResults_buttons=function(text,matches)
{
	// embed buttons only if writing SearchResults to tiddler
	if (!config.options.chkSearchListTiddler) return "";
	// "open all" button
	var title=config.macros.search.reportTitle;
	var body="";
	body+="@@display:block;<html><input type=\"button\" href=\"javascript:;\" "
		+"onclick=\"story.displayTiddlers(null,[";
	for(var t=0;t<matches.length;t++)
		body+="'"+matches[t].title.replace(/\'/mg,"\\'")+"'"+((t<matches.length-1)?", ":"");
	body+="],1);\" accesskey=\"O\" value=\"open all matching tiddlers\"></html> ";
	// "discard SearchResults" button
	body+="<html><input type=\"button\" href=\"javascript:;\" "
		+"onclick=\"discardSearchResults()\" value=\"discard "+title+"\"></html>";
	body+="@@\n";
	return body;
}

if (!window.discardSearchResults) window.discardSearchResults=function()
{
	// remove the tiddler
	story.closeTiddler(config.macros.search.reportTitle);
	store.deleteTiddler(config.macros.search.reportTitle);
	store.notify(config.macros.search.reportTitle,true);
}
//}}}
// // DELIVER [[SearchOptions]] shadow payload
//{{{
config.shadowTiddlers.SearchOptions = store.getTiddlerText('SearchOptionsPlugin##panel','');
config.annotations.SearchOptions    = 'created by SearchOptionsPlugin';
//}}}
/***
//{{{
!panel
search in:
  {{nowrap{<<option chkSearchTitles>>titles <<option chkSearchText>>text <<option chkSearchTags>>tags}}} /%
%/{{nowrap{<<option chkSearchFields>>fields <<option chkSearchShadows>>shadows}}}
----
  {{nowrap{<<option chkCaseSensitiveSearch>>case-sensitive}}} /%
%/{{nowrap{<<option chkRegExpSearch>>match text patterns}}}
  {{nowrap{<<option chkIncrementalSearch>>key-by-key search:}}} /%
	%/{{threechar smallform nowrap{<<option txtIncrementalSearchMin>> or more characters}}} /%
	%/{{threechar smallform nowrap{<<option txtIncrementalSearchDelay>> msec delay}}}<hr>
  {{nowrap{<<option chkSearchList>>show results in a list &nbsp; &nbsp;}}} /%
%/{{nowrap{<<option chkSearchListTiddler>>save list in ''[[SearchResults]]''}}}
  {{nowrap{<<option chkSearchTitlesFirst>>show title matches first}}} /%
%/{{nowrap{<<option chkSearchByDate>>sort results by date}}} /%
%/{{nowrap{<<option chkSearchHighlight>>highlight matching text}}}
----
{{nowrap{<<option chkSearchOpenTiddlers>>search open tiddlers only}}}
{{nowrap{<<option chkSearchExcludeTags>>exclude tiddlers tagged with:}}}
{{editor{<<option txtSearchExcludeTags>>}}}
!end
//}}}
***/
 
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
<!--{{{-->
<div class='toolbar'><span class='textbutton' macro='tiddler NewHere'></span><span macro='toolbar [[ToolbarCommands::ViewToolbar]] icons:yes more:popup'></span></div>
<div class='followPlaceHolder' macro='followTiddlers'></div>
<div class='heading'>
	<div class='concertina'></div>
	<div class='title' macro='view title'></div>
	<div class='tagClear'></div>
</div>
<div class='tiddlerInfo'>
	<div class='spaceSiteIcon'><span class="infoLabel">Access</span>
		<span macro='tiddlerOrigin label:no height:48 width:48'></span></div>
	<div class="modifiedDate" title="click to see revisions"><span class="infoLabel">Modified</span>
		<div class='calendar' macro='viewRevisions page:5'>
			<div class='month' macro='view modified date mmm'></div>
			<div class='date' macro='view modified date 0DD'></div>
			<div class='time' macro='view modified date 0hh:0mm'></div>
		</div>
	</div>
	<div class='modifierIcon'><span class="infoLabel">Author</span>
		<span macro='view modifier SiteIcon spaceLink:yes label:no height:48 width:48'></span></div>
	<div class='content'>
	</div>
	<div class='tagged' macro='tags'></div>
</div>
<div class='viewer' macro='view text wikified'></div>
<span macro="evalify {{tiddler&&tiddler.tags&&tiddler.tags.contains('follow')?'{{followersFollowers{\n!This users followers...\n<<followers {{'+tiddler.title+'}\} fat:y>>}\}\}':'';}}"></span>
<span macro="evalify {{tiddler&&tiddler.tags&&(tiddler.tags.contains('Talks')||tiddler.tags.contains('WhatOthersSay'))?'{{tbScan{\n!What everyone says right now...\n<<tsScan {{'+tiddler.title+'}\} fat:y template:Templates##TALK>>\n}\}\}':'';}}"></span>
<div class='tagClear'></div>
<!--}}}-->
/***
|Name|GotoPlugin|
|Source|http://www.TiddlyTools.com/#GotoPlugin|
|Documentation|http://www.TiddlyTools.com/#GotoPluginInfo|
|Version|1.9.? hacked because of: https://groups.google.com/forum/?fromgroups#!topic/tiddlywiki/Pwt4ogJIS-s |
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|plugin|
|Description|view any tiddler by entering it's title - displays list of possible matches|
''View a tiddler by typing its title and pressing //enter//.''  As you type, a list of possible matches is displayed.  You can scroll-and-click (or use arrows+enter) to select/view a tiddler, or press escape to close the listbox to resume typing.  When the listbox is not displayed, pressing //escape// clears the current input.
!!!Documentation
>see [[GotoPluginInfo]]
!!!Configuration
<<<
*Match titles only after {{twochar{<<option txtIncrementalSearchMin>>}}} or more characters are entered.<br>Use down-arrow to start matching with shorter input.  //Note: This option value is also set/used by [[SearchOptionsPlugin]]//.
*To set the maximum height of the listbox, you can create a tiddler tagged with <<tag systemConfig>>, containing:
//{{{
config.macros.gotoTiddler.listMaxSize=10;  // change this number
//}}}
<<<
!!!Revisions
<<<
2009.05.22 [1.9.2] use reverseLookup() for IncludePlugin
|please see [[GotoPluginInfo]] for additional revision details|
2006.05.05 [0.0.0] started
<<<
!!!Code
***/
//{{{
version.extensions.GotoPlugin= {major: 1, minor: 9, revision: 2, date: new Date(2009,5,22)};

// automatically tweak shadow SideBarOptions to add <<gotoTiddler>> macro above <<search>>
config.shadowTiddlers.SideBarOptions=config.shadowTiddlers.SideBarOptions.replace(/<<search>>/,"{{button{goto}}}\n<<gotoTiddler>><<search>>");

if (config.options.txtIncrementalSearchMin===undefined) config.options.txtIncrementalSearchMin=3;

config.macros.gotoTiddler= { 
	listMaxSize: 10,
	listHeading: 'Found %0 matching title%1...',
	searchItem: "Search for '%0'...",
	handler:
	function(place,macroName,params,wikifier,paramString,tiddler) {
		var quiet	=params.contains("quiet");
		var showlist	=params.contains("showlist");
		var search	=params.contains("search");
		params = paramString.parseParams("anon",null,true,false,false);
		var instyle	=getParam(params,"inputstyle","");
		var liststyle	=getParam(params,"liststyle","");
		var filter	=getParam(params,"filter","");
		var html=this.html;
		var keyevent=window.event?"onkeydown":"onkeydown"; // IE event fixup for ESC handling
		html=html.replace(/%keyevent%/g,keyevent);
		html=html.replace(/%search%/g,search);
		html=html.replace(/%quiet%/g,quiet);
		html=html.replace(/%showlist%/g,showlist);
		html=html.replace(/%display%/g,showlist?'block':'none');
		html=html.replace(/%position%/g,showlist?'static':'absolute');
		html=html.replace(/%instyle%/g,instyle);
		html=html.replace(/%liststyle%/g,liststyle);
		html=html.replace(/%filter%/g,filter);
		if (config.browser.isIE) html=this.IEtableFixup.format([html]);
		var span=createTiddlyElement(place,'span');
		span.innerHTML=html; var form=span.getElementsByTagName("form")[0];
		if (showlist) this.fillList(form.list,'',filter,search,0);
	},
	html:
	'<form onsubmit="return false" style="display:inline;margin:0;padding:0">\
		<input name=gotoTiddler type=text autocomplete="off" accesskey="G" style="%instyle%"\
			title="Enter title text... ENTER=goto, SHIFT-ENTER=search for text, DOWN=select from list"\
			onfocus="this.select(); this.setAttribute(\'accesskey\',\'G\');"\
			%keyevent%="return config.macros.gotoTiddler.inputEscKeyHandler(event,this,this.form.list,%search%,%showlist%);"\
			onkeyup="return config.macros.gotoTiddler.inputKeyHandler(event,this,%quiet%,%search%,%showlist%);">\
		<select name=list style="display:%display%;position:%position%;%liststyle%"\
			onchange="if (!this.selectedIndex) this.selectedIndex=1;"\
			onblur="this.style.display=%showlist%?\'block\':\'none\';"\
			%keyevent%="return config.macros.gotoTiddler.selectKeyHandler(event,this,this.form.gotoTiddler,%showlist%);"\
			onclick="return config.macros.gotoTiddler.processItem(this.value,this.form.gotoTiddler,this,%showlist%);">\
		</select><input name="filter" type="hidden" value="%filter%">\
	</form>',
	IEtableFixup:
	"<table style='width:100%;display:inline;padding:0;margin:0;border:0;'>\
		<tr style='padding:0;margin:0;border:0;'><td style='padding:0;margin:0;border:0;'>\
		%0</td></tr></table>",
	getItems:
	function(list,val,filter) {
		if (!list.cache || !list.cache.length || val.length<=config.options.txtIncrementalSearchMin) {
			// starting new search, fetch and cache list of tiddlers/shadows/tags
			list.cache=new Array();
			if (filter.length) {
				var fn=store.getMatchingTiddlers||store.getTaggedTiddlers;
				var tiddlers=store.sortTiddlers(fn.apply(store,[filter]),'title');
			} else 
				var tiddlers=store.reverseLookup('tags','excludeLists');
			for(var t=0; t<tiddlers.length; t++) list.cache.push(tiddlers[t].title);
			if (!filter.length) {
				for (var t in config.shadowTiddlers) list.cache.pushUnique(t);
				var tags=store.getTags();
				for(var t=0; t<tags.length; t++) list.cache.pushUnique(tags[t][0]);
			}
		}
		var found = [];
		var match=val.toLowerCase();
		for(var i=0; i<list.cache.length; i++)
			if (list.cache[i].toLowerCase().indexOf(match)!=-1) found.push(list.cache[i]);
		return found;
	},
	getItemSuffix:
	function(t) {
		if (store.tiddlerExists(t)) return "";  // tiddler
		if (store.isShadowTiddler(t)) return " (shadow)"; // shadow
		return " (tag)"; // tag 
	},
	fillList:
	function(list,val,filter,search,key) {
		if (list.style.display=="none") return; // not visible... do nothing!
		var indent='\xa0\xa0\xa0';
		var found = this.getItems(list,val,filter); // find matching items...
		found.sort(); // alpha by title
		while (list.length > 0) list.options[0]=null; // clear list
		var hdr=this.listHeading.format([found.length,found.length==1?"":"s"]);
		list.options[0]=new Option(hdr,"",false,false);
		for (var t=0; t<found.length; t++) list.options[list.length]=
			new Option(indent+found[t]+this.getItemSuffix(found[t]),found[t],false,false);
		if (search)
			list.options[list.length]=new Option(this.searchItem.format([val]),"*",false,false);
		list.size=(list.length<this.listMaxSize?list.length:this.listMaxSize); // resize list...
		list.selectedIndex=key==38?list.length-1:key==40?1:0;
	},
	keyProcessed:
	function(ev) { // utility function
		ev.cancelBubble=true; // IE4+
		try{event.keyCode=0;}catch(e){}; // IE5
		if (window.event) ev.returnValue=false; // IE6
		if (ev.preventDefault) ev.preventDefault(); // moz/opera/konqueror
		if (ev.stopPropagation) ev.stopPropagation(); // all
		return false;
	},
	inputEscKeyHandler:
	function(event,here,list,search,showlist) {
		if (event.keyCode==27) {
			if (showlist) { // clear input, reset list
				here.value=here.defaultValue;
				this.fillList(list,'',here.form.filter.value,search,0);
			}
			else if (list.style.display=="none") // clear input
				here.value=here.defaultValue;
			else list.style.display="none"; // hide list
			return this.keyProcessed(event);
		}
		return true; // key bubbles up
	},
	inputKeyHandler:
	function(event,here,quiet,search,showlist) {
		var key=event.keyCode;
		var list=here.form.list;
		var filter=here.form.filter;
		// non-printing chars bubble up, except for a few:
		if (key<48) switch(key) {
			// backspace=8, enter=13, space=32, up=38, down=40, delete=46
			case 8: case 13: case 32: case 38: case 40: case 46: break; default: return true;
		}
		// blank input... if down/enter... fall through (list all)... else, and hide or reset list
		if (!here.value.length && !(key==40 || key==13)) {
			if (showlist) this.fillList(here.form.list,'',here.form.filter.value,search,0);
			else list.style.display="none";
			return this.keyProcessed(event);
		}
		// hide list if quiet, or below input minimum (and not showlist)
		list.style.display=(!showlist&&(quiet||here.value.length<config.options.txtIncrementalSearchMin))?'none':'block';
		// non-blank input... enter=show/create tiddler, SHIFT-enter=search for text
		if (key==13 && here.value.length) return this.processItem(event.shiftKey?'*':here.value,here,list,showlist);
		// up or down key, or enter with blank input... shows and moves to list...
		if (key==38 || key==40 || key==13) { list.style.display="block"; list.focus(); }
		this.fillList(list,here.value,filter.value,search,key);
		return true; // key bubbles up
	},
	selectKeyHandler:
	function(event,list,editfield,showlist) {
		if (event.keyCode==27) // escape... hide list, move to edit field
			{ editfield.focus(); list.style.display=showlist?'block':'none'; return this.keyProcessed(event); }
		if (event.keyCode==13 && list.value.length) // enter... view selected item
			{ this.processItem(list.value,editfield,list,showlist); return this.keyProcessed(event); }
		return true; // key bubbles up
	},
	processItem:
	function(title,here,list,showlist) {
		if (!title.length) return;
		list.style.display=showlist?'block':'none';
		if (title=="*")	{ story.search(here.value); return false; } // do full-text search
		if (!showlist) here.value=title;
		story.displayTiddler(null,title); // show selected tiddler
		return false;
	}
}
//}}}
[[Home]] <<tag "Punjabi Courses" Learn>> [[Cases]]
Type the text for 'New Tiddler'
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xl="http://www.w3.org/1999/xlink" version="1.1" viewBox="301 225 48 52"
width="30" height="30">
<g stroke="none" stroke-opacity="1" stroke-dasharray="none" fill="none" fill-opacity="1">
	<g>
		<path d="M 333.00003 234 L 306 258.75003 L 301.5 270 L 312.75 265.50003 L 339.75 240.74998 Z M 337.5 229.50002 
		L 335.24988 231.75008 L 341.99997 238.50003 L 344.24997 236.24995 Z M 342 225.00003 L 339.74988 227.25009 
		L 346.5 234.00005 L 348.75 231.75003 Z M 301.5 273.9719 C 301.5 273.9719 309.59888 277.99927 317.70013 273.97183 
		C 325.80066 269.94437 341.99997 276.65686 341.99997 276.65686 L 341.99997 273.97195 
		C 341.99997 273.97195 325.80014 267.2594 317.70013 271.28687 C 309.6 275.31451 301.5 271.28683 301.5 271.28683 Z" 
		fill="#101010" class="glyph"/>
	</g>
</g>
</svg>
/***
https://raw.github.com/tiddlyweb/chrjs/master/main.js
***/
//{{{
// TiddlyWeb adaptor
// v0.14.3

/*jslint vars: true, unparam: true, nomen: true, white: true */
/*global jQuery */

var tiddlyweb = (function($) {

"use strict";

var tw = {
	routes: {
		// host is the TiddlyWeb instance's URI (including server_prefix)
		// placeholders "_type" & "name" refer to the respective bag/recipe
		root     : "{host}/",
		bags     : "{host}/bags",
		bag      : "{host}/bags/{name}",
		recipes  : "{host}/recipes",
		recipe   : "{host}/recipes/{name}",
		tiddlers : "{host}/{_type}s/{name}/tiddlers",
		tiddler  : "{host}/{_type}s/{name}/tiddlers/{title}",
		revisions: "{host}/{_type}s/{name}/tiddlers/{title}/revisions",
		revision : "{host}/{_type}s/{name}/tiddlers/{title}/revisions/{revision}",
		search   : "{host}/search?q={query}"
	}
};

var convertTimestamp, supplant;

// host (optional) is the URI of the originating TiddlyWeb instance
tw.Resource = function(type, host) {
	if(arguments.length) { // initialization
		this._type = type;
		if(host !== false) {
			this.host = host !== undefined ? host.replace(/\/$/, "") : null;
		}
	}
};
$.extend(tw.Resource.prototype, {
	// retrieves resource from server
	// callback is passed resource, status, XHR (cf. jQuery.ajax success)
	// errback is passed XHR, error, exception, resource (cf. jQuery.ajax error)
	// filters is an optional filter string (e.g. "select=tag:foo;limit=5")
	get: function(callback, errback, filters) {
		var uri = this.route();
		if(filters) {
			var separator = uri.indexOf("?") === -1 ? "?" : ";";
			uri += separator + filters;
		}
		var self = this;
		return $.ajax({
			url: uri,
			type: "GET",
			dataType: "json",
			success: function(data, status, xhr) {
				var resource = self.parse(data);
				resource.etag = xhr.getResponseHeader("Etag");
				callback(resource, status, xhr);
			},
			error: function(xhr, error, exc) {
				errback(xhr, error, exc, self);
			}
		});
	},
	// sends resource to server
	// callback is passed data, status, XHR (cf. jQuery.ajax success)
	// errback is passed XHR, error, exception, resource (cf. jQuery.ajax error)
	put: function(callback, errback) {
		var self = this;
		var options = {
			url: this.route(),
			type: "PUT",
			contentType: "application/json",
			data: JSON.stringify(this.baseData()),
			success: function(data, status, xhr) {
				callback(self, status, xhr);
			},
			error: function(xhr, error, exc) {
				errback(xhr, error, exc, self);
			}
		};
		if(this.ajaxSetup) {
			this.ajaxSetup(options);
		}
		return $.ajax(options);
	},
	// deletes resource on server
	// callback is passed data, status, XHR (cf. jQuery.ajax success)
	// errback is passed XHR, error, exception, resource (cf. jQuery.ajax error)
	"delete": function(callback, errback) {
		var self = this;
		var options = {
			url: this.route(),
			type: "DELETE",
			success: function(data, status, xhr) {
				callback(self, status, xhr);
			},
			error: function(xhr, error, exc) {
				errback(xhr, error, exc, self);
			}
		};
		if(this.ajaxSetup) {
			this.ajaxSetup(options);
		}
		return $.ajax(options);
	},
	// returns an object carrying only the essential information of the resource
	baseData: function() {
		var data = {},
			self = this;
		$.each(this.data, function(i, item) {
			var value = self[item];
			if(value !== undefined) {
				data[item] = value;
			}
		});
		return data;
	},
	// returns corresponding instance from a raw object (if applicable)
	parse: function(data) {
		return data;
	},
	// list of accepted keys in serialization
	data: [],
	// returns resource's URI
	route: function() {
		return supplant(tw.routes[this._type], this);
	}
});

var Container = function(type, name, host) {
	if(arguments.length) { // initialization
		tw.Resource.apply(this, [type, host]);
		this.name = name;
		this.desc = "";
		this.policy = new tw.Policy({});
	}
};
Container.prototype = new tw.Resource();
$.extend(Container.prototype, {
	tiddlers: function() {
		return new tw.TiddlerCollection(this);
	},
	parse: function(data) {
		var type = tw._capitalize(this._type),
			container = new tw[type](this.name, this.host);
		data.policy = new tw.Policy(data.policy);
		return $.extend(container, data);
	},
	data: ["desc", "policy"]
});

// attribs is an object whose members are merged into the instance (e.g. query)
tw.Collection = function(type, host, attribs) {
	if(arguments.length) { // initialization
		tw.Resource.apply(this, [type, host]);
		$.extend(this, attribs);
	}
};
tw.Collection.prototype = new tw.Resource();

tw.TiddlerCollection = function(container, tiddler) {
	if(arguments.length) { // initialization
		tw.Collection.apply(this, [tiddler ? "revisions" : "tiddlers"]);
		this.container = container || null;
		this.tiddler = tiddler || null;
	}
};
tw.TiddlerCollection.prototype = new tw.Collection();
$.extend(tw.TiddlerCollection.prototype, {
	parse: function(data) {
		var container = this.container;
		return $.map(data, function(item, i) {
			var tiddler = new tw.Tiddler(item.title, container),
				bag = item.bag;
			tiddler = tw.Tiddler.prototype.parse.apply(tiddler, [item]);
			if(!tiddler.bag && bag) { // XXX: bag always present!?
				tiddler.bag = new tw.Bag(bag, container.host);
			}
			if(!tiddler.recipe && item.recipe) {
				tiddler.recipe = new tw.Recipe(item.recipe, container.host);
			}
			delete item.recipe;
			return $.extend(tiddler, item);
		});
	},
	route: function() {
		var params = this.container;
		if(this.tiddler) {
			var container = this.tiddler.bag || this.tiddler.recipe;
			params = {
				_type: container._type,
				host: container.host,
				name: container.name,
				title: this.tiddler.title
			};
		}
		return supplant(tw.routes[this._type], params);
	}
});

tw.Search = function(query, host) {
	tw.Collection.apply(this, ["search", host]);
	this.query = query;
};
tw.Search.prototype = new tw.Collection();
$.extend(tw.Search.prototype, {
	parse: function(data) {
		this.container = { // XXX: hacky
			_type: "bag",
			host: this.host
		};
		var tiddlers = tw.TiddlerCollection.prototype.parse.apply(this, arguments);
		delete this.container;
		return tiddlers;
	}
});

// title is the name of the tiddler
// container (optional) is an instance of either Bag or Recipe
// optionally accepts a single object representing tiddler attributes
tw.Tiddler = function(title, container) {
	tw.Resource.apply(this, ["tiddler", false]);
	this.title = title;
	this.bag = container && container._type === "bag" ? container : null;
	this.recipe = container && container._type === "recipe" ? container : null;
	var self = this;
	$.each(this.data, function(i, item) {
		self[item] = undefined; // exposes list of standard attributes for inspectability
	});
	if(title && title.title) { // title is an object of tiddler attributes
		$.extend(this, title);
	}
};
tw.Tiddler.prototype = new tw.Resource();
$.extend(tw.Tiddler.prototype, {
	revisions: function() {
		return new tw.TiddlerCollection(this.bag || this.recipe, this);
	},
	route: function() {
		var container = this.bag || this.recipe;
		var params = $.extend({}, this, {
			host: container ? container.host : null,
			_type: this.bag ? "bag" : (this.recipe ? "recipe" : null),
			name: container ? container.name : null
		});
		return supplant(tw.routes[this._type], params);
	},
	parse: function(data) {
		var tiddler = new tw.Tiddler(this.title),
			container = this.bag || this.recipe;
		if(data.bag) {
			tiddler.bag = new tw.Bag(data.bag, container.host);
			delete data.bag;
		}
		delete data.recipe;
		tiddler.created = data.created ? convertTimestamp(data.created) : new Date();
		delete data.created;
		tiddler.modified = data.modified ? convertTimestamp(data.modified) : new Date();
		delete data.modified;
		if(this.recipe) {
			tiddler.recipe = this.recipe;
		}
		return $.extend(tiddler, data);
	},
	data: ["created", "creator", "modifier", "modified", "tags", "type", "text",
			"fields"],
	ajaxSetup: function(options) {
		var self = this;
		if(this.etag && (options.type === "PUT" || options.type === "DELETE")) {
			options.beforeSend = function(xhr) {
				xhr.setRequestHeader("If-Match", self.etag);
			};
		}
		if(options.type === "PUT") {
			var callback = options.success;
			options.success = function(data, status, xhr) {
				var loc = xhr.getResponseHeader("Location"),
					etag = xhr.getResponseHeader("Etag");
				if(loc && etag) {
					self.etag = etag;
					if(!self.bag) {
						var bag = loc.split("/bags/").pop().split("/")[0];
						self.bag = new tw.Bag(bag, self.recipe.host);
					}
					callback(self, status, xhr);
				} else { // IE
					self.get(callback, options.error);
				}
			};
		}
	}
});

tw.Revision = function(id, tiddler) {
	var container = tiddler.bag || tiddler.recipe;
	tw.Tiddler.apply(this, [tiddler.title, container]);
	this._type = "revision";
	this.revision = id;
};
tw.Revision.prototype = new tw.Tiddler();
$.extend(tw.Revision.prototype, {
	revisions: false,
	data: false,
	put: false,
	"delete": false
});

tw.Bag = function(name, host) {
	Container.apply(this, ["bag", name, host]);
};
tw.Bag.prototype = new Container();

tw.Recipe = function(name, host) {
	Container.apply(this, ["recipe", name, host]);
	this.recipe = [];
};
tw.Recipe.prototype = new Container();
$.extend(tw.Recipe.prototype, {
	data: ["recipe"].concat(Container.prototype.data)
});

tw.Policy = function(constraints) { // TODO: validation?
	var self = this;
	$.each(this.constraints, function(i, item) {
		self[item] = constraints[item];
	});
};
tw.Policy.prototype.constraints = ["read", "write", "create", "delete",
	"manage", "accept", "owner"];

/*
 * utilities
 */

tw._capitalize = function(str) {
	return str.charAt(0).toUpperCase() + str.slice(1);
};

// convert YYYYMMDDhhmmss timestamp to Date instance
convertTimestamp = function(t) {
	if (t.match(/^\d{12,17}$/)) {
		return new Date(Date.UTC(
			parseInt(t.substr(0, 4), 10),
			parseInt(t.substr(4, 2), 10) - 1,
			parseInt(t.substr(6, 2), 10),
			parseInt(t.substr(8, 2), 10),
			parseInt(t.substr(10, 2), 10),
			parseInt(t.substr(12, 2) || "0", 10),
			parseInt(t.substr(14, 3) || "0", 10)
		));
	} else {
		return new Date(Date.parse(t));
	}
};

// adapted from Crockford (http://javascript.crockford.com/remedial.html)
supplant = function(str, obj) {
	return str.replace(/{([^{}]*)}/g, function (a, b) {
		var r = obj[b];
		r = typeof r === "string" || typeof r === "number" ? r : a;
		return $.inArray(b, ["host", "query"]) !== -1 ? r : encodeURIComponent(r); // XXX: special-casing
	});
};

return tw;

}(jQuery));
//}}}
AAABAAQAICAQAAEABADoAgAARgAAABAQEAABAAQAKAEAAC4DAAAgIAAAAQAIAKgIAABWBAAAEBAAAAEACABoBQAA/gwAACgAAAAgAAAAQAAAAAEABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACAAAAAgIAAgAAAAIAAgACAgAAAgICAAAAA/wAA/wAAAP//AP8AAAD/AP8A//8AAMDAwAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADnAAAAAAAAAAAAAAAAAOcAAAAHAAAAAAAAAAAAAPdwAAAAAAcAAAAAAAAAAP73AAAAAAAAAAAAAAAAAA7+4AAAAAAAAABwAAAAAADv73AAAAAAAAAAAAAAAAAA//5wAAf+cAAAAAAAAAAAD/7+cAAH/3AAAAAAcAAAAO///3AAAOcAAAAAAAAAAAD////gAAAAAAAAAAAHAAAA////5wAAAAAAAAAAAAAAAP////4AAAAAAAAAAAAAAA//////8AAAAAAAAAAAAAAP//////7nAHAAAAAAAHAAD//////////3cAAAAABwAA////////////cAAAAA4AAP////////////dwcAcAAAAP////////////dwcHcAAAD////////////+d3d3AAAA////////7v///nd3cAAAAA///////gDv//7nd3AAAAAP//////537//+5+cAAAAAAP///////////37uAAAAAAAP//////////7u4AAAAAAAAP/////////+7gAAAAAAAAAP////////7uAAAAAAAAAAAA///////uAAAAAAAAAAAAAAAP//7wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD////////////+f///4Af//4AB//4AAP/8AAA/+AAAP/gAAB/wAAAP4AAAD+AAAAfgAAAH4AAAB8AAAAfAAAADwAAAA8AAAAPAAAAH4AAAB+AAAAfgAAAP8AAAD/AAAB/4AAAf/AAAP/4AAH//AAD//8AD///4H////////////ygAAAAQAAAAIAAAAAEABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACAAAAAgIAAgAAAAIAAgACAgAAAgICAAAAA/wAA/wAAAP//AP8AAAD/AP8A//8AAMDAwAD///8AAAAAAAAAAAAAAADndwAAAAAA5wAABwAAAA/gAAAAAAAA/3AOcAAHAAD/4ABwAAAAD//nAAAAAHAP//9wAAAAcA/////+AABwD//////nB3AA//////d3AAD///d//ucAAA/////+4AAAAP///+4AAAAAAP//AAAAAAAAAAAAAAD//////D////AP///gB///wAP//8AD//+AAf//gAH//4AB//+AAf//wAP//8AD///gB///8A////w/////////KAAAACAAAABAAAAAAQAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGBgYACAgIAA0NDQAQEBAAFRUVABoaGgAcHBwAIiIiACYmJgApKSkALS0tADY2NgA5OTkAPz8/AEFBQQBKSkoATU1NAFVVVQBaWloAXV1dAGNjYwBlZWUAaGhoAG1tbQBxcXEAenp6AHx8fACCgoIAhYWFAI2NjQCRkZEAmZmZAJ6engCgoKAAp6enAKioqACsrKwAsbGxALW1tQC4uLgAvb29AMHBwQDFxcUAysrKAM3NzQDT09MA1dXVANra2gDe3t4A4eHhAOXl5QDp6ekA7e3tAPHx8QD19fUA+fn5AP7+/gBR/8gAcf/TAJH/3ACx/+UA0f/wAP///wAAAAAAAC8OAABQGAAAcCIAAJAsAACwNgAAz0AAAPBKABH/WwAx/3EAUf+HAHH/nQCR/7IAsf/JANH/3wD///8AAAAAAAIvAAAEUAAABnAAAAiQAAAKsAAAC88AAA7wAAAg/xIAPf8xAFv/UQB5/3EAmP+RALX/sQDU/9EA////AAAAAAAULwAAIlAAADBwAAA9kAAATLAAAFnPAABn8AAAeP8RAIr/MQCc/1EArv9xAMD/kQDS/7EA5P/RAP///wAAAAAAJi8AAEBQAABacAAAdJAAAI6wAACpzwAAwvAAANH/EQDY/zEA3v9RAOP/cQDp/5EA7/+xAPb/0QD///8AAAAAAC8mAABQQQAAcFsAAJB0AACwjgAAz6kAAPDDAAD/0hEA/9gxAP/dUQD/5HEA/+qRAP/wsQD/9tEA////AAAAAAAvFAAAUCIAAHAwAACQPgAAsE0AAM9bAADwaQAA/3kRAP+KMQD/nVEA/69xAP/BkQD/0rEA/+XRAP///wAAAAAALwMAAFAE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
/***
|''Name''|BinaryUploadPlugin|
|''Version''|0.3.16|
|''Author''|Ben Gillies and Jon Robson|
|''Type''|plugin|
|''Source''|http://github.com/TiddlySpace/tiddlyspace/raw/master/src/plugins/BinaryUploadPlugin.js|
|''Description''|Upload a binary file to TiddlyWeb|
|''CoreVersion''|2.6.1|
|''Requires''|TiddlySpaceConfig TiddlyWebConfig|
!Usage
{{{
<<binaryUpload bag:<name> edit:tags edit:title tags:<default tags> title:<title> >>
}}}
* {{{bag:<name>}}}: optional; if left out, the file will be saved to the current workspace
* {{{edit:tags}}}: specifies that you want to tag the file being uploaded
* {{{edit:title}}}: specifies that you want to set the title to something other than the filename
* {{{tags:<default tags>}}}: specifies a default set of tags to apply to the file (requires {{{edit:tags}}} to be set)
* {{{title:<title>}}}: predefines the title of the binary tiddler
!Requires
TiddlyWeb
tiddlywebplugins.form
!Code
***/
//{{{
(function($) {

var tiddlyspace = config.extensions.tiddlyspace;

var macro = config.macros.binaryUpload = {
	locale: {
		titleDefaultValue: "Please enter a title...",
		tagsDefaultValue: "Please enter some tags...",
		titlePrefix: "title: ",
		tagsPrefix: "tags: ",
		loadSuccess: 'Tiddler %0 successfully uploaded',
		loadError: "An error occurred when uploading the tiddler %0",
		uploadInProgress: "Please wait while the file is uploaded...",
		membersOnly: "Only members can upload."
	},
	renderInputFields: function(container, options) {
		var locale = macro.locale;
		var editableFields = options.edit;
		var includeFields = {
			tags:  editableFields && editableFields.contains("tags") ? true : false,
			title: editableFields && editableFields.contains("title") ? true : false
		};
		var fields = ["title", "tags"];
		for(var i = 0; i < fields.length; i++) {
			var fieldName = fields[i];
			var userDefault = options[fieldName];
			var defaultValue = userDefault ? userDefault[0] : false;
			if(includeFields[fieldName] || defaultValue) {
				var localeDefault = locale["%0DefaultValue".format(fieldName)];
				var className = defaultValue ? "userInput" : "userInput notEdited";
				var inputEl;
				var val = defaultValue || localeDefault || "";
				var iContainer = $("<div />").addClass("binaryUpload%0".format(fieldName)).
					appendTo(container);
				if(defaultValue && !includeFields[fieldName]) {
					var label = locale["%0Prefix".format(fieldName)];
					$("<span />").text(label).appendTo(iContainer);
					$("<span />").addClass("disabledInput").text(val).appendTo(iContainer);
					inputEl = $("<input />").attr("type", "hidden");
				} else {
					inputEl = $("<input />").attr("type", "text");
				}
				inputEl.attr("name", fieldName).
					addClass("%0Edit".format(fieldName)).
					val(val).addClass(className).appendTo(iContainer);
			}
		}
	},
	getTiddlerName: function(fileName) {
		var fStart = fileName.lastIndexOf("\\");
		var fStart2 = fileName.lastIndexOf("/");
		fStart = fStart < fStart2 ? fStart2 : fStart;
		fileName = fileName.substr(fStart+1);
		return fileName;
	},
	errorHandler: function(fileName) {
		displayMessage("upload of file %0 failed".format(fileName));
	},
	uploadFile: function(place, baseURL, workspace, options) {
		var pleaseWait = $(".uploadProgress", place);
		var iframeName = options.target;
		var form = $("form", place);
		var existingVal = $("input[name=title]", form).val();
		var fileName = existingVal || $('input:file', form).val();
		if(!fileName) {
			return false; // the user hasn't selected a file yet
		}
		fileName = macro.getTiddlerName(fileName);
		$("input[name=title]", place).val(fileName);
		// we need to go somewhere afterwards to ensure the onload event triggers
		var redirectTo = "/%0/tiddlers.txt?select=title:%1".
			format(workspace, fileName);
		var token = tiddlyspace ? tiddlyspace.getCSRFToken() : "";
		var action = "%0?csrf_token=%1&redirect=%2"
			.format(baseURL, token, redirectTo);
		form[0].action = action; // dont use jquery to work with ie
		form[0].target = iframeName;
		// do not refactor following line... won't work in IE6 otherwise
		$(place).append($('<iframe name="' + iframeName + '" id="' + iframeName + '"/>').css('display','none'));
		macro.iFrameLoader(iframeName, function() {
			var content = document.getElementById(iframeName).contentWindow.document.documentElement;
			if($(content).text().indexOf(fileName) > -1) {
				options.callback(place, fileName, workspace, baseURL);
			} else {
				macro.errorHandler(fileName);
			}
			form.show(1000);
			pleaseWait.hide(1000);
		});
		form.hide(1000);
		pleaseWait.show(1000);
		return true;
	},
	createUploadForm: function(place, options) {
		var locale = macro.locale;
		if(readOnly) {
			$('<div class="annotation" />').text(locale.membersOnly).
				appendTo(place);
			return;
		}
		var bag = options.bag;
		options.callback = options.callback ? options.callback :
			function(place, fileName, workspace, baseurl) {
				macro.displayFile(place, fileName, workspace);
				displayMessage(locale.loadSuccess.format(fileName));
				$("input[type=text]", place).val("");
			};
		var defaults = config.defaultCustomFields;
		place = $("<div />").addClass("container").appendTo(place)[0];
		var workspace = bag ? "bags/%0".format(bag) : config.defaultCustomFields["server.workspace"];
		var baseURL = defaults["server.host"];
		baseURL += (baseURL[baseURL.length - 1] !== "/") ? "/" : "";
		baseURL = "%0%1/tiddlers".format(baseURL, workspace);
		//create the upload form, complete with invisible iframe
		var iframeName = "binaryUploadiframe%0".format(Math.random());
		// do not refactor following line of code to work in IE6.
		var form = $('<form action="%0" method="POST" enctype="multipart/form-data" />'.
					format(baseURL)).addClass("binaryUploadForm").
			appendTo(place)[0];
		macro.renderInputFields(form, options);
		$(form).
			append('<div class="binaryUploadFile"><input type="file" name="file" /></div>').
			append('<div class="binaryUploadSubmit"><input type="submit" value="Upload" disabled /></div>').
			submit(function(ev) {
				this.target = iframeName;
				options.target = iframeName;
				macro.uploadFile(place, baseURL, workspace, options);
			})
			.find('[type="file"]').bind('change', function() {
				$(form).find('[type="submit"]').prop('disabled', false);
			}).end();
		$('<div />').addClass("uploadProgress").text(locale.uploadInProgress).hide().appendTo(place);
		$("input[name=file]", place).change(function(ev) {
			var target = $(ev.target);
			var fileName = target.val();
			var title = $("input[type=text][name=title]", place);
			if(!title.val()) {
				title.val(fileName);
			}
		});
	},
	handler: function(place, macroName, params, wikifier, paramString, tiddler) {
		params = paramString.parseParams(null, null, true);
		macro.createUploadForm(place, params[0]);
	},
	iFrameLoader: function(iframeName, callback) {
		var iframe = document.getElementById(iframeName); //jQuery doesn't seem to want to do this!?
		var locale = macro.locale;
		$(".userInput").addClass("notEdited"); // reset editing
		var finishedLoading = function() {
			callback();
		};
		var iFrameLoadHandler = function() {
			finishedLoading.apply();
			return;
		};

		iframe.onload = iFrameLoadHandler;
		//IE
		completeReadyStateChanges = 0;
		iframe.onreadystatechange = function() {
			if (++(completeReadyStateChanges) == 3) {
				iFrameLoadHandler();
			}
		};
	},
	displayFile: function(place, title, workspace) {
		var adaptor = store.getTiddlers()[0].getAdaptor();
		var context = {
			workspace: workspace,
			host: config.defaultCustomFields['server.host']
		};
		adaptor.getTiddler(title, context, null, function(context) {
			if(context.status) {
				store.addTiddler(context.tiddler);
				story.displayTiddler(place, title);
				var image = config.macros.image;
				if(image && image.refreshImage) {
					image.refreshImage("/%0/tiddlers/%1".format(workspace, title));
					image.refreshImage(title);
					image.refreshImage("/%0".format(title));
					image.refreshImage("%0/%1/tiddlers/%2".format(config.extensions.tiddlyweb.host, workspace, title));
				}
			} else {
				displayMessage(macro.locale.loadError.format(title));
			}
		});
	}
};

if(tiddlyspace) {
	config.macros.binaryUploadPublic = {
		handler: function(place, macroName, params, wikifier, paramString, tiddler) {
			var options = paramString.parseParams(null, null, true)[0];
			var bag = tiddlyspace.getCurrentBag("public");
			options.bag = bag;
			macro.createUploadForm(place, options);
		}
	};
	config.messages.privacySetting = config.options.chkPrivateMode ?
		"private" : "public";
	config.macros.binaryUpload.defaultWorkspace = tiddlyspace.
		getCurrentWorkspace(config.messages.privacySetting);
}

})(jQuery);
//}}}
<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="utf-8"/>
	<title>TiddlySpace Apps</title>
	<link rel="stylesheet" href="/bags/common/tiddlers/reset.css" />
	<link rel="stylesheet" href="/bags/common/tiddlers/appspage.css" />
	<!--[if lt IE 7 ]>
	<link rel="stylesheet" href="/bags/common/tiddlers/appspageie6.css" />
	<![endif]-->
</head>
<body>
	
	<div id="wrapper">
		<div id="TSbar"></div>
		<div id="main-content">
			<div id="space-details">
				<a href="/_space"><img class="siteicon"></a>
				<div id="title-subtitle">
					<h1 class="spaceaddress">
						<span class="spaceName"></span><span class="hostName"></span>
					</h1>
					<p class="tagline"><span class="subTitle"></span><a class="managespaces" href="/_space">manage space</a></p>
				</div>
			</div>
			<div id="holder">
				<div id="appswitcher-wrapper">
					<div id="appswitcher">
						<h2>Your Apps</h2>
						<ul id="app-list">
							<li class="htmlserialisation">
								<a href="/tiddlers.html?select=tag:!excludeLists;sort=-modified">
									<img src="/bags/common/tiddlers/browse_read_blue.png" alt="Icon for the HTML Serialisation" class="app-img" />
									BROWSE
								</a>
							</li>
							<li class="tiddlywiki">
								<a href="/tiddlers.wiki">
									<img src="/bags/common/tiddlers/tiddlywiki2_blue.png" alt="Icon for TiddlyWiki" class="app-img" />
									TIDDLYWIKI
								</a>
							</li>
						</ul>
						<div id="addapp">
							<button class="inactive">Add More!</button>
						</div>
					</div>
					<div id="app-desc">
						<ul>
							<li class="htmlserialisationdesc"><p>an easy to understand HTML representation of your content.</p></li>
							<li class="tiddlywikidesc"><p>use TiddlyWiki to create, edit and organise your content.</p></li>
						</ul>
					</div>
					<div style="clear: both;"></div>
				</div>
			</div>
		</div>
		<div id="footer"><!-- ie doesn't support footer tag -->
			<div id="footer-content">
				<div class="links">
					<a href="http://blog.tiddlyspace.com">blog</a>
					<a href="http://featured.tiddlyspace.com">featured</a>
					<a href="http://docs.tiddlyspace.com">documentation</a>
					<a href="https://github.com/TiddlySpace/tiddlyspace">source</a>
				</div>
				<p>TiddlySpace 2011, created by <a href="http://osmosoft.com">Osmosoft</a></p>
			</div>
		</div>
	</div>
	
	<script type="text/javascript" src="/bags/common/tiddlers/backstage.js"></script>
	<script type="text/javascript" src="/bags/common/tiddlers/jquery.js"></script>
	<script type="text/javascript" src="/bags/tiddlyspace/tiddlers/chrjs"></script>
	<script type="text/javascript" src="/bags/common/tiddlers/chrjs-store.js"></script>
	<script type="text/javascript" src="/bags/common/tiddlers/jquery-json.js"></script>
	<script type="text/javascript" src="/bags/common/tiddlers/appspage.js"></script>
</body>
</html>
<!--{{{-->
<div id='messageArea'></div>
<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>
<div class='header'>
	<div class='headerForeground'>
		<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>
		<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
	</div>
	<div id='sidebarSearch' refresh='content' tiddler='SiteSearch'></div>
	<div class='clearFloat'></div>
</div>

<div id='menuBar'>
	<div id='mainMenu' refresh='content' tiddler='MainMenu'></div>
	<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>
</div>
<div id='displayArea'>
	<div id='tiddlerDisplay'></div>
</div>
<div macro="evalify {{if(jQuery.fn.makeFloat)jQuery('#sidebarTabs').makeFloat({x:'right',y:'current',speed:'fast'});'';}}"></div>
<!--}}}-->
/***
TiddlySpace extensions for [[chrjs]]
|''Requires''|chrjs.users|
***/
//{{{
(function($) {

tiddlyweb.routes.identities = "{host}/users/{username}/identities";
var IdentitiesCollection = function(user) {
	tiddlyweb.Collection.apply(this, ["identities", user.host, {
		username: user.username
	}]);
};
IdentitiesCollection.prototype = new tiddlyweb.Collection();
jQuery.extend(IdentitiesCollection.prototype, {
	add: function(identity, callback, errback) {
		var tiddler = new tiddlyweb.Tiddler(identity);
		tiddler.bag = new tiddlyweb.Bag("MAPUSER", this.host);
		tiddler.put(callback, errback);
	},
	get: function(callback, errback) {
		var uri = this.route();
		$.ajax({
			type: "get",
			dataType: "json",
			url: uri,
			success: function(uris, status, xhr) {
				callback(uris, status, xhr);
			},
			error: function(xhr, error, exc) {
				errback(xhr, error, exc, self);
			}
		});
	}
});

tiddlyweb.User.prototype.identities = function() {
	return new IdentitiesCollection(this);
};

})(jQuery);
//}}}
/***
|''Name''|TiddlySpaceInitialization|
|''Version''|0.7.3|
|''Description''|Initializes new TiddlySpaces the first time they are created|
|''Status''|@@beta@@|
|''Source''|http://github.com/TiddlySpace/tiddlyspace/blob/master/src/plugins/TiddlySpaceInit.js|
|''CoreVersion''|2.6.1|
|''Requires''|TiddlySpaceConfig RandomColorPalettePlugin chrjs ImageMacroPlugin|
!TODO
* robust error notification and recovery
!MarkupPreHead
<!--{{{-->
<link href="/bags/%0_public/tiddlers.atom" rel="alternate"
	type="application/atom+xml" title="%0's public feed" />
<link rel="canonical" href="%1/" />
<!--}}}-->
!Code
***/
//{{{
(function($) {

var versionField = "tiddlyspaceinit_version";
var markupPreHead = store.getTiddlerText(tiddler.title + "##MarkupPreHead", "");
var tiddlyspace = config.extensions.tiddlyspace;
var currentSpace = tiddlyspace.currentSpace;
var tweb = config.extensions.tiddlyweb;

var plugin = config.extensions.TiddlySpaceInit = {
	version: "0.6",
	SiteTitle: "%0",
	SiteSubtitle: "a TiddlySpace",
	flagTitle: "%0SetupFlag",
	flagWarning: "Please do not modify this tiddler; it was created " +
		"automatically upon space creation.",

	dispatch: function(ev) {
		var title = plugin.flagTitle.format([currentSpace.name]);
		config.annotations[title] = plugin.flagWarning;
		if(currentSpace.type != "private") {
			return;
		}
		var tiddlers = [];
		var tid = store.getTiddler(title);
		if(tid) {
			curVersion = parseFloat(tid.fields[versionField]);
			reqVersion = parseFloat(plugin.version);
			if(curVersion < reqVersion) {
				plugin.update(curVersion, tid);
				tid.fields[versionField] = plugin.version;
				tid.incChangeCount();
				tid = store.saveTiddler(tid);
				tiddlers.push(tid);
			}
		} else { // first run
			tid = new Tiddler(title);
			tid.tags = ["excludeLists", "excludeSearch", "excludePublisher"];
			tid.fields = $.extend({}, config.defaultCustomFields);
			tid.fields[versionField] = plugin.version;
			tid.text = "@@%0@@".format([plugin.flagWarning]);
			tid = store.saveTiddler(tid);
			tiddlers = tiddlers.concat(plugin.firstRun(), tid);
		}
		autoSaveChanges(null, tiddlers);
	},
	update: function(curVersion, flagTiddler) {
		if(curVersion < 0.2) {
			this.createAvatar();
		}
		if(curVersion < 0.3) {
			flagTiddler.tags.pushUnique("excludePublisher"); // XXX: never persisted
		}
		if(curVersion < 0.5) { // v0.4 was faulty
			this.setupMarkupPreHead();
		}
		if(curVersion < 0.6) {
			this.purgeSystemSettings();
		}
	},
	pubTid: {
		tags: ["excludeLists", "excludeSearch"],
		fields: $.extend({}, config.defaultCustomFields, {
			"server.workspace": tiddlyspace.getCurrentWorkspace("public")
		})
	},
	makeTiddlerIfNot: function(tiddler) {
		if (!store.tiddlerExists(tiddler.title)) {
			$.extend(true, tiddler, plugin.pubTid);
			return [store.saveTiddler(tiddler)];
		} else {
			return [];
		}
	},
	firstRun: function() {
		var tiddlers = [];
		// generate Site*itle
		$.each(["SiteTitle", "SiteSubtitle"], function(i, item) {
			var tid = new Tiddler(item);
			tid.text = plugin[item].format([currentSpace.name]);
			tiddlers.push.apply(tiddlers,
				plugin.makeTiddlerIfNot(tid));
		});
		// generate public ColorPalette
		var tid = new Tiddler("ColorPalette");
		tid.text = config.macros.RandomColorPalette.generatePalette({
			saturation_pale: 0.67, saturation_light: 0.53,
			saturation_mid: 0.43, saturation_dark: 0.06,
			pale: 0.99, light: 0.85, mid: 0.5, dark: 0.31
		},
			false);
		tiddlers.push.apply(tiddlers, plugin.makeTiddlerIfNot(tid));
		this.createAvatar();
		this.setupMarkupPreHead();
		return tiddlers;
	},
	// remove _cookie slices (TiddlyWiki 2.6.2 beta 6 remnants)
	purgeSystemSettings: function() {
		var ss = store.getTiddler("SystemSettings");
		if(ss) {
			var lines = ss.text.split("\n");
			var persistentOptions = $.grep(lines, function(line, i) {
				return line.indexOf("_cookie:") == -1;
			});
			ss.text = persistentOptions.join("\n");
			ss = store.saveTiddler(ss);
			autoSaveChanges(null, [ss]);
		}
	},
	createAvatar: function() {
		var avatar = "SiteIcon";
		var host = tweb.host;
		var notify = function(xhr, error, exc) {
			displayMessage("ERROR: could not create avatar - " + // TODO: i18n
				"%0: %1".format([xhr.statusText, xhr.responseText]));
			// TODO: resolve!?
		};

		var pubBag = tiddlyspace.getCurrentBag("public");
		var tid = new tiddlyweb.Tiddler(avatar);
		tid.bag = new tiddlyweb.Bag(pubBag, host);

		var callback = function(data, status, xhr) {}; // avatar already exists; do nothing
		var errback = function(xhr, error, exc) {
			if(xhr.status != 404) {
				return;
			}
			// copy default avatar
			var _notify = function(tid, status, xhr) {
				displayMessage("created avatar"); // TODO: i18n
				var image = config.macros.image;
				if(image && image.refreshImage) {
					var uri = "/%0/tiddlers/SiteIcon".
						format(tiddlyspace.getCurrentWorkspace("public"));
					image.refreshImage(uri);
					image.refreshImage("SiteIcon");
				}
			};
			var _callback = function(tid, status, xhr) {
				tid.title = avatar;
				tid.bag.name = pubBag;
				delete tid.etag;
				tid.put(_notify, notify); // TODO: add to current session document (via adaptor?)
			};
			tweb.getUserInfo(function(user) {
				var avatarTitle = currentSpace.name == user.name ?
					"defaultUserIcon" : "defaultSiteIcon";
				var tid = new tiddlyweb.Tiddler(avatarTitle);
				tid.bag = new tiddlyweb.Bag("common", host);
				tid.get(_callback, notify);
			});
		};
		tid.get(callback, errback);
	},
	savePublicTiddlerText: function(title, text, pubWorkspace) {
		var tid = new Tiddler(title);
		tid.text = text;
		tid.tags = ["excludeLists"];
		tid.fields = $.extend({}, config.defaultCustomFields);
		tid.fields["server.workspace"] = pubWorkspace;
		tid.fields["server.page.revision"] = "false";
		tid = store.saveTiddler(tid);
		autoSaveChanges(null, [tid]);
	},
	setupMarkupPreHead: function() {
		var pubWorkspace = tiddlyspace.getCurrentWorkspace("public");
		var existing = store.getTiddler("MarkupPreHead");
		if(!existing || existing.fields["server.workspace"] != pubWorkspace) {
			var context = this;
			tweb.getStatus(function(status) {
				var text = markupPreHead.format(currentSpace.name,
					tiddlyspace.getHost(status.server_host, currentSpace.name));
				context.savePublicTiddlerText("MarkupPreHead", text,
					pubWorkspace);
			});
		}
		// also set up DefaultTiddlers
		var title = "DefaultTiddlers";
		existing = store.getTiddler(title) || new Tiddler(title);
		if(existing.fields["server.workspace"] != pubWorkspace) {
			var text = existing.text || store.getShadowTiddlerText(title);
			this.savePublicTiddlerText(title, text, pubWorkspace);
		}
	}
};

$(document).bind("startup", plugin.dispatch);

})(jQuery);
//}}}
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
<html><nowiki>
<h1>Gender | ਲਿੰਗ </h1>
<p>Every noun in Punjabi language has a grammatical gender. This includes nouns of non-living things too. There are two genders in punjabi:</p> <p> Masculine - ਪੁਲਿੰਗ and Feminine - ਇਸਤ੍ਰੀ ਲਿੰਗ  </p>
<p> 
The gender of a noun affects the adjectives and verbs in the sentences. A male child is known as ਬੱਚਾ and a female child is known as ਬੱਚੀ. The adjective <b> lovable </b> would change according to gender when used with this noun eg. <b>ਪਿਆਰਾ</b> ਬੱਚਾ and <b>ਪਿਆਰੀ</b> ਬੱਚੀ </b>. Similarly the verb 'cry' is ' ਰੋਣਾ' which when used in present indefinite tense would be ਰੋਂਦਾ (masculine)  or ਰੋਂਦੀ (feminine). So we can write <b> ਬੱਚਾ ਰੋਂਦਾ ਹੈ </b>(child(boy) cries) and <b> ਬੱਚੀ ਰੋਂਦੀ ਹੈ </b> (child(girl) cries.
</p>
<h3> Examples of Masculine nouns | ਪੁਲਿੰਗ ਨਾਂਵ </h3>
<table class="softGreenTable" >
<tr>
     <td> ਪੁੱਤ </td> <td> Son </td>
</tr><tr>
     <td> ਪਹਾੜ </td> <td> Hill </td>
</tr><tr>
     <td> ਗਿੱਦੜ </td> <td> jackal </td>
</tr><tr>
     <td> ਘੋੜਾ </td> <td> Horse </td>
</tr><tr>
     <td> ਰਾਜਾ </td> <td> King </td>
</tr><tr>
     <td> ਕੰਡਾ </td> <td> Thorn </td>
</tr><tr>
     <td> ਦੁੱਖ </td> <td> Misery </td>
</tr>
</table>

<h3> Examples of Feminine nouns | ਇਸਤ੍ਰੀ ਲਿੰਗ ਨਾਂਵ </h3>
<table class="softGreenTable">
<tr>
     <td>ਰਾਣੀ </td> <td> Queen</td>
</tr><tr>
     <td>ਧੀ </td> <td> Daughter </td>
</tr><tr>
     <td> ਮੱਝ </td> <td> Buffalo </td>
</tr><tr>
     <td>ਜਿੰਦ  </td> <td> life </td>
</tr><tr>
     <td> ਧੁਪ </td> <td> Sunlight </td>
</tr><tr>
     <td> ਪੌੜੀ </td> <td> Stairs </td>
</tr>
</table>

<p>Often, it is possible to convert a masculine noun into a feminine one by following certain common patterns.</p>

<h2>Masculine to Feminine | ਪੁਲਿੰਗ ਤੋਂ ਇਸਤ੍ਰੀ ਲਿੰਗ</h2>

<h3>1. Masculine nouns ending with a Mukta </h3>
<p>
A Mukta is consonant which does not have a lug/matra or a vowel symbol attached to it. For masculine nouns ending with a mukta following are the common ways to convert it to a feminine nouns.
</p>

<h4> Appending a Bihari (ੀ) at the end. </h4>
<table class="softGreenTable">
<tr>
     <th> Masculine (ਪੁਲਿੰਗ) </th> <th> Feminine (ਇਸਤ੍ਰੀ ਲਿੰਗ) </th><th> Pronunciation </th>
</tr>
<tr>
     <td>ਹਿਰਨ <br><small>(Deer)</small> </td> <td>ਹਿਰਨੀ<br><small>(Doe)</small> </td><td> </td>
</tr>
<tr>
     <td>ਕੁੱਕੜ <br><small>(Cock)</small> </td> <td> ਕੁੱਕੜੀ <br><small>(hen)</small> </td><td> </td>
</tr>
<tr>
     <td>ਦੇਵ <br><small>(god)</small> </td> <td>ਦੇਵੀ <br><small>(goddess)</small> </td><td> </td>
</tr>
<tr>
     <td>ਪਹਾੜ <br><small>(hill)</small> </td> <td> ਪਹਾੜੀ <br><small>(hillock)</small> </td><td> </td>
</tr>
<tr>
     <td>ਜੱਟ <br><small>( A male of a punjabi farmer caste)</small> </td> <td>ਜੱਟੀ <br><small>(A women from the same caste)</small> </td><td> </td>
</tr>
</table>

<h4>Appending a Kanna (ਾ) at the end </h4>
<table class="softGreenTable">
<tr>
     <th> Masculine (ਪੁਲਿੰਗ) </th> <th> Feminine (ਇਸਤ੍ਰੀ ਲਿੰਗ) </th><th>Pronounciation</th>
</tr><tr>
     <td>ਅਧਿਆਪਕ <br><small>(Teacher)</small> </td> <td>ਅਧਿਆਪਕਾ <br><small>(Lady teacher)</small> </td><td> </td>
</tr><tr>
     <td>ਸੇਵਕ <br><small>(Male servant)</small> </td> <td>ਸੇਵਕਾ <br><small>(Female servant)</small> </td><td> </td>
</tr><tr>
     <td>ਨਾਇਕ <br><small>(Hero)</small> </td> <td> ਨਾਇਕਾ <br><small>(Heroin)</small> </td><td> </td>
</tr><tr>
     <td>ਨਰਤਕ <br><small>(Dancer)</small> </td> <td>ਨਰਤਕਾ <br><small>(Female Dancer)</small> </td><td> </td>
</tr><tr>
     <td>ਲੇਖਕ <br><small>(Author)</small> </td> <td>ਲੇਖਕਾ <br><small>(Authoress)</small> </td><td> </td>
</tr>
</table>


<h4>Appending ਣੀ at the end </h4>
<table class="softGreenTable">
<tr>
     <th> Masculine (ਪੁਲਿੰਗ) </th> <th> Feminine (ਇਸਤ੍ਰੀ ਲਿੰਗ) </th><th>Pronunciation</th>
</tr><tr>
     <td>ਉਸਤਾਦ <br><small>(Master)</small> </td> <td> ਉਸਤਾਦਣੀ <br><small>(Mistress)</small> </td><td> </td>
</tr><tr>
     <td>ਸੰਤ <br><small>(Saint)</small> </td> <td> ਸੰਤਣੀ <br><small>(Lady saint)</small> </td><td> </td>
</tr><tr>
     <td>ਸ਼ੀਹ <br><small>(Tiger)</small> </td> <td> ਸ਼ੀਹਣੀ <br><small>(Tigress)</small> </td><td> </td>
</tr><tr>
     <td> ਕੁੜਮ <br><small>(Father-in-law of daughter/son)</small> </td> <td>ਕੁੜਮਣੀ <br><small> (Mother-in-law of daughter/son) </small> </td><td>  </td>
</tr><tr>
     <td>ਰਾਗ <br><small>(A melodic mode of classical music)</small> </td> <td> ਰਾਗਣੀ <br><small>(Some melodic modes are feminine)</small> </td><td> </td>
</tr>
</table>


<h4>Appending ਨੀ at the end </h4>
<table class="softGreenTable">
<tr>
     <th> Masculine (ਪੁਲਿੰਗ) </th> <th> Feminine (ਇਸਤ੍ਰੀ ਲਿੰਗ) </th><th>Pronunciation </th>
</tr><tr>
     <td>ਸਰਦਾਰ <br><small>(A Sikh man) </small> </td> <td> ਸਰਦਾਰਨੀ <br><small> (A Sikh woman) </small> </td><td> </td>
</tr><tr>
     <td>ਸ਼ੇਰ <br><small>(Lion)</small> </td> <td> ਸ਼ੇਰਨੀ <br><small>(Lioness)</small> </td><td> </td>
</tr><tr>
     <td>ਮੋਰ <br><small>(Peacock)</small> </td> <td> ਮੋਰਨੀ <br><small>(Peahen)</small> </td><td> </td>
</tr><tr>
     <td>ਡਾਕਟਰ <br><small>(Doctor)</small> </td> <td> ਡਾਕਟਰਨੀ <br><small>(Lady doctor)</small> </td><td> </td>
</tr>
</table>

<h4>Appending ਾ+ਣੀ at the end </h4>
<table class="softGreenTable">
<tr>
     <th> Masculine (ਪੁਲਿੰਗ) </th> <th> Feminine (ਇਸਤ੍ਰੀ ਲਿੰਗ) </th><th> Pronunciation </th>
</tr><tr>
     <td>ਸੇਠ <br><small>(Traditional rich businessman)</small> </td> <td> ਸੇਠਾਣੀ (wife of a Seth) </td><td> </td>
</tr><tr>
     <td>ਜੇਠ <br><small>(Husband's elder brother)</small> </td> <td>ਜਿਠਾਣੀ <br><small>(Wife of husband's elder brother)</small> </td><td> </td>
</tr><tr>
     <td>ਨੌਕਰ <br><small>(Servant)</small> </td> <td>ਨੌਕਰਾਣੀ <br><small>(Maid)</small> </td><td> </td>
</tr><tr>
     <td>ਪ੍ਰੋਹਤ <br><small>(Priest)</small> </td> <td> ਪ੍ਰੋਹਤਾਣੀ (Wife of a priest) </td><td> </td>
</tr>
</table>


<h4>Appending 'ੜੀ' at the end </h4>
<table class="softGreenTable">
<tr>
     <th> Masculine (ਪੁਲਿੰਗ) </th> <th> Feminine (ਇਸਤ੍ਰੀ ਲਿੰਗ) </th><th> Pronunciation </th>
</tr><tr>
     <td> ਸੰਦੂਕ <br><small>(A large chest/trunk)</small> </td> <td> ਸੰਦੂਕੜੀ <br><small>( A small chest)</small> </td><td> </td>
</tr><tr>
     <td> ਬਾਲ <br><small>(Child)</small></td> <td> ਬਾਲੜੀ <br><small>(small girl)</small> </td><td> </td>
</tr>
</table>

<h3>2. Masculine nouns ending with a Bihari (ਿ) </h3>

<h4>Replacing the Bihari with a 'ਨ' </h4>
<table class="softGreenTable">
<tr>
     <th> Masculine (ਪੁਲਿੰਗ) </th> <th> Feminine (ਇਸਤ੍ਰੀ ਲਿੰਗ) </th><th>Pronunciation </th>
</tr><tr>
     <td> ਖਿਡਾਰੀ <br><small>(Player)</small> </td> <td>ਖਿਡਾਰਨ <br><small>(Girl player)</small></td><td> </td>
</tr><tr>
     <td>ਪਟਵਾਰੀ <br><small>(Village land official)</small> </td> <td> ਪਟਵਾਰਨ <br><small>(Wife of a patwari)</small></td><td> </td>
</tr><tr>
     <td> ਸ਼ਿਕਾਰੀ <br><small>(Hunter)</small> </td> <td> ਸ਼ਿਕਾਰਨ <br><small>(Woman hunter)</small> </td><td> </td>
</tr><tr>
     <td> ਕਸ਼ਮੀਰੀ <br><small>(One from Kashmir)</small> </td> <td> ਕਸ਼ਮੀਰਨ <br><small>(A woman from Kashmir)</small> </td><td> </td>
</tr>
</table>

<h4>Replacing the Bihari with a 'ਣ' </h4>
<table class="softGreenTable">
<tr>
     <th> Masculine (ਪੁਲਿੰਗ) </th> <th> Feminine (ਇਸਤ੍ਰੀ ਲਿੰਗ) </th><th>Pronunciation </th>
</tr><tr>
     <td> ਸਾਥੀ <br><small>(Companion)</small> </td> <td>ਸਾਥਣ <br><small>(Female companion)</small> </td><td> </td>
</tr> <tr>
     <td>ਗਿਆਨੀ <br><small>(Traditional wise man)</small> </td> <td> ਗਿਆਨਣ <br><small>(Traditional wise woman)</small> </td><td> </td>
</tr> <tr>
     <td>ਮਾਲੀ <br><small>(Gardener)</small> </td> <td> ਮਾਲਣ <br><small>(Woman gardener)</small> </td><td> </td>
</tr><tr>
     <td>ਗੁਆਂਡੀ <br><small>(Neighbour)</small> </td> <td>ਗੁਆਂਡਣ <br><small>(Woman neighbour)</small></td><td> </td>
</tr>
</table>

<h4>Replacing the Bihari with a ਿ+ 'ਣ' </h4>
<table class="softGreenTable">
<tr>
     <th> Masculine (ਪੁਲਿੰਗ) </th> <th> Feminine (ਇਸਤ੍ਰੀ ਲਿੰਗ) </th><th>Pronunciation </th>
</tr><tr>
     <td>ਸ਼ੁਦਾਈ <br><small>(A mad man)</small> </td> <td>ਸ਼ੁਦਾਇਣ <br><small>(A mad woman)</small> </td><td> </td>
</tr><tr>
     <td> ਨਾਈ <br><small>(Barber)</small> </td> <td> ਨਾਇਣ <br><small>(Wife of a barber)</small> </td><td> </td>
</tr><tr>
     <td> ਹਲਵਾਈ <br><small>(Sweetmeat seller)</small> </td> <td> ਹਲਵਾਇਣ <br><small>(Wife of a sweets seller)</small> </td><td> </td>
</tr>
</table>
<h3> Masculine nouns ending with a Kunna (ਾ) </h3>

<h4>Replacing the Kunna (ਾ) with a Bihari (ਿ) </h4>
<table class="softGreenTable">
<tr>
     <th> Masculine (ਪੁਲਿੰਗ) </th> <th> Feminine (ਇਸਤ੍ਰੀ ਲਿੰਗ) </th><th> Pronunciation</th>
</tr><tr>
     <td>ਦਾਦਾ <br><small>(Paternal Grandfather)</small> </td> <td>ਦਾਦੀ <br><small>(Paternal Grandmother)</small> </td><td> </td>
</tr><tr>
     <td>ਕਾਕਾ <br><small>(Young boy)</small> </td> <td>ਕਾਕੀ <br><small>(Young girl)</small> </td><td> </td>
</tr><tr>
     <td>ਖੁਰਪਾ <br><small>(Spud)</small> </td> <td>ਖੁਰਪੀ <br><small>(Small spud)</small> </td><td> </td>
</tr><tr>
     <td>ਚਰਖਾ <br><small>(Spinning Wheel)</small> </td> <td> ਚਰਖੀ <br><small>(Small spinning wheel)</small> </td><td> </td>
</tr><tr>
     <td>ਤਵਾ <br><small>(Flat baking pan)</small> </td> <td> ਤਵੀ <br><small>(Large flat pan)</small> </td><td> </td>
</tr>
</table>

<h4>Replacing the Kunna (ਾ) with a <ਬ>ਨ</ਬ> </h4>
<table class="softGreenTable">
<tr>
     <th> Masculine (ਪੁਲਿੰਗ) </th> <th> Feminine (ਇਸਤ੍ਰੀ ਲਿੰਗ) </th><th> Pronunciation</th>
</tr><tr>
     <td>ਸਪੇਰਾ <br><small>(Snake charmer)</small> </td> <td> ਸਪੇਰਨ <br><small>(Woman snake charmer)</small> </td><td> </td>
</tr><tr>
     <td>ਲੁਟੇਰਾ <br><small>(Robber)</small> </td> <td> ਲੁਟੇਰਨ <br><small>(A woman robber)</small> </td><td> </td>
</tr>
</table>

<h4>Replace the suffix ੀਆ with a <ਬ>ਨ</ਬ> </h4>
<table class="softGreenTable">
<tr>
     <th> Masculine (ਪੁਲਿੰਗ) </th> <th> Feminine (ਇਸਤ੍ਰੀ ਲਿੰਗ) </th><th> Pronunciation </th>
</tr><tr>
     <td> ਪਹਾੜੀਆ <br><small>(A man from mountains)</small> </td> <td> ਪਹਾੜਨ <br><small>(A woman from mountains)</small> </td><td> </td>
</tr><tr>
     <td>ਦੁਆਬੀਆ <br><small>(A man from Doab region of Punjab)</small> </td> <td>ਦੁਆਬਣ <br><small>(Woman from Doab region)</small></td><td> </td>
</tr><tr>
     <td>ਪੋਠੋਹਾਰੀਆ <br><small>(A man from Pothohar region of Punjab)</small> </td> <td> ਪੋਠੋਹਾਰਨ <br><small>(A woman from Pothohar)</small></td><td> </td>
</tr>
</table>


<div class="note">
<p>Usually the things that are large in size are referred to as Masculine and those small in size are referred to as feminine nouns. </p>
</div>
<table class="softGreenTable">
<tr>
     <th> Masculine (ਪੁਲਿੰਗ) </th> <th> Feminine (ਇਸਤ੍ਰੀ ਲਿੰਗ) </th> <th> Pronunciation </th>
</tr><tr>
     <td>ਛੁਰਾ <br><small>(A large knife)</small> </td><td>ਛੁਰੀ <br><small>(A small knife)</small> </td><td> </td>
</tr><tr>
     <td> ਡੱਬਾ <br><small>(Box)</small> </td><td> ਡੱਬੀ <br><small>(Small box)</small> </td><td> </td>
</tr><tr>
     <td> ਘੜਾ <br><small>(Pot)</small> </td><td>ਘੜੀ <br><small>(Small pot)</small> </td><td> </td>
</tr><tr>
     <td>ਪੱਖਾ <br><small>(Fan)</small> </td><td>ਪੱਖੀ <br><small>(Small fan)</small> </td><td> </td>
</tr><tr>
     <td>ਪਹਾੜ <br><small>(Hill)</small> </td><td>ਪਹਾੜੀ <br><small>(Hillock)</small> </td><td> </td>
</tr>
</table>

<p> Also note that there are many nouns which do not have a feminine counterpart <p>

<table class="softGreenTable">
<tr>
     <th> Masculine (ਪੁਲਿੰਗ) </th> <th> Feminine (ਇਸਤ੍ਰੀ ਲਿੰਗ) </th><th> Pronunciation </th>
</tr><tr>
     <td>ਦਾਣਾ <br><small>(Seed)</small> </td><td>-- </td><td> </td>
</tr><tr>
     <td> ਦਰਖ਼ਤ <br><small>(Tree)</small> </td><td> -- </td><td> </td>
</tr><tr>
     <td> ਹੰਕਾਰ <br><small>(Ego)</small> </td><td> -- </td><td> </td>
</tr><tr>
     <td>ਮਿਹਨਤ <br><small>(Hard work)</small> </td><td>-- </td><td> </td>
</tr><tr>
     <td>ਚੰਗਿਆਈ <br><small>(Goodness)</small> </td><td>-- </td><td> </td>
</tr>
</table>
<p> Then there are some words which are used by some as Masculine and Feminine by others eg. ਅਖਬਾਰ <small>(Newspaper)</small>, ਸਾਈਕਲ <small>(Cycle)</small>, ਥਾਂ <small>(Place)</small> </p>


</html>
/***
|''Name:''|TiddlySpaceLinkPlugin|
|''Description:''|Formatter to reference other spaces from wikitext |
|''Author:''|PaulDowney (psd (at) osmosoft (dot) com) |
|''Source:''|http://github.com/TiddlySpace/tiddlyspace/raw/master/src/plugins/TiddlySpaceLinkPlugin.js|
|''Version:''|1.4.2|
|''License:''|[[BSD License|http://www.opensource.org/licenses/bsd-license.php]] |
|''Comments:''|Please make comments at http://groups.google.co.uk/group/TiddlyWikiDev |
|''~CoreVersion:''|2.4|
!!Documentation
This plugin provides wikitext formatters for referencing another [[space|Space]] on the same TiddlySpace server, as in the following examples:
<<<
  {{{@space}}} -- @space 
  {{{~@space}}} -- ~@space 
  {{{Tiddler@space}}} -- Tiddler@space
  {{{[[Tiddler Title]]@space}}} -- [[Tiddler Title]]@space 
  {{{[[Link text|Tiddler Title]]@space}}} -- [[Link text|Tiddler Title]]@space
<<<
Links to tiddlers with a title begining with an "@" remain as tiddlyLinks:
<<<
  {{{[[@tiddler]]}}} -- [[@tiddler]]
<<<
and these may be changed into a space link using {{{@@}}}:
<<<
  {{{[[@@space]]}}} -- [[@@space]]
  {{{[[Link to an another space|@@space]]}}} -- [[Link to another space|@@space]]
  {{{[[@space|@@space]]}}} -- [[@space|@@space]]
<<<
TiddlySpace includes the [[TiddlySpaceLinkPlugin]] which provides WikiText markup for linking to other spaces on the same server. For example @glossary is a link to the {{{glossary}}} space and [[Small Trusted Group]]@glossary a link to an individual tiddler in the @glossary space. Prefixing the link with a tilde escapes the link, for example {{{~@space}}}.
Email addresses, for example joe.bloggs@example.com and mary@had.a.little.lamb.org should be unaffected.
!!Features
The plugin provides external links decorated so that other plugins may be included to add features such as the ability to dynamically pull externally linked tiddlers into the current TiddlyWiki.
Wikitext linking to a space on another server, for example from a tiddler in a space on tiddlyspace.com to a tiddler or a space on example.com, isn't currently supported. 
!!Code
***/
//{{{
/*jslint onevar: false nomen: false plusplus: false */
/*global jQuery config createTiddlyText createExternalLink createTiddlyLink */

function createSpaceLink(place, spaceName, title, alt, isBag) {
	var link, a, currentSpaceName, label;
	try {
		if (spaceName === config.extensions.tiddlyspace.currentSpace.name) {
			title = title || spaceName;
			a = createTiddlyLink(place, title, false);
			jQuery(a).text(alt || title);
			return a;
		}
	} catch (ex1) {
		currentSpaceName = false;
	}

	a = jQuery("<a />").addClass('tiddlySpaceLink externalLink').appendTo(place)[0];
	if(title) {
		jQuery(a).attr('tiddler', title);
	}
	if(isBag) {
		jQuery(a).attr('bag', spaceName);
	} else {
		jQuery(a).attr('tiddlyspace', spaceName);
	}

	config.extensions.tiddlyweb.getStatus(function(status) {
		link = status.server_host.url;
		if (title) {
			label = alt || title;
			link = link + "/" + encodeURIComponent(title);
		} else {
			label = alt || spaceName;
		}
		// assumes a http URI without user:pass@ prefix
		if(!isBag) {
			link = link.replace("http://", "http://" + spaceName.toLowerCase() + ".");
		} else {
			link += "/bags/" + spaceName + "/tiddlers.wiki";
		}
		jQuery(a).attr("href", link).text(label);
	});
	return a;
}

(function ($) {

	config.textPrimitives.spaceName = "[a-zA-Z][a-zA-Z0-9-]*[a-zA-Z0-9]";
	config.textPrimitives.spaceNameStrict = "[a-z][a-z0-9-]*";
	config.textPrimitives.bareTiddlerLetter = config.textPrimitives.anyLetterStrict;

	config.formatters.splice(0, 0, {
		name: "spacenameLink",
		match: config.textPrimitives.unWikiLink + "?" + config.textPrimitives.bareTiddlerLetter + "*@" + config.textPrimitives.spaceName + "\\.?.?",
		lookaheadRegExp: new RegExp(config.textPrimitives.unWikiLink + "?(" + config.textPrimitives.bareTiddlerLetter + "*)@(" + config.textPrimitives.spaceName + ")", "mg"),
		handler: function (w) {
			if (w.matchText.substr(w.matchText.length - 2, 1) === '.' && w.matchText.substr(w.matchText.length - 1, 1).match(/[a-zA-Z]/)) {
				w.outputText(w.output, w.matchStart, w.nextMatch);
				return;
			}
			if (w.matchText.substr(0, 1) === config.textPrimitives.unWikiLink) {
				w.outputText(w.output, w.matchStart + 1, w.nextMatch);
				return;
			}
			this.lookaheadRegExp.lastIndex = w.matchStart;
			var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
			if (lookaheadMatch && lookaheadMatch.index === w.matchStart) {
				createSpaceLink(w.output, lookaheadMatch[2], lookaheadMatch[1]);
				w.nextMatch = this.lookaheadRegExp.lastIndex;
			}
		}
	},
	{
		name: "tiddlySpaceLink",
		match: "\\[\\[[^\\|\\]]*\\|*@@" + config.textPrimitives.spaceName + "\\]",
		lookaheadRegExp: new RegExp("\\[\\[(.*?)(?:\\|@@(.*?))?\\]\\]", "mg"),
		handler: function (w) {
			this.lookaheadRegExp.lastIndex = w.matchStart;
			var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
			if (lookaheadMatch && lookaheadMatch.index === w.matchStart) {
				var alt = lookaheadMatch[2] ? lookaheadMatch[1] : lookaheadMatch[1].replace(/^@@/, "");
				var space = lookaheadMatch[2] || alt;
				createSpaceLink(w.output, space, "", alt);
				w.nextMatch = this.lookaheadRegExp.lastIndex;
			}
		}
	},
	{
		name: "tiddlyLinkSpacenameLink",
		match: "\\[\\[[^\\[]*\\]\\]@",
		lookaheadRegExp: new RegExp("\\[\\[(.*?)(?:\\|(.*?))?\\]\\]@(" + config.textPrimitives.spaceName + ")", "mg"),
		handler: function (w) {
			this.lookaheadRegExp.lastIndex = w.matchStart;
			var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
			if (lookaheadMatch && lookaheadMatch.index === w.matchStart) {
				var title = lookaheadMatch[2] || lookaheadMatch[1];
				var alt = lookaheadMatch[1] || lookaheadMatch[2];
				createSpaceLink(w.output, lookaheadMatch[3], title, alt);
				w.nextMatch = this.lookaheadRegExp.lastIndex;
			}
		}
	});

	// ensure space links don't appear as missing links
	config.textPrimitives.brackettedLink = "\\[\\[([^\\]][^@\\]][^\\]]*)\\]\\](?=[^@])";
	config.textPrimitives.titledBrackettedLink = "\\[\\[([^\\[\\]\\|]+)\\|([^\\[\\]\\|]+)\\]\\](?=[^@])";

	// reevaluate derrived expressions ..
	config.textPrimitives.tiddlerForcedLinkRegExp = new RegExp("(?:" + config.textPrimitives.titledBrackettedLink + ")|(?:" +
		config.textPrimitives.brackettedLink + ")|(?:" +
		config.textPrimitives.urlPattern + ")","mg");
	config.textPrimitives.tiddlerAnyLinkRegExp = new RegExp("("+ config.textPrimitives.wikiLink + ")|(?:" +
		config.textPrimitives.titledBrackettedLink + ")|(?:" +
		config.textPrimitives.brackettedLink + ")|(?:" +
		config.textPrimitives.urlPattern + ")","mg");

	// treat space links in titledBracketedLink as external links
	var missingTiddlySpaceLink = new RegExp("^@@" + config.textPrimitives.spaceName + "$", "");
	var isExternalLink = config.formatterHelpers.isExternalLink;
	config.formatterHelpers.isExternalLink = function(link) {
		return missingTiddlySpaceLink.test(link) || isExternalLink(link);
	};

}(jQuery));
//}}}
|~ViewToolbar|typeWithMe tagSearch +editTiddler +saveDraft +cloneTiddler > fields changeToPublic changeToPrivate revisions syncing permalink references jump closeOthers < closeTiddler|
|~EditToolbar|+saveTiddler saveDraft -cancelTiddler deleteTiddler|
|~RevisionToolbar|> fields revert|
Install this space!
<<install>>
<<evalify [[(config.macros.gotoTiddler?'search <<gotoTiddler search>\>':'<<search>\>');]]>>
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
the language & related
Type the text for 'New Tiddler'
/***
|''Name''|TiddlySpaceRevisionView|
|''Description''|Show tiddler revisions in a stack of cards view|
|''Author''|BenGillies|
|''Version''|0.2.0|
|''Status''|beta|
|''Source''|http://github.com/TiddlySpace/tiddlyspace|
|''CodeRepository''|http://github.com/TiddlySpace/tiddlyspace|
|''License''|[[BSD|http://www.opensource.org/licenses/bsd-license.php]]|
|''CoreVersion''|2.6.0|
|''Requires''|TiddlyWebAdaptor|
!Usage
The viewRevisions macro can be attached to any element, which should be passed
in as a parameter.

For example:

&lt;&lt;viewRevisions page:10 link:"<<view modified date>>"&gt;&gt;

would show the revisions "stack of cards" view, 10 at a time, when the modified
date is clicked.
!Code
***/
//{{{
(function($) {

var me = config.macros.viewRevisions = {
	revisionTemplate: "RevisionTemplate",
	revSuffix: " [rev. #%0]", // text to append to each tiddler title
	defaultPageSize: 5, // default number of revisions to show
	defaultLinkText: "View Revisions", // when there's nothing else to use
	offsetTop: 30, // in px
	offsetLeft: 10, // in px
	shiftDownDelay: 50, // in ms
	visibleSlideAmount: 20, // amount of revisions to show on left hand edge after sliding
	zIndex: 100, // default z-index
	handler: function(place, macroName, params, wikifier, paramString, tiddler) {
		params = paramString.parseParams(null, null, true)[0];
		var tiddlerElem = story.findContainingTiddler(place);

		var revButton;
		var pageSize = parseInt(params.page[0], 10) || me.defaultPageSize;
		var linkObj = params.link ? params.link[0] || me.defaultLinkText : false;
		if(linkObj) {
			revButton = $('<span class="button openRevisions" />')
				.appendTo(place);
			wikify(linkObj, revButton[0], null, tiddler);
		} else {
			revButton = place;
		}

		$(revButton).click(function() {
			if (!$(tiddlerElem).hasClass("revisions")) {
				me.showRevisions(tiddlerElem, tiddler, pageSize);
			} else {
				me.closeRevisions(tiddlerElem);
			}
		});
	},

	// initialisation for revision view
	showRevisions: function(tiddlerElem, tiddler, pageSize) {
		var context = {
			host: tiddler.fields["server.host"],
			workspace: tiddler.fields["server.workspace"]
		};
		$(tiddlerElem).addClass("revisions").attr("revName", tiddler.title);
		// ensure toolbar commands deactivate RevisionsView
		$("a", ".toolbar", tiddlerElem).each(function(index, btn) {
			var _onclick = btn.onclick;
			btn.onclick = function(e) {
				me.closeRevisions(tiddlerElem);
				_onclick.apply(this, arguments);
			};
		});
		// ensure default action deactivates RevisionsView
		var _ondblclick = tiddlerElem.ondblclick;
		tiddlerElem.ondblclick = function(e) {
			me.closeRevisions(tiddlerElem);
			_ondblclick.apply(this, arguments);
		};
		var type = tiddler.fields["server.type"];
		var adaptor = new config.adaptors[type]();
		var userParams = {
			tiddlerElem: tiddlerElem,
			pageSize: pageSize,
			title: tiddler.title
		};
		me.createCloak(tiddlerElem);
		adaptor.getTiddlerRevisionList(tiddler.title, null, context, userParams,
				function(context, userParams) {
					// strip the current revision
					context.revisions.shift();
					me.expandStack(context, userParams);
				});
	},

	// fetch the actual revision and put it in the tiddler div
	showRevision: function(place, revision, callback) {
		var context = {
			host: revision.fields["server.host"],
			workspace: revision.fields["server.workspace"]
		};
		var userParams = {
			revElem: place
		};
		var type = revision.fields["server.type"];
		var adaptor = new config.adaptors[type]();
		var revNo = revision.fields["server.page.revision"];
		adaptor.getTiddlerRevision(revision.title, revNo, context, userParams,
			function(context, userParams) {
				var tiddler = context.tiddler;
				tiddler.title += me.revSuffix
					.format([$(place).attr("revision")]);
				tiddler.fields.doNotSave = true;
				if (store.getTiddler(tiddler.title)) {
					store.deleteTiddler(tiddler.title);
				}
				store.addTiddler(tiddler);

				//now, populate the existing div
				var revElem = userParams.revElem;
				$(revElem).attr("id", story.tiddlerId(tiddler.title));
				$(revElem).attr("refresh", "tiddler");
				var getTemplate = function() {
					var themeName = config.options.txtTheme;
					if (themeName) {
						return store.getTiddlerSlice(themeName,
							me.revisionTemplate) || me.revisionTemplate ||
							"ViewTemplate";
					} else {
						return (store.getTiddler(me.revisionTemplate)) ?
							me.revisionTemplate : "ViewTemplate";
					}
				};
				var template = getTemplate();
				story.refreshTiddler(tiddler.title, template, true);
				callback(tiddler);
			});
	},

	createCloak: function(promoteElem) {
		var el = $(promoteElem);
		// cache styles for resetting later
		el.data({
			top: el.css("top"),
			left: el.css("left"),
			zIndex: el.css("z-index")
		});

		$('<div class="revisionCloak" />').css("z-index", me.zIndex)
			.click(function() {
				me.closeRevisions(promoteElem);
			})
			.appendTo(document.body);

		el.css("z-index", me.zIndex + 1);
	},

	// clean up, removing all evidence of revision view
	closeRevisions: function(promoteElem) {
		var el = $(promoteElem);
		// revert the original tiddler back to its previous state
		el.removeAttr("revName").removeClass("revisions").css({
			top: el.data("top"),
			left: el.data("left"),
			zIndex: el.data("zIndex")
		});

		// remove any revisions still in the store
		var revisions = $(".revisions");
		revisions.each(function(index, revision) {
			var revAttributes = revision.attributes;
			if ((revAttributes.revname) &&
					(revAttributes.revision)) {
				var revName = revAttributes.revname.value;
				var revNo = revAttributes.revision.value;
				var title = revName + me.revSuffix.format([revNo]);

				if (store.getTiddler(title)) {
					store.deleteTiddler(title);
				}
			}
		});

		// delete the previous revisions
		revisions.remove();

		// remove the cloak
		$(".revisionCloak").remove();
	},

	// calback from getting list of revisions
	expandStack: function(context, userParams) {
		var pageSize = userParams.pageSize;

		var from = userParams.from || 0;
		var tiddlerElem = userParams.tiddlerElem;

		userParams.defaultHeight = $(tiddlerElem).height();
		userParams.defaultWidth = $(tiddlerElem).width();
		if (from < context.revisions.length) {
			me.displayNextRevision(tiddlerElem, userParams, context, from,
				from + pageSize - 1);
		}
	},

	// place the next div above and behind the previous one
	displayNextRevision: function(tiddlerElem, userParams, context, from, to) {
		var revision = context.revisions[from];
		var callback = function() {
			var revText = revBtn.getRevisionText(tiddlerElem, revision);
			tiddlerElem = me.createRevisionObject(tiddlerElem, context,
				userParams, revText);
			$(tiddlerElem)
				.attr("revision", (context.revisions.length - from));
			if ((from < to) && ((from + 1) < context.revisions.length)){
				me.displayNextRevision(tiddlerElem, userParams, context,
					from + 1, to);
			} else if ((context.revisions.length - 1) > to) {
				me.showMoreButton(tiddlerElem, context, userParams, to + 1);
			}
		};
		me.shiftVisibleDown(userParams.title, callback);
	},

	createRevisionObject: function(tiddlerElem, context, userParams, text) {
		var newPosition = me.calculatePosition(tiddlerElem, context);
		return $('<div class="revisions tiddler" />')
			.css({
				position: "absolute",
				top: newPosition.top,
				left: newPosition.left,
				"z-index": me.zIndex + 1,
				height: userParams.defaultHeight,
				width: userParams.defaultWidth
			})
			.attr("revName", userParams.title)
			.append(text)
			.insertBefore(tiddlerElem);
	},

	// move the already present revisions down by 1 to fit the next one in
	shiftVisibleDown: function(title, callback) {
		var revisions = $("[revName='%0'].revisions".format([title]));
		var revisionCount = revisions.length;

		$(revisions).animate({top: "+=" + me.offsetTop},
				me.shiftDownDelay, function() {
					revisionCount -= 1;
					if ((callback) && (!revisionCount)) {
						callback();
					}
				});
	},

	// where we put the new revision
	calculatePosition: function(elem, context) {
		var offset = $(elem).offset();
		var currentPosition = $(elem).position();
		var newPosition = {
			top: currentPosition.top - me.offsetTop
		};
		if ((context.restrictLeft) ||
				((offset.left - me.offsetLeft) <
				$("#contentWrapper").offset().left)) {
			newPosition.left = $(elem).position().left;
			context.restrictLeft = true;
		} else {
			newPosition.left = currentPosition.left - me.offsetLeft;
		}
		return newPosition;
	},

	// equivalent of displayNextRevision, but for the more button
	showMoreButton: function(tiddlerElem, context, userParams, moreIndex) {
		userParams.from = moreIndex + 1;
		me.shiftVisibleDown(userParams.title, function() {
			var btn = me.createRevisionObject(tiddlerElem, context, userParams,
				"");

			var more = createTiddlyButton(btn[0], "more...", "show more revisions",
				function() {
					if ($(".viewRevision").length) {
						return;
					}
					userParams.tiddlerElem = btn[0];
					$(btn).text("")
						.append(revBtn
							.getRevisionText(btn[0], context.revisions[moreIndex]))
						.attr("revision", context.revisions.length - moreIndex);
					me.expandStack(context, userParams);
				});
			$(more).css("float", "right");
		});
	},

	stripRevFromTitle: function(revisionTitle) {
		return revisionTitle.split(/ ?\[rev\. #[0-9]+\]$/)[0];
	},

	onClickRevision: function(revElem, revision, callback) {
		// don't do anything if we are still loading
		if ($(".revisions").hasClass("loading")) {
			return null;
		}

		var origTitle = me.stripRevFromTitle(revision.title);
		if ($(revElem).hasClass("viewRevision")) {
			$(".revisions").addClass("loading");
			me.slideIn(revElem, revision, origTitle, function() {
				store.deleteTiddler(revision.title);
				revision.title = origTitle;
				$(revElem).text("").append(revBtn.getRevisionText(revElem,
						revision))
					.removeAttr("tags").removeAttr("tiddler")
					.removeAttr("refresh").removeAttr("template")
					.removeAttr("id");
				$(".revisions").removeClass("loading");
				if (callback) {
					callback();
				}
			});
			$(revElem).removeAttr("prevPos").removeClass("viewRevision");
		} else {
			var viewRevision = function() {
				var prevPos = $(revElem).position().left;
				$(revElem).addClass("viewRevision").attr("prevPos", prevPos);
				$(".revisions").addClass("loading");
				me.showRevision(revElem, revision, function(rev) {
					me.slideOut(revElem, rev, origTitle, function() {
						$(".revisions").removeClass("loading");
					});
				});
			};
			// make sure another revision isn't already out
			if ($(".viewRevision").length) {
				var newRevElem = $(".viewRevision")[0];
				var newRevision = store.getTiddler($(newRevElem)
					.attr("tiddler"));
				me.onClickRevision(newRevElem, newRevision, viewRevision);
			} else {
				viewRevision();
			}
		}
	},

	slideOut: function(revElem, revision, title, callback) {
		var leftMostPos = $("[revName='%0'].revisions".format([title]))
			.offset().left;
		var width = $(revElem).width();
		var originalLeftPos = $(story.getTiddler(title))
			.position().left;

		var slideAmount = leftMostPos + width - me.visibleSlideAmount;
		$("[revName='%0'].revisions:not(.viewRevision)".format([title]))
			.animate({left: "-=" + slideAmount}, 1000);
		$(revElem)
			.attr("baseHeight", $(revElem).css("height"))
			.css("height", "auto")
			.animate({left: originalLeftPos}, 1000, callback);
	},

	slideIn: function(revElem, revision, title, callback) {
		var slideAmount = $(revElem).offset().left -
			$(story.getTiddler(title)).offset().left;
		var origRevPos = $(revElem).attr("prevPos");

		$("[revName='%0'].revisions:not(.viewRevision)".format([title]))
			.animate({left: "+=" + slideAmount}, 1000);
		$(revElem).animate({left: origRevPos}, 1000, function() {
			$(revElem)
				.css("height", $(revElem).attr("baseHeight"))
				.removeAttr("baseHeight");
			callback();
		});
	}
};

var revBtn;
config.macros.slideRevision = revBtn = {
	btnText: "created by %0 at %1 on %2",
	handler: function(place, macroName, params, wikifier, paramString, tiddler) {
		var btn = revBtn.getRevisionText(place, tiddler);
		$(place).append(btn);
	},

	getRevisionText: function(place, revision) {
		var text = revBtn.btnText.format([revision.modifier,
			revision.modified.formatString("0hh:0mm"),
			revision.modified.formatString("0DD MMM YYYY")]);
		var btn = $('<a href="javascript:;" class="button revButton" />')
			.text(text)
			.click(function() {
				var revElem = story.findContainingTiddler(this);
				me.onClickRevision(revElem, revision);
			});
		return btn;
	}
};

})(jQuery);
//}}}
Type the text for 'New Tiddler'
Type the text for 'New Tiddler'
[[StyleSheetTiddlySpace]]
/*{{{*/

body {background:[[ColorPalette::Foreground]];font-family:verdana,helvetica,arial,sans-serif;}

.headerForeground {float:left;text-align:left;padding:0.5em 0 1em 0;margin-left:4em;}
.siteTitle {display:inline;font-size:1.5em;font-weight:normal;}
.headerForeground .siteTitle a {color:[[ColorPalette::Background]];font-weight:normal;padding 0.5em 0 1em 0;}
.headerForeground .siteTitle a:hover {color:[[ColorPalette::SecondaryPale]];}
.siteSubtitle {padding-left:1em;display:inline;font-size:1em;}

#sidebarSearch {position:absolute;width:17em;right:2em;top:1.5em;margin:0;padding:1em 0 1em 1em;color:[[ColorPalette::TertiaryPale]];font-weight:bold;background:[[ColorPalette::PrimaryMid]];}
#sidebarSearch input, #sidebarSearch .txtOptionInput{z-index:10;width:15em;right:0;top:-3px;border:1px solid [[ColorPalette::TertiaryMid]];-moz-border-radius:2px; -webkit-border-radius:2px;border-radius:2px;float:right;}
#sidebarSearch select{width:17em;z-index:10;right:0;border:1px solid [[ColorPalette::TertiaryMid]];border-top:0;float:right;right:0;width:15em;}
#sidebarSearch .searchButton {color: [[ColorPalette::Background]];display:block;float:left;margin-top:7px;font-size:0.8em;}

#menuBar {background:[[ColorPalette::TertiaryDark]];border:none;}
#menuBar .highlight{background:[[ColorPalette::PrimaryDark]];}

#mainMenu .button,
#mainMenu .tiddlyLink,
#mainMenu .externalLink,
#sidebarOptions .button,
#sidebarOptions .tiddlyLink,
#sidebarOptions .externalLink
{float:none;display:inline;border:none;color:[[ColorPalette::TertiaryPale]];padding:0.5em 5px;font-size:14px;font-weight:normal;margin:0 3px;line-height;1em;border:0;}

#mainMenu .button:hover,
#mainMenu .tiddlyLink:hover,
#mainMenu .externalLink:hover,
#sidebarOptions .button:hover,
#sidebarOptions .tiddlyLink:hover,
#sidebarOptions .externalLink:hover
{background:[[ColorPalette::Foreground]];color:[[ColorPalette::Background]] !important;border:0;}

#mainMenu {padding:2px 0 0 2.5em;}
#mainMenu,
#sidebarOptions {margin:0;color:[[ColorPalette::Foreground]];line-height:1.2em;font-size:14px;}
#sidebarOptions {padding:0 2em 0 0;}
#sidebarOptions br {display:none;}

#sidebarTabs{width:340px;position:absolute;clear:right;top:160px;right:0.5em;margin:0;height:385px;overflow:hidden;z-index:10;}
#sidebarTabs .tabsetWrapper .tabContents {height:385px;display:block;overflow:auto;background:none;border:0;color:[[ColorPalette::SecondaryPale]];padding:0 0 5px 5px;min-height:15em;width:16em;}
#sidebarTabs .listTitle{padding-bottom:3px;}
#sidebarTabs .timeline li.listTitle, #sidebarTabs .tabContents .timeline, #sidebarTabs li.listTitle {color:[[ColorPalette::SecondaryLight]]; padding:0.1em 0.3em;}

#sidebarTabs li, #sidebarTabs .listLink, #sidebarTabs li.listTitle{list-style-type:none;}

#sidebarTabs .button,
#sidebarTabs .tiddlyLink,
#sidebarTabs .externalLink,
#sidebarTabs .tabContents li a,
#sidebarTabs .tabContents .timeline{color:[[ColorPalette::Background]];display:block;background:[[ColorPalette::PrimaryDark]];cursor:pointer;padding:0.3em;font-size:0.9em;}

#sidebarTabs .button:hover,
#sidebarTabs .tiddlyLink:hover,
#sidebarTabs .externalLink:hover,
#sidebarTabs .tabContents li a:hover{color:[[ColorPalette::Background]];background:[[ColorPalette::TertiaryDark]];}

#sidebarTabs .tabsetWrapper .tabset {width:90px;background:none;border:0;word-wrap:none;}
#sidebarTabs .tabsetWrapper .tabset .tab{word-wrap:none;height:22px;text-align:right;margin:2px 0;background:#161616;color:[[ColorPalette::SecondaryLight]];border:0;font-weight:normal;width:80px;height:1.4em;line-height:1.4em;padding:7px 7px 7px 5px;}
#sidebarTabs .tabsetWrapper .tabset .tab:hover{z-index:10;background:[[ColorPalette::TertiaryDark]];color:[[ColorPalette::Background]];}
#sidebarTabs .tabsetWrapper .tabset .tabSelected{color:[[ColorPalette::Background]];font-weight:bold;z-index:11;border:0px solid transparent !important;}
#sidebarTabs .tabsetWrapper .tabContents{background: [[ColorPalette::Foreground]];border:0;font-size:0.9em;}

#sidebarTabs .sideBarTools .button, #sidebarTabs .sideBarTools .tiddlyLink {display:block;font-weight:bold;padding:2%;color:[[ColorPalette::Background]];width:92%;}
#sidebarTabs .sideBarTools .button:hover, #sidebarTabs .sideBarTools .tiddlyLink:hover {background:[[ColorPalette::TertiaryDark]];}
#sidebarTabs .suggestionArea .externalLink{display:inline;}
.suggestionArea .marked{display:none;}

#sidebarTabs .tabsetWrapper .tabsetWrapper .tabset .tabSelected, #sidebarTabs .tabsetWrapper .tabsetWrapper .tabset .tab {width:auto;float:left;text-align:middle;margin:0 1px 5px 0;padding:5px 10px 0;}
#sidebarTabs .tabsetWrapper .tabsetWrapper .tabset {display:block;width:100%;}
#sidebarTabs .tabsetWrapper .tabsetWrapper .tabContents {height:335px;min-height:15em;width:95%;clear:both;font-size:1em;}

.tiddler .tiddlerInfo{float:right;position:relative;width:width:60px;margin:-2em 0 0 10px;font-size:11px;}
.tiddler .tiddlerInfo .spaceSiteIcon, .tiddler .tiddlerInfo .modifierIcon, .modifiedDate {clear:both;float:right;margin:0.3em 1em 0 0;position:relative;text-align:center;width:60px;opacity:0.8;color:[[ColorPalette::SecondaryMid]];}
.modifiedDate{margin:0.5em 1em 0.5em 0;}
.modifiedDate .calendar{margin:0 auto;float:none;background:#C1E6FD;color:[[ColorPalette::SecondaryDark]];border:2px solid [[ColorPalette::SecondaryMid]];cursor:pointer;width:40px;font-size:14px;}
.tiddler .tiddlerInfo .spaceSiteIcon:hover, .tiddler .tiddlerInfo .modifierIcon:hover, .modifiedDate:hover {opacity:1;}
.modifiedDate .calendar .month {padding-top:3px;}
.modifiedDate .calendar .date {font-weight:bold;}
.modifiedDate .calendar .time{font-size:12px;background:[[ColorPalette::Background]];border-top: 1px solid [[ColorPalette::SecondaryMid]];padding:2px;}
.tiddler .tiddlerInfo .info{float:none;right:auto;top:auto;width:auto;left:31px;position:relative;width:48px;}

.tagged{right:-1.1em;clear:both;}
.tagged .button{color:[[ColorPalette::TertiaryDark]];font-weight:bold;background:[[ColorPalette::TertiaryPale]];}
.tagged .button:hover{color:[[ColorPalette::SecondaryDark]];background:[[ColorPalette::SecondaryPale]];}

#displayArea{margin-right:0;}
#tiddlerDisplay, #searchResults{margin:1.5em 23em 0 2em;}
.tiddler .heading .title {margin-left:1em;margin-right:5em;font-size:1.4em;}
.tiddler .editheading .editor .title {margin:0 0 0 0.5em;}
.tiddler .editheading .editor {width:75%;float:left;margin:1em 0 0;}
.tiddler .editheading .editor input{font-size:1em;}
.tiddler .editheading .spaceSiteIcon{display:inline;text-align:center;float:right;margin:1em 4em 0 0;}
.tiddler .editheading .roundelLabel,.tiddler .editheading .infoLabel{font-size:12px;color:[[ColorPalette::SecondaryMid]];margin:0;padding-top:4px;}
.tiddler .editheading .modifierIcon{margin:1em 1.5em 0 0;}
.tiddler .viewer {margin:1em 5.5em 0 2em;overflow:auto;font-size:0.95em;line-height:1.3em;}
.tiddler .viewer pre {font-size:1em;}
.tiddler, #searchResults {border-radius:7px;-moz-border-radius:7px;-webkit-border-radius:7px;border-color:#DDD;-moz-box-shadow:2px 2px 18px #999;background-color:[[ColorPalette::Background]];margin-bottom:2em;padding:0;position:relative;}
.noTitle .listTitle{display:none;}
.tiddler .heading .title {margin:0 4em 0 1em;padding-bottom:5px;}
.tiddler .editor {font-family:arial,helvetica;}
.tiddler .editor .title{border:0;}
.tiddler .editor textarea {font-size:14px;}
.marked {padding:1px 2px;}

#searchResults {padding:1em;}
#searchResults .button{float:right;padding:0.5em;margin-left:0.5em;}

/*thanks bauwebijl*/
.tiddler .toolbar {margin:0;padding:0;right:1em;z-index:10;}
.tiddler .toolbar .button {float: left;display: block;color:#666;font-weight:bold;height:10px;margin:10px 7px 0 1px;padding:0 7px 7px;margin:5px 8px 0 -2px;padding:0 7px 10px;background:#ddd;-moz-border-radius:20px;-webkit-border-radius:20px;border-radius:20px;background:-moz-linear-gradient(center top ,#fff, #999) repeat scroll 0 0 transparent;background: -webkit-gradient(linear, center top, center bottom, from(#fff), to(#999));border:1px solid #999 !important;}
.tiddler .toolbar .button:hover {color:#111;height:16px;padding: 3px 8px;margin:3px 5px 0 -5px;background:-moz-linear-gradient(center top, #EEE, #999) repeat scroll 0 0 transparent;background: -webkit-gradient(linear, center top, center bottom, from(#EEE), to(#999));border-color:#555 !important;}
.tiddler .toolbar .textbutton .button:hover {padding: 2px 10px 4px 10px;margin:3px 5px 0 -5px;}
.toolbar svg {height:20px;width:20px;margin-top:-5px;}
.toolbar .button:hover svg {height:24px;width:24px;margin-top:-18px;}
.toolbar svg .glyph{fill: #C1E6FD;stroke:#05A;stroke-width:2px;}
.toolbar .button:hover svg .glyph{fill:#C1E6FD;stroke:#05A;stroke-width:2px;}

h1  {font-size:1.2em;}
h1, h2, h3, h4, h5, h6 {font-weight:normal;}

.tiddler .title{font-weight:normal;}
.tiddler .title a {color:[[ColorPalette::SecondaryMid]];}
.tiddler .title a:hover {color:[[ColorPalette::SecondaryDark]];}

.viewer table, table.twtable {margin:5px 5px 0 0;}
.viewer td, .viewer tr, .twtable td, .twtable tr {border:1px solid [[ColorPalette::TertiaryMid]] !important;vertical-align:top;padding:5px;}
.viewer td ul, .viewer td ol {margin: 0.2em;padding-left:1em;}
.tagsearch{-moz-box-shadow:2px 2px 8px black;}

#popup, .popup {z-index:1000;position:absolute;min-width:100px;list-style-type:none;background:[[ColorPalette::Foreground]]; color:[[ColorPalette::TertiaryLight]]; border-left:1px solid [[ColorPalette::TertiaryDark]]; border-top:1px solid [[ColorPalette::TertiaryDark]]; border-right:2px solid [[ColorPalette::TertiaryDark]]; border-bottom:2px solid [[ColorPalette::TertiaryDark]];}
.popup ul {list-style-type:none;margin:0;padding:0;}
.popup hr {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::PrimaryDark]]; border-bottom:1px;}
#popup li a, .popup li a, .popup li a:visited,.popupmacro .tiddlyLink {color:[[ColorPalette::SecondaryPale]]; border: none;font-weight:normal;font-size:1em;padding:0.2em 0.5em;}
.popupHighlight, .popup li a:hover, .popup li a:active,.popupmacro .tiddlyLink:hover {background:[[ColorPalette::TertiaryDark]]; color:[[ColorPalette::TertiaryPale]]; border: none;}
.popup .listBreak div{margin:0;}
.popup .title, .popup h1, .popup  h2, .popup  h3, .popup  h4, .popup h5, .popup h6 {color:[[ColorPalette::SecondaryLight]];display:block;font-weight:normal;font-size:1.1em;}
.popup .title a {font-size:1em;}
.popup .message{color:[[ColorPalette::TertiaryDark]];}

.popupmacro .title, .popupmacro .title .tiddlyLink{padding:2px 7px;color:[[ColorPalette::SecondaryLight]];border-bottom:1px solid [[ColorPalette::TertiaryDark]];display:block;margin:2px 0 0 0;}
.popupmacro li a{display:block;padding:0.4em;}
.popupmacro .title .tiddlyLink{color: [[ColorPalette::SecondaryLight]];font-size:0.9em;margin:0 0 -2px -0.5em;padding:0.3em 0.5em;width:100%;}
.popupmacro br{display:none;}

#messageArea {background:[[ColorPalette::TertiaryPale]];position:absolute;top:0;left:30%;padding:1em 1%;margin:-2em 0 0 1%;width:35%;border:3px solid [[ColorPalette::TertiaryLight]];-moz-border-radius:5px; -webkit-border-radius:5px;border-radius:5px;background:[[ColorPalette::MsgLo]];font-size:0.9em;}
#messageArea .messageToolbar {display:block;float:right;padding:0.1em;text-align:right;width:60px;}
#messageArea a, #messageArea .button {background:transparent;text-decoration:none;color:[[ColorPalette::TertiaryDark]];border:0;}
#messageArea a:hover{color:black;border-bottom:1px solid [[ColorPalette::TertiaryDark]];}
#backstageToolbar {text-align:center;}

.confirmationPopup {font-size:14px;width:400px;}
.confirmationPopup .button {display:inline;font-size:12px;height:auto;margin:10px 5px 0 0;width:auto;}
.followList .listTitle {text-decoration:none;font-size:14px;color:[[ColorPalette::SecondaryMid]];margin-bottom:0.5em;}

.tiddler .followPlaceHolder {left:5em;width:50px;}
.tiddler .followButton {height:10px;margin:-10px -8px 24px 0;width:30px;background:[[ColorPalette::TertiaryPale]];z-index:1;}
.tiddler .followButton:before {margin-top:-12px;border-color: transparent [[ColorPalette::TertiaryPale]];border-width: 0 0 10px 10px;}
.tiddler .followButton .highlight {background:transparent;}
.tiddler .followButton a {font-size:0.8em;margin-top:-7px;color:[[ColorPalette::TertiaryDark]];}
.tiddler .followButton a:hover {background:transparent;color:[[ColorPalette::Foreground]];font-weight:bold;}

#sidebarTabs .followers ul, .followersFollowers ul{list-style-type:none;margin:10px 0 0 0;padding:0;}
#sidebarTabs .followers .externalImage, .followersFollowers .externalImage{float:left;margin-right:10px;}
#sidebarTabs .followers .spaceName, .followersFollowers .spaceName{clear:left;height:30px;}
#sidebarTabs .followers .externalLink{display:inline;}
#sidebarTabs .suggestionArea span{display:block;height:20px;}
#sidebarTabs .suggestionArea a{line-height;1em;margin:5px 0;}
#sidebarTabs .suggestionArea .marked{background:transparent;}
iframe{width:98%;height:600px;border:2px solid #EEE;z-index:0;position:relative;}
object{z-index:0;position:relative;}
.frmTypeWithMe {margin-left:1%;width:86%;}

#tiddlerDisplay .tbScan, .followersFollowers{margin:1em 5.5em 0 2em;overflow:auto;}
#tiddlerDisplay .scanResults>ul{margin:0;padding:0;}

.scanUser {display:block;display:block;font-size:1.5em;height:2em;margin-top:5px;padding:0.5em 0.3em 0;background:[[ColorPalette::TertiaryPale]];margin-top:5px;-moz-border-radius-topleft:10px;-moz-border-radius-topright:10px; -webkit-border-radius-topleft:10px;-webkit-border-radius-topright:10px;border-radius-topleft:10px;border-radius-topright:10px;}
.scanUser .externalImage,.scanUser .image{display:block;float:left;margin:-0.3em 0.5em 0 0 ;}
.scanText {display:block;background:[[ColorPalette::SecondaryPale]];font-size:0.9em;padding:0.5em;-moz-border-radius-bottomleft:10px;-moz-border-radius-bottomright:10px; -webkit-border-radius-bottomleft:10px;-webkit-border-radius-bottomright:10px;border-radius-bottomleft:10px;border-radius-bottomright:10px;}
.tbScan .scanResults blockquote {border-left:2px solid [[ColorPalette::SecondaryDark]];margin:0.7em 0 0.7em 0.7em;padding-left:0.5em;}
.tbScan .scanResults .spaceName li {list-style-type:circle;margin:0.7em 0 0.7em 0.7em;padding-left:0.5em;}
.tbScan .scanResults code{color:[[ColorPalette::SecondaryDark]];}
/*}}}*/

[[StyleSheetFullTheme]]
[[StyleSheetSpace]]
/***
|''Name''|EvalifyPlugin|
|''Description''|a simple macro to wikify evaled output|
|''Version''|1.0|
|''Type''|macro|
|''Author''|[[TobiasBeer]]|
|''Source''|http://evalify.tiddlyspace.com|
|''Documentation''|http://tobibeer.tiddlyspace.com/#Evalify|
|''License''|[[Creative Commons Attribution-Share Alike 3.0|http://creativecommons.org/licenses/by-sa/3.0/]]|
***/
//{{{
config.macros.evalify={handler:function(place,macroName,params,wikifier,paramString,tiddler){
  var out=eval(params.shift());
  var el=params.shift();
  if(el)el=document.getElementById(el);
  el=el?el:place;
  if(out)wikify(out,el);
}}
//}}}
#[[Past Tense]]
#[[Present Tense]]
#[[Future]]
PUNJABI
<html><nowiki>
<h1> Count | ਵਚਨ </h1>
<p>All the nouns are either Singular(ਇਕ ਵਚਨ) or Plural(ਬਹੁ ਵਚਨ) in count. Following are some rules for converting a singular noun into a plural one.</p>
<h2>Masculine Nouns | ਪੁਲਿੰਗ ਨਾਂਵ</h2>
<h3>Replace the suffixed Kunna(ਾ) with a Laan(ੇ) </h3>
<table class="softGreenTable">
<tr>
     <th>Singular | ਇਕ-ਵਚਨ </th>
     <th>Plural | ਬਹੁਵਚਨ </th>
     <th> Pronunciation</th>
</tr><tr>
     <td>ਕਾਕਾ </td>
     <td>ਕਾਕੇ </td>
     <td> </td>
</tr><tr>
     <td>ਪੱਖਾ </td>
     <td>ਪੱਖੇ </td>
     <td> </td>
</tr><tr>
     <td>ਡੱਬਾ </td>
     <td>ਡੱਬੇ </td>
     <td> </td>
</tr><tr>
     <td>ਘੋੜਾ </td>
     <td>ਘੋੜੇ </td>
     <td> </td>
</tr><tr>
     <td>ਪੱਤਾ </td>
     <td>ਪੱਤੇ </td>
     <td> </td>
</tr><tr>
</table>
<p>For all other masculine nouns, which do not end with a kunna(ਾ) , the plural form is the same as the singular</p>

<h2>Feminine Nouns | ਇਸਤ੍ਰੀ-ਲਿੰਗ ਨਾਂਵ </h3>

<h3>When the word is Mukta ended attach a ਾ+ਂ to the last Mukta letter</h3>
<table class="softGreenTable">
<tr>
     <th>Singular | ਇਕ-ਵਚਨ </th>
     <th>Plural | ਬਹੁਵਚਨ </th>
     <th>Pronunciation</th>
</tr><tr>
     <td>ਕਿਤਾਬ </td>
     <td>ਕਿਤਾਬਾਂ </td>
     <td> </td>
</tr><tr>
     <td>ਕਾਰ </td>
     <td>ਕਾਰਾਂ </td>
     <td> </td>
</tr><tr>
     <td>ਬਾਂਹ </td>
     <td>ਬਾਂਹਾ </td>
     <td> </td>
</tr><tr>
     <td>ਲੱਤ </td>
     <td>ਲੱਤਾਂ </td>
     <td> </td>
</tr><tr>
     <td>ਕਲਮ </td>
     <td>ਕਲਮਾਂ </td>
     <td> </td>
</tr>
</table>

<h3>when the word ends with a kunna (ਾ) OR kunna and a bindi (ਾ+ਂ) attach a ਵ+ਾ+ਂ=ਵਾਂ at the end</h3>

<table class="softGreenTable">
<tr>
     <th>Singular | ਇਕ-ਵਚਨ </th>
     <th>Plural | ਬਹੁਵਚਨ </th>
     <th>Pronunciation</th>
</tr><tr>
     <td>ਸਭਾ </td>
     <td>ਸਭਾਵਾਂ </td>
     <td> </td>
</tr><tr>
     <td>ਹਵਾ </td>
     <td>ਹਵਾਵਾਂ </td>
     <td> </td>
</tr><tr>
     <td>ਕਵਿਤਾ </td>
     <td>ਕਵਿਤਾਵਾਂ </td>
     <td> </td>
</tr><tr>
     <td>ਛਾਂ </td>
     <td>ਛਾਂਵਾਂ </td>
     <td> </td>
</tr><tr>
     <td>ਥਾਂ </td>
     <td>ਥਾਂਵਾਂ </td>
     <td> </td>
</tr><tr>
     <td>ਮਾ </td>
     <td>ਮਾਵਾਂ </td>
     <td> </td>
</tr>
</table>

<h3>When the word ends with either a Bihari (ੀ),a Dulaan (ੈ), an Aunkarh (ੁ),a Dulainkarh (ੂ) or a  Horha (ੋ) attach a (ਅ+ਾ+ਂ)=(ਆਂ) at the end</h3>
<table class="softGreenTable">
<tr>
     <th>Singular | ਇਕ-ਵਚਨ </th>
     <th>Plural | ਬਹੁਵਚਨ </th>
     <th>Pronunciation</th>
</tr><tr>
     <td>ਕਲੀ </td>
     <td>ਕਲੀਆਂ </td>
     <td> </td>
</tr><tr>
     <td>ਬੋਲੀ </td>
     <td>ਬੋਲੀਆਂ </td>
     <td> </td>
</tr><tr>
     <td>ਕੌਲੀ </td>
     <td>ਕੌਲੀਆਂ </td>
     <td> </td>
</tr><tr>
     <td>ਵਸਤੂ </td>
     <td>ਵਸਤੂਆਂ </td>
     <td> </td>
</tr><tr>
     <td>ਸਹੁੰ </td>
     <td>ਸਹੁੰਆਂ </td>
     <td> </td>
</tr>
</table>
<div class="note">
<p>
Noun words also change under effect of their relationship with other words in the sentence. These are their propositional forms. Sometimes even when the ordinary plural form is the same as the singular form, the prepositional plural form maybe different which may lead to a wrong conclusion that it (prepositional plural form) is the ordinary plural form. But when making plural of a singular only the rodinary form is to be considered.
</p>
<p>
In Punjabi plural forms are also used to denote respect. For example while speaking to or about a person who is to be accorded respect, the plural form of name or pronoun is used. The adjectives and verbs all change accordingly to their plural form.
</p>
<p style="text-decoration: underline; font-weight: bold;">Would you have some tea?</p>
<ul>
     <li>To a child: ਤੂੰ ਚਾਹ ਪੀਏਂਗਾ? (Singular pronoun and verb form)</li>
     <li>To a lady: ਤੁਸੀਂ ਚਾਹ ਪੀਓਂਗੇ? (Plural pronoun and verb form)</li>
</ul>

</div>
</html>
Type the text for 'New Tiddler'
/***
|''Name''|TiddlySpaceToolbar|
|''Description''|augments tiddler toolbar commands with SVG icons|
|''Author''|Osmosoft|
|''Version''|0.6.6|
|''Status''|@@beta@@|
|''Source''|http://github.com/TiddlySpace/tiddlyspace/raw/master/src/plugins/TiddlySpaceToolbar.js|
|''CodeRepository''|http://github.com/TiddlySpace/tiddlyspace|
|''License''|[[BSD|http://www.opensource.org/licenses/bsd-license.php]]|
|''CoreVersion''|2.5.0|
|''Requires''|ImageMacroPlugin|
|''Keywords''|toolbar icons SVG|
!Description
replaces tiddler toolbar commands with SVG icons if available
!Notes
requires [[ImageMacroPlugin|http://svn.tiddlywiki.org/Trunk/contributors/JonRobson/plugins/ImageMacroPlugin/plugins/ImageMacroPlugin.tid]]

SVG icons are drawn from tiddlers titled {{{<command>.svg}}}
In readonly mode a tiddler called {{{<command>ReadOnly.svg}}} will be used if it exists.
!TODO
* rename (IconToolbarPlugin?)
* support more than one more popup menu in the toolbar.
!Code
***/
//{{{
(function($) {

if(!config.macros.image) {
	throw "Missing dependency: ImageMacroPlugin";
}

var macro = config.macros.toolbar;

macro.icons = {
	cloneTiddler: "editTiddler"
};

var _handler = macro.handler;
macro.handler = function(place, macroName, params, wikifier,
		paramString, tiddler) {
	var toolbar = $(place);
	toolbar.attr({
		refresh: "macro",
		macroName: macroName
	}).data("args", arguments);
	var status = _handler.apply(this, arguments);
	if(tiddler.isReadOnly()) {
		toolbar.addClass("toolbarReadOnly");
	} else {
		toolbar.removeClass("toolbarReadOnly");
	}
	var parsedParams = paramString.parseParams("name")[0];
	if(parsedParams.icons && parsedParams.icons == "yes") {
		this.augmentCommandButtons(place);
	}
	if(parsedParams.more && parsedParams.more == "popup") {
		// note we must override the onclick event like in createTiddlyButton
		// otherwise the click event is the popup AND the slider
		$(".moreCommand", place).each(function(i, el) {
			el.onclick = macro.onClickMorePopUp;
		});
		// buttons that are after a less command should not be in more menu.
		$(".lessCommand ~ .button", place).appendTo(place);
		$(".lessCommand", place).remove();
	}
	return status;
};

macro.refresh = function(place, params) {
	var args = $(place).empty().data("args");
	this.handler.apply(this, args);
};

var imageMacro = config.macros.image;
macro.augmentCommandButtons = function(toolbar) {
	$(".button", toolbar).each(function(i, el) {
		var cmd = $(el).attr("commandname");
		cmd = cmd ? cmd : "moreCommand"; // XXX: special-casing of moreCommand due to ticket #1234
		var icon = store.tiddlerExists(cmd) ? cmd : macro.icons[cmd];
		var text = $(el).text();
		if(readOnly) {
			var readOnlyAlternative = "%0ReadOnly".format([icon]);
			if(store.tiddlerExists(readOnlyAlternative)) {
				icon = readOnlyAlternative;
			}
		}
		if(store.tiddlerExists(icon)) {
			$(el).css({display: "inline-block"}).empty();
			imageMacro.renderImage(el, icon, { alt: text });
		}
	});
};

// provide onClickMore to provide extra commands in a popup
macro.onClickMorePopUp = function(ev) {
	ev = ev || window.event;
	var sibling = this.nextSibling;
	if(sibling) {
		var commands = sibling.childNodes;
		var popup = Popup.create(this);
		$(popup).addClass("taggedTiddlerList");
		for(var i = 0; i < commands.length; i++) {
			var li = createTiddlyElement(popup, "li", null);
			var oldCommand = commands[i];
			var command = oldCommand.cloneNode(true);
			command.onclick = oldCommand.onclick;
			li.appendChild(command);
		}
		Popup.show();
	}
	ev.cancelBubble = true;
	if(ev.stopPropagation) {
		ev.stopPropagation();
	}
	return false;
};

})(jQuery);
//}}}
<<evalify [[config.macros.tagsearch?'<<tagsearch toolbar>\>':'';]]>>
/***
|''Name''|TiddlySpaceSearcher|
|''Version''|0.2.5|
|''Requires''|TiddlySpaceConfig TiddlySpaceFollowingPlugin|
***/
//{{{
(function($) {
var tiddlyspace = config.extensions.tiddlyspace;
var tsScan = config.macros.tsScan;

config.shadowTiddlers.SearchTemplate = "<<view server.bag SiteIcon label:no width:24 height:24 preserveAspectRatio:yes>> <<view server.bag spaceLink title external:no>> in space <<view server.bag spaceLink>>";
config.shadowTiddlers.StyleSheetSearch = [".resultsArea .siteIcon { display: inline; }",
	".searchForm {text-align: left;}"].join("\n");
store.addNotification("StyleSheetSearch", refreshStyles);

var search = config.macros.tsSearch = {
	locale: {
		advanced: "Advanced Options",
		header: "Search",
		resultsHeader: "Results (%0)",
		find: "find",
		noResults: "No tiddlers matched your search query",
		query: "QUERY: ",
		error: "please provide a search query or a tag, modifier or title!",
		titleAdvanced: "where the title is",
		modifierAdvanced: "where the last modifier is",
		spaceAdvanced: "only in the space: ",
		notspaceAdvanced: "but not in the spaces: ",
		tagsAdvanced: "with the tags: "
	},
	andConstructor: function(container, label, fieldname, negationMode) {
		var tags = $("<div />").appendTo(container);
		$('<span />').text(label).appendTo(tags);
		var id = "area" + Math.random();
		container = $("<span />").attr("id", id).appendTo(tags)[0];
		function add(container) {
			var el = $('<input type="text" />').attr("field", fieldname).appendTo(container);
			if(negationMode) {
				el.attr("negation", "true");
			}
		}
		add(container);
		var el = $("<button />").text("AND").click(function(ev) {
			add($(ev.target).data("container"));
			ev.preventDefault();
		}).appendTo(tags);
		$(el).data("container", container);
	},
	fieldConstructor: function(container, label, field) {
		container = $("<div />").appendTo(container)[0];
		$("<span />").text(label).appendTo(container);
		$("<input />").attr("text", "input").attr("field", field).appendTo(container);
	},
	advancedOptions: function(form) {
		var locale = search.locale;
		var container = $("<div />").addClass("tsAdvancedOptions").appendTo(form)[0];
		$("<h2/ >").text(search.locale.advanced).appendTo(container);
		$("<div />").addClass("separator").appendTo(container);
		search.fieldConstructor(container, locale.titleAdvanced, "title");
		search.fieldConstructor(container, locale.modifierAdvanced, "modifier");
		search.fieldConstructor(container, locale.spaceAdvanced, "space");
		search.andConstructor(container, locale.notspaceAdvanced, "space", true);
		search.andConstructor(container, locale.tagsAdvanced, "tag");
	},
	constructSearchQuery: function(form) {
		var data = [], select = [];
		var query = $("[name=q]", form).val();
		if(query) {
			data.push("q=%0".format(query));
		}

		// add tags, fields etc..
		$("[field]", form).each(function(i, el) {
			var val = $(el).val();
			var name = $(el).attr("field");
			var negate = $(el).attr("negation") == "true";
			if(val && name) {
				val = encodeURIComponent(val);
				val = negate ? "!" + val : val;
				if(name == "space") {
					val += "_public";
					name = "bag";
				}
				if(negate) {
					select.push("select=%0:%1".format(name,val));
				} else {
					var prefix = data.length === 0 ? "q=" : "";
					data.push('%0%1:"%2"'.format(prefix, name, val));
				}
			}
		});
		var dataString = data.join(" ");
		if(dataString.length === 0 && !query) {
			return false;
		}
		var selectStatement = select.join("&");
		if(dataString.length > 0 && selectStatement.length > 0) {
			dataString += "&";
		}
		dataString += selectStatement;
		return "/search?%0".format(dataString);
	},
	constructForm: function(place) {
		var locale = search.locale;
		$("<h1 />").text(locale.header).appendTo(place);
		var form = $("<form />").appendTo(place)[0];
		$('<input type="text" name="q" />').appendTo(form);
		$('<input type="submit" />').val(locale.find).appendTo(form);
		search.advancedOptions(form);
		var query = $('<h2 class="query"/>').appendTo(place)[0];
		var results = $("<div />").appendTo(place).addClass("resultsArea")[0];
		var lookup = function(url) {
			if(!url) {
				results.empty().addClass("error").text(locale.error);
				return;
			}
			config.extensions.tiddlyweb.getStatus(function(status) {
				$(query).text(locale.query);
				var href = status.server_host.url + url;
				$("<a />").attr("href", href).text(href).appendTo(query);
				tsScan.scan(results, { url: url, emptyMessage: search.locale.noResults, cache: true,
					template: "SearchTemplate", sort: "title", callback: function(tiddlers) {
						$("<h2 />").text(locale.resultsHeader.format(tiddlers.length)).prependTo(results);
					}
				});
			});
		};
		$(form).submit(function(ev) {
			ev.preventDefault();
			var url = search.constructSearchQuery(form);
			config.macros.tsSearch.lastSearch = url;
			lookup(url);
		});
		if(search.lastSearch) {
			lookup(search.lastSearch);
		}
		return form;
	},
	handler: function(place) {
		var container = $("<div />").addClass("searchForm").appendTo(place)[0];
		search.constructForm(container);
	}
};

})(jQuery);
//}}}
<html><nowiki>
<h1>  Past Tense </h1>
<h2> ਜਾ (Go)</h2>
<h3>1. Past Indefinite Tense ਅਨਿਸ਼ਚਿਤ ਭੂਤ ਕਾਲ / ਸਾਧਾਰਣ ਭੂਤ ਕਾਲ</h3>

<table class="verbConjugation">
<tr>
    <th rowspan=2 >Subject </th>
    <th rowspan=2>Object </th>
    <th colspan=2> Verb (phrase) </th>
    <th rowspan=2> English Translation </th>
</tr>
<tr>

     <th> Masculine </th>
     <th> Feminine </th>
</tr>
<tr class="singular" >
     <td> ਮੈਂ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td>  ਜਾਂਦਾ ਸੀ </td>
     <td> ਜਾਂਦੀ ਸੀ</td>
     <td>I went to the market </td>
</tr> <tr class="plural">
     <td> ਅਸੀਂ </td>
     <td>  ਬਜ਼ਾਰ </td>
     <td>  ਜਾਂਦੇ ਸੀ/ਸਾਂ </td>
     <td> ਜਾਂਦੀਆਂ ਸੀ/ਸਾਂ </td>
     <td> We went to the market </td>
</tr><tr class="singular">
     <td> ਤੂੰ </td>
     <td> ਬਜ਼ਾਰ </td> 
     <td> ਜਾਂਦਾ ਸੀ/ਸੈਂ </td>
     <td> ਜਾਂਦੀ ਸੀ/ਸੈਂ </td>
     <td> You went to the market </td>
</tr><tr class="plural">
     <td> ਤੁਸੀਂ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਜਾਂਦੇ ਸੀ/ਸਉ </td>
     <td> ਜਾਂਦੀਆਂ ਸੀ/ਸਉ</td>
     <td> You (plural) went to the market </td>
</tr><tr class="singular">
     <td> ਓਹ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਜਾਂਦਾ ਸੀ </td>
     <td> ਜਾਂਦੀ ਸੀ </td>
     <td> He/She went to the market </td>
</tr><tr class="plural">
     <td> ਓਹ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਜਾਂਦੇ ਸੀ/ਸਨ </td>
     <td> ਜਾਂਦੀਆਂ ਸੀ/ਸਨ </td>
     <td> They went to the market </td>
</tr>
<tr class="singular">
     <td> ਰਾਮ  </td>
     <td>ਬਜ਼ਾਰ  </td>
     <td>ਜਾਂਦਾ ਸੀ</td>
     <td>  </td>
     <td> Ram went to the market </td>
</tr>
<tr class="singular">
     <td>ਸੀਤਾ </td>
     <td>ਬਜ਼ਾਰ </td>
     <td> </td>
     <td> ਜਾਂਦੀ ਸੀ </td>
     <td>Sita went to the market </td>
</tr>
<tr class="plural">
     <td> ਰਾਮ ਅਤੇ ਸੀਤਾ</td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਜਾਂਦੇ ਸਨ </td>
     <td>  </td>
     <td> Ram and Sita went to the market </td>
</tr>
<tr class="plural">
     <td> ਸੀਤਾ ਅਤੇ ਗੀਤਾ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> </td>
     <td> ਜਾਂਦੀਆਂ ਸਨ </td>
     <td> Sita and Gita went to the market </td>
</tr>
</table>
<br/>


<h3>2. Past Imperfect Continuous Tense ਅਪੂਰਨ ਚਾਲੂ ਭੂਤ ਕਾਲ</h3>
<table class="verbConjugation">
<tr>
    <th rowspan=2 >Subject </th>
    <th rowspan=2>Object </th>
    <th colspan=2> Verb (phrase) </th>
    <th rowspan=2> English Translation </th>
</tr>
<tr>

     <th> Masculine </th>
     <th> Feminine </th>
</tr>
<tr class="singular" >
     <td> ਮੈਂ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td>  ਜਾ ਰਿਹਾ ਸੀ/ਸਾਂ  </td>
     <td> ਜਾ ਰਹੀ ਸੀ/ਸਾਂ</td>
     <td>I was going to the market </td>
</tr> <tr class="plural">
     <td> ਅਸੀਂ </td>
     <td>  ਬਜ਼ਾਰ </td>
     <td>  ਜਾ ਰਹੇ ਸੀ/ਸਾਂ </td>
     <td> ਜਾ ਰਹੀਆਂ ਸੀ/ਸਾਂ </td>
     <td> We were going to the market </td>
</tr><tr class="singular">
     <td> ਤੂੰ </td>
     <td> ਬਜ਼ਾਰ </td> 
     <td> ਜਾ ਰਿਹਾ ਸੀ/ਸੈਂ </td>
     <td> ਜਾ ਰਹੀ ਸੀ/ਸੈਂ </td>
     <td> You were going to the market </td>
</tr><tr class="plural">
     <td> ਤੁਸੀਂ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਜਾ ਰਹੇ ਸੀ/ਸਉ </td>
     <td> ਜਾ ਰਹੀਆਂ ਸੀ/ਸਉ</td>
     <td> You (plural) were going to the market </td>
</tr><tr class="singular">
     <td> ਓਹ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਜਾ ਰਿਹਾ ਸੀ </td>
     <td> ਜਾ ਰਹੀ ਸੀ </td>
     <td> He/She was going to the market </td>
</tr><tr class="plural">
     <td> ਓਹ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਜਾ ਰਹੇ ਸੀ/ਸਨ </td>
     <td> ਜਾ ਰਹੀਆਂ ਸੀ/ਸਨ </td>
     <td> They were going to the market </td>
</tr>
<tr class="singular">
     <td> ਰਾਮ  </td>
     <td>ਬਜ਼ਾਰ  </td>
     <td>ਜਾ ਰਿਹਾ ਸੀ </td>
     <td> </td>
     <td> Ram was going to the market </td>
</tr>
<tr class="singular">
     <td>ਸੀਤਾ </td>
     <td>ਬਜ਼ਾਰ </td>
     <td> </td>
     <td>ਜਾ ਰਹੀ ਸੀ </td>
     <td> Sita was going to the market </td>
</tr>
<tr class="plural">
     <td> ਰਾਮ ਅਤੇ ਸੀਤਾ</td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਜਾ ਰਹੇ ਸੀ/ਸਨ </td>
     <td>  </td>
     <td> Ram and Sita were going to the market </td>
</tr>
<tr class="plural">
     <td> ਸੀਤਾ ਅਤੇ ਗੀਤਾ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> </td>
     <td> ਜਾ ਰਹੀਆਂ ਸੀ/ਸਨ </td>
     <td> Sita and Gita were going to the market </td>
</tr>
</table>
<br/>

<h3>3. Past Perfect Continuous Tense ਪੂਰਨ ਚਾਲੂ ਭੂਤ ਕਾਲ</h3>
<table class="verbConjugation">
<tr>
    <th rowspan=2 >Subject </th>
    <th rowspan=2>Object </th>
    <th colspan=2> Verb (phrase) </th>
    <th rowspan=2> English Translation </th>
</tr>
<tr>

     <th> Masculine </th>
     <th> Feminine </th>
</tr>
<tr class="singular" >
     <td> ਮੈਂ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td>  ਜਾਂਦਾ ਰਿਹਾ ਸੀ/ਸਾਂ  </td>
     <td> ਜਾਂਦੀ ਰਹੀ ਸੀ/ਸਾਂ</td>
     <td>I had been going to the market </td>
</tr> <tr class="plural">
     <td> ਅਸੀਂ </td>
     <td>  ਬਜ਼ਾਰ </td>
     <td>  ਜਾਂਦੇ ਰਹੇ ਸੀ/ਸਾਂ </td>
     <td> ਜਾਂਦੀਆਂ ਰਹੀਆਂ ਸੀ/ਸਾਂ </td>
     <td> We had been going to the market </td>
</tr><tr class="singular">
     <td> ਤੂੰ </td>
     <td> ਬਜ਼ਾਰ </td> 
     <td> ਜਾਂਦਾ ਰਿਹਾ ਸੀ/ਸੈਂ </td>
     <td> ਜਾਂਦੀ ਰਹੀ ਸੀ/ਸੈਂ </td>
     <td> You had been going to the market </td>
</tr><tr class="plural">
     <td> ਤੁਸੀਂ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਜਾਂਦੇ ਰਹੇ ਸੀ/ਸਉ </td>
     <td> ਜਾਂਦੀਆਂ ਰਹੀਆਂ ਸੀ/ਸਉ </td>
     <td> You (plural) had been going to the market </td>
</tr><tr class="singular">
     <td> ਓਹ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਜਾਂਦਾ ਰਿਹਾ ਸੀ </td>
     <td> ਜਾਂਦੀ ਰਹੀ ਸੀ </td>
     <td> He/She had been going to the market </td>
</tr><tr class="plural">
     <td> ਓਹ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਜਾਂਦੇ ਰਹੇ ਸੀ/ਸਨ </td>
     <td> ਜਾਂਦੀਆਂ ਰਹੀਆਂ ਸੀ/ਸਨ </td>
     <td> They had been going to the market </td>
</tr>
<tr class="singular">
     <td> ਰਾਮ  </td>
     <td>ਬਜ਼ਾਰ  </td>
     <td>ਜਾਂਦਾ ਰਿਹਾ ਸੀ </td>
     <td> </td>
     <td> Ram had been going to market </td>
</tr>
<tr class="singular">
     <td>ਸੀਤਾ </td>
     <td>ਬਜ਼ਾਰ </td>
     <td> </td>
     <td>ਜਾਂਦੀ ਰਹੀ ਸੀ </td>
     <td> Sita had been going to the market </td>
</tr>
<tr class="plural">
     <td> ਰਾਮ ਅਤੇ ਸੀਤਾ</td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਜਾਂਦੇ ਰਹੇ ਸੀ/ਸਨ </td>
     <td>  </td>
     <td> Ram and Sita had been going to the market </td>
</tr>
<tr class="plural">
     <td> ਸੀਤਾ ਅਤੇ ਗੀਤਾ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> </td>
     <td> ਜਾਂਦੀਆਂ ਰਹੀਆਂ ਸੀ/ਸਨ </td>
     <td> Sita and Gita had been going to the market </td>
</tr>
</table>
<br/>

<h3>4. Past Perfect indefinite ਅਨਿਸ਼ਚਿਤ ਪੂਰਨ ਭੂਤ ਕਾਲ</h3>
<table class="verbConjugation">
<tr>
    <th rowspan=2 >Subject </th>
    <th rowspan=2>Object </th>
    <th colspan=2> Verb (phrase) </th>
    <th rowspan=2> English Translation </th>
</tr>
<tr>

     <th> Masculine </th>
     <th> Feminine </th>
</tr>
<tr class="singular" >
     <td> ਮੈਂ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td>  ਗਿਆ ਸੀ/ਸਾਂ  </td>
     <td> ਗਈ ਸੀ/ਸਾਂ</td>
     <td> I had gone to the market </td>
</tr> <tr class="plural">
     <td> ਅਸੀਂ </td>
     <td>  ਬਜ਼ਾਰ </td>
     <td> ਗਏ ਸੀ/ਸਾਂ </td>
     <td> ਗਈਆਂ ਸੀ/ਸਾਂ </td>
     <td> We had gone to the market  </td>
</tr><tr class="singular">
     <td> ਤੂੰ </td>
     <td> ਬਜ਼ਾਰ </td> 
     <td> ਗਿਆ ਸੀ/ਸੈਂ </td>
     <td> ਗਈ ਸੀ/ਸੈਂ </td>
     <td> You had gone to the market  </td>
</tr><tr class="plural">
     <td> ਤੁਸੀਂ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਗਏ ਸੀ/ਸਉ </td>
     <td> ਗਈਆਂ ਸੀ/ਸਉ</td>
     <td> You(plural) had gone to the market  </td>
</tr><tr class="singular">
     <td> ਓਹ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਗਿਆ ਸੀ </td>
     <td> ਗਈ ਸੀ </td>
     <td> He/She had gone to the market  </td>
</tr><tr class="plural">
     <td> ਓਹ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਗਏ ਸੀ/ਸਨ </td>
     <td> ਗਈਆਂ ਸੀ/ਸਨ </td>
     <td> They had gone to the market  </td>
</tr>
<tr class="singular">
     <td> ਰਾਮ  </td>
     <td>ਬਜ਼ਾਰ  </td>
     <td>ਗਿਆ ਸੀ </td>
     <td> </td>
     <td> Ram had gone to the market </td>
</tr>
<tr class="singular">
     <td>ਸੀਤਾ </td>
     <td>ਬਜ਼ਾਰ </td>
     <td> </td>
     <td>ਗਈ ਸੀ </td>
     <td>Sita had gone to the market </td>
</tr>
<tr class="plural">
     <td> ਰਾਮ ਅਤੇ ਸੀਤਾ</td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਗਏ ਸੀ/ਸਨ </td>
     <td>  </td>
     <td> Ram and Sita had gone to the market</td>
</tr>
<tr class="plural">
     <td> ਸੀਤਾ ਅਤੇ ਗੀਤਾ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> </td>
     <td> ਗਈਆਂ ਸੀ/ਸਨ </td>
     <td> Sita and Gita had gone to the market </td>
</tr>
</table>
<br/>

<h3>5. Past Perfect Definite  ਨਿਸ਼ਚਿਤ ਪੂਰਨ ਭੂਤ ਕਾਲ</h3>
<table class="verbConjugation">
<tr>
    <th rowspan=2 >Subject </th>
    <th rowspan=2>Object </th>
    <th colspan=2> Verb (phrase) </th>
    <th rowspan=2> English Translation </th>
</tr>
<tr>

     <th> Masculine </th>
     <th> Feminine </th>
</tr>
<tr class="singular" >
     <td> ਮੈਂ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td>  ਜਾ ਚੁੱਕਾ ਸੀ/ਸਾਂ  </td>
     <td> ਜਾ ਚੁੱਕੀ ਸੀ/ਸਾਂ </td>
     <td> </td>
</tr> <tr class="plural">
     <td> ਅਸੀਂ </td>
     <td>  ਬਜ਼ਾਰ </td>
     <td> ਜਾ ਚੁੱਕੇ ਸੀ/ਸਾਂ </td>
     <td> ਜਾ ਚੁੱਕੀਆਂ ਸੀ/ਸਾਂ </td>
     <td>  </td>
</tr><tr class="singular">
     <td> ਤੂੰ </td>
     <td> ਬਜ਼ਾਰ </td> 
     <td> ਜਾ ਚੁੱਕਾਂ ਸੀ/ਸੈਂ </td>
     <td> ਜਾ ਚੁੱਕੀ ਸੀ/ਸੈਂ </td>
     <td>  </td>
</tr><tr class="plural">
     <td> ਤੁਸੀਂ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਜਾ ਚੁੱਕੇ ਸੀ/ਸਉ </td>
     <td> ਜਾ ਚੁੱਕੀਆਂ ਸੀ/ਸਉ</td>
     <td>  </td>
</tr><tr class="singular">
     <td> ਓਹ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਜਾ ਚੁੱਕਾ ਸੀ </td>
     <td> ਜਾ ਚੁੱਕੀ ਸੀ </td>
     <td>  </td>
</tr><tr class="plural">
     <td> ਓਹ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਜਾ ਚੁੱਕੇ ਸੀ/ਸਨ </td>
     <td> ਜਾ ਚੁੱਕੀਆਂ ਸੀ/ਸਨ </td>
     <td>  </td>
</tr>
<tr class="singular">
     <td> ਰਾਮ  </td>
     <td>ਬਜ਼ਾਰ  </td>
     <td>ਜਾ ਚੁੱਕਾ ਸੀ </td>
     <td> </td>
     <td>  </td>
</tr>
<tr class="singular">
     <td>ਸੀਤਾ </td>
     <td>ਬਜ਼ਾਰ </td>
     <td> </td>
     <td>ਜਾ ਚੁੱਕੀ ਸੀ </td>
     <td> </td>
</tr>
<tr class="plural">
     <td> ਰਾਮ ਅਤੇ ਸੀਤਾ</td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਜਾ ਚੁੱਕੇ ਸੀ/ਸਨ </td>
     <td>  </td>
     <td> </td>
</tr>
<tr class="plural">
     <td> ਸੀਤਾ ਅਤੇ ਗੀਤਾ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> </td>
     <td> ਜਾ ਚੁੱਕੀਆਂ ਸੀ/ਸਨ </td>
     <td> Sita and Gita  </td>
</tr>
</table>
<br/>
<h3>6. Conditional Past Tense ਸ਼ਰਤੀ ਭੂਤ ਕਾਲ </h3>
<table class="verbConjugation">
<tr>
    <th rowspan=2> Conjugate </th>
    <th rowspan=2 >Subject </th>
    <th rowspan=2>Object </th>
    <th colspan=2> Verb (phrase) </th>
    <th rowspan=2> English Translation </th>
</tr>
<tr>

     <th> Masculine </th>
     <th> Feminine </th>
</tr>
<tr class="singular" >
     <td> ਜੇ </td>
     <td> ਮੈਂ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td colspan=2>  ਜਾਂਦਾ   </td>

     <td> If I went to the market </td>
</tr> <tr class="plural">
     <td> ਜੇ </td>
     <td> ਅਸੀਂ </td>
     <td>  ਬਜ਼ਾਰ </td>
     <td colspan=2> ਜਾਂਦੇ </td>
     <td> If we went to the market </td>
</tr><tr class="singular">
     <td> ਜੇ </td>
     <td> ਤੂੰ </td>
     <td> ਬਜ਼ਾਰ </td> 
     <td colspan=2> ਜਾਦਾਂ </td>
     <td> If you went to the market  </td>
</tr><tr class="plural">
     <td> ਜੇ </td>
     <td> ਤੁਸੀਂ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td colspan=2> ਜਾਦੇਂ </td>
     <td> If you(plural) went to the market  </td>
</tr><tr class="singular">
     <td> ਜੇ </td>
     <td> ਓਹ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td colspan=2> ਜਾਂਦਾ </td>
     <td> If he went to the market  </td>
</tr><tr class="plural">
     <td> ਜੇ </td>
     <td> ਓਹ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td colspan=2> ਜਾਂਦੇ </td>
     <td> If they went to the market  </td>
</tr>
<tr class="singular">
     <td> ਜੇ </td>
     <td> ਰਾਮ  </td>
     <td>ਬਜ਼ਾਰ  </td>
     <td colspan=2>ਜਾਂਦਾ </td>
     <td> If Ram went to the market  </td>
</tr>
<tr class="singular">
     <td> ਜੇ </td>
     <td>ਸੀਤਾ </td>
     <td>ਬਜ਼ਾਰ </td>
     <td colspan=2>ਜਾਂਦੀ </td>
     <td>If Sita went to the market </td>
</tr>
<tr class="plural">
     <td> ਜੇ </td>
     <td> ਰਾਮ ਅਤੇ ਸੀਤਾ</td>
     <td> ਬਜ਼ਾਰ </td>
     <td colspan=2> ਜਾਂਦੇ </td>
     <td>If Ram and Sita went to the market </td>
</tr>
<tr class="plural">
     <td> ਜੇ </td>
     <td> ਸੀਤਾ ਅਤੇ ਗੀਤਾ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td colspan=2> ਜਾਂਦੀਆਂ </td>
     <td> If Sita and Gita went to the market  </td>
</tr>
</table>
<br/>
</html>
{{{
!INFO
{{scanUser{<<image http://$1.tiddlyspace.com/bags/$1_public/tiddlers/SiteIcon spaceLink:yes 48 48>> @$1}}}{{scanText{<<view text wikified>>}}}
!TALK
{{scanUser{<<image http://$1.tiddlyspace.com/bags/$1_public/tiddlers/SiteIcon spaceLink:yes 48 48>> @$1 says}}}{{scanText{<<view text wikified>>}}}
!END
}}}
Click the "new tiddler" button towards the top right of the screen to write something in your space. You'll need to give it a title, some content and, optionally, some tags that will help you identify it later.

!Stuck for ideas?
Not sure what to write about? Not sure what to keep in your space? Other people use ~TiddlySpace for almost anything. How about some of the following:

* [[Save interesting sites|http://bookmarks.tiddlyspace.com]], images or articles from around the web so that you can refer back to them.
* [[Record your family tree|http://familytree.tiddlyspace.com]], store notes on long lost relatives or ancestors and map their relationship to you.
* [[Make up a pocketbook|http://pocketbook.tiddlyspace.com]] to store some useful information in, then print it out, [[fold it up|http://www.pocketmod.com/]], and take it with you.
* [[Plan your holiday|http://the-web-is-your-oyster.tiddlyspace.com/]], record where you're planning to go, note down places of interest and refer back to it later.
* [[Create a mindmap|http://mindmaps.tiddlyspace.com/]] to visualise your inner thoughts and see how they relate to each other.
* [[Set up a questionnaire|http://questionnaire.tiddlyspace.com/]] and get all your friends to answer it.

If you don't like any of those ideas, you can still use this space directly to keep notes and link them together, make a todo list and keep track of everything you're doing, or any one of a hundred million other things.

Still stuck? Check out the @featured space for more suggestions.

You can also [[socialise with others|How to socialise]].
/***
https://github.com/tiddlyweb/chrjs/raw/master/users.js
***/
//{{{
// chrjs users extension
// v0.5.0
//
// requires tiddlywebplugins.socialusers
// http://pypi.python.org/pypi/tiddlywebplugins.socialusers

/*jslint vars: true */
/*global jQuery, tiddlyweb */

(function($, tw) {

"use strict";

tw.routes.users = "{host}/users";
tw.routes.user = "{host}/users/{username}";

tw.User = function(username, password, host) {
	tw.Resource.apply(this, ["user", host]);
	this.username = username;
	this.password = password;
};
tw.User.prototype = new tw.Resource();
$.extend(tw.User.prototype, {
	create: function(callback, errback) {
		var uri = this.route().split("/"); // XXX: hacky!?
		uri.pop();
		uri = uri.join("/");
		var data = {
			username: this.username,
			password: this.password
		};
		var self = this;
		return $.ajax({
			url: uri,
			type: "POST",
			contentType: "application/json",
			data: JSON.stringify(data),
			success: callback,
			error: function(xhr, error, exc) {
				errback(xhr, error, exc, self);
			}
		});
	},
	setPassword: function(newPass, callback, errback) {
		this.old_password = this.password; // XXX: should not use underscore (consistency)
		this.password = newPass;
		return this.put(callback, errback);
	},
	data: ["password", "old_password"]
});

}(jQuery, tiddlyweb));
//}}}
<!--{{{-->
<div class='toolbar' macro='toolbar [[ToolbarCommands::EditToolbar]] icons:yes'></div>
<div class='heading editheading'>
	<div class='editor'><div class='title' macro='edit title'></div></div>
	<div class='spaceSiteIcon' macro='tiddlerOrigin label:no height:32 width:32 '></div>
	<div class='modifierIcon' macro='view modifier SiteIcon spaceLink:no label:no height:32 width:32 '></div>
	<div class='tagClear'></div>
</div>
<div class='annotationsBox' macro='annotations'>
	<div macro='setPrivacy'></div>
</div>
<div class='editor' macro='edit text'></div>
<div class='editor' macro='edit tags'></div>
<div class='editorFooter'>
	<span macro='message views.editor.tagPrompt'></span>
	<span macro='tagChooser excludeLists'></span>
</div>
<!--}}}-->
/***
|''Name''|TiddlySpaceFilters|
|''Description''|provide TiddlySpace-specific filter extensions|
|''Author''|Jon Robson|
|''Version''|0.6.1|
|''Status''|@@beta@@|
|''CoreVersion''|2.6.2|
|''Requires''|TiddlySpaceConfig|
|''License''|[[BSD|http://www.opensource.org/licenses/bsd-license.php]]|
!Usage
{{{
<<tsList Private>>
<<tsList Public>>
<<tsList Draft>>
}}}
!Code
***/
//{{{
(function($) {

var tiddlyspace = config.extensions.tiddlyspace;
var privateBag = tiddlyspace.getCurrentBag("private");
var publicBag = tiddlyspace.getCurrentBag("public");

config.filterHelpers = {
	is: {
		"private": function(tiddler) {
			var bag = tiddler.fields["server.bag"];
			return bag == privateBag;
		},
		"public": function(tiddler) {
			var bag = tiddler.fields["server.bag"];
			return bag == publicBag;
		},
		draft: function(tiddler) {
			var fields = tiddler.fields;
			var bag = fields["server.bag"];
			return (privateBag == bag && fields["publish.name"]) ? true : false;
		},
		local: function(tiddler) {
			return config.filterHelpers.is["public"](tiddler) ||
				config.filterHelpers.is["private"](tiddler);
		},
		unsynced: function(tiddler) {
			return tiddler ? tiddler.isTouched() : false;
		}
	}
};

config.filters.is = function(results, match) {
	var candidates = store.getTiddlers("title");
	var type = match[3];
	for (var i = 0; i < candidates.length; i++) {
		var tiddler = candidates[i];
		var helper = config.filterHelpers.is[type];
		if(helper && helper(tiddler)) {
			results.pushUnique(tiddler);
		}
	}
	return results;
};

})(jQuery);
//}}}
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xl="http://www.w3.org/1999/xlink" version="1.1" viewBox="450 366 38 57"
width="30" height="30">
	<g stroke="none" stroke-opacity="1" stroke-dasharray="none" fill="none" fill-opacity="1">
		<g>
			<path d="M 452.1094 421.2422 L 450 421.2422 L 450 423 L 487.9688 423 L 487.9688 421.2422 L 485.8595 421.2422 
			L 485.8595 377.29688 L 487.9688 377.29688 L 487.9688 375.53906 L 485.8595 375.53906 
			C 485.8595 375.53906 481.12463 371.59341 473.02023 370.52802 C 472.6824 368.9689 471.72098 366.75 468.9844 366.75 
			C 466.24783 366.75 465.28638 368.9689 464.94864 370.52802 
			C 456.84418 371.59341 452.1094 375.53906 452.1094 375.53906 L 450 375.53906 L 450 377.29688 L 452.1094 377.29688 
			Z M 467.12247 370.32086 L 467.12247 370.32086 C 467.3805 369.42395 467.90762 368.50781 468.9844 368.50781 
			C 470.0612 368.50781 470.5883 369.42395 470.84634 370.32086 
			C 470.24136 370.2848 469.62054 370.26562 468.9844 370.26562 
			C 468.34827 370.26562 467.72748 370.2848 467.12247 370.32086 Z M 454.21875 420.92804 L 454.21875 420.92804 
			C 455.46762 420.42087 456.32816 419.35281 456.32816 418.11716 L 456.32816 377.29688 L 458.4375 377.29688 
			L 458.4375 421.2422 L 454.21875 421.2422 Z M 460.5469 420.92804 L 460.5469 420.92804 
			C 461.79578 420.42087 462.65625 419.35281 462.65625 418.11716 L 462.65625 377.29688 L 464.76566 377.29688 
			L 464.76566 421.2422 L 460.5469 421.2422 Z M 466.87503 420.92804 L 466.87503 420.92804 
			C 468.1239 420.42087 468.9844 419.35281 468.9844 418.11716 L 468.9844 377.29688 L 471.09378 377.29688 
			L 471.09378 421.2422 L 466.87503 421.2422 Z M 473.2032 420.92804 L 473.2032 420.92804 
			C 474.45203 420.42087 475.31256 419.35281 475.31256 418.11716 L 475.31256 377.29688 L 477.4219 377.29688 
			L 477.4219 421.2422 L 473.2032 421.2422 Z M 479.5313 420.92804 L 479.5313 420.92804 
			C 480.78018 420.42087 481.64066 419.35281 481.64066 418.11716 L 481.64066 377.29688 L 483.75006 377.29688 
			L 483.75006 421.2422 L 479.5313 421.2422 Z" fill="black" class="glyph"/>
		</g>
	</g>
</svg>
/***
|''Name''|RandomColorPalettePlugin|
|''Description''|Adds a random color palette to TiddlyWiki|
|''Author''|Jon Robson|
|''Version''|1.4.0|
|''Status''|stable|
|''Source''|https://github.com/jdlrobson/TiddlyWikiPlugins/raw/master/plugins/RandomColorPalettePlugin/RandomColorPalettePlugin.js|
|''License''|[[BSD|http://www.opensource.org/licenses/bsd-license.php]]|
!Usage
{{{
<<RandomColorPalette>>
}}}
Sets and saves a random color palette on execution

{{{
<<RandomColorPaletteButton>>
}}}
Creates a button, which when clicked will change the color palette
More information at http://macros.tiddlyspace.com/#%5B%5BRandomColorPaletteButton%20macro%5D%5D
!Code
***/
//{{{
RGB.prototype.toRGBString = function() {
	return "rgb(%0,%1,%2)".format(parseInt(this.r * 255, 10),
		parseInt(this.g * 255, 10), parseInt(this.b * 255, 10))
}
function HSL_TO_RGB(h, s, l) { // h (hue) between 0 and 360, s (saturation) & l (lightness) between 0 and 1
	var c = l <= 0.5 ? 2 * l * s : ( 2 - (2 * l)) * s;
	var h1 = h / 60;
	var x = c * (1 - Math.abs((h1 % 2) - 1)); 
	var r, g, b;
	if(typeof(h) == 'undefined') {
		r = 0;
		g = 0;
		b = 0;
	} else if(0 <= h1 && h1 < 1) {
		r = c;
		g = x;
		b = 0;
	} else if(1 <= h1 && h1 < 2) {
		r = x;
		g = c;
		b = 0;
	} else if(2 <= h1 && h1 < 3) {
		r = 0;
		g = c;
		b = x;
	} else if(3 <= h1 && h1 < 4) {
		r = 0;
		g = x;
		b = c;
	} else if(4 <= h1 && h1 < 5) {
		r = x;
		g = 0;
		b = c;
	} else if(5 <= h1 && h1 < 6) {
		r = c;
		g = 0;
		b = x;
	}
	m = l - (0.5 * c);
	return new RGB(r + m, g + m, b + m);
}

(function($){
	var macro = config.macros.RandomColorPalette = {
		messagesOn: false, 
		changedPaletteText: "We have assigned you a random theme by adjusting the [[ColorPalette]] tiddler.\nDon't like it? Click <<RandomColorPalette>> for another one.", 
		handler: function(place, macroName, params, wikifier, paramString, tiddler) {
			paramString = paramString || "";
			var options = macro.getOptions(paramString);
			macro.generatePalette(options, true);
		},
		optionTypes: {
			floats: ["hue", "saturation", "darkest", "lightness", "huevariance", "dark", "pale", "light", "mid",
				"saturation_light", "saturation_pale", "saturation_mid", "saturation_dark"
			]
		},
		getOptions: function(paramString) {
			var args = paramString.parseParams("name", null, true, false, true)[0];
			var options = {};
			var numbers = macro.optionTypes.floats;
			for(var i in args) {
				options[i] = numbers.indexOf(i) > -1 ? parseFloat(args[i][0], 10) : args[i][0];
			}
			return options;
		},
		generateRandomNumber: function(min, max, info) {
			var num = (Math.random() * 1);
			info = !info ? { attempts:0 } : info;
			info.attempts += 1;
			var good = true;
			if(min == max) {
				return max;
			}
			if(min && num < min) {
				good = false;
			} else if(max && num > max) {
				good = false;
			}
			if(!good) {
				if(info.attempts < 5) {
					return macro.generateRandomNumber(min, max, info);
				} else {
					if(max) {
						return max;
					} else if(min) {
						return min;
					} else {
						return 1;
					}
				}
			}
			return num;
		},
		getExistingPalette: function(asJSON) {
			var title = "ColorPalette";
			var tiddlerText;
			if(store.tiddlerExists(title)) {
				tiddlerText = store.getTiddlerText(title);
			} else if(store.isShadowTiddler(title)){
				tiddlerText = config.shadowTiddlers[title];
			}
			if(asJSON) {
				var json = {};
				if(tiddlerText) {
					var lines = tiddlerText.split("\n");
					for(var i = 0; i < lines.length; i++) {
						var definition = lines[i].split(":");
						if(definition.length == 2) {
							var name = definition[0].trim();
							var value = definition[1].trim();
							json[name] = value;
						}
					}
				}
				return json;
			} else {
				return tiddlerText;
			}
		},
		generatePalette: function(options, save) {
			var outputRGB = options.rgb;
			var palette = macro.getExistingPalette(true);
			var hue = options.hue || Math.floor(Math.random() * 359);
			var saturation = options.saturation || macro.generateRandomNumber(0.3, 0.7);
			var dark = options.dark || options.darkest || macro.generateRandomNumber(0, 0.10);
			var pale = options.pale || options.lightness || macro.generateRandomNumber(0.90, 1);
			var delta = ( ( pale - dark ) / 3 );
			var mid = options.mid || dark + delta;
			var light = options.light || dark + (delta * 2);
			var lightness_values = {Dark: dark, Mid: mid, Light: light, Pale: pale};
			var saturation_values = {};
			for(i in lightness_values) {
				if(true) {
					saturation_values[i] = options["saturation_" + i.toLowerCase()] || saturation;
				}
			}

			var opposite_hue = (hue + 180) % 360;
			var seed = options.huevariance || Math.floor((85 * Math.random()) + 5); // we want it to be at least 5 degrees
			var huetwo = (opposite_hue + seed) % 360;
			var huethree = (opposite_hue - seed) % 360;
			if(huetwo < 0) {
				huetwo = 360 + huetwo;
			}
			if(huethree < 0) {
				huethree = 360 + huethree;
			}
			for(var j in lightness_values) {
				if(true) {
					var saturation = saturation_values[j];
					palette["Primary" + j] = HSL_TO_RGB(hue, saturation, lightness_values[j]);
					palette["Secondary" + j] = HSL_TO_RGB(huetwo, saturation, lightness_values[j]);
					palette["Tertiary" + j] = HSL_TO_RGB(huethree, saturation, lightness_values[j]);
				}
			}
			palette.Background = HSL_TO_RGB(hue, saturation, 0.92);
			palette.Foreground = HSL_TO_RGB(hue, saturation, 0.08);
			palette.ColorPaletteParameters = ["HSL([", hue, "|", seed, "], [", saturation_values.Pale, "|",
				saturation_values.Light, "|", saturation_values.Mid, "|", saturation_values.Dark, "],",
				"[", dark, "|", mid, "|", light, "|", pale, "])"].join("");
			// construct new ColorPalette
			var text = ["/*{{{*/\n"];
			var colorcode;
			for(var id in palette) {
				if(true) {
					var color = palette[id];
					colorcode = outputRGB ? color.toRGBString() : color.toString();
					text.push("%0: %1\n".format(id, colorcode));
				}
			}
			text.push("/*}}}*/");
			text = text.join("");
			if(save) {
				macro.saveColorPalette(text);
			}
			return text;
		},
		saveColorPalette: function(text) {
			var tid = store.getTiddler("ColorPalette");
			if(!tid) {
				tid = new Tiddler("ColorPalette");
				tid.fields = merge({}, config.defaultCustomFields);
			} // TODO: detect that the ColorPalette in the space comes from outside recipe
			tid.fields["server.page.revision"] = "false"; // edit conflicts dont matter

			// save the color palette in tid
			tid = store.saveTiddler(tid.title, tid.title, text, tid.modifier, tid.modified,
				tid.tags, tid.fields, false, tid.created, tid.creator);
			// an interval is used to cope with users clicking on the palette button quickly.
			if(macro._nextSave) {
				window.clearTimeout(macro._nextSave);
			}
			macro._nextSave = window.setTimeout(function() {
					autoSaveChanges(null, [tid]);
				}, 2000);
			// temporary workaround for IE.
			$.twStylesheet.remove({ id: "StyleSheetColors" });
			$.twStylesheet.remove({ id: "StyleSheet" });
			refreshAll();
			macro.reportChange();
			return tid;
		},
		reportChange: function() {
			if(macro.messagesOn) { // only display message once..
				var msgPlace = getMessageDiv();
				if(!$(".changedPalette", msgPlace)[0]) {
					var tempPlace = document.createElement("div");
					wikify("{{changedPalette{" + macro.changedPaletteText + "}}}", tempPlace);
					msgPlace.appendChild(tempPlace);
				}
			}
		}
	};
	var btnMacro = config.macros.RandomColorPaletteButton = {
			text: "New ColorPalette",
			tooltip: "Generate a random colour scheme for your TiddlyWiki",
			makeButton: function(place, options) {
				var btnHandler = function(ev) {
					var t = $(ev.target);
					var options = t.data("options");
					macro.generatePalette(options, true);
					ev.preventDefault();
					return false;
				};
				var btn = createTiddlyButton(place, this.text, this.tooltip, btnHandler);
				$(btn).data("options", options);
				return btn;
			},
			handler: function(place, macroName, params, wikifier, paramString, tiddler) {
				var options = macro.getOptions(paramString);
				btnMacro.makeButton(place, options);
			}
	};
})(jQuery);
//}}}
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xl="http://www.w3.org/1999/xlink" version="1.1" viewBox="78 222 60 60" 
width="30" height="30">
<g stroke="none" stroke-opacity="1" stroke-dasharray="none" fill="none" fill-opacity="1">
	<g>
		<path d="M 107.92718 244.14815 L 86.651474 222.89253 L 78.85206 230.69925 L 100.120415 251.9476 L 78.774 273.27396 
		L 86.57342 281.08075 L 107.927216 259.74707 L 129.39981 281.19946 L 137.19922 273.39267 L 115.73397 251.94763 
		L 137.121155 230.58054 L 129.32175 222.77374 Z" fill="black" class="glyph"/>
	</g>
</g>
</svg>
/***
|''Name''|TiddlyWebConfig|
|''Description''|configuration settings for TiddlyWebWiki|
|''Author''|FND|
|''Version''|1.3.2|
|''Status''|stable|
|''Source''|http://svn.tiddlywiki.org/Trunk/association/plugins/TiddlyWebConfig.js|
|''License''|[[BSD|http://www.opensource.org/licenses/bsd-license.php]]|
|''Requires''|TiddlyWebAdaptor ServerSideSavingPlugin|
|''Keywords''|serverSide TiddlyWeb|
!Code
***/
//{{{
(function($) {

if(!config.extensions.ServerSideSavingPlugin) {
	throw "Missing dependency: ServerSideSavingPlugin";
}
if(!config.adaptors.tiddlyweb) {
	throw "Missing dependency: TiddlyWebAdaptor";
}

if(window.location.protocol != "file:") {
	config.options.chkAutoSave = true;
}

var adaptor = tiddler.getAdaptor();
var recipe = tiddler.fields["server.recipe"];
var workspace = recipe ? "recipes/" + recipe : "bags/common";

var plugin = config.extensions.tiddlyweb = {
	host: tiddler.fields["server.host"].replace(/\/$/, ""),
	username: null,
	status: {},

	getStatus: null, // assigned later
	getUserInfo: function(callback) {
		this.getStatus(function(status) {
			callback({
				name: plugin.username,
				anon: plugin.username ? plugin.username == "GUEST" : true
			});
		});
	},
	hasPermission: function(type, tiddler) {
		var perms = tiddler.fields["server.permissions"];
		if(perms) {
			return perms.split(", ").contains(type);
		} else {
			return true;
		}
	}
};

config.defaultCustomFields = {
	"server.type": tiddler.getServerType(),
	"server.host": plugin.host,
	"server.workspace": workspace
};

// modify toolbar commands

config.shadowTiddlers.ToolbarCommands = config.shadowTiddlers.ToolbarCommands.
	replace("syncing ", "revisions syncing ");

config.commands.saveTiddler.isEnabled = function(tiddler) {
	return plugin.hasPermission("write", tiddler) && !tiddler.isReadOnly();
};

config.commands.deleteTiddler.isEnabled = function(tiddler) {
	return !readOnly && plugin.hasPermission("delete", tiddler);
};

// hijack option macro to disable username editing
var _optionMacro = config.macros.option.handler;
config.macros.option.handler = function(place, macroName, params, wikifier,
		paramString) {
	if(params[0] == "txtUserName") {
		params[0] = "options." + params[0];
		var self = this;
		var args = arguments;
		args[0] = $("<span />").appendTo(place)[0];
		plugin.getUserInfo(function(user) {
			config.macros.message.handler.apply(self, args);
		});
	} else {
		_optionMacro.apply(this, arguments);
	}
};

// hijack isReadOnly to take into account permissions and content type
var _isReadOnly = Tiddler.prototype.isReadOnly;
Tiddler.prototype.isReadOnly = function() {
	return _isReadOnly.apply(this, arguments) ||
		!plugin.hasPermission("write", this);
};

var getStatus = function(callback) {
	if(plugin.status.version) {
		callback(plugin.status);
	} else {
		var self = getStatus;
		if(self.pending) {
			if(callback) {
				self.queue.push(callback);
			}
		} else {
			self.pending = true;
			self.queue = callback ? [callback] : [];
			var _callback = function(context, userParams) {
				var status = context.serverStatus || {};
				for(var key in status) {
					if(key == "username") {
						plugin.username = status[key];
						config.macros.option.propagateOption("txtUserName",
							"value", plugin.username, "input");
					} else {
						plugin.status[key] = status[key];
					}
				}
				for(var i = 0; i < self.queue.length; i++) {
					self.queue[i](plugin.status);
				}
				delete self.queue;
				delete self.pending;
			};
			adaptor.getStatus({ host: plugin.host }, null, _callback);
		}
	}
};
(plugin.getStatus = getStatus)(); // XXX: hacky (arcane combo of assignment plus execution)

})(jQuery);
//}}}
/***
|''Name''|ToggleTiddlerPrivacyPlugin|
|''Version''|0.7.1|
|''Status''|@@beta@@|
|''Description''|Allows you to set the privacy of new tiddlers and external tiddlers within an EditTemplate, and allows you to set a default privacy setting|
|''CoreVersion''|2.6.1|
|''Requires''|TiddlySpaceConfig|
|''Source''|http://github.com/TiddlySpace/tiddlyspace/raw/master/src/plugins/ToggleTiddlerPrivacyPlugin.js|
!Notes
When used in conjunction with TiddlySpaceTiddlerIconsPlugin changing the privacy setting will also interact with any privacy icons.

Currently use of
{{{<<setPrivacy defaultValue:public>>}}} is in conflict with {{{<<newTiddler fields:"server.workspace:x_private">>}}}

There is an option, found in the tweak tab of the backstage, called txtPrivacyMode. Set this to either ''public'' or ''private'' depending on your security preference. If you choose not to set it then it will default to ''public''.
!Params
defaultValue:[private|public]
Allows you to set the default privacy value (Default is private)

!Code
***/
//{{{
(function($) {

	var tiddlyspace = config.extensions.tiddlyspace,
		macro;
	macro = config.macros.setPrivacy = {
		handler: function(place, macroName, params, wikifier, paramString, tiddler) {
			if(readOnly) {
				return;
			}
			var el = $(story.findContainingTiddler(place)),
				args = paramString.parseParams("name",
					null, true, false, true)[0],
				container = $("<div />").
					addClass("privacySettings").
					appendTo(place)[0],
				currentSpace = tiddlyspace.currentSpace.name,
				currentBag = tiddler ? tiddler.fields["server.bag"] : false,
				// XXX: is the following reliable?
				isNewTiddler = el.hasClass("missing") || !currentBag,
				tiddlerStatus = tiddlyspace.getTiddlerStatusType(tiddler),
				customFields = el.attr("tiddlyfields"),
				defaultValue = "public",
				options = config.macros.tiddlerOrigin ?
						config.macros.tiddlerOrigin.getOptions(paramString) :
						{};
			customFields = customFields ? customFields.decodeHashMap() : {};
			if(isNewTiddler || !["public", "private", "unsyncedPrivate",
					"unsyncedPublic"].contains(tiddlerStatus)) {
				if(args.defaultValue) {
					defaultValue = args.defaultValue[0].toLowerCase();
				} else {
					defaultValue = config.options.chkPrivateMode ?
							"private" : "public";
				}
				defaultValue = defaultValue ?
						"%0_%1".format(currentSpace, defaultValue) :
						customFields["server.bag"];
				this.createRoundel(container, tiddler, currentSpace,
						defaultValue, options);
			}
		},
		updateEditFields: function(tiddlerEl, bag) {
			var saveBagField = $('[edit="server.bag"]', tiddlerEl),
				saveWorkspaceField = $('[edit="server.workspace"]', tiddlerEl),
				input = $("<input />").attr("type", "hidden"),
				workspace = "bags/" + bag;
			if(saveBagField.length === 0) {
				input.clone().attr("edit", "server.bag").val(bag).
					appendTo(tiddlerEl);
			} else {
				saveBagField.val(bag);
			}
			// reset to prevent side effects
			$(tiddlerEl).attr("tiddlyFields", "");
			if(saveWorkspaceField.length === 0) {
				input.clone().attr("edit", "server.workspace").
					val(workspace).appendTo(tiddlerEl);
			} else {
				saveWorkspaceField.val(workspace);
			}
		},
		setBag: function(tiddlerEl, newBag, options) {
			var bagStatus,
				title = $(tiddlerEl).attr("tiddler"),
				tiddler = store.getTiddler(title),
				originButton = $(".originButton", tiddlerEl)[0],
				refreshIcon,
				newWorkspace = "bags/" + newBag,
				rPrivate = $("input[type=radio].isPrivate", tiddlerEl),
				rPublic = $("input[type=radio].isPublic", tiddlerEl);
			refreshIcon = function(type) {
				var originMacro = config.macros.tiddlerOrigin;
				if(originButton && originMacro) {
					options.noclick = true;
					originMacro.showPrivacyRoundel(tiddler, type,
							originButton, options);
				}
			};
			macro.updateEditFields(tiddlerEl, newBag);
			if(tiddler) {
				tiddler.fields["server.bag"] = newBag;
				// for external tiddlers
				tiddler.fields["server.workspace"] = newWorkspace;
			}
			if(newBag.indexOf("_public") > -1) {
				rPrivate.attr("checked", false);
				rPublic.attr("checked", true);
				bagStatus = "public";
			} else {
				rPublic.attr("checked", false); // explicitly do this for ie
				rPrivate.attr("checked", true);
				bagStatus = "private";
			}
			refreshIcon(bagStatus);
		},
		createRoundel: function(container, tiddler, currentSpace,
							   defaultValue, options) {
			var privateBag = "%0_private".format(currentSpace),
				publicBag = "%0_public".format(currentSpace),
				rbtn = $("<input />").attr("type", "radio").
					attr("name", tiddler.title),
				el = story.findContainingTiddler(container);
			rbtn.clone().val("private").addClass("isPrivate").
				appendTo(container);
			$("<label />").text("private").appendTo(container); // TODO: i18n
			rbtn.clone().val("public").addClass("isPublic")
				.appendTo(container);
			$("<label />").text("public").appendTo(container); // TODO: i18n
			$("[type=radio]", container).click(function(ev) {
				var btn = $(ev.target);
				tiddler.fields["server.page.revision"] = "false";
				if(btn.hasClass("isPrivate")) { // private button clicked.
					$(el).addClass("isPrivate").removeClass("isPublic");
					macro.setBag(el, privateBag, options);
				} else {
					$(el).addClass("isPublic").removeClass("isPrivate");
					macro.setBag(el, publicBag, options);
				}
			});
			window.setTimeout(function() {
				macro.setBag(el, defaultValue, options);
			}, 100);
			// annoyingly this is needed as customFields are added to end of EditTemplate so are not present yet
			// and don't seem to respect any existing customFields.
		}
	};

}(jQuery));
//}}}
!SpaceUnplugged
{{unpluggedSpaceTab{
{{wizard{
<<image unsyncedIcon width:48>> Sync is currently unavailable in ~TiddlyWiki due to security constraints in modern browsers. Research is being done to build a suitable alternative. In the meantime if you have changed content in an offline ~TiddlyWiki, you can get your content back into ~TiddlySpace by using the ''import'' functionality from the backstage of the online wiki.
}}}
}}}

!Menu
<<message messages.memberStatus>> <<homeLink>>
{{unsyncedList{<<message messages.syncListHeading>> <<list filter [is[unsynced]]>>}}}

running TiddlySpace@glossary version <<message extensions.tiddlyweb.status.tiddlyspace_version>>
{{autotable{
<<tiddler Backstage##Resources>>
}}}

!Resources
[[blog|@@blog]] [[documentation|@@docs]] [[featured spaces|@@featured]] 

!ImportExport
<<fileImport>>
You can download this TiddlySpace as an offline TiddlyWiki:

{{chunkyButton{<<exportSpace>>}}}

!BackstageTiddlers
|upload a <<message messages.privacySetting>> file: <<binaryUpload>>|<<closeAll>><<permaview>><<newTiddler>><<newJournal "DD MMM YYYY" "journal">><<saveChanges>>|
|>|<<search>>|
|>|<<tiddler Backstage##Tiddlers>>|

!Tiddlers
<<tabs
	txtMainTab
	"Recent" "Recently edited tiddlers" TabTimeline
	"All" "All tiddlers" TabAll
	"Public" "All public tiddlers" [[TiddlySpaceTabs##Public]]
	"Private" "All private tiddlers" [[TiddlySpaceTabs##Private]]
	"Tags" "All tags" TabTags
	"Spaces" "Tiddlers grouped by space" [[TiddlySpaceTabs##Spaces]]
	"Missing" "Missing tiddlers" TabMoreMissing
	"Orphans" "Orphaned tiddlers" TabMoreOrphans
	"Shadows" "Shadowed tiddlers" TabMoreShadowed
>>

!BatchOps
<<tabs
	txtPublisherTab
	"Private" "Move tiddlers from private to public" Backstage##BatchPrivate
	"Public" "Move tiddlers from public to private" Backstage##BatchPublic
>>

!BatchPrivate
<<TiddlySpacePublisher type:private>>

!BatchPublic
<<TiddlySpacePublisher type:public>>

!Plugins
''Note:'' Many of these plugins are core TiddlySpace plugins and cannot be changed unless first cloned.

<<tiddler PluginManager>>

!Tweaks
These options change behavior in TiddlyWiki //only// and may be ineffective in TiddlySpace.

<<tiddler AdvancedOptions>>
/***
|''Name''|TiddlySpaceRevertRevision|
|''Description''|Revert to a previous revision|
|''Author''|BenGillies|
|''Version''|0.1|
|''Status''|unstable|
|''Source''|http://github.com/TiddlySpace/tiddlyspace|
|''CodeRepository''|http://github.com/TiddlySpace/tiddlyspace|
|''License''|[[BSD|http://www.opensource.org/licenses/bsd-license.php]]|
|''CoreVersion''|2.6.0|
|''Requires''|TiddlyWebAdaptor TiddlySpaceRevisionView|
!Usage
Add a control button to revert to a particular revision.

The button must be called from within a revision, as generated by TiddlySpaceRevisionView
!Code
***/
//{{{
(function($) {

config.commands.revert = {
	text: "revert",
	tooltip: "make this revision the current one",
	handler: function(ev, src, title) {
		var revElem = story.getTiddler(title);
		var tidToRevert = store.getTiddler($(revElem).attr("revName"));

		var revision = store.getTiddler(title);
		if ((revision) && (tidToRevert)) {
			tidToRevert.text = revision.text;
			var newFields = merge({}, revision.fields);
			for (var fieldName in newFields) {
				if (fieldName.substr(0, 7) === "server.") {
					delete newFields[fieldName];
				}
			}
			merge(tidToRevert.fields, newFields);
			tidToRevert.tags = merge([], revision.tags);
			tidToRevert.fields.changecount = 1;
			delete tidToRevert.fields.doNotSave;

			store.saveTiddler(tidToRevert.title, tidToRevert.title,
				tidToRevert.text, null, null, tidToRevert.tags,
				tidToRevert.fields, false, tidToRevert.created, tidToRevert.creator);

			autoSaveChanges(true);
		}
	}
};

})(jQuery);
//}}}
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xl="http://www.w3.org/1999/xlink" version="1.1" viewBox="2 724 68 55" 
width="30" height="30">
<g stroke="none" stroke-opacity="1" stroke-dasharray="none" fill="none" fill-opacity="1">
	<g>
		<path d="M 2.25 756 L 11.25 747 L 24.75 760.4994 L 60.750004 724.4994 L 69.75 733.49902 
		L 24.749977 778.49976 Z" fill="#101010" class="glyph"/>
	</g>
</g>
</svg>
Once you have some content then you may choose to determine a tiddler, or set of tiddlers to display each time you load ~TiddlySpace. This is determined by the [[DefaultTiddlers]].
<!DOCTYPE html>
<html>
<head>
	<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
	<title>This Space</title>
	<link href="/bags/common/tiddlers/profile.css" type='text/css' rel='stylesheet' >
	<link href="/bags/common/tiddlers/admin.css" type='text/css' rel='stylesheet' >
	<!--[if lte IE 8]>
	<script type="text/javascript" src="/bags/common/tiddlers/json2.js"></script>
	<script type="text/javascript" src="/bags/common/tiddlers/es5-shim.min.js"></script>
	<![endif]-->
</head>
<body>
<div id="container">
	<div id="text-html" class="main section">
		<a class="app" href="/">home</a>
		<div class="left">
		<h2>About this space <button class='toggleNext'></button></h2>
		<div id="siteinfo"></div>
		<h2>Site Icon</h2>
		<div>
			<img id="siteicon" class="siteicon">
			<form id="upload" method="POST" enctype="multipart/form-data">
				<input type="hidden" name="title" value="SiteIcon" />
				<input type="hidden" name="tags" value="excludeLists">
				<input type="hidden" name="csrf_token" class="csrf" />
				<input type="file" name="file" accept="image/*" />
				<input class="btn" type="submit" value="upload" />
			</form>
			<div id="dropzone">Drop file here
				<img class="notloading" src="/bags/common/tiddlers/ajax-loader.gif" alt="submitting SiteIcon" />
			</div>
		</div>
		<h2>Vital Statistics</h2>
		<div id="info">please wait while information is loaded about this space...</div>
		<button class="spacereset">Reset Space</button>
		<div class="reset-confirm-wrap messageArea">
			<button class="close-btn" title="cancel reset">×</button>
			<p>Are you sure you want to reset the space? You can't go back! This will remove all the content from the space!</p>
			<form class="cf">
				<label for="reset-confirm">Enter the space name to confirm.</label>
				<input type="text" name="reset-confirm" class="reset-confirm-input inputBox" />
				<button type="submit">Reset Now</button>
			</form>
			<div class="reset-message-area">
				<p class="performing">Resetting...</p>
				<p class="finished">Reset Done!</p>
				<p class="recipe-error-msg">Error removing includes. Please remove manually.</p>
			</div>
		</div>
		</div>
		<div class="right">
		<div class="ts-membership">
			<h2>
				Add Member
				<a href="http://docs.tiddlyspace.com/What%20is%20a%20member%3F" title="What is a Member?" class="help">What is a Member?</a>
			</h2>
			<div>
				<p>Add a new member to your space by entering their name below. Enter a space name instead and prefix with @ to add everyone who is already a member of that space.</p>
				<form class="ts-members">
					<input class="inputBox" type="text" name="username">
					<input type="submit" value="Add Member" class="btn" />
				</form>
			</div>
			<h2>
				Existing Members <button class='toggleNext'></button>
			</h2>
			<div>
				Your space currently has the following members: 
				<ul class="ts-members"></ul>
			</div>
			<h2>
				Include Space
				<a class="help" href="http://docs.tiddlyspace.com/What%20is%20space%20inclusion%3F" title="What is inclusion?">What is Inclusion?</a>
			</h2>
			<form class="ts-includes">
				<input class="inputBox" type="text" name="spacename">
				<input type="submit" value="Include Space" class="btn" />
			</form>
		</div>
		<div>
			<h2>Included Spaces <button class='toggleNext'></button></h2>
			<div>
			This space includes the following spaces:
			<ul class="ts-includes"></ul>
			</div>
		</div>
		</div>
		<div class="clear"></div>
	</div>
</div>
<script src='/bags/common/tiddlers/backstage.js'></script>
<script src='/bags/common/tiddlers/jquery.js'></script>
<script src='/bags/tiddlyspace/tiddlers/chrjs'></script>
<script src='/bags/common/tiddlers/chrjs.space'></script>
<script src='/bags/common/tiddlers/chrjs.users'></script>
<script src='/bags/common/tiddlers/chrjs.identities'></script>
<script src='/bags/tiddlyspace/tiddlers/TiddlySpaceCSRF'></script>
<script src='/bags/common/tiddlers/jquery-form.js'></script>
<script src="/bags/common/tiddlers/siteiconupload.js"></script>
<script src="/bags/common/tiddlers/ts.js"></script>
<script src="/status.js"></script>
<script src="/bags/common/tiddlers/space.js"></script>
</body>
</html>
User-agent: *
Disallow: /bags
Disallow: /recipes
/***
|''Name''|ErrorHandlerPlugin|
|''Version''|0.4.3|
|''Author''|Jon Robson|
|''Description''|Localised tiddler save errors including edit conflict resolution.|
|''CoreVersion''|2.6.1|
|''Requires''|TiddlySpaceConfig|
***/
//{{{
(function($) {

var tiddlyspace = config.extensions.tiddlyspace;
var currentSpace = tiddlyspace.currentSpace.name;
tiddlyspace.getLocalTitle = function(title, workspace, suffix) {
	var endsWith = config.extensions.BinaryTiddlersPlugin.endsWith;
	if(!suffix) {
		var isPublic = endsWith(workspace, "_public");
		suffix = tiddlyspace.resolveSpaceName(workspace);
		if(currentSpace == suffix) {
			suffix = isPublic ? "public" : "private";
		} else {
			suffix = "@%0".format(suffix);
		}
	}
	return "%0 *(%1)*".format(title, suffix);
};

var sssp = config.extensions.ServerSideSavingPlugin;

var msgs = config.messages.editConflict = {
	loading: "Loading..",
	resolve: "[[Edit Conflict]]@glossary: this tiddler may have been changed by someone else.",
	reviewDiff: "review (recommended)",
	reviewDiffTooltip: "review changes made to this tiddler",
	reviewDiffError: "error retrieving revision.",
	save: "overwrite",
	saveTooltip: "make this revision the top revision of this tiddler",
	discard: "cancel",
	discardTooltip: "undo changes to this tiddler and get most recent version",
	diffTitle: "%0",
	diffFieldTitle: "%0 - fields",
	diffTextTitle: "%0 - text",
	updating: "updating your version...",
	diffHeader: ["Review the changes that have been made whilst you were editing this tiddler. ",
		"Fold relevant changes back into your version.\n",
		"{{removed{Red}}} highlight shows content removed. ",
		"{{added{Green}}} highlight shows content added.\n"].join(""),
	diffTextHeader: "View changes in text",
	diffFieldsHeader: "View changes in fields"
};

var plugin = config.extensions.errorHandler = {
	diffTags: ["excludeLists", "excludeMissing", "excludeSearch"],
	displayMessage: function(message, tiddler, context) {
		var desc = context && context.httpStatus ? context.statusText :
			sssp.locale.connectionError;
		var reportArea = plugin.reportError(tiddler.title);
		var msg = $("<div />").appendTo(reportArea);
		if(message == "saveConflict") {
			wikify(msgs.resolve, msg[0]);
			var choiceArea = $("<div />").appendTo(reportArea)[0];
			plugin.editConflictHandler(choiceArea, tiddler);
		} else {
			msg.text(sssp.locale[message].format(tiddler.title, desc));
		}
	},
	editConflictHandler: function(container, tiddler) {
		var title = tiddler.title;
		var myrev = tiddler.fields["server.page.revision"];
		// note user now needs to edit, fix problem and save. 
		// TODO: make sure this gets reset in save callback
		store.getTiddler(title).fields["server.page.revision"] = "false";

		var diffBtn = createTiddlyButton(container, msgs.reviewDiff, msgs.reviewDiffTooltip, function(ev) {
			var title = $(ev.target).data("title");
			plugin.displayDiff(ev.target, store.getTiddler(title), myrev);
		});
		var saveBtn = createTiddlyButton(container, msgs.save, msgs.saveTooltip, function(ev) {
				var title = $(ev.target).data("title");
				var tid = store.saveTiddler(store.getTiddler(title));
				autoSaveChanges(null, [tid]);
			});
		var ignoreBtn = createTiddlyButton(container, msgs.discard, msgs.discardTooltip, function(ev) {
			var title = $(ev.target).text(msgs.updating).data("title");
			plugin.resetToServerVersion(store.getTiddler(title));
		});
		$([diffBtn, ignoreBtn, saveBtn]).data("title", title);
	},
	getDiffTiddlerTexts: function(diffText) {
		var chunks = diffText.split("\n  \n");
		if(chunks.length < 2) {
			return [chunks[0], ""];
		} else {
			var diffFieldsText = "{{diff{\n%0\n}}}".format(chunks[0]);
			diffText = '{{diff{\n%0\n}}}'.format(chunks.splice(1, chunks.length).join("\n"));
			return [diffText, diffFieldsText];
		}
	},
	makeDiffTiddler: function(title, diff) {
		var newTiddler = new Tiddler(title);
		var tags = plugin.diffTags;
		newTiddler.text = msgs.loading;
		newTiddler.fields.doNotSave = true;
		newTiddler.tags = diff ? tags.concat(["diff"]) : tags;
		newTiddler = store.saveTiddler(newTiddler);
		$.extend(store.getTiddler(title).fields,
			config.defaultCustomFields); // allow option to save it
		return newTiddler;
	},
	displayDiff: function(src, tiddler, latestRevision) {
		var adaptor = tiddler.getAdaptor();
		var title = tiddler.title;
		var ts = new Date().formatString("0hh:0mm:0ss");
		var suffix = "edit conflict %0".format(ts);
		var diffTitle = tiddlyspace.getLocalTitle(msgs.diffTitle.format(title), "", suffix);
		var diffTextTitle = tiddlyspace.getLocalTitle(msgs.diffTextTitle.format(title), "", suffix);
		var diffFieldsTitle = tiddlyspace.getLocalTitle(msgs.diffFieldTitle.format(title), "", suffix);
		plugin.makeDiffTiddler(diffTextTitle, true);
		plugin.makeDiffTiddler(diffFieldsTitle, true);
		var newTiddler = plugin.makeDiffTiddler(diffTitle, false);
		newTiddler.text = ['%0\n<<slider chkViewDiffText "%1" "%2">>\n',
			'<<slider chkViewDiffField "%3" "%4">>'].join("").
			format(msgs.diffHeader, diffTextTitle, msgs.diffTextHeader,
				diffFieldsTitle, msgs.diffFieldsHeader);
		store.saveTiddler(newTiddler);

		var callback = function(r) {
			var text = plugin.getDiffTiddlerTexts(r);
			store.getTiddler(diffTextTitle).text = text[0];
			store.getTiddler(diffFieldsTitle).text = text[1];
			story.refreshTiddler(diffTitle, null, true);
		};
		var workspace = "bags/%0".format(tiddler.fields["server.bag"]);
		ajaxReq({
			type: "get",
			dataType: "text",
			url: "/diff?format=unified&rev1=%0/%1/%2&rev2=%0/%1".format(workspace, title, latestRevision),
			success: callback,
			error: function() {
				displayMessage(msgs.reviewDiffError);
			}
		});
		story.displayTiddler(src, diffTitle);
	},
	resetToServerVersion: function(tiddler) {
		var adaptor = tiddler.getAdaptor();
		var ctx = { 
			host: tiddler.fields["server.host"],
			workspace: "bags/" + tiddler.fields["server.bag"]
		};
		adaptor.getTiddler(tiddler.title, ctx, null, function(context) {
			store.saveTiddler(context.tiddler);
			story.refreshTiddler(tiddler.title);
			store.setDirty(false);
		});
	},
	reportError: function(title) {
		var el = story.getTiddler(title);
		if(!el) {
			el = story.displayTiddler(null, title);
		}
		return $("<div />").addClass("error annotation").prependTo(el)[0];
	}
};

sssp.reportFailure = function(message, tiddler, context) {
	config.options.chkViewDiffText = config.options.chkViewDiffText === undefined ?
		true : config.options.chkViewDiffText;
	config.options.chkViewDiffFields = config.options.chkViewDiffFields || false;
	plugin.displayMessage(message, tiddler, context);
};

})(jQuery);
//}}}
<html><nowiki>
<style>
.verbConjugation table{
     border: none;
     background-color: none;
     text-align: center;
}
.verbConjugation tr{
     border: none;
     background-color: none;     
}
.verbConjugation tr th{
     background-color: #519600;
     border: 1px solid #00ff00;
}
.verbConjugation tr.singular{
     background-color: #9ff33d;
}
.verbConjugation tr.plural{
     background-color: #B5F36D; 
}

.verbConjugation tr td{
     border: 1px solid #00ff00;
     text-align: center;
}

</style>

<h1>  Future Tense </h1>
<h2> ਜਾ (Go)</h2>
<h3>1. Future Indefinite Tense ਅਨਿਸ਼ਚਿਤ ਭਵਿੱਖਤ ਕਾਲ / ਸਾਧਾਰਣ ਭਵਿੱਖਤ ਕਾਲ</h3>

<table class="verbConjugation">
<tr>
    <th rowspan=2 >Subject </th>
    <th rowspan=2>Object </th>
    <th colspan=2> Verb (phrase) </th>
    <th rowspan=2> English Translation </th>
</tr>
<tr>

     <th> Masculine </th>
     <th> Feminine </th>
</tr>
<tr class="singular" >
     <td> ਮੈਂ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td>  ਜਾਂਵਾਗਾ </td>
     <td> ਜਾਂਵਾਗੀ</td>
     <td>I will go to the market </td>
</tr> <tr class="plural">
     <td> ਅਸੀਂ </td>
     <td>  ਬਜ਼ਾਰ </td>
     <td>  ਜਾਂਵਾਗੇ </td>
     <td> ਜਾਂਵਾਗੀਆਂ/ਜਾਂਵਾਗੇ </td>
     <td> We will go  to the market </td>
</tr><tr class="singular">
     <td> ਤੂੰ </td>
     <td> ਬਜ਼ਾਰ </td> 
     <td> ਜਾਂਵੇਗਾ </td>
     <td> ਜਾਂਵੇਗੀ </td>
     <td> You will go to the market </td>
</tr><tr class="plural">
     <td> ਤੁਸੀਂ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਜਾਂਵੋਗੇ/ਜਾਂਓਗੇ </td>
     <td> ਜਾਂਵੋਗੀਓ/ਜਾਂਓਗੇ </td>
     <td> You (plural) will go to the market </td>
</tr><tr class="singular">
     <td> ਓਹ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਜਾਵੇਗਾ/ਜਾਏਗਾ </td>
     <td> ਜਾਵੇਗੀ/ਜਾਏਗੀ </td>
     <td> He/She will go to the market </td>
</tr><tr class="plural">
     <td> ਓਹ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਜਾਂਣਗੇ </td>
     <td> ਜਾਣਗੀਆਂ  </td>
     <td> They will go to the market </td>
</tr>
<tr class="singular">
     <td> ਰਾਮ  </td>
     <td>ਬਜ਼ਾਰ  </td>
     <td>ਜਾਵੇਗਾ</td>
     <td>  </td>
     <td> Ram will go to the market </td>
</tr>
<tr class="singular">
     <td>ਸੀਤਾ </td>
     <td>ਬਜ਼ਾਰ </td>
     <td> </td>
     <td> ਜਾਵੇਗੀ </td>
     <td>Sita will go to the market </td>
</tr>
<tr class="plural">
     <td> ਰਾਮ ਅਤੇ ਸੀਤਾ</td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਜਾਣਗੇ </td>
     <td>  </td>
     <td> Ram and Sita will go to the market </td>
</tr>
<tr class="plural">
     <td> ਸੀਤਾ ਅਤੇ ਗੀਤਾ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> </td>
     <td> ਜਾਣਗੀਆਂ </td>
     <td> Sita and Gita will go to the market </td>
</tr>
</table>
<br/>
<table>
<tr>
     <td style="background-color: #9FF33d;" >Singular </td> <td style="background-color: #b5f36d;">Plural </td>
</tr>
</table>


<h3>2. Future Imperfect Continuous Tense ਅਪੂਰਨ ਚਾਲੂ ਭਵਿੱਖਤ ਕਾਲ</h3>
<table class="verbConjugation">
<tr>
    <th rowspan=2 >Subject </th>
    <th rowspan=2>Object </th>
    <th colspan=2> Verb (phrase) </th>
    <th rowspan=2> English Translation </th>
</tr>
<tr>

     <th> Masculine </th>
     <th> Feminine </th>
</tr>
<tr class="singular" >
     <td> ਮੈਂ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td>  ਜਾ ਰਿਹਾ ਹੋਵਾਂਗਾ  </td>
     <td> ਜਾ ਰਹੀ ਹੋਵਾਂਗੀ</td>
     <td>I will be going to the market </td>
</tr> <tr class="plural">
     <td> ਅਸੀਂ </td>
     <td>  ਬਜ਼ਾਰ </td>
     <td>  ਜਾ ਰਹੇ ਹੋਵਾਂਗੇ </td>
     <td> ਜਾ ਰਹੀਆਂ ਹੋਵਾਂਗੀਆਂ </td>
     <td> We will be going to the market </td>
</tr><tr class="singular">
     <td> ਤੂੰ </td>
     <td> ਬਜ਼ਾਰ </td> 
     <td> ਜਾ ਰਿਹਾ ਹੋਵੇਂਗਾ </td>
     <td> ਜਾ ਰਹੀ ਹੋਵੇਂਗੀ </td>
     <td> You will be going to the market </td>
</tr><tr class="plural">
     <td> ਤੁਸੀਂ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਜਾ ਰਹੇ ਹੋਵੋਂਗੇ </td>
     <td> ਜਾ ਰਹੀਆਂ ਹੋਵੋਂਗੀਆਂ</td>
     <td> You (plural) will be going to the market </td>
</tr><tr class="singular">
     <td> ਓਹ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਜਾ ਰਿਹਾ ਹੋਵੇਗਾ </td>
     <td> ਜਾ ਰਹੀ ਹੋਵੇਗਾ </td>
     <td> He/She will be going to the market </td>
</tr><tr class="plural">
     <td> ਓਹ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਜਾ ਰਹੇ ਹੋਵਣਗੇ/ਹੋਣਗੇ </td>
     <td> ਜਾ ਰਹੀਆਂ ਹੋਵਣਗੀਆਂ/ਹੋਣਗੀਆਂ </td>
     <td> They will be going to the market </td>
</tr>
<tr class="singular">
     <td> ਰਾਮ  </td>
     <td>ਬਜ਼ਾਰ  </td>
     <td>ਜਾ ਰਿਹਾ ਹੋਵੇਗਾ </td>
     <td> </td>
     <td> Ram will be going to the market </td>
</tr>
<tr class="singular">
     <td>ਸੀਤਾ </td>
     <td>ਬਜ਼ਾਰ </td>
     <td> </td>
     <td>ਜਾ ਹੋਵੇਗੀ </td>
     <td> Sita will be going to the market </td>
</tr>
<tr class="plural">
     <td> ਰਾਮ ਅਤੇ ਸੀਤਾ</td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਜਾ ਰਹੇ ਹੋਵਣਗੇ/ਹੋਣਗੇ </td>
     <td>  </td>
     <td> Ram and Sita will be going to the market </td>
</tr>
<tr class="plural">
     <td> ਸੀਤਾ ਅਤੇ ਗੀਤਾ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> </td>
     <td> ਜਾ ਰਹੀਆਂ ਹੋਣਗੀਆਂ </td>
     <td> Sita and Gita will be going to the market </td>
</tr>
</table>
<br/>
<table>
<tr>
     <td style="background-color: #9FF33d;" >Singular </td> <td style="background-color: #b5f36d;">Plural </td>
</tr>
</table>

<h3>3. Future Perfect indefinite ਅਨਿਸ਼ਚਿਤ ਪੂਰਨ ਭਵਿੱਖਤ ਕਾਲ</h3>
<table class="verbConjugation">
<tr>
    <th rowspan=2 >Subject </th>
    <th rowspan=2>Object </th>
    <th colspan=2> Verb (phrase) </th>
    <th rowspan=2> English Translation </th>
</tr>
<tr>

     <th> Masculine </th>
     <th> Feminine </th>
</tr>
<tr class="singular" >
     <td> ਮੈਂ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td>  ਗਿਆ ਹੋਵਾਂਗਾ  </td>
     <td> ਗਈ ਹੋਵਾਂਗੀ</td>
     <td> I will have gone to the market </td>
</tr> <tr class="plural">
     <td> ਅਸੀਂ </td>
     <td>  ਬਜ਼ਾਰ </td>
     <td> ਗਏ ਹੋਵਾਂਗੇ </td>
     <td> ਗਈਆਂ ਹੋਵਾਂਗੀਆਂ </td>
     <td> We will have gone to the market  </td>
</tr><tr class="singular">
     <td> ਤੂੰ </td>
     <td> ਬਜ਼ਾਰ </td> 
     <td> ਗਿਆ ਹੋਵੇਂਗਾ </td>
     <td> ਗਈ ਹੋਵੇਂਗੀ </td>
     <td> You will have gone to the market  </td>
</tr><tr class="plural">
     <td> ਤੁਸੀਂ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਗਏ ਹੋਵੋਂਗੇ </td>
     <td> ਗਈਆਂ ਹੋਵੋਂਗੀਆਂ</td>
     <td> You(plural) will have gone to the market  </td>
</tr><tr class="singular">
     <td> ਓਹ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਗਿਆ ਹੋਵੇਗੇ </td>
     <td> ਗਈ ਹੋਵੇਗੀ </td>
     <td> He/She will have gone to the market  </td>
</tr><tr class="plural">
     <td> ਓਹ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਗਏ ਹੋਣਗੇ </td>
     <td> ਗਈਆਂ ਹੋਣਗੀਆਂ </td>
     <td> They will have gone to the market  </td>
</tr>
<tr class="singular">
     <td> ਰਾਮ  </td>
     <td>ਬਜ਼ਾਰ  </td>
     <td>ਗਿਆ ਹੋਵੇਗਾ </td>
     <td> </td>
     <td> Ram will have gone to the market </td>
</tr>
<tr class="singular">
     <td>ਸੀਤਾ </td>
     <td>ਬਜ਼ਾਰ </td>
     <td> </td>
     <td>ਗਈ ਹੋਵੇਗੀ </td>
     <td>Sita will have gone to the market </td>
</tr>
<tr class="plural">
     <td> ਰਾਮ ਅਤੇ ਸੀਤਾ</td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਗਏ ਹੋਣਗੇ </td>
     <td>  </td>
     <td> Ram and Sita will have gone to the market</td>
</tr>
<tr class="plural">
     <td> ਸੀਤਾ ਅਤੇ ਗੀਤਾ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> </td>
     <td> ਗਈਆਂ ਹੋਣਗੀਆਂ </td>
     <td> Sita and Gita will have gone to the market </td>
</tr>
</table>
<br/>
<table>
<tr>
     <td style="background-color: #9FF33d;" >Singular </td> <td style="background-color: #b5f36d;">Plural </td>
</tr>
</table>

<h3>4. Future Perfect Definite  ਨਿਸ਼ਚਿਤ ਪੂਰਨ ਭੂਤ ਕਾਲ</h3>
<table class="verbConjugation">
<tr>
    <th rowspan=2 >Subject </th>
    <th rowspan=2>Object </th>
    <th colspan=2> Verb (phrase) </th>
    <th rowspan=2> English Translation </th>
</tr>
<tr>

     <th> Masculine </th>
     <th> Feminine </th>
</tr>
<tr class="singular" >
     <td> ਮੈਂ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td>  ਜਾ ਚੁੱਕਾ ਹੋਵਾਂਗਾ  </td>
     <td> ਜਾ ਚੁੱਕੀ ਹੋਵਾਂਗੀ </td>
     <td> </td>
</tr> <tr class="plural">
     <td> ਅਸੀਂ </td>
     <td>  ਬਜ਼ਾਰ </td>
     <td> ਜਾ ਚੁੱਕੇ ਹੋਵਾਂਗੇ </td>
     <td> ਜਾ ਚੁੱਕੀਆਂ ਹੋਵਾਂਗੀਆਂ </td>
     <td>  </td>
</tr><tr class="singular">
     <td> ਤੂੰ </td>
     <td> ਬਜ਼ਾਰ </td> 
     <td> ਜਾ ਚੁੱਕਾਂ ਹੋਵੇਂਗਾ </td>
     <td> ਜਾ ਚੁੱਕੀ ਹੋਵੇਂਗੀ </td>
     <td>  </td>
</tr><tr class="plural">
     <td> ਤੁਸੀਂ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਜਾ ਚੁੱਕੇ ਹੋਵੋਂਗੇ </td>
     <td> ਜਾ ਚੁੱਕੀਆਂ ਹੋਵੋਂਗੀਆਂ</td>
     <td>  </td>
</tr><tr class="singular">
     <td> ਓਹ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਜਾ ਚੁੱਕਾ ਹੋਵੇਗਾ </td>
     <td> ਜਾ ਚੁੱਕੀ ਹੋਵੇਗੀ </td>
     <td>  </td>
</tr><tr class="plural">
     <td> ਓਹ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਜਾ ਚੁੱਕੇ ਹੋਣਗੇ </td>
     <td> ਜਾ ਚੁੱਕੀਆਂ ਹੋਣਗੀਆਂ </td>
     <td>  </td>
</tr>
<tr class="singular">
     <td> ਰਾਮ  </td>
     <td>ਬਜ਼ਾਰ  </td>
     <td>ਜਾ ਚੁੱਕਾ ਹੋਵੇਗਾ </td>
     <td> </td>
     <td>  </td>
</tr>
<tr class="singular">
     <td>ਸੀਤਾ </td>
     <td>ਬਜ਼ਾਰ </td>
     <td> </td>
     <td>ਜਾ ਚੁੱਕੀ ਹੋਵੇਗੀ </td>
     <td> </td>
</tr>
<tr class="plural">
     <td> ਰਾਮ ਅਤੇ ਸੀਤਾ</td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਜਾ ਚੁੱਕੇ ਹੋਣਗੇ </td>
     <td>  </td>
     <td> </td>
</tr>
<tr class="plural">
     <td> ਸੀਤਾ ਅਤੇ ਗੀਤਾ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> </td>
     <td> ਜਾ ਚੁੱਕੀਆਂ ਹੋਣਗੀਆਂ </td>
     <td>   </td>
</tr>
</table>
<br/>
<table>
<tr>
     <td style="background-color: #9FF33d;" >Singular </td> <td style="background-color: #b5f36d;">Plural </td>
</tr>
</table>
<h3>5. Conditional Future Tense ਸ਼ਰਤੀ ਭੂਤ ਕਾਲ </h3>
<table class="verbConjugation">
<tr>
    <th rowspan=2> Conjugate </th>
    <th rowspan=2 >Subject </th>
    <th rowspan=2>Object </th>
    <th colspan=2> Verb (phrase) </th>
    <th rowspan=2> English Translation </th>
</tr>
<tr>

     <th> Masculine </th>
     <th> Feminine </th>
</tr>
<tr class="singular" >
     <td> ਜੇ </td>
     <td> ਮੈਂ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td >  ਜਾਵਾਂਗਾ  </td>
     <td >  ਜਾਵਾਂਗੀ  </td>
     <td> If I go to the market </td>
</tr> <tr class="plural">
     <td> ਜੇ </td>
     <td> ਅਸੀਂ </td>
     <td>  ਬਜ਼ਾਰ </td>
     <td colspan=2> ਜਾਵਾਂਗੇ</td>
     <td> If we go to the market </td>
</tr><tr class="singular">
     <td> ਜੇ </td>
     <td> ਤੂੰ </td>
     <td> ਬਜ਼ਾਰ </td> 
     <td> ਜਾਵੇਂਗਾ </td>
     <td> ਜਾਵੇਂਗੀ </td>
     <td> If you go to the market  </td>
</tr><tr class="plural">
     <td> ਜੇ </td>
     <td> ਤੁਸੀਂ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td colspan=2> ਜਾਵੋਂਗੇ </td>
     <td> If you(plural) go to the market  </td>
</tr><tr class="singular">
     <td> ਜੇ </td>
     <td> ਓਹ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਜਾਵੇਗਾ</td>
     <td> ਜਾਵੇਗੀ </td>
     <td> If he goes to the market  </td>
</tr><tr class="plural">
     <td> ਜੇ </td>
     <td> ਓਹ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td colspan=2> ਜਾਣਗੇ</td>
     <td> If they go to the market  </td>
</tr>
<tr class="singular">
     <td> ਜੇ </td>
     <td> ਰਾਮ  </td>
     <td>ਬਜ਼ਾਰ  </td>
     <td colspan=2>ਜਾਵੇਗਾ </td>
     <td> If Ram goes to the market  </td>
</tr>
<tr class="singular">
     <td> ਜੇ </td>
     <td>ਸੀਤਾ </td>
     <td>ਬਜ਼ਾਰ </td>
     <td colspan=2>ਜਾਵੇਗੀ</td>
     <td>If Sita goes to the market </td>
</tr>
<tr class="plural">
     <td> ਜੇ </td>
     <td> ਰਾਮ ਅਤੇ ਸੀਤਾ</td>
     <td> ਬਜ਼ਾਰ </td>
     <td colspan=2> ਜਾਣਗੇ</td>
     <td>If Ram and Sita go to the market </td>
</tr>
<tr class="plural">
     <td> ਜੇ </td>
     <td> ਸੀਤਾ ਅਤੇ ਗੀਤਾ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td colspan=2> ਜਾਣਗੀਆਂ</td>
     <td> If Sita and Gita go to the market  </td>
</tr>
</table>
<br/>
<table>
<tr>
     <td style="background-color: #9FF33d;" >Singular </td> <td style="background-color: #b5f36d;">Plural </td>
</tr>
</table>
</html>
<html><nowiki>
<style>
.verbConjugation table{
     border: none;
     background-color: none;
     text-align: center;
}
.verbConjugation tr{
     border: none;
     background-color: none;     
}
.verbConjugation tr th{
     background-color: #519600;
     border: 1px solid #00ff00;
}
.verbConjugation tr.singular{
     background-color: #9ff33d;
}
.verbConjugation tr.plural{
     background-color: #B5F36D; 
}

.verbConjugation tr td{
     border: 1px solid #00ff00;
     text-align: center;
}

</style>

<h1>  Past Tense </h1>
<h2> ਜਾ (Go)</h2>
<h3>1. Past Indefinite Tense ਅਨਿਸ਼ਚਿਤ ਭੂਤ ਕਾਲ / ਸਾਧਾਰਣ ਭੂਤ ਕਾਲ</h3>

<table class="verbConjugation">
<tr>
    <th rowspan=2 >Subject </th>
    <th rowspan=2>Object </th>
    <th colspan=2> Verb (phrase) </th>
    <th rowspan=2> English Translation </th>
</tr>
<tr>

     <th> Masculine </th>
     <th> Feminine </th>
</tr>
<tr class="singular" >
     <td> ਮੈਂ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td>  ਜਾਂਦਾ ਸੀ </td>
     <td> ਜਾਂਦੀ ਸੀ</td>
     <td>I went to the market </td>
</tr> <tr class="plural">
     <td> ਅਸੀਂ </td>
     <td>  ਬਜ਼ਾਰ </td>
     <td>  ਜਾਂਦੇ ਸੀ/ਸਾਂ </td>
     <td> ਜਾਂਦੀਆਂ ਸੀ/ਸਾਂ </td>
     <td> We went to the market </td>
</tr><tr class="singular">
     <td> ਤੂੰ </td>
     <td> ਬਜ਼ਾਰ </td> 
     <td> ਜਾਂਦਾ ਸੀ/ਸੈਂ </td>
     <td> ਜਾਂਦੀ ਸੀ/ਸੈਂ </td>
     <td> You went to the market </td>
</tr><tr class="plural">
     <td> ਤੁਸੀਂ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਜਾਂਦੇ ਸੀ/ਸਉ </td>
     <td> ਜਾਂਦੀਆਂ ਸੀ/ਸਉ</td>
     <td> You (plural) went to the market </td>
</tr><tr class="singular">
     <td> ਓਹ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਜਾਂਦਾ ਸੀ </td>
     <td> ਜਾਂਦੀ ਸੀ </td>
     <td> He/She went to the market </td>
</tr><tr class="plural">
     <td> ਓਹ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਜਾਂਦੇ ਸੀ/ਸਨ </td>
     <td> ਜਾਂਦੀਆਂ ਸੀ/ਸਨ </td>
     <td> They went to the market </td>
</tr>
<tr class="singular">
     <td> ਰਾਮ  </td>
     <td>ਬਜ਼ਾਰ  </td>
     <td>ਜਾਂਦਾ ਸੀ</td>
     <td>  </td>
     <td> Ram went to the market </td>
</tr>
<tr class="singular">
     <td>ਸੀਤਾ </td>
     <td>ਬਜ਼ਾਰ </td>
     <td> </td>
     <td> ਜਾਂਦੀ ਸੀ </td>
     <td>Sita went to the market </td>
</tr>
<tr class="plural">
     <td> ਰਾਮ ਅਤੇ ਸੀਤਾ</td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਜਾਂਦੇ ਸਨ </td>
     <td>  </td>
     <td> Ram and Sita went to the market </td>
</tr>
<tr class="plural">
     <td> ਸੀਤਾ ਅਤੇ ਗੀਤਾ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> </td>
     <td> ਜਾਂਦੀਆਂ ਸਨ </td>
     <td> Sita and Gita went to the market </td>
</tr>
</table>
<br/>
<table>
<tr>
     <td style="background-color: #9FF33d;" >Singular </td> <td style="background-color: #b5f36d;">Plural </td>
</tr>
</table>


<h3>2. Past Imperfect Continuous Tense ਅਪੂਰਨ ਚਾਲੂ ਭੂਤ ਕਾਲ</h3>
<table class="verbConjugation">
<tr>
    <th rowspan=2 >Subject </th>
    <th rowspan=2>Object </th>
    <th colspan=2> Verb (phrase) </th>
    <th rowspan=2> English Translation </th>
</tr>
<tr>

     <th> Masculine </th>
     <th> Feminine </th>
</tr>
<tr class="singular" >
     <td> ਮੈਂ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td>  ਜਾ ਰਿਹਾ ਸੀ/ਸਾਂ  </td>
     <td> ਜਾ ਰਹੀ ਸੀ/ਸਾਂ</td>
     <td>I was going to the market </td>
</tr> <tr class="plural">
     <td> ਅਸੀਂ </td>
     <td>  ਬਜ਼ਾਰ </td>
     <td>  ਜਾ ਰਹੇ ਸੀ/ਸਾਂ </td>
     <td> ਜਾ ਰਹੀਆਂ ਸੀ/ਸਾਂ </td>
     <td> We were going to the market </td>
</tr><tr class="singular">
     <td> ਤੂੰ </td>
     <td> ਬਜ਼ਾਰ </td> 
     <td> ਜਾ ਰਿਹਾ ਸੀ/ਸੈਂ </td>
     <td> ਜਾ ਰਹੀ ਸੀ/ਸੈਂ </td>
     <td> You were going to the market </td>
</tr><tr class="plural">
     <td> ਤੁਸੀਂ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਜਾ ਰਹੇ ਸੀ/ਸਉ </td>
     <td> ਜਾ ਰਹੀਆਂ ਸੀ/ਸਉ</td>
     <td> You (plural) were going to the market </td>
</tr><tr class="singular">
     <td> ਓਹ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਜਾ ਰਿਹਾ ਸੀ </td>
     <td> ਜਾ ਰਹੀ ਸੀ </td>
     <td> He/She was going to the market </td>
</tr><tr class="plural">
     <td> ਓਹ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਜਾ ਰਹੇ ਸੀ/ਸਨ </td>
     <td> ਜਾ ਰਹੀਆਂ ਸੀ/ਸਨ </td>
     <td> They were going to the market </td>
</tr>
<tr class="singular">
     <td> ਰਾਮ  </td>
     <td>ਬਜ਼ਾਰ  </td>
     <td>ਜਾ ਰਿਹਾ ਸੀ </td>
     <td> </td>
     <td> Ram was going to the market </td>
</tr>
<tr class="singular">
     <td>ਸੀਤਾ </td>
     <td>ਬਜ਼ਾਰ </td>
     <td> </td>
     <td>ਜਾ ਰਹੀ ਸੀ </td>
     <td> Sita was going to the market </td>
</tr>
<tr class="plural">
     <td> ਰਾਮ ਅਤੇ ਸੀਤਾ</td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਜਾ ਰਹੇ ਸੀ/ਸਨ </td>
     <td>  </td>
     <td> Ram and Sita were going to the market </td>
</tr>
<tr class="plural">
     <td> ਸੀਤਾ ਅਤੇ ਗੀਤਾ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> </td>
     <td> ਜਾ ਰਹੀਆਂ ਸੀ/ਸਨ </td>
     <td> Sita and Gita were going to the market </td>
</tr>
</table>
<br/>
<table>
<tr>
     <td style="background-color: #9FF33d;" >Singular </td> <td style="background-color: #b5f36d;">Plural </td>
</tr>
</table>

<h3>3. Past Perfect Continuous Tense ਪੂਰਨ ਚਾਲੂ ਭੂਤ ਕਾਲ</h3>
<table class="verbConjugation">
<tr>
    <th rowspan=2 >Subject </th>
    <th rowspan=2>Object </th>
    <th colspan=2> Verb (phrase) </th>
    <th rowspan=2> English Translation </th>
</tr>
<tr>

     <th> Masculine </th>
     <th> Feminine </th>
</tr>
<tr class="singular" >
     <td> ਮੈਂ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td>  ਜਾਂਦਾ ਰਿਹਾ ਸੀ/ਸਾਂ  </td>
     <td> ਜਾਂਦੀ ਰਹੀ ਸੀ/ਸਾਂ</td>
     <td>I had been going to the market </td>
</tr> <tr class="plural">
     <td> ਅਸੀਂ </td>
     <td>  ਬਜ਼ਾਰ </td>
     <td>  ਜਾਂਦੇ ਰਹੇ ਸੀ/ਸਾਂ </td>
     <td> ਜਾਂਦੀਆਂ ਰਹੀਆਂ ਸੀ/ਸਾਂ </td>
     <td> We had been going to the market </td>
</tr><tr class="singular">
     <td> ਤੂੰ </td>
     <td> ਬਜ਼ਾਰ </td> 
     <td> ਜਾਂਦਾ ਰਿਹਾ ਸੀ/ਸੈਂ </td>
     <td> ਜਾਂਦੀ ਰਹੀ ਸੀ/ਸੈਂ </td>
     <td> You had been going to the market </td>
</tr><tr class="plural">
     <td> ਤੁਸੀਂ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਜਾਂਦੇ ਰਹੇ ਸੀ/ਸਉ </td>
     <td> ਜਾਂਦੀਆਂ ਰਹੀਆਂ ਸੀ/ਸਉ </td>
     <td> You (plural) had been going to the market </td>
</tr><tr class="singular">
     <td> ਓਹ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਜਾਂਦਾ ਰਿਹਾ ਸੀ </td>
     <td> ਜਾਂਦੀ ਰਹੀ ਸੀ </td>
     <td> He/She had been going to the market </td>
</tr><tr class="plural">
     <td> ਓਹ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਜਾਂਦੇ ਰਹੇ ਸੀ/ਸਨ </td>
     <td> ਜਾਂਦੀਆਂ ਰਹੀਆਂ ਸੀ/ਸਨ </td>
     <td> They had been going to the market </td>
</tr>
<tr class="singular">
     <td> ਰਾਮ  </td>
     <td>ਬਜ਼ਾਰ  </td>
     <td>ਜਾਂਦਾ ਰਿਹਾ ਸੀ </td>
     <td> </td>
     <td> Ram had been going to market </td>
</tr>
<tr class="singular">
     <td>ਸੀਤਾ </td>
     <td>ਬਜ਼ਾਰ </td>
     <td> </td>
     <td>ਜਾਂਦੀ ਰਹੀ ਸੀ </td>
     <td> Sita had been going to the market </td>
</tr>
<tr class="plural">
     <td> ਰਾਮ ਅਤੇ ਸੀਤਾ</td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਜਾਂਦੇ ਰਹੇ ਸੀ/ਸਨ </td>
     <td>  </td>
     <td> Ram and Sita had been going to the market </td>
</tr>
<tr class="plural">
     <td> ਸੀਤਾ ਅਤੇ ਗੀਤਾ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> </td>
     <td> ਜਾਂਦੀਆਂ ਰਹੀਆਂ ਸੀ/ਸਨ </td>
     <td> Sita and Gita had been going to the market </td>
</tr>
</table>
<br/>
<table>
<tr>
     <td style="background-color: #9FF33d;" >Singular </td> <td style="background-color: #b5f36d;">Plural </td>
</tr>
</table>

<h3>4. Past Perfect indefinite ਅਨਿਸ਼ਚਿਤ ਪੂਰਨ ਭੂਤ ਕਾਲ</h3>
<table class="verbConjugation">
<tr>
    <th rowspan=2 >Subject </th>
    <th rowspan=2>Object </th>
    <th colspan=2> Verb (phrase) </th>
    <th rowspan=2> English Translation </th>
</tr>
<tr>

     <th> Masculine </th>
     <th> Feminine </th>
</tr>
<tr class="singular" >
     <td> ਮੈਂ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td>  ਗਿਆ ਸੀ/ਸਾਂ  </td>
     <td> ਗਈ ਸੀ/ਸਾਂ</td>
     <td> I had gone to the market </td>
</tr> <tr class="plural">
     <td> ਅਸੀਂ </td>
     <td>  ਬਜ਼ਾਰ </td>
     <td> ਗਏ ਸੀ/ਸਾਂ </td>
     <td> ਗਈਆਂ ਸੀ/ਸਾਂ </td>
     <td> We had gone to the market  </td>
</tr><tr class="singular">
     <td> ਤੂੰ </td>
     <td> ਬਜ਼ਾਰ </td> 
     <td> ਗਿਆ ਸੀ/ਸੈਂ </td>
     <td> ਗਈ ਸੀ/ਸੈਂ </td>
     <td> You had gone to the market  </td>
</tr><tr class="plural">
     <td> ਤੁਸੀਂ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਗਏ ਸੀ/ਸਉ </td>
     <td> ਗਈਆਂ ਸੀ/ਸਉ</td>
     <td> You(plural) had gone to the market  </td>
</tr><tr class="singular">
     <td> ਓਹ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਗਿਆ ਸੀ </td>
     <td> ਗਈ ਸੀ </td>
     <td> He/She had gone to the market  </td>
</tr><tr class="plural">
     <td> ਓਹ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਗਏ ਸੀ/ਸਨ </td>
     <td> ਗਈਆਂ ਸੀ/ਸਨ </td>
     <td> They had gone to the market  </td>
</tr>
<tr class="singular">
     <td> ਰਾਮ  </td>
     <td>ਬਜ਼ਾਰ  </td>
     <td>ਗਿਆ ਸੀ </td>
     <td> </td>
     <td> Ram had gone to the market </td>
</tr>
<tr class="singular">
     <td>ਸੀਤਾ </td>
     <td>ਬਜ਼ਾਰ </td>
     <td> </td>
     <td>ਗਈ ਸੀ </td>
     <td>Sita had gone to the market </td>
</tr>
<tr class="plural">
     <td> ਰਾਮ ਅਤੇ ਸੀਤਾ</td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਗਏ ਸੀ/ਸਨ </td>
     <td>  </td>
     <td> Ram and Sita had gone to the market</td>
</tr>
<tr class="plural">
     <td> ਸੀਤਾ ਅਤੇ ਗੀਤਾ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> </td>
     <td> ਗਈਆਂ ਸੀ/ਸਨ </td>
     <td> Sita and Gita had gone to the market </td>
</tr>
</table>
<br/>
<table>
<tr>
     <td style="background-color: #9FF33d;" >Singular </td> <td style="background-color: #b5f36d;">Plural </td>
</tr>
</table>

<h3>5. Past Perfect Definite  ਨਿਸ਼ਚਿਤ ਪੂਰਨ ਭੂਤ ਕਾਲ</h3>
<table class="verbConjugation">
<tr>
    <th rowspan=2 >Subject </th>
    <th rowspan=2>Object </th>
    <th colspan=2> Verb (phrase) </th>
    <th rowspan=2> English Translation </th>
</tr>
<tr>

     <th> Masculine </th>
     <th> Feminine </th>
</tr>
<tr class="singular" >
     <td> ਮੈਂ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td>  ਜਾ ਚੁੱਕਾ ਸੀ/ਸਾਂ  </td>
     <td> ਜਾ ਚੁੱਕੀ ਸੀ/ਸਾਂ </td>
     <td> </td>
</tr> <tr class="plural">
     <td> ਅਸੀਂ </td>
     <td>  ਬਜ਼ਾਰ </td>
     <td> ਜਾ ਚੁੱਕੇ ਸੀ/ਸਾਂ </td>
     <td> ਜਾ ਚੁੱਕੀਆਂ ਸੀ/ਸਾਂ </td>
     <td>  </td>
</tr><tr class="singular">
     <td> ਤੂੰ </td>
     <td> ਬਜ਼ਾਰ </td> 
     <td> ਜਾ ਚੁੱਕਾਂ ਸੀ/ਸੈਂ </td>
     <td> ਜਾ ਚੁੱਕੀ ਸੀ/ਸੈਂ </td>
     <td>  </td>
</tr><tr class="plural">
     <td> ਤੁਸੀਂ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਜਾ ਚੁੱਕੇ ਸੀ/ਸਉ </td>
     <td> ਜਾ ਚੁੱਕੀਆਂ ਸੀ/ਸਉ</td>
     <td>  </td>
</tr><tr class="singular">
     <td> ਓਹ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਜਾ ਚੁੱਕਾ ਸੀ </td>
     <td> ਜਾ ਚੁੱਕੀ ਸੀ </td>
     <td>  </td>
</tr><tr class="plural">
     <td> ਓਹ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਜਾ ਚੁੱਕੇ ਸੀ/ਸਨ </td>
     <td> ਜਾ ਚੁੱਕੀਆਂ ਸੀ/ਸਨ </td>
     <td>  </td>
</tr>
<tr class="singular">
     <td> ਰਾਮ  </td>
     <td>ਬਜ਼ਾਰ  </td>
     <td>ਜਾ ਚੁੱਕਾ ਸੀ </td>
     <td> </td>
     <td>  </td>
</tr>
<tr class="singular">
     <td>ਸੀਤਾ </td>
     <td>ਬਜ਼ਾਰ </td>
     <td> </td>
     <td>ਜਾ ਚੁੱਕੀ ਸੀ </td>
     <td> </td>
</tr>
<tr class="plural">
     <td> ਰਾਮ ਅਤੇ ਸੀਤਾ</td>
     <td> ਬਜ਼ਾਰ </td>
     <td> ਜਾ ਚੁੱਕੇ ਸੀ/ਸਨ </td>
     <td>  </td>
     <td> </td>
</tr>
<tr class="plural">
     <td> ਸੀਤਾ ਅਤੇ ਗੀਤਾ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td> </td>
     <td> ਜਾ ਚੁੱਕੀਆਂ ਸੀ/ਸਨ </td>
     <td> Sita and Gita  </td>
</tr>
</table>
<br/>
<table>
<tr>
     <td style="background-color: #9FF33d;" >Singular </td> <td style="background-color: #b5f36d;">Plural </td>
</tr>
</table>
<h3>6. Conditional Past Tense ਸ਼ਰਤੀ ਭੂਤ ਕਾਲ </h3>
<table class="verbConjugation">
<tr>
    <th rowspan=2> Conjugate </th>
    <th rowspan=2 >Subject </th>
    <th rowspan=2>Object </th>
    <th colspan=2> Verb (phrase) </th>
    <th rowspan=2> English Translation </th>
</tr>
<tr>

     <th> Masculine </th>
     <th> Feminine </th>
</tr>
<tr class="singular" >
     <td> ਜੇ </td>
     <td> ਮੈਂ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td colspan=2>  ਜਾਂਦਾ   </td>

     <td> If I went to the market </td>
</tr> <tr class="plural">
     <td> ਜੇ </td>
     <td> ਅਸੀਂ </td>
     <td>  ਬਜ਼ਾਰ </td>
     <td colspan=2> ਜਾਂਦੇ </td>
     <td> If we went to the market </td>
</tr><tr class="singular">
     <td> ਜੇ </td>
     <td> ਤੂੰ </td>
     <td> ਬਜ਼ਾਰ </td> 
     <td colspan=2> ਜਾਦਾਂ </td>
     <td> If you went to the market  </td>
</tr><tr class="plural">
     <td> ਜੇ </td>
     <td> ਤੁਸੀਂ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td colspan=2> ਜਾਦੇਂ </td>
     <td> If you(plural) went to the market  </td>
</tr><tr class="singular">
     <td> ਜੇ </td>
     <td> ਓਹ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td colspan=2> ਜਾਂਦਾ </td>
     <td> If he went to the market  </td>
</tr><tr class="plural">
     <td> ਜੇ </td>
     <td> ਓਹ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td colspan=2> ਜਾਂਦੇ </td>
     <td> If they went to the market  </td>
</tr>
<tr class="singular">
     <td> ਜੇ </td>
     <td> ਰਾਮ  </td>
     <td>ਬਜ਼ਾਰ  </td>
     <td colspan=2>ਜਾਂਦਾ </td>
     <td> If Ram went to the market  </td>
</tr>
<tr class="singular">
     <td> ਜੇ </td>
     <td>ਸੀਤਾ </td>
     <td>ਬਜ਼ਾਰ </td>
     <td colspan=2>ਜਾਂਦੀ </td>
     <td>If Sita went to the market </td>
</tr>
<tr class="plural">
     <td> ਜੇ </td>
     <td> ਰਾਮ ਅਤੇ ਸੀਤਾ</td>
     <td> ਬਜ਼ਾਰ </td>
     <td colspan=2> ਜਾਂਦੇ </td>
     <td>If Ram and Sita went to the market </td>
</tr>
<tr class="plural">
     <td> ਜੇ </td>
     <td> ਸੀਤਾ ਅਤੇ ਗੀਤਾ </td>
     <td> ਬਜ਼ਾਰ </td>
     <td colspan=2> ਜਾਂਦੀਆਂ </td>
     <td> If Sita and Gita went to the market  </td>
</tr>
</table>
<br/>
<table>
<tr>
     <td style="background-color: #9FF33d;" >Singular </td> <td style="background-color: #b5f36d;">Plural </td>
</tr>
</table>
</html>
<<list filter "[tag[Punjabi Courses]]">>
/***
|''Name''|TiddlySpaceTiddlerIconsPlugin|
|''Version''|0.8.10|
|''Status''|@@beta@@|
|''Author''|Jon Robson|
|''Description''|Provides ability to render SiteIcons and icons that correspond to the home location of given tiddlers|
|''Source''|http://github.com/TiddlySpace/tiddlyspace/raw/master/src/plugins/TiddlySpaceTiddlerIconsPlugin.js|
|''Requires''|TiddlySpaceConfig BinaryTiddlersPlugin ImageMacroPlugin TiddlySpacePublishingCommands|
!Notes
{{{<<tiddlerOrigin>>}}} shows the origin of the tiddler it is being run on.
In TiddlySpace terms this means it will determine whether the tiddler is external, public or private.
Where private it will analyse whether a public version exists and distinguish between the different scenarios.
If a tiddler is external, the SiteIcon of that external space will be shown

!Parameters
width / height : define a width or height of the outputted icon
label: if label parameter is set to yes, a label will accompany the icon.
!Code
***/
//{{{
(function($) {

if(!config.macros.image) {
	throw "Missing dependency: ImageMacroPlugin";
}

var imageMacro = config.macros.image;
var tiddlyspace = config.extensions.tiddlyspace;
var tweb = config.extensions.tiddlyweb;
var cmds = config.commands;
var cmd = cmds.publishTiddler;
tiddlyspace.resolveSpaceName = function(value) {
	var endsWith = config.extensions.BinaryTiddlersPlugin.endsWith;
	if(value) {
		value = value.indexOf("bags/") === 0 ? value.substr(5) : value;
		value = value.indexOf("recipes/") === 0 ? value.substr(8) : value;
		if(value.indexOf("@") === 0) {
			value = value.substr(1);
		}
		if(endsWith(value, "_public")) {
			value = value.substr(0, value.length - 7);
		} else if(endsWith(value, "_private")) {
			value = value.substr(0, value.length - 8);
		}
		value = value.toLowerCase();
	}
	return value;
};

tiddlyspace.renderAvatar = function(place, value, options) {
	options = options ? options : {};
	options.labelOptions = options.labelOptions ? options.labelOptions : { include: false, height: 48, width: 48 };
	options.imageOptions = options.imageOptions ? options.imageOptions : {};
	options.imageOptions.altImage = "/bags/common/tiddlers/defaultUserIcon";
	var container = $('<div class="siteIcon" />').appendTo(place);
	value = tiddlyspace.resolveSpaceName(value);

	tweb.getStatus(function(status) {
		var link, noLabel;
		if(!value || value == config.views.wikified.defaultModifier ||
			value == config.views.wikified.shadowModifier) {
			var icon = config.views.wikified.shadowModifier == value ? "shadowIcon" : "missingIcon";
			if(store.tiddlerExists(icon)) {
				imageMacro.renderImage(container, icon, options.imageOptions);
			} else {
				noLabel = true;
			}
		} else {
			var spaceURI;
			if(value != tiddlyspace.currentSpace.name) {
				spaceURI = options.notSpace ? tiddlyspace.getHost(status.server_host) :
					tiddlyspace.getHost(status.server_host, value);
			}
			link = spaceURI ? $("<a />").attr("href", spaceURI) : $("<span />");
			link.text(value);

			var imageOptions = options.imageOptions;
			if(options.spaceLink && !imageOptions.link) {
				imageOptions.link = spaceURI;
			}
			var avatar = options.notSpace ? false : value;
			var uri = tiddlyspace.getAvatar(status.server_host, avatar);
			imageMacro.renderImage(container, uri, options.imageOptions);
			if(!value) {
				value = "tiddlyspace";
			}
		}
		if(!noLabel && options.labelOptions.include) {
			var prefix = $("<span />").text(options.labelOptions.prefix || "")[0];
			var suffix = $("<span />").text(options.labelOptions.suffix || "")[0];
			$('<div class="label" />').append(prefix).append(link).
				append(suffix).appendTo(container);
		}
	});
	if(value) {
		var prefix = options.labelOptions.prefix || "";
		var suffix = options.labelOptions.suffix || "";
		var label = "%0%1%2".format(prefix, value, suffix);
		$(container).attr("title", label);
	}
};

var originMacro = config.macros.tiddlerOrigin = {
	locale: {
		"shadow": "shadow tiddler",
		"missing": "missing tiddler",
		"private": "private",
		"unknown": "unknown state",
		"public": "public",
		"unsyncedPrivate": "unsynced and private",
		"unsyncedPublic": "unsynced and public",
		externalPrefix: "from ",
		externalBagSuffix: " bag",
		externalSuffix: " space",
		publishPrivateDeletePrivate: "Are you sure you want to make this tiddler public?",
		moveToPrivate: "Are you sure you want to make this tiddler private? Only members will be able to see it.",
		pleaseWait: "please wait..",
		keepPublic: "keep public",
		cannotPublishDirtyTiddler: "The current tiddler is unsaved so cannot be published. Please save the tiddler first.",
		keepPrivate: "keep private",
		makePublic: "make public",
		makePrivate: "make private"
	},
	handler: function(place, macroName, params,wikifier, paramString, tiddler){
		var adaptor = tiddler.getAdaptor();
		var btn = $("<div />").addClass("originButton").attr("params", paramString).
			attr("refresh", "macro").attr("macroName", macroName).appendTo(place)[0];
		$(btn).data("tiddler", tiddler);
		originMacro.refresh(btn);
	},
	refresh: function(btn) {
		$(btn).empty();
		var paramString = $(btn).attr("params");
		var tiddler = $(btn).data("tiddler");
		var options = originMacro.getOptions(paramString);
		var type = tiddlyspace.getTiddlerStatusType(tiddler);
		originMacro.renderIcon(tiddler, type, btn, options);
	},
	getOptions: function(paramString) {
		paramString = "%0 label:no width:48 height:48 spaceLink:yes preserveAspectRatio:yes".format(paramString);
		var parsedParams = paramString.parseParams("name");
		var params = parsedParams[0].name;
		var options = {
			labelOptions: originMacro._getLabelOptions(parsedParams),
			imageOptions: imageMacro.getArguments(paramString, []),
			noclick: parsedParams[0].interactive &&
				parsedParams[0].interactive[0] == "no" ? true : false
		};
		if(!options.noclick) {
			var spaceLink = parsedParams[0].spaceLink;
			options.spaceLink = spaceLink && spaceLink[0] == "no" ? false : true;
		} else {
			options.spaceLink = false;
		}
		return options;
	},
	_getLabelOptions: function(parsedParams) {
		parsedParams = parsedParams[0];
		var includeLabel = !parsedParams.label || ( parsedParams.label && parsedParams.label[0] == "yes" );
		var prefix = parsedParams.labelPrefix ? parsedParams.labelPrefix[0] : false;
		var suffix = parsedParams.labelSuffix ? parsedParams.labelSuffix[0] : false;
		return { include: includeLabel, suffix: suffix, prefix: prefix };
	},
	_isSpace: function(value) {
		value = value ? value : "";
		var endsWith = config.extensions.BinaryTiddlersPlugin.endsWith;
		if(endsWith(value, "_private") || endsWith(value, "_public")) {
			return true;
		} else {
			return false;
		}
	},
	renderIcon: function(tiddler, type, button, options) {
		var locale = originMacro.locale;
		originMacro.annotateTiddler(button, type);
		if(type != "external") {
			originMacro.showPrivacyRoundel(tiddler, type, button,
				options);
		} else {
			var prefix = options.labelOptions.prefix, suffix = options.labelOptions.suffix;
			var space = tiddler.fields["server.bag"];
			options.notSpace = !originMacro._isSpace(space);
			options.labelOptions.prefix = prefix ? prefix : locale.externalPrefix;
			options.labelOptions.suffix = suffix ? suffix : (options.notSpace ? locale.externalBagSuffix : locale.externalSuffix);

			tiddlyspace.renderAvatar(button, space, options);
		}
	},
	showPrivacyRoundel: function(thisTiddler, privacyType, button, options) {
		// there is a public tiddler as well as the current tiddler!
		// TODO: not this is not enough.. we also need to check if the public tiddler is the same as..
		// .. the private tiddler to determine whether this is a draft
		// use of hashes would be useful here.
		$(button).empty();
		var icon = "%0Icon".format(privacyType);
		if(privacyType.indexOf("unsynced") === 0 && !store.tiddlerExists(icon)) {
			icon = "unsyncedIcon";
		}
		if(privacyType == "shadow") {
			if(!store.tiddlerExists(icon)) {
				icon = "bags/tiddlyspace/tiddlers/SiteIcon";
			}
		}
		if(privacyType == "missing" && !store.tiddlerExists(icon)) {
			return; // the user is not making use of the missingIcon
		} else {
			imageMacro.renderImage(button, icon, options.imageOptions);
			originMacro.showLabel(button, privacyType, options.labelOptions);
			var cmd = originMacro.iconCommands[privacyType];
			if(cmd && thisTiddler && !options.noclick) {
				$(button).click(function(ev) {
					cmd(ev, thisTiddler);
				});
			}
		}
	},
	annotateTiddler: function(place, type) {
		var tidEl = $(story.findContainingTiddler(place));
		tidEl.
			removeClass("private public external privateAndPublic privateNotPublic shadow").
			addClass(type);
	},
	showLabel: function(button, type, options) {
		var locale = originMacro.locale;
		var label = options.label ? options.label : locale[type];
		label = label ? label : locale.unknown;
		if(options && options.include) {
			$('<div class="roundelLabel" />').html(label).appendTo(button);
		}
		$(button).attr("title", label);
	},
	confirm: function(ev, msg, onYes, options) {
		options = options ? options : {};
		onYes = onYes ? onYes : function(ev) {};
		var btn = $(".originButton", $(ev.target).parents())[0];
		var popup = Popup.create(btn);
		$(popup).addClass("confirmationPopup");
		$("<div />").addClass("message").text(msg).appendTo(popup);
		$("<button />").addClass("button").text(options.yesLabel || "yes").appendTo(popup).click(onYes);
		$("<button />").addClass("button").text(options.noLabel || "no").click(function(ev) {
			Popup.remove();
		}).appendTo(popup);
		Popup.show();
		ev.stopPropagation();
		return false;
	},
	alert: function(ev, msg) {
		var popup = Popup.create(ev.target);
		$(popup).addClass("confirmationPopup alert");
		$("<div />").addClass("message").text(msg).appendTo(popup);
		Popup.show();
		ev.stopPropagation();
	},
	reportDirty: function(el) {
		originMacro.alert(el, originMacro.locale.cannotPublishDirtyTiddler);
	},
	iconCommands: {
		"public": function(ev, tiddler) {
			if(!readOnly) {
				var locale = originMacro.locale;
				var msg = locale.moveToPrivate;
				if(story.isDirty(tiddler.title)) {
					originMacro.reportDirty(ev);
				} else {
					originMacro.confirm(ev, msg, function(ev) {
						var target = $(ev.target);
						var onComplete = function(info) {};
						var privateBag = cmd.toggleBag(tiddler, "private");
						cmd.moveTiddler(tiddler, {
							title: tiddler.title,
							fields: { "server.bag": privateBag }
						}, onComplete);
					}, { yesLabel: locale.makePrivate, noLabel: locale.keepPublic });
				}
			}
		},
		"private": function(ev, tiddler) {
			if(!readOnly) {
				var locale = originMacro.locale;
				var adaptor = tiddler.getAdaptor();
				var publishTo = tiddler.fields["publish.name"] || tiddler.title;
				var workspace = "bags/%0".format(tiddler.fields["server.bag"]);
				tiddler.fields["server.workspace"] = workspace;
				var publicBag = cmd.toggleBag(tiddler, "public");
				var msg;
				msg = locale.publishPrivateDeletePrivate;
				var title = tiddler.title;
				var newTitle = publishTo || tiddler.title;
				tiddler.fields["server.page.revision"] = "false";
				store.addTiddler(tiddler);
				if(story.isDirty(tiddler.title)) {
					originMacro.reportDirty(ev);
				} else {
					originMacro.confirm(ev, msg, function(ev) {
						var onComplete = function(info) {};
						cmd.moveTiddler(tiddler, {
							title: newTitle,
							fields: { "server.bag": publicBag }
						}, onComplete);
					}, { yesLabel: locale.makePublic, noLabel: locale.keepPrivate });
				}
			}
		}
	}
};

})(jQuery);
//}}}
In the last topic you learnt the basics of Gurmukhi script. Lets take this further and learn names of some common things we find around around us:

|!Punjabi|!Prounciation|!English|
|!House and related|>|>|
|ਘਰ|ਘ+ਰ|Home|
|ਮਕਾਨ|ਮ+ਕਾ+ਨ|House|
|ਕਮਰਾ|ਕ+ਮ+ਰਾ|Room|
|ਦਿਵਾਰ|ਦਿ+ਵਾ+ਰ|Wall|
|ਖਿੜਕੀ|ਖਿ+ੜ+ਕੀ|Window|
|ਦਰਵਾਜਾ|ਦ+ਰ+ਵਾ+ਜਾ|Door|
|!Machines and related|>|>|
|ਟੀ.ਵੀ|ਟੀ.+ਵੀ.|
|ਫ੍ਰਿੱਜ|ਫ੍ਰਿੱ+ਜ|
|ਰੇਡੀਓ|ਰੇ+ਡੀ+ਓ|
|ਪੱਖਾ|ਪੱ+ਖਾ|
|ਬੱਲਬ|ਬੱ+ਲ+ਬ|
|ਟ੍ਯੂਬ|ਟ੍ਯੂ+ਬ|
|ਏਸੀ|ਏ.+ਸੀ.|
|ਕੂਲਰ|ਕੂ+ਲ+ਰ|
|ਕੰਪ੍ਯੂਟਰ|ਕੰ+ਪ੍ਯੂ+ਟ+ਰ|
|ਮਾਊਸ|ਮਾ+ਊ+ਸ|
|ਸਕਰੀਨ|ਸ+ਕ+ਰੀ+ਨ|
|ਕੀ-ਬੋਰਡ|ਕੀ+-+ਬੋ+ਰ+ਡ|
|ਸੀ.ਪੀ.ਯੂ.|ਸੀ.+ਪੀ.+ਯੂ.|
|ਸੀ.ਡੀ.|ਸੀ.+ਡੀ.+|
|ਪੈੱਨ ਡ੍ਰਾਈਵ|ਪੈੱ+ਨ  ਡ੍ਰਾ+ਈ+ਵ|
----
ਕੁਰਸੀ
ਮੇਜ਼
ਮੰਜਾ
ਬਿਸਤਰਾ
ਸਿਰ੍ਹਾਣਾ
ਅਲਮਾਰੀ
ਪੜਦਾ
ਕਮਰਾ
ਦਿਵਾਰ
ਖਿੜਕੀ
ਸ਼ੀਸ਼ਾ
ਜਾਲੀ
ਕੁੰਡੀ
ਤਾਲਾ
ਛੱਤ
ਪਉੜੀਆਂ
ਰਸੋਈ
ਗੁਸਲਖਾਨਾ
----
/***
|''Name''|ServerSideSavingPlugin|
|''Description''|server-side saving|
|''Author''|FND|
|''Version''|0.6.5|
|''Status''|stable|
|''Source''|http://svn.tiddlywiki.org/Trunk/association/plugins/ServerSideSavingPlugin.js|
|''License''|[[BSD|http://www.opensource.org/licenses/bsd-license.php]]|
|''CoreVersion''|2.5.3|
|''Keywords''|serverSide|
!Notes
This plugin relies on a dedicated adaptor to be present.
The specific nature of this plugin depends on the respective server.
!Revision History
!!v0.1 (2008-11-24)
* initial release
!!v0.2 (2008-12-01)
* added support for local saving
!!v0.3 (2008-12-03)
* added Save to Web macro for manual synchronization
!!v0.4 (2009-01-15)
* removed ServerConfig dependency by detecting server type from the respective tiddlers
!!v0.5 (2009-08-25)
* raised CoreVersion to 2.5.3 to take advantage of core fixes
!!v0.6 (2010-04-21)
* added notification about cross-domain restrictions to ImportTiddlers
!To Do
* conflict detection/resolution
* rename to ServerLinkPlugin?
* document deletion/renaming convention
!Code
***/
//{{{
(function($) {

readOnly = false; //# enable editing over HTTP

var plugin = config.extensions.ServerSideSavingPlugin = {};

plugin.locale = {
	saved: "%0 saved successfully",
	saveError: "Error saving %0: %1",
	saveConflict: "Error saving %0: edit conflict",
	deleted: "Removed %0",
	deleteError: "Error removing %0: %1",
	deleteLocalError: "Error removing %0 locally",
	removedNotice: "This tiddler has been deleted.",
	connectionError: "connection could not be established",
	hostError: "Unable to import from this location due to cross-domain restrictions."
};

plugin.sync = function(tiddlers) {
	tiddlers = tiddlers && tiddlers[0] ? tiddlers : store.getTiddlers();
	$.each(tiddlers, function(i, tiddler) {
		var changecount = parseInt(tiddler.fields.changecount, 10);
		if(tiddler.fields.deleted === "true" && changecount === 1) {
			plugin.removeTiddler(tiddler);
		} else if(tiddler.isTouched() && !tiddler.doNotSave() &&
				tiddler.getServerType() && tiddler.fields["server.host"]) { // XXX: server.host could be empty string
			delete tiddler.fields.deleted;
			plugin.saveTiddler(tiddler);
		}
	});
};

plugin.saveTiddler = function(tiddler) {
	try {
		var adaptor = this.getTiddlerServerAdaptor(tiddler);
	} catch(ex) {
		return false;
	}
	var context = {
		tiddler: tiddler,
		changecount: tiddler.fields.changecount,
		workspace: tiddler.fields["server.workspace"]
	};
	var serverTitle = tiddler.fields["server.title"]; // indicates renames
	if(!serverTitle) {
		tiddler.fields["server.title"] = tiddler.title;
	} else if(tiddler.title != serverTitle) {
		return adaptor.moveTiddler({ title: serverTitle },
			{ title: tiddler.title }, context, null, this.saveTiddlerCallback);
	}
	var req = adaptor.putTiddler(tiddler, context, {}, this.saveTiddlerCallback);
	return req ? tiddler : false;
};

plugin.saveTiddlerCallback = function(context, userParams) {
	var tiddler = context.tiddler;
	if(context.status) {
		if(tiddler.fields.changecount == context.changecount) { //# check for changes since save was triggered
			tiddler.clearChangeCount();
		} else if(tiddler.fields.changecount > 0) {
			tiddler.fields.changecount -= context.changecount;
		}
		plugin.reportSuccess("saved", tiddler);
		store.setDirty(false);
	} else {
		if(context.httpStatus == 412) {
			plugin.reportFailure("saveConflict", tiddler);
		} else {
			plugin.reportFailure("saveError", tiddler, context);
		}
	}
};

plugin.removeTiddler = function(tiddler) {
	try {
		var adaptor = this.getTiddlerServerAdaptor(tiddler);
	} catch(ex) {
		return false;
	}
	var context = {
		host: tiddler.fields["server.host"],
		workspace: tiddler.fields["server.workspace"],
		tiddler: tiddler
	};
	var req = adaptor.deleteTiddler(tiddler, context, {}, this.removeTiddlerCallback);
	return req ? tiddler : false;
};

plugin.removeTiddlerCallback = function(context, userParams) {
	var tiddler = context.tiddler;
	if(context.status) {
		if(tiddler.fields.deleted === "true") {
			store.deleteTiddler(tiddler.title);
		} else {
			plugin.reportFailure("deleteLocalError", tiddler);
		}
		plugin.reportSuccess("deleted", tiddler);
		store.setDirty(false);
	} else {
		plugin.reportFailure("deleteError", tiddler, context);
	}
};

plugin.getTiddlerServerAdaptor = function(tiddler) { // XXX: rename?
	var type = tiddler.fields["server.type"] || config.defaultCustomFields["server.type"];
	return new config.adaptors[type]();
};

plugin.reportSuccess = function(msg, tiddler) {
	displayMessage(plugin.locale[msg].format([tiddler.title]));
};

plugin.reportFailure = function(msg, tiddler, context) {
	var desc = (context && context.httpStatus) ? context.statusText :
		plugin.locale.connectionError;
	displayMessage(plugin.locale[msg].format([tiddler.title, desc]));
};

config.macros.saveToWeb = { // XXX: hijack existing sync macro?
	locale: { // TODO: merge with plugin.locale?
		btnLabel: "save to web",
		btnTooltip: "synchronize changes",
		btnAccessKey: null
	},

	handler: function(place, macroName, params, wikifier, paramString, tiddler) {
		createTiddlyButton(place, this.locale.btnLabel, this.locale.btnTooltip,
			plugin.sync, null, null, this.locale.btnAccessKey);
	}
};

// hijack saveChanges to trigger remote saving
var _saveChanges = saveChanges;
saveChanges = function(onlyIfDirty, tiddlers) {
	if(window.location.protocol == "file:") {
		_saveChanges.apply(this, arguments);
	} else {
		plugin.sync(tiddlers);
	}
};

// override removeTiddler to flag tiddler as deleted -- XXX: use hijack to preserve compatibility?
TiddlyWiki.prototype.removeTiddler = function(title) { // XXX: should override deleteTiddler instance method?
	var tiddler = this.fetchTiddler(title);
	if(tiddler) {
		tiddler.tags = ["excludeLists", "excludeSearch", "excludeMissing"];
		tiddler.text = plugin.locale.removedNotice;
		tiddler.fields.deleted = "true"; // XXX: rename to removed/tiddlerRemoved?
		tiddler.fields.changecount = "1";
		this.notify(title, true);
		this.setDirty(true);
	}
};

// hijack ImportTiddlers wizard to handle cross-domain restrictions
var _onOpen = config.macros.importTiddlers.onOpen;
config.macros.importTiddlers.onOpen = function(ev) {
	var btn = $(resolveTarget(ev));
	var url = btn.closest(".wizard").find("input[name=txtPath]").val();
	if(window.location.protocol != "file:" && url.indexOf("://") != -1) {
		var host = url.split("/")[2];
		var macro = config.macros.importTiddlers;
		if(host != window.location.host) {
			btn.text(macro.cancelLabel).attr("title", macro.cancelPrompt);
			btn[0].onclick = macro.onCancel;
			$('<span class="status" />').text(plugin.locale.hostError).insertAfter(btn);
			return false;
		}
	}
	return _onOpen.apply(this, arguments);
};

})(jQuery);
//}}}
/***
|''Name''|GroupByPlugin|
|''Description''|Mimics allTags macro to provide ways of creating lists grouping tiddlers by any field|
|''Version''|0.6.1|
|''Author''|Jon Robson|
|''Status''|beta|
!Usage
{{{<<groupBy tags>>}}}
mimics allTags macro

{{{<<groupBy server.bag>>}}}
groups by the server.bag field (this version contains TiddlySpace specific code for turning a bag into a space name)

{{{groupBy modified dateFormat:"YYYY"}}}
group tiddlers by year.

{{{<<groupBy tags exclude:excludeLists exclude:systemConfig>>}}}
group tiddlers by tag but exclude the tags with values excludeLists and systemConfig

Within that group you can also exclude things by filter
{{{groupBy modifier filter:[tag[film]]}}}
will group tiddlers tagged with film by modifier.
***/
//{{{
(function($) {
var taglocale = config.views.wikified.tag;
var macro = config.macros.groupBy = {
	locale: {
		tooltip: "all tiddlers in group %0",
		noTiddlers: "no tiddlers",
		openAllText: taglocale.openAllText,
		openAllTooltip: taglocale.openAllTooltip,
		openTiddler: "open tiddler with title %0"
	},
	morpher: {
		// TODO: note currently the following 2 morphers are TiddlySpace specific and probably should be in separate plugin
		"server.workspace": function(value, options) {
			return macro.morpher["server.bag"](value.replace("bags/", "").replace("recipes/", ""));
		},
		"server.bag": function(value, options) {
			if(typeof(value) !== "string") {
				return false;
			} else if(value.indexOf("_public") === -1 && value.indexOf("_private") === -1) {
				value = "*%0".format(value); // add star for non-space bags.
			}
			return value.replace("_public", "").replace("_private", "");
		},
		created: function(value, options) {
			return value.formatString(options.dateFormat || "DD MMM YYYY");
		},
		modified: function(value, options) {
			return macro.morpher.created(value, options);
		}
	},

	handler: function(place, macroName, params, wikifier, paramString) {
		var field = params[0] || "server.workspace";
		var dateFormat = params[1] || "DD MMM YYYY";
		var container = $("<div />").attr("macroName", macroName).addClass("groupBy").
			attr("refresh", "macro").attr("fieldName", field).
			attr("paramString", paramString).
			attr("dateFormat", dateFormat).appendTo(place)[0];
		macro.refresh(container);
	},
	isTypeArray: function(value) {
		var valueType = typeof value;
		if(valueType === "object" && typeof value.length === "number" &&
			!(value.propertyIsEnumerable("length")) &&
			typeof value.splice === "function") { //is Array
			return true;
		} else {
			return false;
		}
	},
	_onClickGroup: function(ev, options) {
		var i, target = ev.target, locale = macro.locale;
		var tiddlers = $(target).closest(".templateContainer").data("tiddlers");
		var popup = $(Popup.create(target)).addClass("taggedTiddlerList")[0];
		var value = $(target).attr("value");
		var openAll = createTiddlyButton($("<li />").appendTo(popup)[0],
			locale.openAllText.format(value), locale.openAllTooltip);
		$(openAll).click(function(ev) {
			story.displayTiddlers(ev.target, tiddlers);
			return false;
		});
		var listBreak = $("<li />").addClass("listBreak").html("<div />").appendTo(popup);
		for(i = 0; i < tiddlers.length; i++) {
			var item = $("<li />").appendTo(popup)[0];
			var template = store.getTiddlerText(options.template) || macro.template;
			wikify(template, item, null, tiddlers[i]);
		}
		listBreak.clone().appendTo(popup);
		$(createTiddlyLink($("<li />").appendTo(popup)[0], value, false)).
			text(locale.openTiddler.format(value));
		Popup.show();
		ev.stopPropagation();
		return false;
	},
	_refresh: function(container, tiddlers, options) {
		var totalGroups = 0, locale = macro.locale, i, j;
		var excludeValues = options.exclude;
		var values = {}, value_ids = [];
		var field = options.field;
		var morpher = macro.morpher[field] || function(value) {
			return value;
		};
		for(i = 0; i < tiddlers.length; i++) {
			var tiddler = tiddlers[i];
			var value = tiddler[field] || tiddler.fields[field];
			value = macro.isTypeArray(value) ? value : [ value ];
			for(j = 0; j < value.length; j++) {
				var v = morpher(value[j], options);
				if(v && $.inArray(v, excludeValues) === -1) {
					totalGroups += 1;
					if(!values[v]) {
						values[v] = [];
					}
					values[v].push(tiddler);
					value_ids.pushUnique(v);
				}
			}
		}
		var ul = $("<ul />").appendTo(container)[0];
		if(totalGroups === 0) {
			$("<li />").addClass("listTitle").text(locale.noTiddlers);
		}
		value_ids = value_ids.sort();
		var groupTemplate = store.getTiddlerText(options.groupTemplate);
		var onClick = function(ev) {
			macro._onClickGroup(ev, options);
		};
		for(i = 0; i < value_ids.length; i++) {
			var title = value_ids[i];
			var info = getTiddlyLinkInfo(title);
			tiddlers = values[title];
			var btn = createTiddlyButton($("<li />").appendTo(ul)[0],
				"%0 (%1)".format(title, tiddlers.length), locale.tooltip.format(title), null, info.classes);
			if(groupTemplate) {
				$(btn).empty();
				wikify(groupTemplate, btn, null, tiddlers[0]);
			}
			$(btn).click(onClick).attr("value", title).attr("refresh", "link").attr("tiddlyLink", title);
			$(btn).addClass("templateContainer").data("tiddlers", tiddlers);
		}
	},
	refresh: function(container) {
		container = $(container).empty();
		var paramString = container.attr("paramString");
		var args = paramString.parseParams("name", null, true, false, true)[0];
		var options = { field: container.attr("fieldName"), dateFormat: container.attr("dateFormat"), exclude: args.exclude || [],
			template: args.template ? args.template[0] : false, groupTemplate: args.groupTemplate ? args.groupTemplate[0] : "" };
		var tiddlers = args.filter ? store.filterTiddlers(args.filter[0]) : store.getTiddlers("title");
		macro._refresh(container, tiddlers, options);
	},
	template: "<<view title link>>"
};

}(jQuery));
//}}}
/***
|''Name''|TiddlySpaceViewTypes|
|''Version''|0.6.0|
|''Status''|@@beta@@|
|''Description''|Provides TiddlySpace specific view types|
|''Author''|Jon Robson|
|''Source''|http://github.com/TiddlySpace/tiddlyspace/raw/master/src/plugins/TiddlySpaceViewTypes.js|
|''Requires''|TiddlySpaceConfig TiddlySpaceTiddlerIconsPlugin|
!Usage
Provides replyLink, spaceLink and SiteIcon view types.
!!SiteIcon view parameters
* labelPrefix / labelSuffix : prefix or suffix the label with additional text. eg. labelPrefix:'modified by '
* spaceLink: if set to "yes" will make any avatars link to the corresponding space. {{{<<originMacro spaceLink:yes>>}}}

!Code
***/
//{{{
(function($) {

var tiddlyspace = config.extensions.tiddlyspace;
var originMacro = config.macros.tiddlerOrigin;
var tweb = config.extensions.tiddlyweb;

config.macros.view.replyLink = {
	locale: {
		label: "Reply to this tiddler"
	}
};

var _replyButtons = [];
var _replyInitialised, _replyScriptLoaded;
config.macros.view.views.replyLink = function(value, place, params, wikifier,
		paramString, tiddler) {
	var valueField = params[0];
	var imported;
	if(valueField == "title") { // special casing for imported tiddlers
		var localTitle = tiddler.title;
		var serverTitle = tiddler.fields["server.title"];
		if(serverTitle && localTitle != serverTitle) {
			value = serverTitle ? serverTitle : localTitle;
			imported = true;
		}
	} else {
		title = tiddler[valueField] ? tiddler[valueField] : tiddler.fields[valueField];
	}
	var args = paramString.parseParams("anon")[0];
	var label = (args.label) ? args.label : config.macros.view.replyLink.locale.label;
	var space;
	if(tiddler) {
		var bag = tiddler.fields["server.bag"];
		space = tiddlyspace.resolveSpaceName(bag);
	}
	var container = $('<span class="replyLink" />').appendTo(place)[0];

	tweb.getUserInfo(function(user) {
		if ((!user.anon) && ((space && user.name != space &&
				user.name != tiddlyspace.currentSpace.name) || imported)) {
			var link = $("<a />")
				.text(config.macros.view.replyLink.locale.label)
				.appendTo(container)[0];

			if(typeof(createReplyButton) === "undefined") {
				_replyButtons.push(link);
			}
			if(_replyInitialised) {
				createReplyButton(link);
			} else if(!_replyScriptLoaded) {
				_replyScriptLoaded = true;
				$.getScript("/bags/common/tiddlers/_reply-button.js",
					function() {
						_replyInitialised = true;
						for(var i = 0; i < _replyButtons.length; i++) {
							createReplyButton(_replyButtons[i]);
						}
						_replyButtons = [];
					});
			}
		}
	});

};

config.macros.view.views.spaceLink = function(value, place, params, wikifier,
		paramString, tiddler) {
		var spaceName = tiddlyspace.resolveSpaceName(value);
		var isBag = params[0] == "server.bag" && value === spaceName ? true : false;
		var args = paramString.parseParams("anon")[0];
		var titleField = args.anon[2];
		var labelField = args.labelField ? args.labelField[0] : false;
		var label;
		if(labelField) {
			label = tiddler[labelField] ? tiddler[labelField] : tiddler.fields[labelField];
		} else {
			label = args.label ? args.label[0] : false;
		}
		var title = tiddler[titleField] ? tiddler[titleField] : tiddler.fields[titleField];

		var link = createSpaceLink(place, spaceName, title, label, isBag);
		if(args.external && args.external[0] == "no") {
			$(link).click(function(ev) {
				var el = $(ev.target);
				var title = el.attr("tiddler");
				var bag = el.attr("bag");
				var space = el.attr("tiddlyspace");
				bag = space ? space + "_public" : bag;
				if(title && bag) {
					ev.preventDefault();
					tiddlyspace.displayServerTiddler(el[0], title,
						"bags/" + bag);
				}
				return false;
			});
		}
};

config.macros.view.views.SiteIcon = function(value, place, params, wikifier,
		paramString, tiddler) {
	var options = originMacro.getOptions(paramString);
	if(!tiddler || value == "None") { // some core tiddlers lack modifier
		value = false;
	}
	var field = params[0];
	if(field == "server.bag") {
		options.notSpace = !originMacro._isSpace(value);
	}
	tiddlyspace.renderAvatar(place, value, options);
};

})(jQuery);
//}}}
/***
|''Name''|DiffFormatter|
|''Description''|highlighting of text comparisons|
|''Author''|FND|
|''Version''|0.9.0|
|''Status''|beta|
|''Source''|http://svn.tiddlywiki.org/Trunk/contributors/FND/formatters/DiffFormatter.js|
|''CodeRepository''|http://svn.tiddlywiki.org/Trunk/contributors/FND/|
|''License''|[[BSD|http://www.opensource.org/licenses/bsd-license.php]]|
|''Keywords''|formatting|
!Description
Highlights changes in a unified [[diff|http://en.wikipedia.org/wiki/Diff#Unified_format]].
!Notes
Based on Martin Budden's [[DiffFormatterPlugin|http://svn.tiddlywiki.org/Trunk/contributors/MartinBudden/formatters/DiffFormatterPlugin.js]].
!Usage
The formatter is applied to blocks wrapped in <html><code>{{{diff{..}}}</code></html> within tiddlers tagged with "diff".
!Revision History
!!v0.9 (2010-04-07)
* initial release; fork of DiffFormatterPlugin
!StyleSheet
.diff { white-space: pre; font-family: monospace; }
.diff ins, .diff del { display: block; text-decoration: none; }
.diff ins { background-color: #dfd; }
.diff del { background-color: #fdd; }
.diff .highlight { background-color: [[ColorPalette::SecondaryPale]]; }
!Code
***/
//{{{
(function() {

config.shadowTiddlers.StyleSheetDiffFormatter = store.getTiddlerText(tiddler.title + "##StyleSheet");
store.addNotification("StyleSheetDiffFormatter", refreshStyles);

var formatters = [{
		name: "diffWrapper",
		match: "^\\{\\{diff\\{\n", // XXX: suboptimal
		termRegExp: /(.*\}\}\})$/mg,
		handler: function(w) {
			var el = createTiddlyElement(w.output, "div", null, "diff");
			w.subWikifyTerm(el, this.termRegExp);
		}
	}, {
		name: "diffRange",
		match: "^(?:@@|[+\\-]{3}) ",
		lookaheadRegExp: /^(?:@@|[+\-]{3}) .*\n/mg,
		handler: function(w) {
			createTiddlyElement(w.output, "div", null, "highlight").
				innerHTML = "&#8230;";
			this.lookaheadRegExp.lastIndex = w.matchStart;
			var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
			if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {
				w.nextMatch = this.lookaheadRegExp.lastIndex;
			}
		}
	}, {
		name: "diffAdded",
		match: "^\\+",
		termRegExp: /(\n)/mg,
		handler: function(w) {
			var el = createTiddlyElement(w.output, "ins", null, "added");
			w.subWikifyTerm(el, this.termRegExp);
		}
	}, {
		name: "diffRemoved",
		match: "^-",
		termRegExp: /(\n)/mg,
		handler: function(w) {
			var el = createTiddlyElement(w.output, "del", null, "removed");
			w.subWikifyTerm(el, this.termRegExp);
		}
	}
];

config.parsers.diffFormatter = new Formatter(formatters);
config.parsers.diffFormatter.format = "diff";
config.parsers.diffFormatter.formatTag = "diff";

})();
//}}}
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xl="http://www.w3.org/1999/xlink" version="1.1" viewBox="364 157 64 51" width="30" height="30"><g stroke="none" stroke-opacity="1" stroke-dasharray="none" fill="none" fill-opacity="1"><g><path class="glyph" d="M 364.50006 184.50061 L 386.99985 207.00037 L 396 198.00002 L 373.50003 175.50066 Z M 403.02295 181.97704 C 400.38693 179.34099 396.11307 179.34099 393.47702 181.97704 C 390.841 184.61307 390.841 188.88695 393.47702 191.52298 C 396.11307 194.15903 400.38693 194.15903 403.02295 191.52298 C 405.65906 188.88695 405.65906 184.61307 403.02295 181.97704 M 414.27298 170.72704 C 411.63693 168.091 407.36307 168.091 404.72702 170.72704 C 402.091 173.36308 402.091 177.63693 404.72702 180.27296 C 407.36307 182.90901 411.63693 182.90901 414.27298 180.27296 C 416.90903 177.63693 416.90903 173.36308 414.27298 170.72704 M 425.523 159.47705 C 422.88696 156.841 418.6131 156.841 415.97705 159.47705 C 413.341 162.11308 413.341 166.38695 415.97705 169.02295 C 418.6131 171.65903 422.88696 171.65903 425.523 169.02295 C 428.15906 166.38695 428.15906 162.11308 425.523 159.47705" fill="#020202"/></g></g></svg>
/***
|''Name''|TiddlySpaceCloneCommand|
|''Version''|0.5.8|
|''Description''|provides a toolbar command for cloning external tiddlers|
|''Status''|stable|
|''Source''|http://github.com/TiddlySpace/tiddlyspace/raw/master/src/plugins/TiddlySpaceCloneCommand.js|
|''Requires''|TiddlySpaceConfig TiddlySpaceFilters|
!Code
***/
//{{{
(function($) {

var cmd = config.commands;
var tiddlyspace = config.extensions.tiddlyspace;

var fieldsCache = {};

cmd.cloneTiddler = {
	text: cmd.editTiddler.text,
	tooltip: "Create a copy of this tiddler in the current space",
	errorMsg: "Error publishing %0: %1",

	isEnabled: function(tiddler) {
		return !config.filterHelpers.is.local(tiddler) && !readOnly;
	},
	handler: function(ev, src, title) {
		var tiddler = store.getTiddler(title);
		if(tiddler) {
			fieldsCache[title] = $.extend({}, tiddler.fields);
			tiddler.fields["server.workspace"] = tiddlyspace.getCurrentWorkspace(config.options.chkPrivateMode ?
		"private" : "public");
			tiddler.fields["server.permissions"] = "read, write, create"; // no delete
			delete tiddler.fields["server.page.revision"];
			delete tiddler.fields["server.title"];
			delete tiddler.fields["server.etag"];
			// special handling for pseudo-shadow tiddlers
			if(tiddlyspace.coreBags.contains(tiddler.fields["server.bag"])) {
				tiddler.tags.remove("excludeLists");
			}
		} else { // ensure workspace is the current space
			var el = story.findContainingTiddler(src);
			el = $(el);
			var fields = el.attr("tiddlyfields");
			if(fields) { // inherited via TiddlyLink
				fields = fields.decodeHashMap();
				fields["server.workspace"] = config.
					defaultCustomFields["server.workspace"];
			} else {
				fields = config.defaultCustomFields;
			}
			fields = String.encodeHashMap(fields);
			el.attr("tiddlyfields", fields);
		}
		cmd.editTiddler.handler.apply(this, arguments);
		if(tiddler) {
			tiddler.fields["server.permissions"] += ", delete";
		}
		return false;
	}
};

cmd.editTiddler.isEnabled = function(tiddler) {
	return !cmd.cloneTiddler.isEnabled.apply(this, arguments);
};

// hijack cancelTiddler to restore original fields
var _cancelHandler = cmd.cancelTiddler.handler;
cmd.cancelTiddler.handler = function(ev, src, title) {
	var tiddler = store.getTiddler(title);
	if(tiddler) {
		tiddler.fields = fieldsCache[title] || tiddler.fields;
		delete fieldsCache[title];
	}
	return _cancelHandler.apply(this, arguments);
};

// hijack saveTiddler to clear unused fields stash
var _saveHandler = cmd.saveTiddler.handler;
cmd.saveTiddler.handler =  function(ev, src, title) {
	delete fieldsCache[title];
	return _saveHandler.apply(this, arguments);
};

})(jQuery);
//}}}
[[A. Gurmukhi Sounds]] [[B. Gurmukhi Script]] [[C. Nouns]] [[D. Gender]] [[E. Number]] [[F. Cases]] [[G. Pronouns]] [[H. Adjectives]] [[I. Past | ਭੂਤ]] [[I. Verbs]] [[II. Present | ਵਰਤਮਾਨ]] [[III. Future | ਭਵਿੱਖਤ]] [[J. Tenses]] [[K. Adverbs]] [[L. Postpositions]] [[M. Conjunctions]] [[N.Exclamations]] [[O. Word Formation]] [[P. Sentences]] [[Q. Clauses]] [[R. Noun phrase]] [[S. Verb phrase]]
<<tabs chkTabsMain
	Tools "Navigation Tools" SideBarTools
	Tags "All tags" TabTags
	Latest "Recently edited tiddlers" TabTimeline
	Follow "Followers and activities" SideBarTabs##FOLLOW
	Access "Origin and accessibility of tiddlers" SideBarTabs##ACCESS
	More "More tabs" SideBarTabs##MORE
>>/%
!ACCESS
<<tabs chkTabsAccess
	Inc "Included spaces" TiddlySpaceTabs##Spaces
	Pub "Public tiddlers" TiddlySpaceTabs##Public
	Priv "Private tiddlers" TiddlySpaceTabs##Private
	Draft "Draft tiddlers" TiddlySpaceTabs##Drafts
>>
!FOLLOW
<<tabs chkTabsFollow
	..ing "Users I follow" TabFollowing##Following
	..ers "Folowers of mine" TabFollowing##Followers
	Activity "Space activity" TabFollowing##Activity
>>
!MORE
<<tabs chkTabsMore
	All "All tiddlers" TabAll
	Shad "Shadowed tiddlers" TabMoreShadowed
	Orph "Orphaned tiddlers" TabMoreOrphans
	Miss "Missing tiddlers" TabMoreMissing
>>
!END%/
<html><nowiki>
<h1>Adjectives | ਵਿਸ਼ੇਸ਼ਣ</h1>
<h2>Contents</h2>
<ul>
 <li><a href="#adjective-define">What are adjectives|ਵਿਸ਼ੇਸ਼ਣ ਕੀ ਹੁੰਦੇ ਹਨ?</a></li>
 <li><a href="#adjective-place">Place in the Sentence|ਵਾਕ ਵਿੱਚ ਥਾਂ</a></li>
 <li><a href="#adjective-twoBroadCategories">Two Broad categories|ਦੋ ਮੁੱਖ ਵਰਗ</a></li>
 <li><a href="#adjective-avikaari">Uninflected Adjectives|ਅਵਿਕਾਰੀ ਵਿਸ਼ੇਸਣ</a></li>
 <li><a href="#adjective-vikaari">Inflected Adjectives|ਵਿਕਾਰੀ ਵਿਸ਼ੇਸ਼ਣ</a></li>
 <li><a href="#adjective-vocabulary">Build Vocabulary|ਆਪਣਾ ਸ਼ਬਦ-ਭੰਡਾਰ ਵਧਾਓ</a></li>
 <li><a href="#adjective-practice">Practice|ਅਭਿਆਸ</a></li>
</ul>
<hr>
<h2><a name="adjective-define">What are adjectives|ਵਿਸ਼ੇਸ਼ਣ ਕੀ ਹੁੰਦੇ ਹਨ?</a></h2>
<p>Those words which describe a noun are known as adjectives or ਵਿਸ਼ੇਸ਼ਣ. An adjective can describe a noun by its quality, quantity, measure etc. In this aspect Punjabi adjectives are similar to English ones.</p>
<h2><a name="adjective-place">Place in the Sentence|ਵਾਕ ਵਿੱਚ ਥਾਂ</a></h2>
<p>An adjective is usually placed <b>before</b> the noun it describes. But in certain sentences they can come later too, before the verb/verb phrase. For example look at the adjective ਚਲਾਕ (clever):</p>
<blockquote><u>ਚਲਾਕ</u> ਵਪਾਰੀ - Clever businessman. </blockquote>
<p>In a sentence this can be written like this too:</p>
<blockquote>ਵਪਾਰੀ <u>ਚਲਾਕ</u> ਹੈ। - The businessman is clever.</blockquote>
<h2><a name="adjective-twoBroadCategories">Two Broad categories|ਦੋ ਮੁੱਖ ਵਰਗ</a></h2>
<p>In Punjabi adjectives may be divided into two categories:</p>
<ol>
  <li><u>Uninflected adjectives | ਅਵਿਕਾਰੀ ਵਿਸ਼ੇਸ਼ਣ</u>- Those that do not change their form according to gender, number and case. These are the wods which do not end with a kunna (ਾ).</li>
  <li><u>Inflected Adjectives | ਵਿਕਾਰੀ ਵਿਸ਼ੇਸ਼ਣ</u>- Those that change their form according to gender, number and case. These are the words which end with a kunna (ਾ).</li>
</ol>
<h2><a name="adjective-avikaari">Inflexive Adjectives|ਅਵਿਕਾਰੀ ਵਿਸ਼ੇਸਣ</a></h2>
These are the adjectives which do not change form according to the gender, number, and case of the noun they describe. Here are some examples of verbs in this category.
<blockquote>ਲਾਲ(red), ਬੁਧੂ (stupid), ਸੁੰਦਰ (beautiful), ਸਾਊ (guileless), ਸਫੈਦ (white), ਸਾਫ (clean, clear), ਗਰਮ (hot), ਨਰਮ (soft)</blockquote>
<p>Note that <b>none</b> of these words end with a kunna (ਾ).</p>
<p>Below the adjective ਲਾਲ (red) is used with singular and plural, masculine and feminine form of the noun ਘੋੜਾ (horse). Whereas the noun changes its form according to gender and number, the adjective does not.</p>
<table>
<caption>ਲਾਲ</caption>
<tr>
   <th rowspan="2"></th><th rowspan="2">Subject</th><th colspan="2">Verb</th><th rowspan="2">English</th>
</tr><tr>
   <th>masculine</th><th>feminine</th>
</tr><tr>
   <th>Singular</th><td>ਲਾਲ ਘੋੜਾ</td><td>ਦੌੜਦਾ ਹੈ </td><td></td><td>Red horse runs</td>
</tr><tr >
   <th>Plural</th><td>ਲਾਲ ਘੋੜੇ</td><td>ਦੌੜਦੇ ਹਨ</td><td></td><td>Red horses run</td>
</tr><tr>
   <th>Singular</th><td>ਲਾਲ ਘੋੜੀ</td><td></td><td>ਦੌੜਦੀ ਹੈ</td><td>Red horse(female) runs</td>
</tr><tr>
   <th>Plural</th><td>ਲਾਲ ਘੋੜੀਆਂ</td><td></td><td>ਦੌੜਦੀਆਂ ਹਨ</td><td>Red horses(females) run</td>
</tr>
</table>
Similarly the word ਘੋੜਾ retains its form even when the noun is used in different cases:
<blockquote>
ਲਾਲ ਘੋੜਾ (Simple case)<br>
ਲਾਲ ਘੋੜੇ ਨੇ (Karta kaarak)<br>
ਲਾਲ ਘੋੜੇ ਨੂੰ (Karam kaarak)<br>
ਲਾਲ ਘੋੜੇ ਨਾਲ (Karan Kaarak)<br>
ਲਾਲ ਘੋੜੇ ਵਾਸਤੇ (Sampardaan Kaarak)<br>
ਲਾਲ ਘੋੜੇ ਤੋਂ (Apaadaan kaarak)<br>
ਲਾਲ ਘੋੜੇ ਦਾ (Sambandh kaarak)<br>
ਲਾਲ ਘੋੜੇ ਉੱਤੇ (Adhikaran kaarak)<br>
ਲਾਲ ਘੋੜਿਆ! (Sambodhan kaarak)<br>
</blockquote>
<h2><a name="adjective-vikaari">Reflexive Adjectives|ਵਿਕਾਰੀ ਵਿਸ਼ੇਸ਼ਣ</a></h2>
<p> 
 The adjectives of the second category change their form according to gender, number and case of the noun. Some examples of such adjectives are:
<blockquote>ਛੋਟਾ (small), ਕਾਲਾ (black), ਸੋਹਣਾ (beautiful), ਬੁਰਾ (bad), ਭਾਰਾ (heavy) </blockquote>
All these end with a kunna(ਾ).
</p>
<table>
<caption>ਛੋਟਾ</caption>
<tr>
   <th rowspan="2"></th><th rowspan="2">Subject</th<th colspan="2">Verb</th><th rowspan="2">English</th>
</tr><tr>
   <th>masculine</th><th>feminine</th>
</tr><tr>
   <th>Singular</th><td>ਛੋਟਾ ਮੁੰਡਾ</td><td> ਰੋਣ ਲਗ ਪਿਆ</td><td></td><td>Small boy started crying</td>
</tr><tr>
<th>Plural</th><td>ਛੋਟੇ ਮੁੰਡੇ</td><td>ਰੋਣ ਲਗ ਪਏ</td><td></td><td>Small boys started crying</td>
</tr><tr>
      <th>Singular</th><td>ਛੋਟੀ ਕੁੜੀ</td><td></td><td>ਰੋਣ ਲਗ ਪਈ</td><td>Small girl started crying</td>
</tr><tr>
   <th>Plural</th><td>ਛੋਟੀਆਂ ਕੁੜੀਆਂ</td><td></td><td>ਰੋਣ ਲਗ ਪਈਆਂ</td><td>Small girls started crying</td>
</tr>
</table>
<p> The inflectied adjectives follow these general rules:</p>
<ol>
<li>With a masculine singular noun the adjective ends with a ਾ. For example ਵੱਡਾ ਮੰਜਾ (large bed), ਸੁਹਣਾ ਪੌਦਾ (beautiful plant), ਪਿਆਰਾ ਬੱਚਾ (sweet child(male))
<li>With a masculine plural noun the adjective ends with a ੇ. For example ਵੱਡੇ ਮੰਜੇ(large beds), ਸੁਹਣੇ ਪੌਦੇ (beautiful plants) , ਪਿਆਰੇ ਬੱਚੇ (sweet children)
<li>With a feminine singular noun the adjective ends with a ੀ. For example ਵੱਡੀ ਮੰਜੀ (large bed(feminine)), ਸੁਹਣੀ ਮੁੰਦਰੀ (beautiful ring), ਪਿਆਰੀ ਬੱਚੀ(sweet child(female))
<li>With a feminine plural noun the adjective ends with a ੀਆਂ. For example ਵੱਡੀਆਂ ਮੰਜੀਆਂ(large beds(feminine)), ਸੁਹਣੀਆਂ ਮੁੰਦਰੀਆਂ(beautiful rings(feminine), ਪਿਆਰੀਆਂ ਬੱਚੀਆਂ(sweet children(girls))
</ol>
<p style="font-weight: bold; border: thin solid blue; background-color: #B0C4DE; padding:0.5em;">Note: The nouns, like adjectives are either inflected or uninflected. An adjective which is of the inflected type will change form even if it comes with a noun which remains uninflected</p>
<p>For example: ਗੂੜ੍ਹਾ ਰੰਗ (dark color), ਗੂੜ੍ਹੇ ਰੰਗ (dark colors), 
<p>Here is a "Kaarak Sadhna" (case exercise) for singular masculine noun ਮੁੰਡਾ :</p>
<blockquote>
ਛੋਟਾ ਮੁੰਡਾ (Simple case)<br>
ਛੋਟੇ ਮੁੰਡੇ ਨੇ(Karta kaarak)<br>
ਛੋਟੇ ਮੁੰਡੇ ਨੂੰ (Karam kaarak)<br>
ਛੋਟੇ ਮੁੰਡੇ ਨਾਲ (Karan Kaarak)<br>
ਛੋਟੇ ਮੰਡੇ ਵਾਸਤੇ (Sampardaan Kaarak)<br>
ਛੋਟੇ ਮੁੰਡੇ ਤੋਂ (Apaadaan kaarak)<br>
ਛੋਟੇ ਮੁੰਡੇ ਦਾ (Sambandh kaarak)<br>
ਛੋਟੇ ਮੁੰਡੇ ਉੱਤੇ (Adhikaran kaarak)<br>
ਛੋਟਿਆ ਮੁੰਡਿਆ! (Sambodhan kaarak)<br>
</blockquote>
<h2><a name="adjective-vocabulary">Build Vocabulary|ਆਪਣਾ ਸ਼ਬਦ-ਭੰਡਾਰ ਵਧਾਓ</a></h2>
<table>
<tr>
 <th>ਆਕਾਰ(Shape/Size)</th><th>ਪਰਿਮਾਣ(size)</th><th>ਖੂਬਸੂਰਤੀ(Beauty)</th>
</tr><tr style="vertical-align: top;">
<td>
<ul>
<li>ਗੋਲ਼- Round <li>ਚੌਰਸ- Square <li>ਤਿਕੋਣਾ- triangle, three-sided <li>ਚਕੌਣਾ- four-sided <li>ਸਿੱਧਾ- straight <li>ਢੇਡਾ-crooked <li>ਪੱਧਰਾ- plain <li>ਸਮਤਲ- plain <li>ਵਲ਼ਦਾਰ- wrinkled <li>ਲਹਰਦਾਰ- wavy <li>ਚਪਟਾ- flat <li>ਉਭੜ-ਖਾਬੜ - Bumpy
</ul>
</td><td>
<ul>
<li>ਛੋਟਾ- small <li>ਵੱਡਾ-large, big <li>ਦਰਮਿਆਨਾ-medium <li>ਭਾਰਾ- heavy <li>ਨਿੱਕਾ-little <li>ਮੱਧਰਾ/ ਨਾਟਾ/ ਗਠਾ- small in height <li>ਚੌੜਾ- wide <li>ਸੌੜਾ- narrow <li>ਮੋਟਾ- fat <li>ਪਤਲਾ- thin, slim <li>ਲੰਮਾ- long, tall <li>ਲੰਮ-ਸਲੰਮਾ- tall <li>ਸਰੂ ਵਰਗਾ- tall like mustard plant <li>ਕੱਦਾਵਰ- having towering height <li>ਉੱਚਾ- high, tall <li>ਨੀਵਾਂ- low <li>ਹਲਕਾ-light, lightweight <li>ਛਾਂਟਿਆ- slim and trim <li>ਪੀਚ੍ਹਾ-ਜਿਹਾ- too small 
</ul>
</td><td>
<ul>
<li>ਸੁਹਣਾ- beautiful, handsome <li>ਖੂਬਸੂਰਤ- beautiful <li>ਆਕਰਸ਼ਕ-attractive <li>ਦਿਲਕਸ਼- charming <li>ਕੂੰਜ-ਵਰਗੀ- (fem)like a bird<br>(koonj is a small migratory bird) <li>ਲਗਰ-ਜਿਹੀ- (fem)like a tender branch <li>ਛਮਕ-ਜਿਹੀ- (fem)like a soft branch <li>ਛਮਕ-ਛੱਲੋ- (fem)same as above <li>ਚਿੜੀ-ਜਿਹੀ- (fem)sparrow-like <li>ਗੋਰੀ- (fem)fair skinned <li>ਮ੍ਰਿਗ-ਨੈਣੀ- (fem)doe eyed <li>ਮਾਣ-ਮੱਤੀ- (fem)proud of one's beauty<li>ਸੁਨੱਖੀ- (fem)good featured <li>ਸਿਰੇ ਦੀ ਸੁਹਣੀ- (fem)extremely beautiful <li> ਅੰਤਾ ਦੀ ਸੁਹਣੀ- (fem)extremely beautiful <li>ਮਦਮਸਤ-  <li>ਚਿੱਤਾਕਰਸ਼ਕ- alluring <li>ਸਜੀਲੀ- (fem)good-looking <li>ਮਨਮੋਹਣੀ- (fem) attractive <li>ਮੋਹਣੀ-(fem) attractive <li>ਪਿਆਰੀ-(fem)lovable
</ul>
</td></tr>
</table>
<table>
<tr><th>ਚਰਿੱਤਰ(Character)</th><th>ਸਵਾਦ(Taste)</th></tr>
<tr style='vertical-align:top;'><td>
<ul>
<li>ਚੰਗਾ -good<li>ਮਾੜਾ- Bad, weak<li>ਬੁਰਾ- bad <li>ਭਲਾ- good; simple or saintly of character;  <li>ਸਿੱਧਾ- gullible, straightforward <li>ਢੇਡਾ- crooked;<li>ਇਮਾਨਦਾਰ- honest <li>ਬੇਈਮਾਨ- dishonest <li>ਸਾਫ-ਦਿਲ- clear-hearted <li>ਚੁਸਤ- fast, sharp <li>ਚਲਾਕ-clever <li>ਤਿੱਖਾ-sharp <li>ਸਿਆਣਾ- intelligent, wise <li>ਨਿਆਣਾ- childish, not wise <li>ਸਮਝਦਾਰ- mature, understanding <li>ਸੁਲਜਿਆ ਹੋਇਆ- clear in wisdom and understanding <li>ਬੇਵਕੂਫ- stupid <li>ਮੂਰਖ- unintelligent <li>ਪਾਗਲ- mad, crazy <li>ਠੰਡਾ- cool minded <li>ਗਰਮ- hot-tempered <li>ਗੁੱਸੇ ਵਾਲਾ- hot tempered
</ul>
</td><td>
<ul>
<li>ਸਵਾਦ- Tasty <li>ਬੇਸਵਾਦ- untasty <li>ਮਿੱਠਾ- sweet <li>ਖੱਟਾ- sour <li>ਨਮਕੀਨ- salty <li>ਕਰਾਰਾ- spicy, tangy  <li>ਕੌੜਾ- bitter <li>ਮਸਾਲੇਦਾਰ- having strong spices <li>ਮਿਰਚ ਵਾਲਾ- hot(chilly) <li>ਰਸ-ਭਰਿਆ- juicy  <li>ਤਿੱਖਾ- sharp in taste <li>ਤੁਰਸ਼- sharp in taste <li>ਬਕਬਕਾ- unpleasantly tasteless
</ul>
</td>
</tr>
</table>
<ul>
<li>ਲੰਮਾ- long <li>ਉੱਚਾ- high <li>ਛੋਟਾ-small <li>ਮੋਟਾ-fat, heavy <li>ਪਤਲਾ- thin <li>ਅਰਾਮਦਾਇਕ- comfortable <li>ਚੁਭਵਾਂ- pinching <li>ਮਿੱਠਾ- sweet <li>ਖੱਟਾ- bitter, sour <li>ਕੌੜਾ- bitter <li>ਨਮਕੀਨ- salty <li>ਠੰਡਾ- cold, cool <li>ਗਰਮ- hot <li>ਜਵਾਨ-young <li>ਬੁੱਢਾ- old <li>ਤਕੜਾ- strong <li>ਕਮਜ਼ੋਰ-weak 
</ul>
<h2><a name="adjective-practice">Practice|ਅਭਿਆਸ</a></h2>
<p style=" border: thin solid blue; padding: 1em; color: blue;">The following table has a special functionality. It can help you memorize either of its columns. After you have read it carefully, click on memorize button of a column.</p>
<table class="mem">
<caption>Inflected forms of adjective ਚੰਗਾ (simple case only) </caption>
<tr>
<th> Adjective <a href="#" onclick="return Mem.start( this )">(memorize)</a></th>
<th> Noun <a href="#" onclick="return Mem.start( this )">(memorize)</a></th>
</tr><tr>
<td>ਚੰਗਾ</td><td>ਮੁੰਡਾ (masculine, singular)</td>
</tr><tr>
<td>ਚੰਗੇ</td><td>ਮੁੰਡੇ(masculine, plural)</td>
</tr><tr>
<td>ਚੰਗੀ</td><td>ਕੁੜੀ(feminine, singular)</td>
</tr><tr>
<td>ਚੰਗੀਆਂ</td><td>ਕੁੜੀਆਂ(feminine, plural)</td>
</tr>
</table>

<table class="mem">
<caption>ਬੁਰਾ</caption>
<tr><th> Adjective <a href="#" onclick="return Mem.start( this )">(memorize)</a></th><th>Gender and Number <a href="#" onclick="return Mem.start( this )">(memorize)</a></th></tr>
<tr><td>ਬੁਰਾ</td><td>Masculine Singular</td></tr>
<tr><td>ਬੁਰੇ</td><td>Masculine Plural</td></tr>
<tr><td>ਬੁਰੀ</td><td>Feminine Singular</td></tr>
<tr><td>ਬੁਰੀਆਂ</td><td>Feminine Plural</td></tr>
</table>

</html>