Welcome to TiddlyWiki created by Jeremy Ruston, Copyright © 2007 UnaMesa Association
The //New Millennium English// authors write in the Teacher's Book Introduction,
"...students are encouraged to distinguish between active vocabulary which should be learned, and passive which is for recognition."
Adrian Doff in [[Teach English: a training course for teachers : trainer's handbook|http://books.google.com/books?id=UH1qk3_ptIYC&pg=PA19&dq=active+vocabulary&hl=en&ei=c2BKTKCFLqafOKeqlJYD&sa=X&oi=book_result&ct=result&resnum=1&ved=0CC0Q6AEwADgK#v=onepage&q=active%20vocabulary&f=false]] writes,
"...Words which students will need to understand and also use themselves. We call this active vocabulary. In teaching active vocabulary, it is usually worth spending time //giving examples// and asking questions, so that students can really see how the word is used."
The Wikipedia adds [[here|http://en.wikipedia.org/wiki/Active_vocabulary]],
"Even if we learn a word, it takes a lot of practice and context connections for us to learn it well. A rough grouping of words we understand when we hear them encompasses our "passive" vocabulary, whereas our "active" vocabulary is made up of words that come to our mind immediately when we have to use them in a sentence, as we speak. In this case, //we often have to come up with a word in the time frame of milliseconds//, so one has to know it well, often in combination with other words in phrases, where it is commonly used...
By knowing the 2000 words with the highest frequency, one would know 80% of the words in those texts. The numbers look even better than this if we want to cover the words we come across in an informally spoken context. Then the 2000 most common words would cover 96% of the vocabulary."
The [[Oxford University Press|http://www.oup.com/oald-bin/oxfordProfiler.pl]] states that in a typical upper intermediate text 90-95% of the words will be Oxford 3000 keywords.
That is why we discuss the [[frequency|Frequency]] of the words from the list of active vocabulary.
Off-topic. None of the words we discuss here are on the list of [[The 100 Most Beautiful Words in English|http://www.alphadictionary.com/articles/100_most_beautiful_words.html]].
!User
{{textRight{
<<TiddlySpaceLogout>>
<<tabs txtUserTab
"Your Identities" "Manage your identities" [[Backstage##Identities]]
"Your Spaces" "Maintain your spaces and create new ones" [[Backstage##UserSpaces]]
"Your Password" "Change your password" [[Backstage##Password]]
>>
}}}
!Menu
{{tiddlyspaceMenu{
<<message messages.memberStatus>>
<<homeLink>> [[help|@@docs]] [[blog|@@blog]] [[featured|@@featured]]
----
running TiddlySpace@glossary version <<message extensions.tiddlyweb.status.tiddlyspace_version>>
}}}
!Space
<<followSpace>>
<<tabs txtSpaceTab
members Members Backstage##SpaceMembers
includes "include spaces" Backstage##SpaceInclusions
tiddlers "tiddlers control panel" Backstage##Tiddlers
plugins "Manage installed plugins" PluginManager
batch "Perform batch operations on public/private tiddlers" Backstage##BatchOps
options "TiddlyWiki options" Backstage##Options
tweaks "Tweak the appearance and behaviour of TiddlyWiki" AdvancedOptions
import "Import tiddlers from a TiddlyWiki" Backstage##FileImport
export "Export this TiddlySpace for offline use" Backstage##Export
>>
!FileImport
<<fileImport>>
!Export
You can download this TiddlySpace as an offline TiddlyWiki:
{{chunkyButton{<<exportSpace>>}}}
!Identities
You can associate your account with multiple identities. If you have an open id for example you could log into TiddlySpace with that as well as a TiddlySpace user account.
<<TiddlySpaceIdentities add>>
{{inlineList{
<<TiddlySpaceIdentities list>>
}}}
{{backstageClear{}}}
!Login
<<TiddlySpaceLogin>>
<<TiddlySpaceRegister>>
!Options
upload a private file:
<<binaryUpload>>
<<search>><<closeAll>><<permaview>><<newTiddler>><<newJournal "DD MMM YYYY" "journal">><<saveChanges>><<slider chkSliderOptionsPanel OptionsPanel "options ยป" "Change TiddlyWiki advanced options">>
!Password
<<TiddlySpaceChangePassword>>
!SpaceInclusions
This space includes the public tiddlers from the following spaces:
<<TiddlySpaceInclusion list>>
<<TiddlySpaceInclusion passive>>
!SpaceMembers
The following people are members of the space ''<<message extensions.tiddlyspace.currentSpace.name>>''. Only members have access to the private tiddlers in a space.
<<TiddlySpaceMembers list>>
<<TiddlySpaceMembers add>>
!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>>
!UserSpaces
<<TiddlySpaceSpaces add>>
You are currently a member of the following spaces.
{{inlineList{
<<TiddlySpaceSpaces list>>
}}}
{{backstageClear{}}}
/***
|''Name''|BinaryTiddlersPlugin|
|''Description''|renders base64-encoded binary tiddlers as images or links|
|''Author''|FND|
|''Version''|0.3.0|
|''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($) {
var ctfield = "server.content-type";
var plugin = config.extensions.BinaryTiddlersPlugin = {
isWikiText: function(tiddler) {
var ctype = tiddler.fields[ctfield];
if(ctype) {
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");
},
endsWith: function(str, suffix) {
return str.length >= suffix.length &&
str.substr(str.length - suffix.length) == suffix;
}
};
// 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 && !tiddler.tags.contains("systemConfig")) {
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''|BinaryUploadPlugin|
|''Version''|0.3.12|
|''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|
|''Requires''|TiddlySpaceConfig|
!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 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 = config.extensions.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]) : defaults["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").
attr("method", "POST").attr("enctype", "multipart/form-data").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" /></div>').
submit(function(ev) {
this.target = iframeName;
options.target = iframeName;
macro.uploadFile(place, baseURL, workspace, options);
});
$('<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(locale.loadError.format([title]));
}
});
}
};
if(config.extensions.tiddlyspace) {
config.macros.binaryUploadPublic = {
handler: function(place, macroName, params, wikifier, paramString, tiddler) {
var options = paramString.parseParams(null, null, true)[0];
var bag = "%0_public".
format([config.extensions.tiddlyspace.currentSpace.name]);
options.bag = bag;
macro.createUploadForm(place, options);
}
};
}
})(jQuery);
//}}}
/*{{{*/
Background: #ece0f5
Foreground: #16091e
PrimaryPale: #e4d1f0
PrimaryLight: #b27dd5
PrimaryMid: #7d37ac
PrimaryDark: #020103
SecondaryPale: #d4f0d1
SecondaryLight: #84d57d
SecondaryMid: #40ac37
SecondaryDark: #010301
TertiaryPale: #e7f0d1
TertiaryLight: #bcd57d
TertiaryMid: #8bac37
TertiaryDark: #020301
Error: #f88
ColorPaletteParameters: HSL([276|19], [0.5143616845825302],[0.008753400458325289|0.8832753890074718])
/*}}}*/
/***
|''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 = "…";
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";
})();
//}}}
<!--{{{-->
<div class='toolbar'
macro='toolbar [[ToolbarCommands::EditToolbar]] icons:yes'>
</div>
<div class='heading editorHeading'>
<div class='editor title' macro='edit title'></div>
<div class='tagClear'></div>
</div>
<div class='annotationsBox' macro='annotations'>
<div class='editSpaceSiteIcon'
macro='tiddlerOrigin height:16 width:16 label:no interactive:no'>
</div>
<div class="privacyEdit" macro='setPrivacy label:no interactive:no'></div>
<div class='tagClear'></div>
</div>
<div class='editor' macro='edit text'></div>
<div class='editorFooter'>
<div class='tagTitle'>tags</div>
<div class='editor' macro='edit tags'></div>
<div class='tagAnnotation'>
<span macro='message views.editor.tagPrompt'></span>
<span macro='tagChooser excludeLists'></span>
</div>
</div>
<!--}}}-->
ColorPalette
StyleSheet
SiteSubtitle
GettingStarted
SiteTitle
MainMenu
SiteIcon
DefaultTiddlers
ViewTemplate
PageTemplate
SideBarOptions
EditTemplate
SiteInfo
SideBarTabs
ToolbarCommands
We checked the words from the [[active vocabulary|Active Vocabulary]] list at [[WordCount|http://www.wordcount.org/main.php]]. It presents the 86,800 most frequently used English words, ranked in order of commonness. ~WordCount data comes from the [[British National Corpus|http://www.natcorp.ox.ac.uk/corpus/index.xml]]. We analyzed 169 words in their dictionary forms (no endings, and all meanings).
The average rank number (7,466) of all those words is too large for the textbook.
These words are very common: [[control]] (#294), [[staff]] (#405), [[provide|provide (sb with sth)]] (#411), [[evidence|evidence (of)]] (#436), [[increase]] (#571).
These words are very rare: [[domineering]] (#32,648), [[snobbish]] (#38,161), [[amphibian]] (#38,484), [[leftovers]] (#39,015), [[economize]] (#42,463), [[decisiveness]] (#43,463), [[domestication]] (#46,664).
We also checked 226 words and phrases from the [[active vocabulary|Active Vocabulary]] list at [[COCA|http://en.wikipedia.org/wiki/Corpus_of_Contemporary_American_English]]. We ranked them in order of their occurrence per million words in 1995-1999. The average frequency is only 25.73.
Here are some more very common words: [[provide (sb with sth)]] (171.49 per million), [[be held]] (174.6), [[evidence (of)]] (174.69), [[program]] (314.53). They should have been studied earlier.
The phrase [[build a bridge between the countries]] (or built, building) was not found in COCA. Here are some more very rare phrases with the frequency of 0.01 per million: [[lone parent]], [[do a fair share]], [[do teenage things]], [[do risky things]].
We don't think we should learn rare words and phrases for our active vocabulary.
Welcome to your brand new [[TiddlySpace]]@glossary.
To get started with this blank [[TiddlySpace]]@glossary, you'll need to modify the following [[tiddlers|Tiddler]]@glossary:
* If you don't like the color scheme click <<RandomColorPaletteButton>> to generate a new random color scheme.
* Upload a [[SiteIcon|SiteIcon tiddler]]@glossary. [[Your SiteIcon|SiteIcon]] gives your space an identity to make it recognisable to others. A good site icon will be square and at least 48*48 pixels size.
<<binaryUploadPublic title:SiteIcon>>
* [[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 ~TiddlySpace is opened
* Many features of ~TiddlySpace are accessed via the backstage bar located at the top of the page. You can toggle it on or off using the button in the top right corner of the screen.
/***
|''Name''|GroupByPlugin|
|''Description''|Mimics allTags macro to provide ways of creating lists grouping tiddlers by any field|
|''Version''|0.5.6|
|''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).
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;
}
},
_refresh: function(container, tiddlers, options) {
var totalGroups = 0, locale = macro.locale;
var excludeValues = options.exclude;
var values = {}, value_ids = [];
var field = options.field
var morpher = macro.morpher[field] || function(value) {
return value;
};
for(var i = 0; i < tiddlers.length; i++) {
var tiddler = tiddlers[i];
var value = tiddler[field] || tiddler.fields[field];
value = macro.isTypeArray(value) ? value : [ value ];
for(var j = 0; j < value.length; j++) {
var v = morpher(value[j], options);
if(v && excludeValues.indexOf(v) == -1) {
totalGroups += 1;
if(!values[v]) {
values[v] = [];
}
values[v].push(tiddler);
value_ids.pushUnique(v);
}
}
}
var CTB = createTiddlyButton;
var CTL = createTiddlyLink;
var ul = $("<ul />").appendTo(container)[0];
if(totalGroups === 0) {
$("<li />").addClass("listTitle").text(locale.noTiddlers);
}
var onClickGroup = function(ev) {
var target = ev.target;
var tiddlers = $.data(target, "tiddlers");
var popup = $(Popup.create(target)).addClass("taggedTiddlerList")[0];
var value = $(target).attr("value");
var openAll = CTB($("<li />").appendTo(popup)[0],
locale.openAllText.format([value]), locale.openAllTooltip,
function(ev) {
for(var i = 0; i < tiddlers.length; i++) {
story.displayTiddler(ev.target, tiddlers[i].title);
}
});
var listBreak = $("<li />").addClass("listBreak").html("<div />").appendTo(popup);
for(var i = 0; i < tiddlers.length; i++) {
CTL($("<li />").appendTo(popup)[0], tiddlers[i].title, true);
}
listBreak.clone().appendTo(popup);
$(CTL($("<li />").appendTo(popup)[0], value, false)).
text(locale.openTiddler.format([value]));
Popup.show();
ev.stopPropagation();
return false;
};
value_ids = value_ids.sort();
for(var i = 0; i < value_ids.length; i++) {
var title = value_ids[i];
var info = getTiddlyLinkInfo(title);
var tiddlers = values[title];
var btn = CTB($("<li />").appendTo(ul)[0],
"%0 (%1)".format([title, tiddlers.length]), locale.tooltip.format([title]), null, info.classes);
$(btn).click(onClickGroup).attr("value", title).attr("refresh", "link").attr("tiddlyLink", title);
$.data(btn, "tiddlers", tiddlers);
}
},
refresh: function(container) {
var 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 || [] };
var tiddlers = args.filter ? store.filterTiddlers(args.filter[0]) : store.getTiddlers("title");
macro._refresh(container, tiddlers, options);
}
};
})(jQuery);
//}}}
/***
|''Name''|ImageMacroPlugin|
|''Version''|0.9.0|
|''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: "" });
}
},
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']);
},
supportsDataUris: false,
renderImage: function(place, imageSource, options) {
var imageTiddler = store.getTiddler(imageSource);
var container;
if(options.link) {
container = $("<a />").attr("href", options.link).appendTo(place)[0];
} else if(options.tiddlyLink) {
container = createTiddlyLink(place, options.tiddlyLink, false);
} else {
container = $("<span />").appendTo(place)[0];
}
$(container).addClass("image");
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"], 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);
}
},
_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 preserve = options.preserveAspectRatio;
var w = dimensions.width;
var h = dimensions.height;
var userH = preserve && h < options.height ? h : options.height;
var userW = preserve && w < options.width ? w : options.width;
if(w && h) {
var preserveWidth = preserve && w > h;
var preserveHeight = preserve && h > w;
var ratio;
if(userH && !userW || preserveHeight) {
ratio = userH / h;
userW = parseInt(ratio * w, 10);
} else if (userW && !userH || preserveWidth) {
ratio = userW / w;
userH = parseInt(ratio * h, 10);
}
userW = userW ? userW : w;
userH = userH ? userH : h;
}
var img = $("<img />").addClass(options.imageClass).appendTo(container);
if(userH) {
img.attr("height", userH);
}
if(userW) {
img.attr("width", userW);
}
if(macro.ieVersion && macro.ieVersion < 7 && macro.shim) {
$(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[srcUrl]) {
macro._image_tag_cache[srcUrl] = [];
}
macro._image_tag_cache[srcUrl].push(img);
}
};
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;
}
};
var datauriTest = function() {
var data = new Image();
data.onload = function() {
macro.supportsDataUris = this.width != 1 || this.height != 1 ? false : true;
};
data.onerror = data.onload;
data.src = "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw==";
};
datauriTest();
// update views
var _oldwikifiedview = config.macros.view.views.wikified;
// update wikifier to check tiddler type before rendering
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);
}
};
config.macros.view.views.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 paramString = '"%0" %1'.format(title, params.splice(2).join(" "))
invokeMacro(place, "image", paramString, null, tiddler);
};
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);
//}}}
{{indent{
to Alfadia
}}}
Welcome to //New Millennium English 10 Vocab//.
We discuss the [[active vocabulary|Active Vocabulary]] in the [[New Millennium English textbook|http://www.titul.ru/central/index.php?id=94&mod=cat&catg=3&prod=259]] for the tenth grade students in Russian schools written by a group of ESL teachers from Russia and first published by the Titul Publishers in 2001. We review the 2009 revised edition.
If you are a student, you might be thinking about some ways to learn the active vocabulary. You will find cool usage examples of how the words get along with other words in the living language. We also give you some usage notes and [[synonyms|Synonyms]].
If you are a teacher, we give you a helping hand with teaching the active vocabulary. We show you how people are using the words now, in their conversations, mass media and blogs.
English as a Second Language is used only in ESL classes and textbooks. Students and teachers know it. Teachers usually are not happy with textbooks. Students learn English elsewhere, not much in the classroom. This is how a linguist put it in a forum thread discussing [[IELTS: The test that sets the standard?|http://languagelog.ldc.upenn.edu/nll/?p=2500#comment-77987]]:
"The [[IELTS|http://en.wikipedia.org/wiki/Ielts]] examples weren't even wrong. They floundered around, used odd or outdated style, and didn't even use common business jargon that a native speaker would choose. It appears we are giving immigrants different lessons to the ones we give ourselves. That can't be healthy."
We took the list of the active vocabulary from the student's book. Every word entry has a certain structure. We give you the word's meaning taken from online dictionaries in the first line. Then we provide you with the example sentence where the word first appeared in the textbook. We discuss only the one meaning of every word in this context. We talk about the readability of the example sentences [[here|Readability]]. You find an example of the word usage from an online dictionary or [[Google Blog Search|http://blogsearch.google.com/blogsearch?hl=en]] in the third line, and from [[Twitter|http://www.twitter.com]] in the fourth. After that, we sometimes give you synonyms and/or usage notes and comments.
We would like to thank [[Jon Miner|http://www.google.com/profiles/chinajon.miner?hl=en]] for some advice on words and [[Paul Downey|http://blog.whatfettle.com/about/]] for technical support.
Follow us on [[Twitter|http://twitter.com/nme_10]], [[Tumblr|http://nme10.tumblr.com/]], [[Blogger|http://nme10vocab.blogspot.com/]]. There is also a Facebook group and Vkontakte group.
Take part in our poll on [[Tumblr|http://nme10.tumblr.com/]] and [[Blogger|http://nme10vocab.blogspot.com/]].
[[Table of Contents]]
Julia Fyodorova and Igor Naumov, 2010
/***
|''Requires''|TiddlyWebConfig|
***/
//{{{
(function($) {
var callback = function(context, userParams) {
if(!context.status) {
return; // XXX: oughta do something
}
var tiddler = context.tiddler;
var dirty = store.isDirty();
store.setDirty(false);
store.saveTiddler(tiddler.title, tiddler.title, tiddler.text,
tiddler.modifier, tiddler.modified, tiddler.tgags, tiddler.fields,
true, tiddler.created, tiddler.creator);
store.setDirty(dirty);
};
try {
var tiddler = store.getTiddler('LazyTiddlers');
var adaptor = tiddler.getAdaptor();
var tiddlers = tiddler.text.split("\n");
var host = adaptor.fullHostName(tiddler.fields["server.host"]);
$.each(tiddlers, function(i, tiddler) {
var tiddler_info = tiddler.split(":");
var bag = tiddler_info.shift();
var title = tiddler_info.join(":");
var context = {workspace: "bags/" + bag, host: host};
adaptor.getTiddler(title, context, null, callback);
});
} catch(err) {} // Unable to get LazyTiddlers, don't do anything
})(jQuery);
//}}}
[[Table of Contents]]
[[Introduction]]
<!--{{{-->
<link rel="shortcut icon" href="/recipes/nme10_public/tiddlers/favicon.ico" />
<link href="/bags/nme10_public/tiddlers.atom?select=tag:!excludeLists"
rel="alternate" type="application/atom+xml" title="nme10's public feed" />
<!--}}}-->
<!--{{{-->
<div class='header'>
<div id='sidebarSearch'>
<span macro='search'></span>
</div>
<div class='headerForeground'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</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='messageArea'></div>
<div id='tiddlerDisplay'></div>
<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>
</div>
<!--}}}-->
/***
|''Name''|RandomColorPalettePlugin|
|''Description''|Adds a random color palette to TiddlyWiki|
|''Author''|Jon Robson|
|''Version''|1.2.8|
|''Status''|stable|
|''Source''|http://svn.tiddlywiki.org/Trunk/contributors/JonRobson/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
}}}
!Parameters
rgb: yes
By default the ColorPalette is defined in hex. You can output the colours as rgb by simply including this parameter.
hue:[0,360]
Seeds the randomiser with this hue.
saturation:[0,1]
Seeds the randomiser with a given saturation
lightness:[0,1]
Seeds the randomiser with a value for the lightest color tone (0 being darkest, 1 being lightest).
darkest:[0,1]
Seeds the randomiser with a value for the darkest color tone (0 being darkest, 1 being lightest).
huevariance: [0,90]
Given a certain hue, specify the angle from the secondary colour to which the secondary and tertiary colours should be determined.
Note parameters can be discovered by viewing the ColorPaletteParameter slice within the generated ColorPalette.
!Code
***/
//{{{
(function($){
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;
if(l <= 0.5) {
c = 2 * l * s;
} else {
c = ( 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);
r += m;
g += m;
b += m;
return new RGB(r, g, b);
}
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 = paramString.parseParams("name", null, true, false, true)[0];
macro.generatePalette(options, true);
},
generateRandomNumber: function(min, max, info) {
var num = (Math.random() * 1);
if(!info) {
info = { attempts:0 };
}
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 && options.rgb[0];
var palette = macro.getExistingPalette(true);
var hue = options.hue ? parseInt(options.hue[0]) : Math.floor(Math.random() * 359);
var saturation = options.saturation ? parseFloat(options.saturation[0]) : macro.generateRandomNumber(0.3, 0.7);
var dark = options.darkest ? parseFloat(options.darkest[0]) : macro.generateRandomNumber(0, 0.1);
var pale = options.lightness ? parseFloat(options.lightness[0]) : macro.generateRandomNumber(0.6 + dark, 1);
var lightness_values = {Dark:dark, Mid:pale - ( ( pale - dark ) / 2 ),
Light:pale - ( ( pale - dark ) / 4 ), Pale:pale};
var opposite_hue = (hue + 180) % 360;
var seed = options.huevariance ? options.huevariance[0] : 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) {
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, "],",
"[", dark, "|", pale, "])"].join("");
// construct new ColorPalette
var text = ["/*{{{*/\n"];
var colorcode;
for(var id in palette) {
if(true) {
var color = palette[id];
if(outputRGB) {
colorcode = color.toRGBString();
} else {
colorcode = 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);
tid.modifier = "RandomColorPalette Macro";
} // 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);
}
}
}
};
config.macros.RandomColorPaletteButton = {
text: "New ColorPalette",
tooltip: "Generate a random colour scheme for your TiddlyWiki",
handler: function(place, macroName, params, wikifier, paramString, tiddler) {
var btnHandler = function(ev) {
macro.handler(place, macroName, params, wikifier, paramString, tiddler);
return false;
};
createTiddlyButton(place, this.text, this.tooltip, btnHandler);
}
};
})(jQuery);
//}}}
[[Mignon Fogarty|http://grammar.quickanddirtytips.com/pronouns-and-antecedents.aspx]] said, "Sometimes readers may feel as if they are juggling. Theyโre trying to remember which nouns have already been mentioned so that they can correctly match them up with later-appearing pronouns. Donโt turn your readers into a circus act. Your job is to provide a pleasurable and easy reading experience."
We checked 129 example sentences from the textbook against the [[FleschโKincaid Grade Level|http://en.wikipedia.org/wiki/Flesch-Kincaid_Readability_Test]]. The FleschโKincaid readability test is designed to indicate comprehension difficulty when reading in English. For example, a score of 8.2 would indicate that the text is expected to be understandable by an average student in 8th grade (usually around ages 13โ14 in the USA).
The average grade level of those example sentences is 6.83. But we found some sentences that are very difficult to understand. See the example sentences for [[be perceived as]], [[be served]], [[give sth away]], [[participate]], [[have a row]]. Their grade levels are 15.25, 15.45, 16.24, 16.4 and 16.8. We checked those sentences in the [[Oxford 3000 Profiler|http://www.oup.com/oald-bin/oxfordProfiler.pl]], and their level was not lower than 90%. The sentences are just the circus [[Mignon Fogarty|http://en.wikipedia.org/wiki/Mignon_Fogarty]] told about.
[[Macmillan Dictionary|http://www.macmillandictionary.com/]]
[[Wordnik|http://www.wordnik.com/]]
[[OneLook|http://www.onelook.com/]]
[[Wiktionary|http://en.wiktionary.org/wiki/Wiktionary:Main_Page]]
[[vocabulary|http://www.vocabulary.com/]]
[[Merriam-Webster|http://www.merriam-webster.com/]]
[[Merriam-Webster's Dictionary of Synonyms|http://books.google.ru/books?id=8N4UReTJYhUC&printsec=frontcover&dq=merriam+webster%27s+dictionary+synonyms&source=bl&ots=7aw6_7Mpeo&sig=jCzCDXXm1uaSWxvOcncTaqLhBhk&hl=ru&ei=WNRoTLaIOJKYOJWppbgF&sa=X&oi=book_result&ct=result&resnum=4&ved=0CDYQ6AEwAw#v=onepage&q&f=false]]
[[yourdictionary|http://www.yourdictionary.com/synonyms/essencial]]
[[Google Blog Search|http://blogsearch.google.com/blogsearch?hl=en]]
[[tweetcloud|http://tweetcloud.com/]]
[[Twitter|http://www.twitter.com]]
[[wordcount|http://wordcount.org/main.php]]
[[COCA|http://www.americancorpus.org/]]
[[BlueCentauri Writing Sample Analyzer|http://bluecentauri.com/tools/writer/sample.php]]
[[Oxford 3000 Profiler|http://www.oup.com/oald-bin/oxfordProfiler.pl]]
[[Wikipedia|http://en.wikipedia.org/wiki/Main_Page]]
[[Language Log|http://languagelog.ldc.upenn.edu/nll/]]
[[A Way with Words|http://www.waywordradio.org/]]
[[Grammar Girl|http://grammar.quickanddirtytips.com/]]
[[separated by a common language|http://separatedbyacommonlanguage.blogspot.com]]
[[youtube|http://www.youtube.com/]]
Webster's New Dictionary of Synonyms ~Merriam-Webster Inc. 1984
Garner's Modern American Usage by Bryan A. Garner Oxford University Press 2003
<!--{{{-->
<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''|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);
//}}}
/***
|''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);
//}}}
<<closeAll>><<permaview>><<newTiddler>>
<<tiddler Backstage##Tiddlers>>
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
for the 10th grade students in Russia
New Millennium English 10 Vocab
[[StyleSheetTiddlySpace]]
/*{{{*/
.publicLightText {
color: #C0E5FC;
}
.privateLightText {
color: #E2C1D6;
}
#backstageArea #backstageToolbar a.task_tiddlyspace {
margin: 0px auto auto -75px;
font-weight: bold;
width: 150px;
line-height:24px;
font-size: 1.2em;
padding: 0;
top: 0;
position: absolute;
left: 50%;
}
.task_tiddlyspace .image,
.task_tiddlyspace .svgIcon {
margin-top: -2px;
display: inline;
}
.task_tiddlyspace .svgIconText {
display: none;
}
.task_tiddlyspace .logoText {
position: absolute;
top: 0px;
margin-left: 5px;
}
#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%);
/* For Internet Explorer 5.5 - 7 */
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ff555555, endColorstr=#ff222222);
/* For Internet Explorer 8 */
-ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr=#ff555555, endColorstr=#ff222222)";
height: 24px;
padding: 0;
border-bottom: solid 1px black;
}
.backstageBackground {
fill: black;
}
#backstageButton {
overflow: hidden;
}
#backstageButton #backstageShow,
#backstageButton #backstageHide {
margin: 0px;
padding: 0px;
}
#backstageButton #backstageShow:hover,
#backstageButton #backstageHide:hover {
background: none;
color: none;
}
#backstageShow {
margin-right: -3px;
margin-top: -3px;
}
#backstageShow .svgIcon {
left: 8px;
position: relative;
top: -5px;
}
#messageArea {
top: 50px;
}
#backstageToolbar {
position: relative;
}
#backstageArea a {
padding: 0px;
margin-left: 0px;
color: white;
background: none;
}
#backstageArea a:hover {
background-color: white;
}
#backstage .tabContents ol,
#backstage .tabContents ul {
padding: auto;
}
#backstageButton a {
margin: 0;
}
.backstagePanelBody,
.backstagePanelBody .tabContents 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: 24px;
color: #767676;
}
.backstageTask .externalImage,
.backstageTask .image {
display: inline;
}
.backstageTask .txtUserName,
.backstageTask .spaceName {
color: #fff;
}
.backstageSelTab .txtUserName,
.backstageSelTab .spaceName,
a:hover .txtUserName,
a:hover .spaceName {
color: #000;
}
.spaceSiteIcon {
margin-right: 10px;
}
.userSiteIcon {
margin-left: 10px;
}
#backstageToolbar .task_space {
position: absolute;
top: 0px;
left: 0%;
}
#backstageToolbar .task_user,
#backstageToolbar .task_login {
display: block;
position: absolute;
top: 0px;
right: 5%;
}
#backstageToolbar .task_login img {
position: relative;
display: inline;
}
#backstageToolbar .task_login img,
#backstageToolbar .task_user img {
float: right;
}
#backstageToolbar .task_space .svgIcon {
float: left;
position: relative;
z-index: 2;
}
#backstageToolbar a span {
z-index: 2;
}
#backstageToolbar .spaceSiteIcon {
float: left;
}
a.backstageTask {
display: block;
}
#backstageToolbar a span.txtUserName,
#backstageToolbar a .txtUserName span {
display: inline;
float: none;
}
#backstage .deleteButton {
margin-left: 0.3em;
font-weight: bold;
color: red;
font-size: 1.6em;
}
#backstage .deleteButton:hover {
background: none;
}
#backstageArea .siteIcon {
display: inline;
}
#backstagePanel .TiddlySpaceLogin {
display: inline;
}
.backstagePanelBody .tabContents .button {
display: block;
}
.backstagePanelBody .tab {
margin: 0 0 0 0.6em;
padding: 0.4em 0.5em 1px 0.5em;
}
#backstage .tabContents{
padding: 1.5em;
}
#backstage .wizard {
border: 0px;
}
#backstage .txtSpaceTab li {
border: 1px solid #ddd;
background: #eee;
list-style: none;
margin: 0.5em;
padding: 0.5em;
width: 80%;
}
#backstage .txtSpaceTab li.annotation {
border: 2px solid [[ColorPalette::SecondaryMid]];
}
#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 div.txtSpaceTab li .deleteButton {
float: right;
}
#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: block;
padding: 0;
margin: 0;
border: solid 2px #000;
}
span.chunkyButton a.button, span.chunkyButton a:active.button {
white-space: nowrap;
font-weight: bold;
font-size: 1.8em;
color: #fff;
background-color: #04b;
text-align: center;
padding: 1em 3em;
margin: 0;
border-style: none;
border-top: solid 1px #fff;
display: block;
}
.chunkyButton {
width: 18em;
}
span.chunkyButton a.button:hover {
background-color: #014;
border-style: none;
color: #fff;
border-top: solid 1px #8cf;
}
a.baskstageTask.task_login,
a.baskstageTask.task_user {
_width: 200px;
_text-align: right;
}
#backstageArea #backstageToolbar .task_login img,
#backstageArea #backstageToolbar .task_user img {
_display: inline;
_float: none;
}
/*}}}*/
/*{{{*/
* 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:0px; top:0px;}
.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:0px 3px 0px 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:0px; padding-bottom:0px;}
.fieldsetFix {border:0; padding:0; margin:1px 0px;}
.sparkline {line-height:1em;}
.sparktick {outline:0;}
.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;}
/*}}}*/
/*{{{*/
.tiddler .originButton div {
display: inline-block;
}
.tiddler .spaceSiteIcon .siteIcon {
_display: inline; /* IE doesn't like inline-block */
}
.tiddler .originButton {
display: block;
}
.selected .tagging,
.selected .tagged,
.selected .tagging:hover,
.selected .tagged:hover {
border: none;
background: none;
}
.tagged {
float: right;
position: relative;
right: -2.4em;
}
.tiddler .tagged ul {
margin: 0;
}
.tagging {
float: none;
}
.tagging, .tagged {
background: none;
border: none;
}
.tagging li.listTitle {
margin-left: 0px;
}
.tagging li {
display: block;
margin-right: 8px;
clear: both;
margin-left: 8px;
}
.tagging .tiddlyLink {
-webkit-border-radius: 3px;
-moz-border-radius: 3px;
-o-border-radius: 3px;
border-radius: 3px;
margin: 0;
padding: 1px 2px;
line-height: 1.2em;
}
.tagged .button {
-webkit-border-radius: 15px 0px 0px 15px;
-moz-border-radius: 15px 0px 0px 15px;
-o-border-radius: 15px 0px 0px 15px;
border-radius: 15px 0px 0px 15px;
background-color: white;
border-bottom: 2px solid #ccc;
border-left: 2px solid #ccc;
border-top: 2px solid #ccc;
display: block;
margin: 0 0 0.3em -1.1em;
padding: 0.4em;
font-size: 0.9em;
width: 8em;
word-wrap: break-word;
color: [[ColorPalette::Background]];
background: [[ColorPalette::TertiaryMid]];
}
/* for following */
#popup .siteIcon {
float: left;
height: 25px;
}
.content {
position: relative;
top: 0;
left: 0;
width: 100%; /* IE */
font-size: 0.9em;
}
.content .info {
float: right;
position: relative;
right: 1em;
top: 0;
width: 9em;
z-index: 2;
}
.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;
}
a.originButton:hover {
color: [[ColorPalette::PrimaryMid]];
}
.originButton img,
.originButton svg {
margin-left: 0px;
}
.modifierIcon {
margin-right: 0px;
position: absolute;
width: 74px;
top: 0px;
right: 0px;
_right: 74px; /* in IE6 positioning works incorrectly so use -width instead */
text-align: right;
}
.modifierIcon .siteIcon div {
height: 52px; /* include border */
}
.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;
}
.spaceIcon img {
height: 40px;
}
.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-left: 8px;
padding-right: 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 .title a {
color: [[ColorPalette::Foreground]];
text-decoration: none;
}
.tiddler .title a:hover {
background: none;
color: [[ColorPalette::Foreground]];
text-decoration: none;
}
.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 .tags {
float: right;
}
.tiddler .tags .listTitle {
display: none;
}
.tiddler .tags li {
font-size: 0.9em;
list-style: none;
margin-bottom: 8px;
overflow: hidden;
margin-right: 8px;
text-align: right;
border-bottom: solid 2px [[ColorPalette::PrimaryPale]];
}
.tiddler .tags li .button {
padding: 0px;
}
.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;
}
@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;
}
}
/*}}}*/
/*{{{*/
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;
}
.public {
border-color: #C7EAFF;
}
.private {
border-color: #FFCAE9;
}
.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 *** */
.headerForeground {
background-color: [[ColorPalette::PrimaryMid]];
float: left;
margin-left: 72px;
margin-right: 16px;
margin-top: 24px;
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*/
}
.header {
position: relative;
background-color: [[ColorPalette::PrimaryMid]];
_width: 100%; /* ie 6 demands */
}
.siteTitle {
clear: both;
display: block;
font-size: 32px;
height: 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;
}
#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;
}
#mainMenu a:hover {
background-color: [[ColorPalette::PrimaryMid]];
color: [[ColorPalette::Background]]
}
.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;
}
.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;
}
/*******************/
/* --- New CSS --- */
/*******************/
#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 */
}
#mainMenu a {
color: #fff;
padding: 8px;
font-size: 0.9em;
margin-right: 16px;
}
#sidebarOptions a.button {
color: #fff;
}
#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]]
Some words from the list of active vocabulary in the textbook are synonyms to the other. We also offer synonyms for some rare words from the list. Our synonyms are more frequently used.
It is a good idea to know the little difference between synonyms, but [[Jan Freeman|http://search.boston.com/local/Search.do?s.sm.query=Jan+Freeman&camp=localsearch:on:byline:art]], a language columnist for the Boston Globe told [[Grant Barrett|http://en.wikipedia.org/wiki/Grant_Barrett]] at [[waywordradio|http://www.waywordradio.org/write-it-right/]] on March 10, 2010,
"You distinguish between //I donโt remember// and //I donโt recollect// based on how much effort it took to remember. And I thought, wait, how would anyone know youโre making that distinction and how would it be possibly useful. And I doubt it really was a distinction, except in the minds of some users. One person makes a distinction in his usage book; the next person picks that up and makes a few more distinctions. And before you know it you have hundreds of distinctions. No one can remember all those distinctions."
Another thing we should keep in mind is the difference between varieties of English. Ordinary people don't care about it in their daily life. But you can understand the embarrassment when people learn that //rubber// is not //eraser// across the pond. As [[David Crystal|http://www.davidcrystal.com/David_Crystal/biography.htm]] said [[here|http://www.youtube.com/watch?v=0XT04EO5RSU]], "It's essential that English learners know about what's going on in English language around the world."
[[M. Lynne Murphy|http://www.blogger.com/profile/10171345732985610861]] collects words/phrases/pronunciations/grammatical constructions that get her into trouble on a daily basis. She has this citation by George B. Shaw on her [[blog|http://separatedbyacommonlanguage.blogspot.com/]], "England and America are two countries separated by a common language."
[[Introduction]]
[[Active Vocabulary]]
[[Frequency]]
[[Readability]]
[[Synonyms]]
[[Unit 1 Lessons 1 and 2]]
[[Unit 1 Lessons 3 and 4]]
[[Unit 1 Lessons 7 and 8]]
[[Unit 2 Lessons 1 and 2]]
[[Unit 2 Lessons 5 and 6]]
[[Unit 2 Lessons 7 and 8]]
[[Unit 3 Lessons 1 and 2]]
[[Unit 3 Lessons 5 and 6]]
[[Unit 3 Lessons 7 and 8]]
[[Unit 4 Lessons 1 and 2]]
[[Unit 4 Lessons 3 and 4]]
[[Unit 4 Lessons 5 and 6]]
[[Unit 4 Lessons 7 and 8]]
[[Unit 5 Lessons 1 and 2]]
[[Unit 5 Lessons 3 and 4]]
[[Unit 5 Lessons 5 and 6]]
[[Unit 5 Lessons 7 and 8]]
[[Unit 6 Lessons 1 and 2]]
[[Unit 6 Lessons 3 and 4]]
[[Unit 6 Lessons 7 and 8]]
[[Unit 7 Lessons 1 and 2]]
[[Unit 7 Lessons 3 and 4]]
[[Unit 7 Lessons 5 and 6]]
[[Unit 8 Lessons 1 and 2]]
[[Unit 8 Lessons 3 and 4]]
[[Unit 8 Lessons 5 and 6]]
[[Unit 8 Lessons 7 and 8]]
[[Reference]]
/***
|''Name''|TiddlyFileImporter|
|''Version''|0.3.2|
|''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:',
step1URLText: 'URL:',
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" />',
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" />');
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" />').appendTo(uploadWrapper);
var onSubmit = function(ev) {
var uploadType = $('select', 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);
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.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('%0 <input type="text" name="uri" />'.
format([me.step1URLText]));
}
};
$(place).append('<span>%0</span>'.format([me.step1TypeChooser])).
append($('<select><option value="file" selected="selected">file'
+ '<option value="uri">url</select>').change(onSelectChange)).
append('<div class="importFrom">%0<input type="file" name="file" />'.
format([me.step1FileText])
+ '</div>');
},
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) == 3) {
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']
.split(/^[^\/]*\//)[1];
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);
delete fields['server.permissions'];
delete fields['server.bag'];
fields['server.page.revision'] = 'false';
delete fields['server.recipe'];
fields.changecount = 1;
store.saveTiddler(tiddler.title, tiddler.title, tiddler.text,
tiddler.modifier, tiddler.modified, tiddler.tags, tiddler.fields,
false, tiddler.created);
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''|TiddlySpaceBackstage|
|''Version''|0.6.0|
|''Description''|Provides a TiddlySpace version of the backstage and a homeLink, and followSpace macro|
|''Status''|@@beta@@|
|''Source''|http://github.com/TiddlySpace/tiddlyspace/raw/master/src/plugins/TiddlySpaceBackstage.js|
|''Requires''|TiddlySpaceConfig ImageMacroPlugin TiddlySpaceViewTypes|
!Code
***/
//{{{
(function($) {
var disabled_tabs_for_nonmembers = ["PluginManager", "Backstage##FileImport", "Backstage##BatchOps",
"Backstage##SpaceMembers", "TiddlySpaceTabs##Private", "TiddlySpaceTabs##Drafts"];
var tweb = config.extensions.tiddlyweb;
var tiddlyspace = config.extensions.tiddlyspace;
var imageMacro = config.macros.image;
if(config.options.chkBackstage === undefined) {
config.options.chkBackstage = true;
}
config.tasks.login = {
text: "login",
tooltip: "TiddlySpace login",
content: "<<tiddler Backstage##Login>>"
};
config.tasks.user = {
text: "user: ",
tooltip: "user control panel",
content: "<<tiddler Backstage##User>>"
};
config.tasks.space = {
text: "space: ",
tooltip: "space control panel",
content: "<<tiddler Backstage##Space>>",
className: "right"
};
config.tasks.tiddlyspace = {
text: "",
tooltip: "",
content: "<<tiddler Backstage##Menu>>"
}
config.backstageTasks = ["login", "tiddlyspace", "user", "space"];
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();
tweb.getUserInfo(function(user) {
if(user.anon) {
$(".task_user", tasks).hide();
tiddlyspace.disableTab(disabled_tabs_for_nonmembers);
} else {
$(".task_login", tasks).hide();
}
});
// display backstage
return _show.apply(this, arguments);
};
if(readOnly) {
tiddlyspace.disableTab(disabled_tabs_for_nonmembers);
}
var _init = backstage.init;
var tasks = config.tasks;
var commonUrl = "/bags/common/tiddlers/%0";
// mock out renderAvatar if unavailable -- XXX: temporary hotfix, not a permanent solution!
tiddlyspace.renderAvatar = tiddlyspace.renderAvatar || function() {};
backstage.tiddlyspace = {
locale: {
member: "You are a member of this space.",
nonmember: "You are a non-member of this space.",
loggedout: "You are currently logged out of TiddlySpace."
},
userButton: function(backstageArea, user) {
// override user button (logged in) to show username
var userBtn = $("[task=user]", backstageArea).empty();
if(user.anon) {
userBtn.remove();
} else {
$("<span />").text(tasks.user.text).appendTo(userBtn);
$("<span />").addClass("txtUserName").text(user.name).appendTo(userBtn);
var container = $("<span />").appendTo(userBtn)[0];
tiddlyspace.renderAvatar(container, user.name, { imageOptions: { imageClass:"userSiteIcon", height: 24, width: 24 },
labelOptions: { include: false } });
}
},
showButton: function() {
var showBtn = $("#backstageShow")[0];
var altText = $(showBtn).text();
$(showBtn).empty();
imageMacro.renderImage(showBtn, "backstage.svg",
{ altImage: commonUrl.format(["backstage.png"]), alt: altText, width: 60, height: 60 });
},
hideButton: function() {
var hideBtn = $("#backstageHide")[0];
altText = $(hideBtn).text();
$(hideBtn).empty();
imageMacro.renderImage(hideBtn, "close.svg",
{ altImage: commonUrl.format(["close.png"]), alt: altText, width: 24, height: 24 });
},
middleButton: function(backstageArea) {
var locale = backstage.tiddlyspace.locale;
var backstageToolbar = $("#backstageToolbar", backstageArea)[0];
var backstageLogo = $("#[task=tiddlyspace]").empty()[0];
var iconName = readOnly ? "publicIcon" : "privateAndPublicIcon";
var space = tiddlyspace.currentSpace.name;
tweb.getUserInfo(function(user) {
if(!user.anon) {
config.messages.memberStatus = readOnly ? locale.nonmember : locale.member;
} else {
config.messages.memberStatus = locale.loggedout;
}
});
imageMacro.renderImage(backstageLogo, iconName, { width: 24, height: 24 });
$(".image", backstageLogo);
// construct the tiddlyspace logo
$('<span class="logoText"><span class="privateLightText">tiddly</span>' +
'<span class="publicLightText">space</span></span>').
appendTo(backstageLogo);
},
spaceButton: function(backstageArea) {
// override space button to show SiteIcon
var spaceName = tiddlyspace.currentSpace.name;
var btn = $("[task=space]", backstageArea);
btn.empty();
tiddlyspace.renderAvatar(btn[0], spaceName, { imageOptions: { imageClass:"spaceSiteIcon", height: 24, width: 24 },
labelOptions: { include: false } });
$("<span />").text(tasks.space.text).appendTo(btn);
$("<span />").addClass("spaceName").text(spaceName).appendTo(btn);
},
loginButton: function(backstageArea, user) {
var loginBtn = $("[task=login]", backstageArea).empty();
if(user.anon) {
$("<span />").text(tasks.login.text).appendTo(loginBtn);
var container = $("<span />").appendTo(loginBtn)[0];
imageMacro.renderImage(container, commonUrl.format(["defaultUserIcon"]),
{ imageClass:"userSiteIcon", height: 24, width: 24 });
} else {
loginBtn.remove();
}
},
addClasses: function(backstageArea) {
var tasks = $(".backstageTask", backstageArea);
for(var i = 0; i < tasks.length; i++) {
var btn = $(tasks[i]);
var taskName = btn.attr("task");
btn.addClass("task_%0".format([taskName]));
}
}
};
backstage.init = function() {
_init.apply(this, arguments);
tweb.getUserInfo(function(user) {
var backstageArea = $("#backstageArea")[0];
var tiddlyspace_b = backstage.tiddlyspace;
tiddlyspace_b.userButton(backstageArea, user);
tiddlyspace_b.showButton();
tiddlyspace_b.hideButton();
tiddlyspace_b.middleButton(backstageArea);
tiddlyspace_b.spaceButton(backstageArea);
tiddlyspace_b.loginButton(backstageArea, user);
tiddlyspace_b.addClasses(backstageArea); // for IE styling purposes
});
};
var home = config.macros.homeLink = {
locale: {
linkText: "your home"
},
handler: function(place) {
var container = $("<span />").appendTo(place)[0];
tweb.getUserInfo(function(user) {
if(!user.anon && user.name != tiddlyspace.currentSpace.name) {
createSpaceLink(container, user.name, null, home.locale.linkText);
}
});
}
};
var followLink = config.macros.followSpace = {
locale: {
label: "follow %0"
},
paramifiedLink: function(container, space, title, label, paramifier) {
tweb.getStatus(function(status) {
var host = config.extensions.tiddlyspace.getHost(status.server_host, space);
var url = "%0/#%1:[[%2]]".format([host, paramifier, title]);
label = label ? label : title;
$("<a />").attr("href", url).text(label).appendTo(container);
});
},
make: function(container, username, space) {
followLink.paramifiedLink(container, username, "@" + space,
followLink.locale.label.format([space]), "follow");
},
handler: function(place) {
var container = $("<span />").appendTo(place)[0];
tweb.getUserInfo(function(user) {
var space = tiddlyspace.currentSpace.name;
var username = user.name;
if(!user.anon && space != username) {
followLink.make(place, username, space);
}
});
}
};
config.macros.exportSpace = {
handler: function(place, macroName, params) {
var filename = params[0] ||
"/?download=%0.html".format([tiddlyspace.currentSpace.name]);
$('<a class="button">download</a>'). // XXX: i18n
attr("href", filename).appendTo(place);
}
};
})(jQuery);
//}}}
/***
|''Name''|TiddlySpaceChangePassword|
|''Version''|0.2.0|
|''Author''|Osmosoft|
|''Source''|http://github.com/TiddlySpace/tiddlyspace/raw/master/src/plugins/TiddlySpaceChangePassword.js|
|''Requires''|TiddlyWebConfig TiddlySpaceUserControls|
!HTMLForm
<form action="#">
<fieldset>
<legend />
<dl>
<dt>Current password:</dt>
<dd>
<input type="password" name="password" />
</dd>
<dd>
<dt>New password:</dt>
<input type="password" name="new_password" />
<dt>Confirm new password:</dt>
<input type="password" name="new_password_confirm" />
</dd>
</dl>
<p class="annotation" />
<input type="submit" />
</fieldset>
</form>
!Code
***/
//{{{
(function($) {
var tweb = config.extensions.tiddlyweb;
var displayError = config.macros.TiddlySpaceLogin.displayError;
var macro = config.macros.TiddlySpaceChangePassword = {
locale: {
label: "Change password",
cpwSuccess: "Password changed",
noPasswordError: "Please enter password",
passwordMatchError: "Error: passwords do not match",
passwordShortError: "Error: password must be at least %0 characters",
passwordAuthError: "Error: old password is incorrect",
passwordMinLength: 6
},
formTemplate: store.getTiddlerText(tiddler.title + "##HTMLForm"),
handler: function(place, macroName, params, wikifier, paramString, tiddler) {
$(macro.formTemplate).submit(macro.onSubmit).
find("legend").text(macro.locale.label).end().
find(".annotation").hide().end().
find("[type=submit]").val(macro.locale.label).end().
appendTo(place);
},
onSubmit: function(ev) {
var msg = macro.locale;
var form = $(this).closest("form");
form.find(".annotation").hide();
var password = form.find("[name=password]").val();
var npassword = form.find("[name=new_password]").val();
var npasswordConfirm = form.find("[name=new_password_confirm]").val();
var xhr, ctx;
if(npassword != npasswordConfirm) {
xhr = { status: 409 }; // XXX: hacky
ctx = {
msg: {
409: msg.passwordMatchError
},
form: form,
selector: "[name=new_password], [name=new_password_confirm]"
};
displayError(xhr, null, null, ctx);
} else if(npassword.length < msg.passwordMinLength) {
xhr = { status: 409 }; // XXX: hacky
ctx = {
msg: {
409: msg.passwordShortError.format([msg.passwordMinLength])
},
form: form,
selector: "[name=new_password]"
};
displayError(xhr, null, null, ctx);
} else {
macro.changePassword(tweb.username, password, npassword);
}
return false;
},
changePassword: function(username, password, npassword, form) {
var pwCallback = function(resource, status, xhr) {
displayMessage(macro.locale.cpwSuccess);
};
var pwErrback = function(xhr, error, exc) {
var ctx = {
msg: {
400: macro.locale.passwordAuthError
},
form: form,
selector: "[name=password]"
};
displayError(xhr, null, null, ctx);
};
var user = new tiddlyweb.User(username, password, tweb.host);
user.setPassword(npassword, pwCallback, pwErrback);
}
};
})(jQuery);
//}}}
/***
|''Name''|TiddlySpaceCloneCommand|
|''Version''|0.5.5|
|''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|
!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) {
if(!store.tiddlerExists(tiddler.title)) {
var el = story.getTiddler(tiddler.title);
// disable if new tiddler already has (inherited) fields
return el ? !$(el).attr("tiddlyFields") : true;
}
var bag = tiddler.fields["server.bag"];
if(readOnly) {
return false;
} else if(tiddlyspace.coreBags.contains(bag)) {
return true;
} else {
var space = tiddlyspace.determineSpace(tiddler, false);
return space && space.name != tiddlyspace.currentSpace.name;
}
},
handler: function(ev, src, title) {
var tiddler = store.getTiddler(title);
if(tiddler) {
fieldsCache[title] = $.extend({}, tiddler.fields);
tiddler.fields["server.workspace"] = "bags/%0_private".
format([tiddlyspace.currentSpace.name]);
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);
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);
//}}}
/***
|''Name''|TiddlySpaceConfig|
|''Version''|0.6.5|
|''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];
// 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) };
};
// hijack saveTiddler to accept Tiddler instance
var _saveTiddler = TiddlyWiki.prototype.saveTiddler;
TiddlyWiki.prototype.saveTiddler = function(title, newTitle, newBody, modifier,
modified, tags, fields, clearChangeCount, created, creator) {
if(title instanceof Tiddler) { // overloading first argument
var t = $.extend(new Tiddler(title.title), title);
t = _saveTiddler.apply(this, [t.title, t.title, t.text, t.modifier,
t.modified, t.tags, t.fields, false, t.created, t.creator]);
return t;
} else {
return _saveTiddler.apply(this, arguments);
}
};
var coreBags = ["system", "tiddlyspace"];
var systemSpaces = ["plugins", "info", "images", "theme"];
systemSpaces = $.map(systemSpaces, function(item, i) {
return "system-%0_public".format(item);
});
var disabledTabs = [];
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;
},
// 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 ? plugin.currentSpace.name : 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) {
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]);
}
}
},
isDisabledTab: function(tabTitle) {
var match = new RegExp("(?:\\[\\[([^\\]]+)\\]\\])", "mg").exec(tabTitle);
var tabIdentifier = match ? match[1] : tabTitle;
return disabledTabs.contains(tabIdentifier);
},
getCsrfToken: function() {
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;
}
};
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:") {
// 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);
}
}
// 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";
if(config.options.chkPrivateMode === undefined) {
config.options.chkPrivateMode = false;
config.defaultCustomFields["server.workspace"] = "bags/%0_public".
format(plugin.currentSpace.name);
} else {
var mode = config.options.chkPrivateMode ? "private" : "public";
config.defaultCustomFields["server.workspace"] = "bags/%0_%1".
format(plugin.currentSpace.name, mode);
}
config.paramifiers.follow = {
onstart: function(v) {
if(!readOnly) {
var bag = "%0_public".format([config.extensions.tiddlyspace.currentSpace.name]);
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");
}
}
};
})(jQuery);
//}}}
/***
|''Name''|TiddlySpaceFollowingPlugin|
|''Version''|0.6.13|
|''Description''|Provides a following macro|
|''Author''|Jon Robson|
|''Requires''|TiddlySpaceConfig TiddlySpaceTiddlerIconsPlugin|
|''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.
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 tweb = config.extensions.tiddlyweb;
var tiddlyspace = config.extensions.tiddlyspace;
var shadows = config.shadowTiddlers;
config.annotations.ScanTemplate = "This tiddler is a template used in the display of tiddlers from spaces you are following. Use the wildcard {{{$1}}} to access the spaceField. 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>> @$1";
shadows.FollowingTemplate = "<<view server.bag SiteIcon width:24 height:24 spaceLink:yes label:no>> @$1";
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.bag SiteIcon width:24 height:24 spaceLink:yes label:no>> ",
"<<view server.bag spaceLink title external:no>> modified by <<view modifier spaceLink>> ",
"in the <<view server.bag 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 endsWith = config.extensions.BinaryTiddlersPlugin.endsWith;
var adaptor = store.getTiddlers()[0].getAdaptor();
var isPublic = endsWith(workspace, "_public");
var space = tiddlyspace.resolveSpaceName(workspace);
if(tiddlyspace.currentSpace.name == space) {
space = isPublic ? "public" : "private";
} else {
space = "@%0".format([space]);
}
var localTitle = "%0 [%1]".format([title, space]);
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) {
tiddlyspace.displayReplyButton(src, tiddler);
callback(src, tiddler);
}
};
adaptor.getTiddler(title, context, null, getCallback);
});
};
tiddlyspace.displayReplyButton = function(el, tiddler) {
var replyLink = $(".replyLink", el);
if(replyLink.length > 0) {
el = replyLink.unbind("click").empty()[0];
el.onclick = null;
}
var btn = $("<button />").addClass("reply").appendTo(el);
var publicBag = "%0_public".format([tiddlyspace.currentSpace.name]);
var serverTitle = tiddler.fields["server.title"];
var yourTiddler = store.getTiddler(serverTitle);
if(yourTiddler) {
btn.text("your version");
} else {
btn.text("reply");
}
btn.click(function(ev) {
if(!yourTiddler) {
story.displayTiddler(ev.target, serverTitle, DEFAULT_EDIT_TEMPLATE, false, null, null);
var tiddlerEl = story.getTiddler(serverTitle);
var text = yourTiddler ? yourTiddler.text : "";
var newFields = {};
merge(newFields, config.defaultCustomFields);
merge(newFields, { "server.workspace": "bags/%0".format([publicBag]) });
var customFields = String.encodeHashMap(newFields);
if(customFields) {
story.addCustomFields(tiddlerEl, customFields);
}
var replyTemplate = "in reply to @%0:\n<<<\n%1\n<<<\n\n%2".format([tiddler.modifier, tiddler.text, text]);
$("[edit=text]", tiddlerEl).val(replyTemplate);
} else {
story.displayTiddler(ev.target, serverTitle, DEFAULT_VIEW_TEMPLATE, false, null, null);
}
});
};
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 = {};
},
beforeSend: function(xhr) {
xhr.setRequestHeader("X-ControlView", "false");
},
followTag: "follow",
getHosts: function(callback) {
tweb.getStatus(function(status) {
callback(tweb.host, tiddlyspace.getHost(status.server_host, "%0"));
});
},
handler: function(place, macroName, params, wikifier, paramString, tiddler) {
var title = params[0] || tiddler.fields["server.title"] || tiddler.title;
var blacklisted = store.getTiddlerText("FollowTiddlersBlackList").split("\n");
var btn = $('<div class="followButton" />').appendTo(place)[0];
if(blacklisted.contains(title)) {
$(btn).remove();
return;
} else {
var options = {};
var user = params[1] || false; // allows a user to use the macro on another username
this.getFollowers(function(followers) {
if(!followers) {
$(btn).remove();
} else {
scanMacro.scan(null, { searchFields: "title", searchValues: [title],
spaceField: "bag", template: null, sort: "-modified",
showBags: followMacro._getFollowerBags(followers), hideBags: [tiddler.fields["server.bag"]],
callback: function(tiddlers) {
followMacro.constructInterface(btn, tiddlers);
}
});
}
}, user);
}
},
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) {
var x = [];
for(var i = 0; i < followers.length; i++) {
var name = followers[i];
if(name != tiddlyspace.currentSpace.name) {
x.push("%0_public".format([name]));
}
}
return x;
},
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, { searchField: "bag", searchValues: ["%0_public".format([user.name])],
spaceField: "title", template: null, tag: "follow", 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);
}
};
if(!username) {
tweb.getUserInfo(followersCallback);
} else {
followersCallback({ name: username });
}
}
};
var scanMacro = config.macros.tsScan = {
init: function () {
this.scanned = {};
},
_scanCallback: function(place, jsontiddlers, options) {
var locale = followersMacro.locale;
var spaceField = options.spaceField || "bag";
var tiddlers = [];
for(var i = 0; i < jsontiddlers.length; i++) {
var t = jsontiddlers[i];
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);
}
}
if(options.sort) {
tiddlers = store.sortTiddlers(tiddlers, options.sort);
}
if(options.filter) {
tiddlers = store.filterTiddlers(options.filter, tiddlers); // note currently not supported in core.
}
if(place) {
$(place).empty();
var list = $("<ul />").appendTo(place)[0];
scanMacro.template(list, tiddlers, options.template);
if(tiddlers.length === 0) {
$("<li />").text(locale.noone).appendTo(list);
}
}
if(options.callback) {
options.callback(tiddlers);
}
},
scan: function(place, options) {
var locale = followersMacro.locale;
options.template = options.template ? options.template : "ScanTemplate";
followMacro.getHosts(function(host, tsHost) {
var inputs = options.searchValues;
var tag = options.tag;
$(place).text(followersMacro.locale.pleaseWait);
options = options ? options: {};
options.filter = options.filter;
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=y".format([query]) : query;
var url = '%0/search?q=%1'.format([host, query]);
if(options.cache && scanMacro.scanned[url]) {
var tiddlers = scanMacro.scanned[url].tiddlers;
scanMacro._scanCallback(place, tiddlers, options);
} else {
ajaxReq({
url: url,
dataType: "json",
beforeSend: followMacro.beforeSend,
success: function(tiddlers) {
scanMacro.scanned[url] = {
tiddlers: tiddlers
};
scanMacro._scanCallback(place, tiddlers, options);
},
error: function() {
$("<span />").text(locale.error).appendTo(place);
}
});
}
});
},
template: function(place, tiddlers, template) {
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 tag = args.tag ? args.tag[0] : false;
var titles = args.title;
var spaceField = args.spaceField ? args.spaceField[0] : "bag";
var searchField = args.searchField ? args.searchField[0] : "title";
// if user has set searchField to modifier, then use the modifiers value if available otherwise use searchValues.
var searchValues = args[searchField] ? args[searchField] : args.searchValues;
// if neither of those were used use the first parameter
var defaultValues = tiddler ? [ tiddler.title ] : [];
searchValues = searchValues ? searchValues : ( args.name ? [args.name[0]] : defaultValues);
var fat = args.fat ? true : false;
var template = args.template ? args.template[0] : false;
var filter = args.filter ? args.filter[0] : false;
var query = args.query ? args.query[0] : false;
var sort = args.sort ? args.sort[0] : false;
var showBags = args.show ? args.show : false;
var hideBags = args.hide ? args.hide : false;
return { searchField: searchField, searchValues: searchValues,
template: template, filter: filter, sort: sort, hideBags: hideBags, showBags: showBags,
query: query, tag: tag, fat: fat, spaceField: spaceField };
},
handler: function(place, macroName, params, wikifier, paramString, tiddler) {
var container = $("<div />").addClass("scanResults").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: "Whoops something went wrong. I was unable to find the followers of this user.",
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, { searchValues: [user.name, "@%0".format([user.name])],
spaceField: "bag", tag: followMacro.followTag,
template: options.template ? options.template : "FollowersTemplate"
});
scanMacro.scan(container, options);
}
};
if(!username) {
followersCallback({ name: tiddlyspace.currentSpace.name });
} else {
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: "Whoops something went wrong. I was unable to find who this user is following.",
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, { searchValues: ["%0_public".format([user.name])],
tag: followMacro.followTag, searchField: "bag", spaceField: "title",
template: options.template ? options.template : "FollowingTemplate"
});
scanMacro.scan(container, options);
}
};
if(!username) {
followingCallback({ name: tiddlyspace.currentSpace.name });
} else {
followingCallback({ name: username });
}
}
};
config.macros.view.views.spaceLink = function(value, place, params, wikifier,
paramString, tiddler) {
var spaceName = tiddlyspace.resolveSpaceName(value);
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);
if(args.external && args.external[0] == "no") {
$(link).click(function(ev) {
ev.preventDefault();
var el = $(ev.target);
tiddlyspace.displayServerTiddler(el[0], el.attr("tiddler"),
"bags/%0_public".format([ el.attr("tiddlyspace") ]));
return false;
});
}
};
})(jQuery);
//}}}
/***
|''Name''|TiddlySpaceIdentities|
|''Version''|0.1.2|
|''Description''||
|''Status''|@@beta@@|
|''Source''|http://github.com/TiddlySpace/tiddlyspace/raw/master/src/plugins/TiddlySpaceIdentities.js|
|''Requires''|TiddlySpaceConfig chrjs|
!HTMLForm
<form method="POST" action="#">
<fieldset>
<legend />
<dl>
<dt>Type:</dt>
<dd>
<select>
<option value="openid">OpenID</option>
</select>
</dd>
<dt>Identity:</dt>
<dd><input type="text" name="openid" /></dd>
</dl>
<input type="hidden" name="tiddlyweb_redirect" />
<input type="hidden" name="csrf_token" />
<input type="submit" />
</fieldset>
</form>
!TODO
* process config.extensions.tiddlyweb.challengers instead of hardcoding OpenID
!Code
***/
//{{{
(function($) {
var tweb = config.extensions.tiddlyweb;
var macro = config.macros.TiddlySpaceIdentities = {
formTemplate: store.getTiddlerText(tiddler.title + "##HTMLForm"),
locale: {
listError: "error retrieving identities for user %0",
addLabel: "Add Identity"
},
handler: function(place, macroName, params, wikifier, paramString, tiddler) {
var mode = params[0] || "list";
if(mode == "add") {
$(place).append(macro.generateForm());
} else if(mode == "list") {
tweb.getUserInfo(function(user) {
if(!user.anon) {
var container = $("<div />").addClass("listIdentities").appendTo(place);
macro.refresh(container);
}
});
}
},
refresh: function(container) {
container.empty().append("<ul />");
$.ajax({ // TODO: add (dynamically) to chrjs user extension?
url: "%0/users/%1/identities".format([tweb.host, tweb.username]),
type: "GET",
success: function(data, status, xhr) {
var identities = $.map(data, function(item, i) {
return $("<li />").text(item)[0];
});
$("ul", container).append(identities);
},
error: function(xhr, error, exc) {
displayMessage(macro.locale.listError.format([tweb.username]));
}
});
},
generateForm: function() {
var challenger = "tiddlywebplugins.tiddlyspace.openid";
var uri = "%0/challenge/%1".format([tweb.host, challenger]);
var redirect = tweb.serverPrefix + "#auth:OpenID=";
return $(this.formTemplate).attr("action", uri).submit(this.onSubmit).
find("legend").text(this.locale.addLabel).end().
find("[name=tiddlyweb_redirect]").val(redirect).end().
find("[type=submit]").val(this.locale.addLabel).end();
},
onSubmit: function(ev) {
var form = $(this);
var redirect = form.find("[name=tiddlyweb_redirect]");
var openid = form.find("[name=openid]").val();
redirect.val(redirect.val() + openid);
var token = config.extensions.tiddlyspace.getCsrfToken();
var csrf_token = form.find("[name=csrf_token]");
csrf_token.val(token);
return true;
}
};
config.paramifiers.auth = {
locale: {
success: "successfully added identity %0",
error: "error adding identity %0: %1"
},
onstart: function(v) {
var identity = window.location.hash.split("auth:OpenID=")[1];
if(identity) {
this.addIdentity(identity);
}
},
addIdentity: function(name) {
var msg = config.paramifiers.auth.locale;
var tiddler = new tiddlyweb.Tiddler(name);
tiddler.bag = new tiddlyweb.Bag("MAPUSER", tweb.host);
var callback = function(data, status, xhr) {
displayMessage(msg.success.format([name]));
window.location = window.location.toString().split("#")[0] + "#";
};
var errback = function(xhr, error, exc) {
displayMessage(msg.error.format([name, error]));
};
tiddler.put(callback, errback);
}
};
})(jQuery);
//}}}
/***
|''Name''|TiddlySpaceInclusion|
|''Version''|0.5.2|
|''Description''|provides user interfaces for managing TiddlySpace inclusions|
|''Status''|@@beta@@|
|''Source''|http://github.com/TiddlySpace/tiddlyspace/raw/master/src/plugins/TiddlySpaceInclusion.js|
|''Requires''|TiddlySpaceConfig TiddlySpaceUserControls chrjs|
!HTMLForm
<form action="#">
<fieldset>
<legend />
<p class="description" />
<dl>
<dt class="_passive">Space Name:</dt>
<dd class="_passive"><input type="text" name="space" /></dd>
<dt class="_active">Space Selection:</dt>
<dd class="_active">
<select>
<option></option>
</select>
</dd>
</dl>
<p class="annotation" />
<input type="submit" />
</fieldset>
</form>
!Code
***/
//{{{
(function($) {
var tweb = config.extensions.tiddlyweb;
var tiddlyspace = config.extensions.tiddlyspace;
var currentSpace = tiddlyspace.currentSpace.name;
var macro = config.macros.TiddlySpaceInclusion = {
formTemplate: store.getTiddlerText(tiddler.title + "##HTMLForm"),
locale: {
addPassiveLabel: "Include space",
addActiveLabel: "Include into space",
passiveDesc: "Include a space into the current space",
activeDesc: "Include another space in the current space",
addSuccess: "included %0 in %1",
delPrompt: "Are you sure you want to exclude %0 from the current space?",
delTooltip: "click to exclude from the space",
delError: "error excluding %0: %1",
listError: "error retrieving spaces included in space %0: %1",
forbiddenError: "unauthorized to modify space <em>%0</em>",
noSpaceError: "space <em>%0</em> does not exist",
conflictError: "space <em>%0</em> is already included in <em>%1</em>",
noInclusions: "no spaces are included",
recursiveInclusions: "Spaces that were included by the removed space and not part of the core TiddlySpace application are highlighted and can be removed manually if wished.",
reloadPrompt: "The page must be reloaded for inclusion to take effect. Reload now?"
},
handler: function(place, macroName, params, wikifier, paramString, tiddler) {
// passive mode means subscribing given space to current space
// active mode means subscribing current space to given space
this.name = macroName;
var mode = params[0] || "list";
var form = $(this.formTemplate).
find(".annotation").hide().end();
if(mode == "passive") {
if(!readOnly) {
form.submit(function(ev) { return macro.onSubmit(this, mode); }).
find("._active").remove().end().
find("legend").text(this.locale.addPassiveLabel).end().
find(".description").text(this.locale.passiveDesc).end().
find("[type=submit]").val(this.locale.addPassiveLabel).end().
appendTo(place);
}
} else if(mode == "active") {
form.submit(function(ev) { return macro.onSubmit(this, mode); }).
find("._passive").remove().end().
find("legend").text(this.locale.addActiveLabel).end().
find(".description").text(this.locale.activeDesc).end().
find("[type=submit]").val(this.locale.addActiveLabel).end().
appendTo(place);
this.populateSpaces(form);
} else {
var container = $("<div />").addClass(this.name).appendTo(place);
$('<p class="annotation" />').hide().appendTo(container);
this.listInclusions(container);
}
},
listInclusions: function(container) {
var recipe = new tiddlyweb.Recipe(currentSpace + "_public", tweb.host);
recipe.get(function(recipe, status, xhr) {
var inclusions = $.map(recipe.recipe, function(item, i) { // TODO: refactor to canonicalize; move to TiddlySpaceConfig!?
var arr = item[0].split("_public");
return (arr[0] != currentSpace && arr[1] === "") ? arr[0] : null;
});
var items = $.map(inclusions, function(item, i) { // TODO: DRY (cf. displayMembers)
var link = $("<a />").text(item);
tweb.getStatus(function(status) {
var uri = tiddlyspace.getHost(
status.server_host, item);
link.attr("href", uri);
});
var btn = $('<a class="deleteButton" href="javascript:;" />').
text("x"). // TODO: i18n (use icon!?)
attr("title", macro.locale.delTooltip).
data("space", item).click(macro.onDelClick);
if(readOnly) {
btn.hide();
}
return $("<li />").append(link).append(btn)[0];
});
if(items.length) {
$("<ul />").append(items).appendTo(container);
} else {
$('<div class="annotation" />').
text(macro.locale.noInclusions).appendTo(container);
}
}, function(xhr, error, exc) {
displayMessage(macro.locale.listError.format([currentSpace, error]));
});
},
populateSpaces: function(form) { // TODO: rename?
$.ajax({ // TODO: add to model/space.js?
url: tweb.host + "/spaces?mine=1",
type: "GET",
success: function(data, status, xhr) {
var spaces = $.map(data, function(item, i) {
return $("<option />", { value: item.name }).text(item.name)[0];
});
$("select", form).append(spaces);
} // TODO: error handling?
});
},
onSubmit: function(el, mode) {
var form = $(el).closest("form");
var selector = mode == "passive" ? "[name=space]" : "select";
var space = form.find(selector).val();
var provider = mode == "passive" ? space : currentSpace;
var subscriber = mode == "passive" ? currentSpace : space;
var loc = macro.locale;
var callback = function(data, status, xhr) {
displayMessage(loc.addSuccess.format([provider, subscriber]));
if(confirm(loc.reloadPrompt)) {
window.location.reload();
}
};
var errback = function(xhr, error, exc) {
if(xhr.status == 409) {
var included = "already subscribed";
xhr = { // XXX: hacky
status: xhr.responseText.indexOf(included) != -1 ? "409a" : "409b"
};
}
var ctx = {
msg: {
403: loc.forbiddenError.format([subscriber]),
404: loc.noSpaceError.format([subscriber]), // XXX: only relevant for passive mode
"409a": loc.conflictError.format([provider, subscriber]),
"409b": loc.noSpaceError.format([provider])
},
form: form,
selector: selector
};
config.macros.TiddlySpaceLogin.displayError(xhr, error, exc, ctx);
};
this.inclusion(provider, subscriber, callback, errback, false);
return false;
},
onDelClick: function(ev) { // XXX: too long, needs refactoring
var btn = $(this);
var provider = btn.data("space");
var msg = macro.locale.delPrompt.format([provider]);
var callback = function(data, status, xhr) {
btn.closest("li").slideUp(function(ev) { $(this).remove(); });
};
var errback = function(xhr, error, exc) { // XXX: doesn't actually happen
displayMessage(macro.locale.delError.format([username, error]));
};
if(confirm(msg)) {
var coreBags = tiddlyspace.coreBags;
var recipe = new tiddlyweb.Recipe(provider + "_public", tweb.host);
recipe.get(function(recipe, status, xhr) {
var inclusions = $.map(recipe.recipe, function(item, i) { // XXX: duplicated from above
var arr = item[0].split("_public");
return (arr[0] != provider && arr[1] === "") ? arr[0] : null;
});
var recursiveMatch = false;
btn.closest("ul").find("li").each(function(i, node) {
var space = $(".deleteButton", node).data("space"); // XXX: relying on button is hacky
if($.inArray(space, inclusions) != -1 && $.inArray("%0_public".format([space]), coreBags) == -1) {
recursiveMatch = true;
$(node).addClass("annotation"); // TODO: proper highlighting
}
});
var annotation = btn.closest("." + macro.name).find("> .annotation");
if(recursiveMatch) {
annotation.text(macro.locale.recursiveInclusions).slideDown();
} else {
annotation.hide();
}
});
macro.inclusion(provider, currentSpace, callback, errback, true);
}
return false;
},
inclusion: function(provider, subscriber, callback, errback, remove) {
var data = {};
var key = remove ? "unsubscriptions" : "subscriptions";
data[key] = [provider];
$.ajax({ // TODO: add to model/space.js?
url: tweb.host + "/spaces/" + subscriber,
type: "POST",
contentType: "application/json",
data: $.toJSON(data),
success: callback,
error: errback
});
}
};
})(jQuery);
//}}}
/***
|''Name''|TiddlySpaceInitialization|
|''Version''|0.6.7|
|''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 rel="shortcut icon" href="/recipes/%0_public/tiddlers/favicon.ico" />
<link href="/bags/%0_public/tiddlers.atom" rel="alternate"
type="application/atom+xml" title="%0's public feed" />
<!--}}}-->
!Code
***/
//{{{
(function($) {
var versionField = "tiddlyspaceinit_version";
var markupPreHead = store.getTiddlerText(tiddler.title + "##MarkupPreHead", "");
var currentSpace = config.extensions.tiddlyspace.currentSpace;
var plugin = config.extensions.TiddlySpaceInit = {
version: "0.5",
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);
},
setupMarkupPreHead: function() {
var pubWorkspace = this.getPublicWorkspace();
var existing = store.getTiddler("MarkupPreHead");
if(!existing || existing.fields["server.workspace"] != pubWorkspace) {
var tid = new Tiddler("MarkupPreHead");
tid.text = markupPreHead.format(currentSpace.name);
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]);
}
},
update: function(curVersion, flagTiddler) {
if(curVersion < 0.2) {
this.createAvatar();
}
if(curVersion < 0.3) {
flagTiddler.tags.pushUnique("excludePublisher");
}
if(curVersion < 0.5) { // v0.4 was faulty
this.setupMarkupPreHead();
}
},
firstRun: function() {
var tiddlers = [];
var pubTid = {
tags: ["excludeLists", "excludeSearch"],
fields: $.extend({}, config.defaultCustomFields, {
"server.workspace": this.getPublicWorkspace()
})
};
// generate Site*itle
$.each(["SiteTitle", "SiteSubtitle"], function(i, item) {
var tid = new Tiddler(item);
$.extend(tid, pubTid);
tid.text = plugin[item].format([currentSpace.name]);
tid = store.saveTiddler(tid);
tiddlers.push(tid);
});
// generate public ColorPalette
var tid = new Tiddler("ColorPalette");
$.extend(tid, pubTid);
tid.text = config.macros.RandomColorPalette.generatePalette({}, true);
tid = store.saveTiddler(tid);
tiddlers.push(tid);
this.createAvatar();
this.setupMarkupPreHead();
return tiddlers;
},
getPublicWorkspace: function() {
return "bags/%0".format(this.getPublicBag());
},
getPublicBag: function() {
return currentSpace.name + "_public";
},
createAvatar: function() {
var avatar = "SiteIcon";
var tweb = config.extensions.tiddlyweb;
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 = this.getPublicBag();
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) {
image.refreshImage("/bags/%0_public/tiddlers/SiteIcon".format([currentSpace.name]));
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);
}
};
$(document).bind("startup", plugin.dispatch);
})(jQuery);
//}}}
/***
|''Name:''|TiddlySpaceLinkPlugin|
|''Description:''|Formatter to reference other spaces from wikitext |
|''Author:''|PaulDowney (psd (at) osmosoft (dot) com) |
|''Source:''|http://whatfettle.com/2008/07/TiddlySpaceLinkPlugin/ |
|''CodeRepository:''|http://svn.tiddlywiki.org/Trunk/contributors/PaulDowney/plugins/TiddlySpaceLinkPlugin/ |
|''Version:''|1.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) {
var link, a, currentSpaceName;
try {
// seems safe to expect this to have been initialised within TiddlySpace
link = config.extensions.tiddlyweb.status.server_host.url;
} catch (ex) {
link = "http://tiddlyspace.com";
}
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;
}
// assumes a http URI without user:pass@ prefix
link = link.replace("http://", "http://" + spaceName.toLowerCase() + ".");
if (title) {
a = createExternalLink(place, link + "#" + encodeURIComponent(String.encodeTiddlyLink(title)), alt || title);
} else {
a = createExternalLink(place, link, alt || spaceName);
}
jQuery(a).addClass('tiddlySpaceLink').attr('tiddlyspace', spaceName).attr('tiddler', title);
return a;
}
(function ($) {
version.extensions.TiddlySpaceLinkPlugin = {installed: true};
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));
//}}}
/***
|''Name''|ListTiddlerPrivacyPlugin|
|''Description''|provide an async list macro and list public, private and draft tiddlers|
|''Author''|Ben Gillies|
|''Version''|0.3.0|
|''Status''|@@experimental@@|
|''Source''|<...>|
|''CodeRepository''|<...>|
|''License''|[[BSD|http://www.opensource.org/licenses/bsd-license.php]]|
!Usage
{{{
<<tsList Private>>
<<tsList Public>>
<<tsList Draft>>
}}}
!Requires
TiddlySpaceConfig
!Code
***/
//{{{
(function($) {
var ns = config.extensions.tiddlyspace;
var tsList = config.macros.tsList = {
locale: {
loadingMsg: "loading..."
},
handler: function(place, macroName, params) {
var type = params[0];
if ((!type) || (!tsList[type])) {
return;
}
var list = $("<ul />").appendTo(place);
var loading = $('<li class="listTitle" />').
text(tsList.locale.loadingMsg).
appendTo(list);
if (tsList[type].handler) {
tsList[type].handler(params, function(tiddlers) {
loading.remove();
if (tsList[type].prompt) {
$('<li class="listTitle" />').
text(tsList[type].prompt).
appendTo(list);
}
$.each(tiddlers, function(index, tiddler) {
var li = $("<li />").appendTo(list)[0];
createTiddlyLink(li, tiddler.title, true);
});
});
}
}
};
tsList.Private = {
handler: function(params, callback) {
var privateTiddlers = [];
store.forEachTiddler(function(title, tiddler) {
if (("%0_private".format([ns.currentSpace.name]) ===
tiddler.fields["server.bag"]) &&
(!tiddler.fields["publish.name"]) &&
(!tiddler.tags.contains("excludeLists"))) {
privateTiddlers.pushUnique(tiddler);
}
});
callback(privateTiddlers);
}
};
tsList.Public = {
handler: function(params, callback) {
var publicTiddlers = [];
store.forEachTiddler(function(title, tiddler) {
if (("%0_public".format([ns.currentSpace.name]) ===
tiddler.fields["server.bag"]) &&
(!tiddler.tags.contains("excludeLists"))) {
publicTiddlers.pushUnique(tiddler);
}
});
callback(publicTiddlers);
}
};
tsList.Draft = {
handler: function(params, callback) {
var draftTiddlers = [];
store.forEachTiddler(function(title, tiddler) {
if (("%0_private".format([ns.currentSpace.name]) ===
tiddler.fields["server.bag"]) &&
(tiddler.fields["publish.name"]) &&
(!tiddler.tags.contains("excludeLists"))) {
draftTiddlers.pushUnique(tiddler);
}
});
callback(draftTiddlers);
}
};
})(jQuery);
//}}}
/***
|''Name''|TiddlySpaceMembers|
|''Version''|0.5.4|
|''Description''|provides a UI for managing space members|
|''Status''|@@beta@@|
|''Source''|http://github.com/TiddlySpace/tiddlyspace/raw/master/src/plugins/TiddlySpaceMembers.js|
|''Requires''|TiddlySpaceConfig TiddlySpaceUserControls|
!Usage
<<TiddlySpaceMembers list>> provides list of members
<<TiddlySpaceMembers add>> creates a form to add new members.
!HTMLForm
<div class='memberForm'>
<div class='messageArea'></div>
<form action="#">
<fieldset>
<legend />
<dl>
<dt>Username:</dt>
<dd><input type="text" name="username" /></dd>
</dl>
<p class="annotation" />
<input type="submit" />
</fieldset>
</form>
</div>
!Code
***/
//{{{
(function($) {
var macro = config.macros.TiddlySpaceMembers = {
formTemplate: store.getTiddlerText(tiddler.title + "##HTMLForm"),
locale: {
authAddError: "You must be a member to add members to this space.",
authError: "list of members is only visible to members of space <em>%0</em>",
listError: "error retrieving members for space <em>%0</em>: %1",
addLabel: "Add member",
noUserError: "user <em>%0</em> does not exist",
delTooltip: "click to remove member",
delPrompt: "Are you sure you want to remove member %0?",
// we can also get an auth error when the user has no perms to
// delete but we wouldn't see the interface
delAuthError: "error removing %0 from %1: may not remove last member",
delSpaceError: "error removing %0 from %1: space does not exist",
addMessage: "please wait..."
},
handler: function(place, macroName, params, wikifier, paramString, tiddler) {
var space = config.extensions.tiddlyspace.currentSpace.name;
var host = config.extensions.tiddlyweb.host;
this.space = new tiddlyweb.Space(space, host); // XXX: singleton
var mode = params[0];
var args = paramString.parseParams("anon", null, true, false, false);
var hideErrors = args.hideErrors ? true : false;
var container;
if(!readOnly) {
if(mode == "add") {
macro.generateForm(place);
} else {
container = $("<div />").appendTo(place);
macro.refresh(container);
}
} else {
var msg;
if(mode == "add") {
msg = this.locale.authAddError.format([this.space.name]);
} else {
msg = this.locale.authError.format([this.space.name]);
}
container = $("<div />").appendTo(place);
if(!hideErrors) {
this.notify(msg, container);
}
}
},
refresh: function(container) {
var callback = function(data, status, xhr) {
$(container).empty();
macro.displayMembers(data, container);
};
var errback = function(xhr, error, exc) {
var msg = xhr.status == 403 ? "authError" : "listError";
msg = macro.locale[msg].format([macro.space.name, error]);
macro.notify(msg, container);
};
this.space.members().get(callback, errback);
},
displayMembers: function(members, container) {
config.extensions.tiddlyweb.getStatus(function(status) {
var items = $.map(members, function(member, i) {
var uri = config.extensions.tiddlyspace.getHost(
status.server_host, member);
var link = $("<a />").attr("href", uri).text(member);
var btn = $('<a class="deleteButton" href="javascript:;" />').
text("x"). // TODO: i18n (use icon!?)
attr("title", macro.locale.delTooltip).
data("username", member).click(macro.onClick);
return $("<li />").append(link).append(btn)[0];
});
$("<ul />").addClass("spaceMembersList").append(items).appendTo(container);
});
},
generateForm: function(container) {
var submitFunction = function(ev) {
ev.preventDefault();
$(".messageArea", container).text(macro.locale.addMessage).show();
$("form", container).fadeOut("slow");
return macro.onSubmit(ev);
};
return $(this.formTemplate).submit(submitFunction).
find("legend").text(this.locale.addLabel).end().
find(".annotation").hide().end().
find("[type=submit]").val(this.locale.addLabel).end().appendTo(container);
},
clearErrors: function(place) {
$(".annotation", place).hide();
$(".error", place).removeClass("error");
},
onSubmit: function(ev) {
var form = $(ev.target).closest("form");
var container = form.closest(".memberForm");
macro.clearErrors(container);
var selector = "[name=username]";
var username = form.find(selector).val();
var callback = function(data, status, xhr) {
$("form", container).stop(true, true).fadeIn("slow");
$(".messageArea", container).hide();
$(".spaceMembersList").each(function(i, el) {
macro.refresh($(el.parentNode));
});
};
var errback = function(xhr, error, exc) {
var ctx = {
msg: { 409: macro.locale.noUserError.format([username]) },
form: form,
selector: selector
};
$(form).stop(true, true).fadeIn("slow");
$(".messageArea", container).hide();
config.macros.TiddlySpaceLogin.displayError(xhr, error, exc, ctx);
};
macro.space.members().add(username, callback, errback);
return false;
},
onClick: function(ev) { // XXX: ambiguous; rename
var btn = $(this);
var username = btn.data("username");
var msg = macro.locale.delPrompt.format([username]);
var callback = function(data, status, xhr) {
if(username == config.extensions.tiddlyweb.username) { // assumes getStatus has completed
readOnly = true;
refreshDisplay();
}
var container = btn.closest("div");
macro.refresh(container);
};
var errback = function(xhr, error, exc) {
var msg = xhr.status == 403 ? "delAuthError" : "delSpaceError";
displayMessage(macro.locale[msg].format([username, macro.space.name]));
};
if(confirm(msg)) {
macro.space.members().remove(username, callback, errback);
}
},
notify: function(msg, container) {
container.addClass("annotation").html(msg);
}
};
})(jQuery);
//}}}
/***
|''Name''|TiddlySpacePublishingCommands|
|''Version''|0.8.2|
|''Status''|@@beta@@|
|''Description''|toolbar commands for drafting and publishing|
|''Author''|Jon Robson|
|''Source''|http://github.com/TiddlySpace/tiddlyspace/raw/master/src/plugins/TiddlySpacePublishingCommands.js|
|''Requires''|TiddlySpaceConfig|
!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 currentSpace = tiddlyspace.currentSpace.name;
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 bag = tiddler.fields["server.bag"];
var currentSpace = tiddlyspace.currentSpace.name;
var privateBag = "%0_private".format([currentSpace]);
var publicBag = "%0_public".format([currentSpace]);
if(bag == privateBag) {
return "private";
} else if (bag == publicBag) {
return "public";
} else {
return "external";
}
}
};
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) {
var type = tiddlyspace.getTiddlerStatusType(tiddler);
if(!readOnly && type == "private") {
return true;
} else {
return false;
}
},
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.removeTiddler(oldTitle);
}
if(el) {
story.displayTiddler(el, newTitle);
}
if(oldTitle != newTitle) {
story.closeTiddler(oldTitle);
}
if(callback) {
callback(info);
}
store.setDirty(_dirty);
story.refreshTiddler(newTitle, null, true); // for drafts
});
} else {
if(callback) {
callback(info);
}
story.refreshTiddler(newTitle, null, true);
}
}
});
}
};
config.commands.changeToPrivate = {
text: "make private",
tooltip: "turn this public tiddler into a private tiddler",
isEnabled: function(tiddler) {
var type = tiddlyspace.getTiddlerStatusType(tiddler);
if(!readOnly && type == "public") {
return true;
} else {
return false;
}
},
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 = config.commands.publishTiddler;
/* Save as draft command */
var saveDraftCmd = config.commands.saveDraft = {
text: "save draft",
tooltip: "Save as a private draft",
isEnabled: function(tiddler) {
var type = tiddlyspace.getTiddlerStatusType(tiddler);
if(!readOnly && type == "public") {
return true;
} else {
return false;
}
},
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 currentSpace = tiddlyspace.currentSpace.name;
var privateBag = "%0_private".format([currentSpace]);
var privateWorkspace = "bags/%0".format([privateBag]);
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, 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 cmd = config.commands.publishTiddler;
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) }
};
config.commands.publishTiddler.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) {
tiddler = tiddler ? tiddler : store.getTiddlers()[0];
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 tiddlers = params.filter ? store.filterTiddlers(params.filter[0]) : store.getTiddlers("title", "excludePublisher");
var status = macro.getMode(paramString);
var fromBag = "%0_%1".format([currentSpace, status[0]]);
// TODO: would be good if filterTiddlers could do the bag checking.
var enabled = [];
for(var i = 0; i < tiddlers.length; i++) {
var tiddler = tiddlers[i];
var bag = tiddler.fields["server.bag"];
if(bag == fromBag) {
publishCandidates.push({ title: tiddler.title, tiddler: tiddler, status: status[0]});
if(checked.contains(tiddler.title)) {
enabled.push("[rowname=%0]".format(tiddler.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, status[1], callback);
};
wizard.setButtons([
{ caption: locale.changeStatusLabel.format([status[1]]), tooltip: locale.changeStatusPrompt.format([status[1]]),
onClick: btnHandler }
]);
$(enabled.join(",")).attr("checked", true); // retain what was checked before.
}
}
};
})(jQuery);
//}}}
/***
|''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);
//}}}
/***
|''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:
<<viewRevisions page:10 link:"<<view modified date>>">>
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);
//}}}
/***
|''Name''|TiddlySpaceSpaces|
|''Version''|0.5.8|
|''Description''|TiddlySpace spaces management|
|''Status''|@@beta@@|
|''Source''|http://github.com/TiddlySpace/tiddlyspace/raw/master/src/plugins/TiddlySpaceSpaces.js|
|''Requires''|TiddlyWebConfig TiddlySpaceInclusion TiddlySpaceUserControls|
!HTMLForm
<div class='createSpace'>
<div class='status'></div>
<form action="#">
<fieldset>
<legend />
<dl>
<dt>Name:</dt>
<dd><input type="text" name="space" /></dd>
</dl>
<p>
<input type="checkbox" name="subscribe" />
Include the current space in the new space.
</p>
<p class="success" />
<p class="annotation" />
<input type="submit" />
</fieldset>
</form>
</div>
!Code
***/
//{{{
(function($) {
var host = config.extensions.tiddlyweb.host;
var macro = config.macros.TiddlySpaceSpaces = { // TODO: rename
formTemplate: store.getTiddlerText(tiddler.title + "##HTMLForm"),
locale: {
listError: "error listing spaces: %0",
addLabel: "Create space",
addSuccess: "created space %0",
conflictError: "space <em>%0</em> already exists",
charError: "error: invalid space name - must start with a letter, be " +
"at least two characters in length and only contain lowercase " +
"letters, digits or hyphens",
noSpaces: "you have no spaces",
addSpace: "creating your new space...",
loadingSpaces: "please wait while we load your spaces..."
},
handler: function(place, macroName, params, wikifier, paramString, tiddler) {
var container = $("<div />").appendTo(place);
var args = paramString.parseParams("anon")[0];
var mode = args.anon ? args.anon[0] : "list";
if(mode == "add") {
var options = {
subscribe: args.subscribe ? true : false
};
this.generateForm(container, options);
} else {
this.refresh(container);
}
},
refresh: function(container) {
container = $(container);
container.text(macro.locale.loadingSpaces).addClass("inProgress").
attr("refresh", "macro").attr("macroName", "TiddlySpaceSpaces").
addClass("listTiddlySpaceSpaces");
$.ajax({ // XXX: DRY; cf. TiddlySpaceInclusion
url: host + "/spaces?mine=1",
type: "GET",
success: function(data, status, xhr) {
container.empty().removeClass("inProgress").append("<ul />");
var spaces = $.map(data, function(item, i) {
var link = $("<a />", {
href: item.uri,
text: item.name
});
return $("<li />").append(link)[0];
});
var el = $("ul", container);
if(data.length > 0) {
el.append(spaces);
} else { // XXX: should never occur!?
$('<p class="annotation" />').text(macro.locale.noSpaces).
replaceAll(el);
}
},
error: function(xhr, error, exc) {
displayMessage(macro.locale.listError.format([error]));
}
});
},
generateForm: function(container, options) {
var locale = macro.locale;
$(this.formTemplate).submit(function(ev) {
$(".status", container).text(locale.addSpace).show();
$("form", container).fadeOut("slow");
ev.preventDefault();
return macro.onSubmit(ev);
}).
find("legend").text(this.locale.addLabel).end().
find(".annotation").hide().end().
find("[type=submit]").val(this.locale.addLabel).end().appendTo(container);
if(options.subscribe) {
$("[name=subscribe]", container).attr("checked", true);
}
},
onSubmit: function(ev) {
var target = ev.target;
var form = $(target).closest("form");
var container = form.closest("div");
$(".annotation", container).hide();
$(".error", container).removeClass("error");
var statusMessage = $(".status", container);
var space = form.find("[name=space]").val();
var subscribe = form.find("[name=subscribe]").attr("checked");
space = new tiddlyweb.Space(space, host);
var displayError = config.macros.TiddlySpaceLogin.displayError;
var ns = config.extensions.tiddlyspace;
var callback = function(resource, status, xhr) {
if(subscribe) {
config.macros.TiddlySpaceInclusion.inclusion(
ns.currentSpace.name, space.name);
}
$(".listTiddlySpaceSpaces").each(function(i, el) {
refreshElements(el.parentNode);
});
form.stop(true, true).fadeIn("slow");
$("input[type=text]", form).val("");
statusMessage.hide();
};
var errback = function(xhr, error, exc) { // TODO: DRY (cf. TiddlySpaceLogin)
var ctx = {
msg: { 409: macro.locale.conflictError.format([space.name]) },
form: form,
selector: "[name=space]"
};
form.stop(true, true).fadeIn("slow");
statusMessage.hide();
displayError(xhr, error, exc, ctx);
};
if(ns.isValidSpaceName(space.name)) {
space.create(callback, errback);
} else {
xhr = { status: 409 }; // XXX: hacky
var ctx = {
msg: { 409: macro.locale.charError },
form: form,
selector: "[name=space]"
};
form.stop(true, true).fadeIn("slow");
statusMessage.hide();
displayError(xhr, null, null, ctx);
}
return false;
}
};
})(jQuery);
//}}}
!Spaces
<<groupBy server.bag>>
!Private
<<tsList Private>>
!Public
<<tsList Public>>
!Drafts
<<tsList Draft>>
/***
|''Name''|TiddlySpaceTiddlerIconsPlugin|
|''Version''|0.8.3|
|''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
Provides an additional SiteIcon view for use with view macro
{{{<<view modifier SiteIcon>>}}}
will show the SiteIcon located in the space with the same name as modifier.
It also works if the attribute given ends with _private or _public (so {{{<<view server.bag SiteIcon>>}}} is usable).
{{{<<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
When a ViewTemplate contains an element with class concertina, clicking on the icon outputted by the tiddlerOrigin macro
will reveal more detailed information on what the icon means.
!Parameters
both take the same 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.
!!additional 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($) {
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: true };
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) {
if(store.tiddlerExists("missingIcon")) {
imageMacro.renderImage(container, "missingIcon", 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);
}
};
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);
};
var originMacro = config.macros.tiddlerOrigin = {
locale: {
"shadow": "shadow tiddler",
"missing": "missing tiddler",
"private": "private",
"unknown": "unknown state",
"public": "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 locale = originMacro.locale;
var type = "private";
if(tiddler && tiddler.fields["server.workspace"]) {
name = tiddler.fields["server.workspace"].replace("recipes/", "").
replace("bags/", "");
} else {
name = tiddler;
}
var options = originMacro.getOptions(paramString);
var btn = $("<div />").addClass("originButton").appendTo(place)[0];
type = tiddlyspace.getTiddlerStatusType(tiddler);
originMacro.renderIcon(tiddler, type, btn, options);
},
getOptions: function(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) {
options.spaceLink = parsedParams[0].spaceLink ? true : false;
} 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 == "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);
//}}}
/***
|''Name''|TiddlySpaceToolbar|
|''Description''|augments tiddler toolbar commands with SVG icons|
|''Author''|Osmosoft|
|''Version''|0.6.5|
|''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);
addClass(popup, "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);
//}}}
/***
|''Name''|TiddlySpaceUserControls|
|''Version''|0.5.3|
|''Description''|registration and login UIs|
|''Status''|@@beta@@|
|''Source''|http://github.com/TiddlySpace/tiddlyspace/raw/master/src/plugins/TiddlySpaceUserControls.js|
|''Requires''|TiddlySpaceConfig|
!Usage
{{{<<TiddlySpaceLogin>>}}}
Shows a login box. If the user is logged in shows a login message. You can define this message by making use of the message parameter: {{{<<TiddlySpaceLogin message:"hello %0">>}}}
{{{<<TiddlySpaceLogout>>}}}
Shows a logout button.
{{{<<TiddlySpaceRegister>>}}}
Shows a registration form.
!HTMLForm
<form action="#">
<fieldset>
<legend />
<dl>
<dt class="_basic">Username:</dt>
<dd class="_basic"><input type="text" name="username" autocapitalize="off" autocorrect="off" /></dd>
<dt class="_basic">Password:</dt>
<dd class="_basic">
<input type="password" name="password" />
</dd>
<dt class="_basic _register" >Confirm Password:</dt>
<dd class="_basic _register" >
<input type="password" name="password_confirm" />
</dd>
<dt class="_openid">OpenID:</dt>
<dd class="_openid"><input type="text" name="openid" autocapitalize="off" autocorrect="off" /></dd>
<dt class="_login">Method:</dt>
<dd class="_login">
<select>
<option value="basic">username & password</option>
<option value="openid">OpenID</option>
</select>
</dd>
</dl>
<input type="hidden" name="tiddlyweb_redirect" class="_openid" />
<p class="annotation" />
<input type="submit" />
</fieldset>
</form>
!Code
***/
//{{{
(function($) {
var tweb = config.extensions.tiddlyweb;
var tiddlyspace = config.extensions.tiddlyspace;
var tsl = config.macros.TiddlySpaceLogin = {
formTemplate: store.getTiddlerText(tiddler.title + "##HTMLForm"),
locale: {
label: "Login",
success: "You are currently logged in as %0.",
loginError: "error logging in %0: %1",
forbiddenError: "login failed for <em>%0</em>: username and password do not match"
},
handler: function(place, macroName, params, wikifier, paramString, tiddler) {
var type = params[0];
this.name = macroName;
var container = $("<div />", { className: this.name }).appendTo(place);
var args = paramString.parseParams("name", null, true, false, true)[0];
var options = {};
options.message = args.message ? args.message[0] : false;
this.refresh(container, type, options);
},
refresh: function(container, type, options) {
var msg = this.locale;
type = type || "basic";
var selector = type == "openid" ? "._basic" : "._openid";
var handler = function(ev) {
var form = $(this).closest("form");
return tsl[type + "Login"](form);
};
container.empty();
tweb.getUserInfo(function(user) {
if(user.anon) {
$(tsl.formTemplate).submit(handler).
find("legend").text(msg.label).end().
find("select").change(tsl.onSelect).end().
find("option[value=" + type + "]").
attr("selected", "selected").end().
find("._register, " + selector).remove().end().
find(".annotation").hide().end().
find("[type=submit]").val(msg.label).end().
appendTo(container);
} else {
tsl.printLoggedInMessage(container, user.name, options);
}
});
},
printLoggedInMessage: function(container, user, options) {
options = options ? options : {};
tweb.getStatus(function(status) {
var uri = tiddlyspace.getHost(status.server_host, user);
var link = '<a href="%0">%1</a>'.format([uri, user]);
var msg = options.message ? options.message : tsl.locale.success;
$(container).html(msg.format([link]));
});
},
onSelect: function(ev) {
var el = $(this);
var type = el.val();
var container = el.closest("." + tsl.name);
tsl.refresh(container, type);
},
basicLogin: function(form) {
var username = form.find("[name=username]").val();
var password = form.find("[name=password]").val();
this.login(username, password, tsl.redirect, function(xhr, error, exc) { // TODO: DRY (cf. displayMembers)
var ctx = {
msg: {
401: tsl.locale.forbiddenError.format([username])
},
form: form,
selector: "[name=username], [name=password]"
};
tsl.displayError(xhr, error, exc, ctx);
});
return false;
},
displayError: function(xhr, error, exc, ctx) {
error = ctx.msg[xhr.status] || // XXX: lacks parameters
"%0: %1".format([xhr.statusText, xhr.responseText]).htmlEncode();
var el = $(ctx.selector, ctx.form).addClass("error").focus(function(ev) {
el.removeClass("error").unbind(ev.originalEvent.type).
closest("form").find(".annotation").slideUp();
});
$(".annotation", ctx.form).html(error).slideDown();
},
login: function(username, password, callback, errback) {
var challenger = "cookie_form";
var uri = "%0/challenge/%1".format([tweb.host, challenger]);
$.ajax({
url: uri,
type: "POST",
data: {
user: username,
password: password,
tiddlyweb_redirect: tweb.serverPrefix + "/status" // workaround to marginalize automatic subsequent GET
},
success: callback,
error: function(xhr, error, exc) {
if(errback) {
errback.apply(this, arguments);
} else {
displayMessage(tsl.locale.loginError.format([username, error]));
}
}
});
},
openidLogin: function(form) {
var openid = form.find("[name=openid]").val();
var challenger = "tiddlywebplugins.tiddlyspace.openid";
var uri = "%0/challenge/%1".format([tweb.host, challenger]);
var redirect = tweb.serverPrefix || "/"; // must not be empty string
form.attr("action", uri).attr("method", "POST").
find("[name=tiddlyweb_redirect]").val(redirect);
return true;
},
redirect: function() {
window.location = tweb.host;
}
};
var logoutMacro = config.macros.TiddlySpaceLogout = {
locale: {
label: "Log out"
},
handler: function(place, macroName, params, wikifier, paramString, tiddler) {
var container = $("<div />").appendTo(place)[0];
tweb.getUserInfo(function(user) {
if(!user.anon) {
var form = $('<form method="POST" />').addClass(macroName).
attr("action", tweb.host + "/logout");
var token = tiddlyspace.getCsrfToken();
$('<input type="hidden" name="csrf_token" />').val(token).
appendTo(form);
$("<button />", { text: logoutMacro.locale.label }).
click(function(ev) { form.submit(); }).
appendTo(form);
form.appendTo(container);
}
});
}
};
var tsr = config.macros.TiddlySpaceRegister = {
locale: {
label: "Sign Up",
userSuccess: "created user %0",
userError: "user <em>%0</em> already exists",
spaceSuccess: "created space %0",
spaceError: "space <em>%0</em> already exists",
charError: "error: invalid username - must only contain lowercase " +
"letters, digits or hyphens",
passwordError: "error: passwords do not match"
},
formTemplate: store.getTiddlerText(tiddler.title + "##HTMLForm"),
handler: function(place, macroName, params, wikifier, paramString, tiddler) {
$(this.formTemplate).submit(this.onSubmit).
find("._login, ._openid").remove().end().
find("legend").text(this.locale.label).end().
find(".annotation").hide().end().
find("[type=submit]").val(this.locale.label).end().
appendTo(place);
},
onSubmit: function(ev) {
var form = $(this).closest("form");
var username = form.find("[name=username]").val();
var password = form.find("[name=password]").val();
var passwordConfirm = form.find("[name=password_confirm]").val();
var validName = tiddlyspace.isValidSpaceName(username);
if(validName && password && password == passwordConfirm) { // TODO: check password length?
tsr.register(username, password, form);
} else {
var xhr = { status: 409 }; // XXX: hacky
var msg = validName ? "passwordError" : "charError";
var ctx = {
msg: { 409: tsr.locale[msg] },
form: form,
selector: validName ? "[type=password]" : "[name=username]"
};
tsl.displayError(xhr, null, null, ctx);
}
return false;
},
register: function(username, password, form) {
var msg = tsr.locale;
var ctx = {
form: form,
selector: "[name=username]"
};
var userCallback = function(resource, status, xhr) {
displayMessage(msg.userSuccess.format([username])); // XXX: redundant?
tsl.login(username, password, function(data, status, xhr) {
var space = new tiddlyweb.Space(username, tweb.host);
space.create(spaceCallback, spaceErrback);
});
};
var userErrback = function(xhr, error, exc) {
ctx.msg = { 409: msg.userError.format([username]) };
tsl.displayError(xhr, error, exc, ctx);
};
var spaceCallback = function(resource, status, xhr) {
displayMessage(msg.spaceSuccess.format([username]));
tsl.redirect();
};
var spaceErrback = function(xhr, error, exc) {
ctx.msg = { 409: msg.spaceError.format([username]) }; // XXX: 409 unlikely to occur at this point
tsl.displayError(xhr, error, exc, ctx);
};
var user = new tiddlyweb.User(username, password, tweb.host);
user.create(userCallback, userErrback);
}
};
})(jQuery);
//}}}
/***
|''Name''|TiddlySpaceViewTypes|
|''Version''|0.5.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|
!Usage
Provides replyLink view type.
!Code
***/
//{{{
(function($) {
var tiddlyspace = config.extensions.tiddlyspace;
config.macros.view.replyLink = {
locale: {
label: "Reply to this tiddler"
}
};
config.macros.view.views.replyLink = function(value, place, params, wikifier,
paramString, tiddler) {
var space;
if(tiddler) {
var bag = tiddler.fields["server.bag"];
space = tiddlyspace.resolveSpaceName(bag);
}
var container = $('<span class="replyLink" />').appendTo(place)[0];
config.extensions.tiddlyweb.getUserInfo(function(user) {
if(!user.anon) {
if(space && user.name != space &&
user.name != tiddlyspace.currentSpace.name) {
createSpaceLink(container, user.name, value,
config.macros.view.replyLink.locale.label);
}
}
});
};
})(jQuery);
//}}}
/***
|''Name''|TiddlyWebAdaptor|
|''Description''|adaptor for interacting with TiddlyWeb|
|''Author:''|FND|
|''Contributors''|Chris Dent, Martin Budden|
|''Version''|1.4.6|
|''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 = status;
context.statusText = xhr.statusText;
context.httpStatus = xhr.status;
if(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;
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]);
rev.title = to.title;
$.each(newTiddler, function(i, item) {
if(!$.isFunction(item)) {
rev[i] = item;
}
});
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);
//}}}
/***
|''Name''|TiddlyWebConfig|
|''Description''|configuration settings for TiddlyWebWiki|
|''Author''|FND|
|''Version''|1.3.1|
|''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 == "GUEST"
});
});
},
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.6.7|
|''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;
var macro = config.macros.setPrivacy = {
handler: function(place, macroName, params, wikifier, paramString, tiddler) {
if(readOnly) {
return;
}
var el = $(story.findContainingTiddler(place));
var args = paramString.parseParams("name", null, true, false, true)[0];
var container = $("<div />").addClass("privacySettings").appendTo(place)[0];
var currentSpace = tiddlyspace.currentSpace.name;
var currentBag = tiddler ? tiddler.fields["server.bag"] : false;
var isNewTiddler = el.hasClass("missing") || !currentBag; // XXX: is this reliable?
var status = tiddlyspace.getTiddlerStatusType(tiddler);
var customFields = el.attr("tiddlyfields");
customFields = customFields ? customFields.decodeHashMap() : {};
if(isNewTiddler || !["public", "private"].contains(status)) {
var defaultValue = "public";
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"];
var options = config.macros.tiddlerOrigin ?
config.macros.tiddlerOrigin.getOptions(paramString) : {};
this.createRoundel(container, tiddler, currentSpace, defaultValue, options);
}
},
updateEditFields: function(tiddlerEl, bag) {
var saveBagField = $("[edit=server.bag]", tiddlerEl);
var saveWorkspaceField = $("[edit=server.workspace]", tiddlerEl);
var input = $("<input />").attr("type", "hidden");
if(saveBagField.length === 0) {
input.clone().attr("edit", "server.bag").val(bag).appendTo(tiddlerEl);
} else {
saveBagField.val(bag);
}
var workspace = "bags/" + bag;
if(saveWorkspaceField.length === 0) {
input.clone().attr("edit", "server.workspace").val(workspace).appendTo(tiddlerEl);
} else {
saveWorkspaceField.val(workspace);
}
},
setBag: function(tiddlerEl, newBag, options) {
var title = $(tiddlerEl).attr("tiddler");
var tiddler = store.getTiddler(title);
var originButton = $(".originButton", tiddlerEl)[0];
var refreshIcon = function(type) {
var originMacro = config.macros.tiddlerOrigin;
if(originButton && originMacro) {
options.noclick = true;
originMacro.showPrivacyRoundel(tiddler, type, originButton, options);
}
};
macro.updateEditFields(tiddlerEl, newBag);
var newWorkspace = "bags/" + newBag;
if(tiddler) {
tiddler.fields["server.bag"] = newBag;
tiddler.fields["server.workspace"] = newWorkspace; // for external tiddlers
}
var rPrivate = $("input[type=radio].isPrivate", tiddlerEl);
var rPublic = $("input[type=radio].isPublic", tiddlerEl);
if(newBag.indexOf("_public") > -1) {
rPublic.attr("checked", true);
rPrivate.attr("checked", false);
status = "public";
} else {
rPrivate.attr("checked", true);
rPublic.attr("checked", false); // explicitly do this for ie
status = "private";
}
refreshIcon(status);
},
createRoundel: function(container, tiddler, currentSpace, defaultValue, options) {
var privateBag = "%0_private".format(currentSpace);
var publicBag = "%0_public".format(currentSpace);
var rbtn = $("<input />").attr("type", "radio").attr("name", tiddler.title);
var rPrivate = rbtn.clone().val("private").addClass("isPrivate").appendTo(container);
$("<label />").text("private").appendTo(container); // TODO: i18n
var rPublic = rbtn.clone().val("public").addClass("isPublic").appendTo(container);
$("<label />").text("public").appendTo(container); // TODO: i18n
var el = story.findContainingTiddler(container);
$("[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);
//}}}
|~ViewToolbar|+editTiddler +cloneTiddler > fields changeToPublic changeToPrivate revisions syncing permalink references jump closeOthers < closeTiddler|
|~EditToolbar|+saveTiddler saveDraft -cancelTiddler deleteTiddler|
|~RevisionToolbar|> fields revert|
[[anxious]]
[[bored]]
[[cheerful]]
[[confident]]
[[confused]]
[[delighted]]
[[enthusiastic]]
[[excited]]
[[frustrated]]
[[inspired]]
[[nervous]]
[[proud]]
[[put at risk]]
[[distract (sb from sth)]]
[[have a row]]
[[prohibited]]
[[rebellious]]
[[sit for exams]]
[[unacceptable]]
[[adapt to]]
[[applicant]]
[[application form]]
[[apply for a program]]
[[apply knowledge]]
[[be nominated for a program]]
[[break the stereotypes]]
[[build a bridge between the countries]]
[[program]]
[[represent]]
[[get oneโs message across]]
[[hurt]]
[[like-minded]]
[[make a statement]]
[[narrow-minded]]
[[originate]]
[[participate]]
[[protest]]
[[take oneโs beliefs to extremes]]
[[tension]]
[[be perceived as]]
[[be sure/unsure of oneself]]
[[cover sth up]]
[[cross oneโs legs]]
[[defensive]]
[[feel certain/uncertain (of oneself)]]
[[feel confident/unconfident (of oneself)]]
[[feel secure]]
[[fold oneโs arms]]
[[give sth away]]
[[look sb in the eye]]
[[put on a fake smile]]
[[scratch]]
[[admit (to doing sth/that)]]
[[complain (that)]]
[[deny (doing sth/that)]]
[[insist (that)]]
[[persuade (sb to do sth)]]
[[promise (to do sth)]]
[[remind (sb to do sth)]]
[[reply]]
[[be associated with]]
[[conquer]]
[[date back to]]
[[declining]]
[[define oneself]]
[[long-standing]]
[[protect (against)]]
[[survival]]
[[survive]]
[[symbol]]
[[unique]]
[[ask permission to do sth]]
[[be forced to do sth]]
[[be held]]
[[be served]]
[[leftovers]]
[[on special occasions]]
[[be in existence]]
[[carnival]]
[[essential]]
[[festival]]
[[festivities]]
[[parade]]
[[take place]]
[[be content (with sth)]]
[[be into sth]]
[[be materialistic (about sth)]]
[[be part of (a group)]]
[[competitive]]
[[designer clothes]]
[[designer labels]]
[[grow out of sth]]
[[impress (sb)]]
[[possessions]]
[[promote]]
[[trend]]
[[worldwide]]
[[burglary]]
[[causes and effects]]
[[debt]]
[[disabled]]
[[facilities]]
[[fight for]]
[[housing conditions]]
[[human rights]]
[[lack of sth]]
[[lone parent]]
[[low pay]]
[[poverty]]
[[sharing]]
[[bank account]]
[[budget, n]]
[[budget, v]]
[[do without sth]]
[[economize]]
[[essentials]]
[[recipe]]
[[save]]
[[spend (on sth)]]
[[waste (sth)]]
[[ambition]]
[[ambitious]]
[[considerate]]
[[consideration]]
[[decisive]]
[[decisiveness]]
[[dominance]]
[[domineering]]
[[easy-going]]
[[flexible]]
[[obstinate]]
[[proceeds]]
[[rebellious]]
[[snobbish]]
[[background]]
[[caring]]
[[childcare]]
[[comfort]]
[[extended family]]
[[household]]
[[in-law]]
[[mutual respect]]
[[privacy]]
[[security]]
[[trust]]
[[act like a baby]]
[[do a fair share]]
[[lack of privacy]]
[[make comments]]
[[nag]]
[[object (to sth)]]
[[show smb up]]
[[treat (smb like)]]
[[feel jealous of sb]]
[[staff]]
[[stuff]]
[[do teenage things]]
[[focus (on)]]
[[get sb off oneโs back]]
[[go out of oneโs mind]]
[[go out]]
[[hang out with]]
[[make fun of sb]]
[[acquire]]
[[allow]]
[[decrease]]
[[do (a sport)]]
[[fitness]]
[[improve]]
[[overcome]]
[[increase]]
[[outlook on]]
[[play (a sport)]]
[[weight]]
[[coach]]
[[compete]]
[[indulge (in)]]
[[indulgence]]
[[injure]]
[[injury]]
[[inspire]]
[[make an impact (on sb)]]
[[moderate]]
[[moderation]]
[[role model]]
[[be addicted to sth]]
[[desire]]
[[do risky things]]
[[excitement]]
[[go to extremes]]
[[risk taker]]
[[satisfy oneโs curiosity]]
[[take risks]]
[[think twice before doing sth]]
[[thrill]]
[[aesthetic pleasure]]
[[animal species]]
[[commercial exploitation]]
[[companionship]]
[[depend on]]
[[domestication]]
[[evidence (of)]]
[[guinea pig]]
[[medical research]]
[[selective breeding]]
[[spiritual strength]]
[[a matter of]]
[[amphibian]]
[[carnivore]]
[[concern]]
[[consider]]
[[examine]]
[[insect]]
[[investigate]]
[[mammal]]
[[oppose (doing sth)]]
[[regard]]
[[reptile]]
[[abandon]]
[[appealing]]
[[be/become extinct]]
[[donation]]
[[extinction]]
[[nature reserve]]
[[rescue]]
[[shelter]]
[[access]]
[[current]]
[[doubt]]
[[online]]
[[predict]]
[[provide (sb with sth)]]
[[remain]]
[[replace]]
[[integral part]]
[[plug into]]
[[reduce the time]]
[[search for info]]
[[user-friendly]]
[[be cheated out of]]
[[challenge]]
[[date]]
[[jog one's brain]]
[[mind-expanding]]
[[outdated]]
[[rely on]]
[[solution]]
[[solve]]
[[up-date]]
[[up-to-date]]
[[addict]]
[[addiction]]
[[control]]
[[disorder]]
[[relief]]
[[suffer from]]
<!--{{{-->
<div class='toolbar'
macro='toolbar [[ToolbarCommands::ViewToolbar]] icons:yes height:16 width:16 more:popup'>
</div>
<div class='heading'>
<span class='spaceSiteIcon'
macro='tiddlerOrigin label:no spaceLink:yes height:48 width:48 preserveAspectRatio:yes'>
</span>
<span class="titleBar">
<div class='title' macro='view title text'></div>
<div class="subtitle" macro='viewRevisions page:5'>
last modified on
<span macro="view modified date"></span>
</div>
<div macro="view title replyLink"></div>
</span>
<span class='followPlaceHolder' macro='followTiddlers'></span>
<span class='modifierIcon'
macro='view modifier SiteIcon label:no spaceLink:yes height:48 width:48 preserveAspectRatio:yes'>
</span>
<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>
<!--}}}-->
something that you are discussing, considering, or dealing with
page 110 I have to do what I promised - this is the matter of honor.
Track Down Any Cell Phone Number in a Matter of Minutes.
impossible is just a matter of opinion
to leave someone when you should stay with them and take care of them
page 114 Your money will help the [[RSPCA|http://www.rspca.org.uk/in-action/aboutus]] build and run animal shelters where abandoned animals find safety.
His mother abandoned him when he was five days old.
God did not abandon me now, not now
//Desert// is a more frequent synonym. You can either //desert// or //abandon// a place or a person, but only //abandon// works for plans or efforts. But //abandoned// is more frequently used than //deserted//. And the word //abandon// is in //Abandon hope all ye who enter here// from Dante's [[Divine Comedy|http://simple.wikipedia.org/wiki/Divine_Comedy]].
to get information, especially from a computer
page 122 Computers allow us to access the latest information really quickly.
The database allows you to access the sales figures in a number of ways.
They reset our internet server & ever since then I have not been able to access my mobile [[twitter|http://simple.wikipedia.org/wiki/Twitter]] client. Blocked in China. Help!
Outside computing and electronic contexts, using //access// as a verb still jars sensitive ears. Avoid the verb if there's a ready substitute.
to get something
page 89 Tennis has helped me to acquire quick reaction.
[[New York Jets|http://www.newyorkjets.com/]] Acquire [[Santonio Holmes|http://en.wikipedia.org/wiki/Santonio_Holmes]]
What skills would you advise a want-to-be-entrepreneur to acquire?
behave in a way very young children do
page 75 My sister just acts like a baby and does nothing.
How can she expect to adopt a child when she still acts like a baby herself?
dude acts all hard when he took the car then cried like a baby when he got caught lol
to change your ideas or behaviour so that you can deal with a new situation
page 19 no example sentence
Most students have little difficulty adapting to college life.
We need to adapt to that reality.
someone who likes a particular activity very much and spends as much time as they can doing it
page 134 Maressa Orzak runs a special clinic for computer addicts.
//Orzak// is a typo. Her full name is [[Maressa Hecht Orzack|http://en.wikipedia.org/wiki/Maressa_Orzack]]
Fashion Addict is an exciting Australian based company with a huge fashion focus.
I never imagined that I'd become a "[[Twitter|http://twitter.com/twitter]] addict" but I can feel the symptoms coming on.. :-O
a strong need or wish to spend as much time as possible doing a particular activity
page 134 She is researching computer addiction.
His addiction to the Internet is taking over his life.
I have a sudoku addiction, HELP !!
to agree that something is true, especially when you are unhappy, sorry, or surprised about it
page 33 He asked her how she felt about her sudden fame and her nomination for the Golden Globe Award and she admitted that she could hardly believe it.
I reluctantly admitted to being nervous about the test.
We have to admit that love doesn't give us the license to own a person.
a feeling of happiness while looking at something nice
page 106 They also found the source of aesthetic pleasure and spiritual strength in animal life about them.
Photography produces works that can be called art โ it gives aesthetic pleasure.
hey!!! they r singers first or aesthetic pleasure??)))
to give someone permission to do or have something
page 89 Many parents do not allow their children to do dangerous sports.
Iโm sorry, sir, but smoking is not allowed.
Please if there is a god do not allow Annie to discover [[Twitter|http://simple.wikipedia.org/wiki/Twitter]]
something that you very much want to do, usually something that is difficult to achieve; the feeling that you want very much to become successful, rich, famous, etc.
The word was not found in the textbook.
His ambition was to become a successful writer.
I Need a chick wit ambition,not just a pretty smile
determined to be successful, rich, famous, etc.
page 66 no example sentence
I'm trying to find out why so many successful ambitious Black sisters are single.
It's a shame [[Google|http://finance.yahoo.com/q/pr?s=GOOG]] is not a hugely ambitious company anymore.
It is used with both favorable and unfavorable connotations.
an animal such as a frog that lives mainly on land, but produces its eggs and develops into its adult form in water
no sentence in the textbook
tiny weeny little [[amphibian|http://www.flickr.com/photos/yersinia/4787623521/]]
Well, now I know how to spell amphibian.
It is a rare word used only in science and technology texts.
//animal species// was not found in the textbook
//species (plural species)// is a plant or animal group whose members all have similar general features and are able to produce young plants or animals together
page 106 Despite highly developed technology and agriculture and the domestication of many species, modern humans still depend on wild stock.
In Canada we have one of the best opportunities to create big parks that can protect species that need large areas of wilderness to survive.
Ain't nobody else in the world like me. I am an endangered species(:
worried because you think something bad might happen; wanting something very much, especially when this makes you [[nervous]], [[excited]], or impatient
page 9 no example sentence
People are naturally anxious about these tests.
I'm kind of anxious for school to start.
//Anxious// has a long history of use roughly as a synonym for //eager//, but many prefer that //anxious// be used only when its subject is worried or uneasy about the anticipated event. But general adoption of //anxious// to mean //eager// is understandable. It implies that the subject so strongly desires a certain outcome that it will lead to unhappiness. In this way, it resembles the informal adjective //dying// in sentences such as //I'm dying to see your new baby//.
attractive and interesting
page 113 appealing visuals
Weโve tried to make the design more appealing to young people.
Doing homework on a beautiful summer day makes the idea of getting teeth pulled sound appealing.
someone who applies for something, such as a job or a loan of money
page 19 no example sentence
The applicant who reports strength in all areas, knows everything, and answers every question with โI've done that before,โ may be looked upon with some suspicion
Successful applicants will be notified by telephone.
a printed list of questions that you answer in order to try to get a job, borrow money, get a place at university etc
page 19 no example sentence
He then took out a paper application form in which he filled the same information, printed and pasted customer's picture on the form, made him sign the form.
Spent this morning at the library filling out the application form they asked me to bring.
to make an official request for a program
page 20 I would like to apply for the Students Exchange Program.
The [[Max F. Perutz Laboratories|http://www.mfpl.ac.at/index.php?cid=6]] invite talented students from all over the world to apply for our graduate program
Do you want to apply for a nursing program?
to use all facts that you know about a subject
page 19 no example sentence
Must have the ability to apply knowledge and skills to complete a wide range of required tasks.
A book is a book, when you apply the knowledge, it becomes very powerful
ask for the right to do something that is given to you by someone in authority
page 47 Today many parents still impose the rule that a child must ask permission to leave the table.
Children should ask their parentsโ permission before making long distance phone calls.
I'm damn near 21 years old and I still gotta ask permission to leave the house!
the type of culture or social status that someone comes from
page 72 She finds living in a multi-generation home quite normal because of her Greek background.
My favorite food is Lasagna, even though I have a Greek background.
But my background is Greek and Italian with some Cherokee Indian thrown in.
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xl="http://www.w3.org/1999/xlink" version="1.1" viewBox="1081 357 41 41"><metadata xmlns:dc="http://purl.org/dc/elements/1.1/"><dc:date>2010-06-05 15:00Z</dc:date><!-- Produced by OmniGraffle Professional 5.2.2 --></metadata><defs><linearGradient x1="0" x2="1" id="Gradient" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#b8b8b8"/><stop offset=".5" stop-color="black"/><stop offset="1" stop-color="black"/></linearGradient><linearGradient id="Obj_Gradient" xl:href="#Gradient" gradientTransform="translate(1101.07983 359.21158) rotate(90) scale(27)"/><linearGradient x1="0" x2="1" id="Gradient_2" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="white"/><stop offset="1" stop-color="#280000"/></linearGradient><linearGradient id="Obj_Gradient_2" xl:href="#Gradient_2" gradientTransform="translate(1122.6825 365.0514) rotate(149.999995) scale(48.74121)"/></defs><g stroke="none" stroke-opacity="1" stroke-dasharray="none" fill="none" fill-opacity="1"><g><path d="M 1083.50964 359.21158 C 1083.6959 359.26721 1083.7958 359.29745 1083.7958 359.29745 C 1083.7958 359.29745 1099.2529 358.84064 1109.0364 367.7494 C 1114.3331 372.57196 1116.91943 380.21628 1118.17786 386.21158 L 1118.65015 386.21158 L 1118.65015 359.21158 Z" fill="url(#Obj_Gradient)"/><path d="M 1113.9187 376.45688 C 1115.64136 375.06143 1116.8745 373.04938 1117.24854 370.68896 C 1118.0514 365.61874 1114.5885 360.85217 1109.5182 360.04938 C 1106.0405 359.49866 1102.7052 360.95535 1100.69434 363.56107" fill="#c1e6fd"/><path d="M 1113.9187 376.45688 C 1115.64136 375.06143 1116.8745 373.04938 1117.24854 370.68896 C 1118.0514 365.61874 1114.5885 360.85217 1109.5182 360.04938 C 1106.0405 359.49866 1102.7052 360.95535 1100.69434 363.56107" stroke="#7aa3be" stroke-linecap="butt" stroke-linejoin="bevel" stroke-width="1.5"/><path d="M 1111.5276 370.43875 C 1111.71826 369.98734 1111.8236 369.49133 1111.8236 368.97086 C 1111.8236 366.88382 1110.1299 365.19073 1108.04346 365.19073 C 1107.4209 365.19073 1106.8334 365.34143 1106.3154 365.60834" fill="#f4c4e2"/><path d="M 1111.5276 370.43875 C 1111.71826 369.98734 1111.8236 369.49133 1111.8236 368.97086 C 1111.8236 366.88382 1110.1299 365.19073 1108.04346 365.19073 C 1107.4209 365.19073 1106.8334 365.34143 1106.3154 365.60834" stroke="#ce81b0" stroke-linecap="butt" stroke-linejoin="bevel" stroke-width="1.5"/><path d="M 1083.79565 359.29755 C 1083.79565 359.29755 1099.2533 358.84064 1109.036 367.74924 C 1118.817 376.6543 1119.3557 395.18008 1119.35815 395.1798 C 1119.3573 395.18008 1118.0963 378.3106 1111.4159 374.57047 C 1104.73865 370.83041 1102.46655 373.58853 1102.46655 373.58853 C 1102.46655 373.58853 1105.8236 370.51877 1102.7499 365.99915 C 1099.68506 361.479 1083.79565 359.29755 1083.79565 359.29755 Z" fill="url(#Obj_Gradient_2)"/><path d="M 1083.79565 359.29755 C 1083.79565 359.29755 1099.2533 358.84064 1109.036 367.74924 C 1118.817 376.6543 1119.3557 395.18008 1119.35815 395.1798 C 1119.3573 395.18008 1118.0963 378.3106 1111.4159 374.57047 C 1104.73865 370.83041 1102.46655 373.58853 1102.46655 373.58853 C 1102.46655 373.58853 1105.8236 370.51877 1102.7499 365.99915 C 1099.68506 361.479 1083.79565 359.29755 1083.79565 359.29755 Z" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width=".5"/></g></g></svg>
an arrangement with a bank that allows you to keep your money there and to pay money in and take money out
page 62 I have my own bank account.
Weโll pay the money directly into your bank account.
I'm checking my bank account balance, hoping money will magically appear in it.
unable to stop taking an illegal or harmful drug; enjoying a particular activity very much and spending as much time as you can doing it
page 99 He was addicted to heroin.
I donโt want the kids getting addicted to stupid TV programs.
r u still addicted 2 [[twitter|http://simple.wikipedia.org/wiki/Twitter]]? lol
to be connected with something in some way
page 40 Evergreens as symbols of survival are associated with this festival.
His social problems were associated with heavy drinking.
I love the people on your lists. Love being associated with them.
//cheat// means to behave dishonestly or to treat someone dishonestly
page 130 Computers cheat students out of mind-expanding experience. //The active construction is used in the textbook.//
Her father was cheated out of the money he raised by the person who was supposed to be helping him with his investment.
Watching [["Lady Sings The Blues"|http://www.imdb.com/title/tt0068828/]]. I love this movie and [[Diana Ross|http://simple.wikipedia.org/wiki/Diana_Ross]] was cheated out of [[Oscar|http://oscar.go.com/]] for her performance as [[Billie Holiday|http://simple.wikipedia.org/wiki/Billie_Holiday]].
satisfied and willing to accept a situation, and not wanting anything more or better
The word is found only in a listening exercise.
He seems to be content with a fairly minor role in the administration.
Keep your life free from the love of money, and be content with what you have.
done or happening because the situation makes it necessary or because someone makes you do it
page 47 This rule certainly suggests that children have been forced to come to the table and would really prefer to eat elsewhere.
Selena Gomez has been forced to cancel some of her upcoming tour dates after losing her voice due to too much talking and eating pickles.
forced to study? get off twitter then:)
if you hold a meeting or event, you organize it
page 47 In Victorian times family meals were held on special occasions, but these again were occasions where power and importance were demonstrated.
The government agreed to hold a referendum.
The chat is held on Twitter itself.
//existence// is the state of being a real or living thing, or of being present in a particular place, time, or situation
page 50 The carnival has been in existence since 1966 and takes place on the last weekend in August.
It's the only copy of the book that is still in existence.
I'm pretty sure I'm the laziest person in existence.
//Be in existence// is redundant. //Exist// is a better choice.
interested in a subject or activity
See the phrase on page 57.
Suddenly sheโs into yoga and things like that.
are u rich too? I'm into rich girls.... Lmao
believing that money and possessions are the most important aspect of your life
page 56 How materialistic are you?
Most people in the world are materialistic, in terms of gadgets, fashion, technology or anything that is possible to buy with money.
Don't be materialistic, be realistic.
to officially suggest that someone should take part in a program
page 19 no example sentence
Western Colorado Pediatric Associates ([[WCPA|http://www.pcpgj.com/wcpa.htm]]) has been nominated for an award for a program in which the Grand Junction medical practice distributes books to.
Our cast has been nominated for a Canadian TV award for "Best Ensemble in A Comedy Program"
belong to
The phrase is found only in a listening exercise.
We got to know each other as part of a group of geeky high schoolers who played a lot of role-playing games.
I am part of a group, am sure I will find you :)
to be understood or thought about in a particular way
page 31 Rachel Reeves, social psychologist at Oxford University, says that being perceived as confident and attractive comes down to whether or not we act as if we're uncertain of ourselves.
Why is train travel perceived as something so romantic?
People love to be perceived as busy.
//to serve// means to provide food and drink for someone to eat at a meal
page 46 When we lived in tribes everyone may have crowded round the carcass, but you can be sure that it was the warrior man who ate first and took the best bits and that the women and children were served last and got leftovers.
A light meal will be served during the flight.
I feel bad. didn't eat all of my food. the guy who served me said he'd feed the [[leftovers]] to his dog.
(not) to be [[confident]] about something
We could find only //feeling unsure of ourselves// in the textbook.
He was so sure of himself that I began to believe him.
I'm feeling unsure of myself today. Learning to be alone aint easy
an extinct animal, plant, or language no longer exists
page 113 number of species that become extinct each year
The Tasmanian tiger was declared extinct in 1936.
good girls are extinct except for me :))
feeling impatient or dissatisfied, because you are not interested in something or because you have nothing to do.
page 9 no example sentence
Steve was getting bored with the game.
Teacher: "GET OUT NOW! " Student: "okay, I was getting bored anyway"
to stop having a very firm and simple idea about what a particular type of person or thing is like
page 19 break the stereotypes
Without a doubt it is now time to break the stereotypes Armenians and Azerbaijanis have of each other.
I like to break the mold and shatter stereotypes.
the amount of money a person or organization has to spend on something
page 62 Do you plan your budget?
All schools are expected to manage their own budgets.
they're cutting our pay b/c they can't manage their budget
to plan the way you will spend the money you have, especially so that you do not spend too much
As a student, you have to learn how to budget.
page 62 I do believe teenagers should learn some basic things about financial affairs like like saving and budgeting.
What to do to Budget your Money Better http://is.gd/aOTCc
to develop friendship between the countries
only in a listening exercise
We want to build a bridge between the countries, says Yuuya Tegoshi. Today the guys are going to meet their Swedish fans and have a party at Spy Bar in Stockholm.
nothing on Twitter, [[COCA|http://corpus.byu.edu/coca/]]
It is a very rare phrase.
the crime of entering a building illegally in order to steal things
page 58 no example sentence
The horrific death of a Mont Vernon woman in her bed during a burglary is the inspiration behind legislation to make future home invasions a capital offense.
sorry to hear about the burglary. Thieving bastards!
<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>
being interested in someone and wanting them to be well and happy
meaning explained on page 73
Much of that stems from the increasing attitude that caring is just another form of [[wasting|waste (sth)]] time.
[[sharing]] is caring we learned that in 1st grade
a lively [[festival]] in which people walk through the streets playing music, dancing, and often wearing unusual colorful clothes
page 50 [[Notting Hill Carnival|http://en.wikipedia.org/wiki/Notting_Hill_Carnival]] is a street carnival in the Notting Hill district of London.
Experience the carnival atmosphere with a host of additional fun activities including: guess your body weight, meet the Yogi and much more.
Just arrived at Candy Carnival, its nuts!
an animal that eats other animals
no sentence in the textbook
Since cats are carnivores, their natural diet would consist of meat.
Vegetarians live 7 years longer than carnivores
//cause and effect// is the principle that one thing causes another
page 58 In your copybook divide the list below into two categories: causes and effects of poverty.
What are your thoughts on the causes and effects of rising Great Lakes temperatures?
Discover the causes and effects of a dysfunctional family. http://dld.bz/dWX4
to test someoneโs skill and abilities
see also http://nme09.tiddlyspace.com/#challenge
page 130 I don't feel like I'm challenging myself.
My present job doesnโt really challenge me.
If [[doubt]] is challenging you & you do not act, doubts will grow.
The word //challenge// is overused. Also check this: [[Hey, douchebag! Stop torturing the English language!|http://unsuck-it.com/challenge/]]
behaving in a happy friendly way
page 9 no example sentence
What does it mean to have a cheerful heart? Does it mean that we take the situation we are given, and try to see the positives in it?
play to win, but be cheerful in defeat. :)
a service involving care for other people's children
page 73 the cost of childcare
We need to put kids first and make sure that their childcare is up to high standards.
a listener wants to know if her company should pay for child care when they send her out on business trips
It is //child care// in American English.
http://www.childcare.gov/
http://www.direct.gov.uk/en/Parents/Childcare/index.htm
/***
https://github.com/tiddlyweb/chrjs/raw/master/main.js
***/
//{{{
// TiddlyWeb adaptor
// v0.10.6
//
// TODO:
// * ensure all routes are supported
// * documentation
(function($) {
tiddlyweb = {
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}"
}
};
// host (optional) is the URI of the originating TiddlyWeb instance
tiddlyweb.Resource = function(type, host) {
if(arguments.length) { // initialization
this._type = type;
if(host !== false) {
this.host = host !== undefined ? host.replace(/\/$/, "") : null;
}
}
};
$.extend(tiddlyweb.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 a 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 uri = this.route();
var data = {};
$.each(this.data, function(i, item) {
var value = self[item];
if(value !== undefined) {
data[item] = value;
}
});
var options = {
url: uri,
type: "PUT",
contentType: "application/json",
data: $.toJSON(data),
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 uri = this.route();
var options = {
url: uri,
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 corresponding instance from raw JSON object (if applicable)
parse: function(data) {
return data;
},
// list of accepted keys in serialization
data: [],
// returns resource's URI
route: function() {
return supplant(tiddlyweb.routes[this._type], this);
}
});
var Container = function(type, name, host) {
if(arguments.length) { // initialization
tiddlyweb.Resource.apply(this, [type, host]);
this.name = name;
this.desc = "";
this.policy = new tiddlyweb.Policy({});
}
};
Container.prototype = new tiddlyweb.Resource();
$.extend(Container.prototype, {
tiddlers: function() {
return new TiddlerCollection(this);
},
parse: function(data) {
var type = tiddlyweb._capitalize(this._type);
var container = new tiddlyweb[type](this.name, this.host);
data.policy = new tiddlyweb.Policy(data.policy);
return $.extend(container, data);
},
data: ["desc", "policy"]
});
// attribs is an object whose members are merged into the instance (e.g. query)
tiddlyweb.Collection = function(type, host, attribs) {
if(arguments.length) { // initialization
tiddlyweb.Resource.apply(this, [type, host]);
$.extend(this, attribs);
}
};
tiddlyweb.Collection.prototype = new tiddlyweb.Resource();
var TiddlerCollection = function(container, tiddler) {
if(arguments.length) { // initialization
tiddlyweb.Collection.apply(this, [tiddler ? "revisions" : "tiddlers"]);
this.container = container || null;
this.tiddler = tiddler || null;
}
};
TiddlerCollection.prototype = new tiddlyweb.Collection();
$.extend(TiddlerCollection.prototype, {
parse: function(data) {
var container = this.container;
return $.map(data, function(item, i) {
var tiddler = new tiddlyweb.Tiddler(item.title, container);
var bag = item.bag;
tiddler = tiddlyweb.Tiddler.prototype.parse.apply(tiddler, [item]);
if(!tiddler.bag && bag) { // XXX: bag always present!?
tiddler.bag = new tiddlyweb.Bag(bag, container.host);
}
if(!tiddler.recipe && item.recipe) {
tiddler.recipe = new tiddlyweb.Recipe(item.recipe, container.host);
}
delete item.recipe;
return $.extend(tiddler, item);
});
},
route: function() {
if(this.tiddler) {
var container = this.tiddler.bag || this.tiddler.recipe;
var params = {
_type: container._type,
host: container.host,
name: container.name,
title: this.tiddler.title
};
} else {
params = this.container;
}
return supplant(tiddlyweb.routes[this._type], params);
}
});
tiddlyweb.Search = function(query, host) {
tiddlyweb.Collection.apply(this, ["search", host]);
this.query = query;
};
tiddlyweb.Search.prototype = new tiddlyweb.Collection();
$.extend(tiddlyweb.Search.prototype, {
parse: function(data) {
this.container = { // XXX: hacky
_type: "bag",
host: this.host
};
var tiddlers = 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
tiddlyweb.Tiddler = function(title, container) {
tiddlyweb.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
});
};
tiddlyweb.Tiddler.prototype = new tiddlyweb.Resource();
$.extend(tiddlyweb.Tiddler.prototype, {
revisions: function() {
return new 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(tiddlyweb.routes[this._type], params);
},
parse: function(data) {
var tiddler = new tiddlyweb.Tiddler(this.title);
var container = this.bag || this.recipe;
tiddler.bag = new tiddlyweb.Bag(data.bag, container.host);
delete data.bag;
delete data.recipe;
tiddler.created = convertTimestamp(data.created);
delete data.created;
tiddler.modified = convertTimestamp(data.modified);
delete data.modified;
if(this.recipe) {
tiddler.recipe = this.recipe;
}
return $.extend(tiddler, data);
},
data: ["modifier", "tags", "fields", "text", "type"],
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");
var etag = xhr.getResponseHeader("Etag");
if(loc && etag) {
self.etag = etag;
if(!self.bag) {
var bag = loc.split("/bags/").pop().split("/")[0];
self.bag = new tiddlyweb.Bag(bag, self.recipe.host);
}
callback(self, status, xhr);
} else { // IE
self.get(callback, options.error);
}
};
}
}
});
tiddlyweb.Revision = function(id, tiddler) {
var container = tiddler.bag || tiddler.recipe;
tiddlyweb.Tiddler.apply(this, [tiddler.title, container]);
this._type = "revision";
this.revision = id;
};
tiddlyweb.Revision.prototype = new tiddlyweb.Tiddler();
$.extend(tiddlyweb.Revision.prototype, {
revisions: false,
data: false,
put: false,
"delete": false
});
tiddlyweb.Bag = function(name, host) {
Container.apply(this, ["bag", name, host]);
};
tiddlyweb.Bag.prototype = new Container();
tiddlyweb.Recipe = function(name, host) {
Container.apply(this, ["recipe", name, host]);
this.recipe = [];
};
tiddlyweb.Recipe.prototype = new Container();
$.extend(tiddlyweb.Recipe.prototype, {
data: ["recipe"].concat(Container.prototype.data)
});
tiddlyweb.Policy = function(constraints) { // TODO: validation?
var self = this;
$.each(this.constraints, function(i, item) {
self[item] = constraints[item];
});
};
tiddlyweb.Policy.prototype.constraints = ["read", "write", "create", "delete",
"manage", "accept", "owner"];
/*
* utilities
*/
tiddlyweb._capitalize = function(str) {
return str.charAt(0).toUpperCase() + str.slice(1);
};
// convert YYYYMMDDhhmmss timestamp to Date instance
var convertTimestamp = function(t) {
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)
));
};
// adapted from Crockford (http://javascript.crockford.com/remedial.html)
var 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
});
};
})(jQuery);
//}}}
/***
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);
}
});
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);
}
});
})(jQuery);
//}}}
/***
https://github.com/tiddlyweb/chrjs/raw/master/users.js
***/
//{{{
// chrjs users extension
// v0.4.0
//
// requires tiddlywebplugins.socialusers
// http://pypi.python.org/pypi/tiddlywebplugins.socialusers
(function($) {
tiddlyweb.routes.users = "{host}/users";
tiddlyweb.routes.user = "{host}/users/{username}";
tiddlyweb.User = function(username, password, host) {
tiddlyweb.Resource.apply(this, ["user", host]);
this.username = username;
this.password = password;
};
tiddlyweb.User.prototype = new tiddlyweb.Resource();
$.extend(tiddlyweb.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: $.toJSON(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);
//}}}
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xl="http://www.w3.org/1999/xlink" version="1.1" viewBox="918 510 14 14" width="14pt" height="14pt">
<defs>
<radialGradient cx="0" cy="0" r="1" id="Gradient" gradientUnits="userSpaceOnUse">
<stop offset="0" stop-color="white"/>
<stop offset="1" stop-color="#2b2b2b"/>
</radialGradient>
<radialGradient id="Obj_Gradient" xl:href="#Gradient" gradientTransform="translate(922.3752 513.7837) scale(11.4739436)"/>
</defs>
<g stroke="none" stroke-opacity="1" stroke-dasharray="none" fill="none" fill-opacity="1">
<g>
<path d="M 929.6952 512.9018 C 927.1568 510.36337 923.0412 510.36337 920.5028 512.9018 C 917.9644 515.4402 917.9644 519.5558 920.5028 522.09418 C 923.0412 524.63257 927.1568 524.63257 929.6952 522.09418 C 932.2336 519.5558 932.2336 515.4402 929.6952 512.9018 M 925.099 515.7425 L 927.17633 513.66516 L 928.9318 515.42065 L 926.8545 517.498 L 928.9318 519.57532 L 927.17633 521.3308 L 925.099 519.25348 L 923.02167 521.3308 L 921.2662 519.57532 L 923.3435 517.498 L 921.2662 515.42065 L 923.02167 513.66516 Z" fill="url(#Obj_Gradient)"/>
<path
d="M 927.61447,515.38354 A 4.5120482,4.2590361 0 1 1 918.59037,515.38354 A 4.5120482,4.2590361 0 1 1 927.61447,515.38354 z"
transform="matrix(1.0218069,0,0,1.0462046,-18.063694,-21.648443)"
id="path2394"
style="opacity:1;fill:#000000;fill-opacity:0;fill-rule:evenodd;stroke:none;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
</g>
</g>
</svg>
<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>
to train a sports player or team
page 92 He coached the 2000 Russian Olympic handball team which won the gold medal. We see //coach// the verb in the example sentence, but //coach// the noun in the list of active vocabulary.
Mr. Jones coaches the football team.
[[Eddie Robinson|http://en.wikipedia.org/wiki/Eddie_Robinson_%28football_coach%29]]; best football coach for my school = ) coached most players in the [[NFL|http://simple.wikipedia.org/wiki/NFL]] too ;)
a feeling of being less sad or worried about something than you were previously
meaning explained on page 73
My mother was always there to offer comfort.
when yo're worried u must pray to God and there's a comfort in prayer
the process of making use of something so that you gain as much as possible from it
page 106 Unmanaged commercial exploitation, however, has greatly reduced this resource.
There's not enough uranium in the Moon to guarantee nuclear power or commercial exploitation.
NEW TERM: "Commersocial", commercial exploitation of social networks.
the relationship you have with a good friend who spends a lot of time with you
page 107 Humans domesticated some animals for food, clothing, power and companionship.
The great thing about cats as compared to dogs is that they don't need as much companionship.
Daily Chinese Word: yวuyรฌ friendship, companionship
//Companionship// is the 16,740th word in the British National Corpus. //Company// is a better choice.
to try to win a competition
page 92 Hundreds of runners competed in the marathon.
You will be competing against the best athletes in the world.
The only time I'll compete w/ a girl for a man is if that man is GOD.
always trying to be more successful than other people
The word is found only in a listening exercise.
She has a reputation for being a fiercely competitive player.
athletes, runners, cyclists, etc, have a more competitive attitude
to say that you are not satisfied with something
page 34 no example sentence
โItโs far too hot,โ she complained.
Costumers complain that the frozen food in the freezer is too frozen.
something that you think is important
page 110 The future of wildlife on our planet should be everyone's concern.
Our primary concern is to give our clients a professional service.
Money is no concern to me when I go to a game
someone who is //confident// believes in their own abilities and so does not feel [[nervous]] or frightened
page 9 no example sentence
He is confident in his ability to do the job well.
the trouble with the world is that the stupid are so confident while the intelligent are full of doubt
see [[feel confident/unconfident (of oneself)]]
Its synonyms are //certain, sure//. //Confident// stresses the firmness of one's certainty or sureness, especially in some expectation.
unable to understand something or think clearly about it
page 9 no example sentence
Happy Birthday to a Confused 3-year-old. "Kelsey, how old are you today?" Without batting an eye, 3-year-old Kels said, "Five!" then held up 4 fingers!
i'm often confused when people say i wish i had an endless amount of cash as it'll be easier to wish that everything was free, seems better
to gain or secure control of by or as if by force of arms
The word was not found in the textbook.
Divide and conquer is a very, very dangerous strategy.
love is the greatest weapon that can conquer your enemy
It looks like (see page 112) the authors want us to use the verb as a command to introduce our opinion. Than it has this meaning:
to have a particular opinion about someone or something; to think of as being
as in //Consider yourself lucky that I didnโt mention it to the boss! or She considered him rude.//
Now consider this stuff: first comes the reflection, โin peace there's nothing so becomes a man ...โ; then the soldier-king wishes his men to โimitateโ the tiger's looks.
Consider this: it would take entire US about 5hrs to use all the oil leaked in the gulf
thinking about the feelings and needs of other people
page 66 no example sentence
It was very considerate of you to include me.
guys should start being more considerate abt how we feel..
careful thought before making a decision or judgment about something
The word was not found in the textbook.
We have given careful consideration to your claim for compensation.
A little Consideration, a little Thought for Others, makes all the difference.
(to have) the power to make decisions about something and decide what should happen
page 135 feeling out of control; failing to control computer use
The latest touchless control system that uses gestures to control computer interfaces.
Why is it that I cannot control my spending habits when it comes to food!?
to hide the truth about something by not telling what you know or by preventing other people from telling what they know
page 31 In fact body language gives away our true feelings so often that politicians are taught not to touch their faces, as placing their hands near the mouth or eyes demonstrates insecurity and suggests an attempt to cover up what you really think.
It was a real scandal, but the school tried to cover the whole thing up.
Even though guys normally still like a girl after a breakup, they go for others to cover up the pain.
to sit with one leg placed over the other at the knee
page 30 no example sentence
I want to know whether you cross your legs when you watch your favourite show.
When you cross your legs do you always cross the same leg over?
happening or existing now
page 123 But even they will prefer computers to books to replace most current information.
Can you make your current phone lose signal depending on how you hold it?
My husband's 6 pack is my current fitness motivation.
The word is found nowhere in the textbook.
to be made or begun at a particular time in the past
page 40 It dates back to the ancient festivals when huge bonfires were set on hilltops to frighten away evil spirits.
Men's bracelets date back to Biblical times.
My old buddy found sketches of comic book heroes we created. They date back to 1981!
an amount of money that you owe
By this time we had debts of over $15,000.
page 58 no example sentence
The fact that I am $100,000 in debt is so humiliating, and I feel like the size of my debt spiraled out of control before I knew it.
Spending 14 bucks of my own money on you isn't gonna drown me in debt
able to make choices or decide what to do quickly and confidently; making the final result of a situation completely certain
page 66 no example sentence
As a chairperson, he was firm and decisive.
I'm preparing myself for the decisive battle against my laziness.
noun derived from [[decisive]]
The word was not found in the textbook.
Decisiveness is the willingness to make decisions, even in the face of complexity or uncertainty.
do everything you want to do with decisiveness
It is a rare word, //self-assurance// looks a little better.
becoming less or worse
page 41 ...it is a declining country.
Gallup poll in Australia shows declining belief in the man-made global warming.
you're the reason why civilization is declining
to become or cause to become smaller or less
page 89 In the last two years the percentage of those who are not into sports has decreased from 53 to 41.
Five major fast food chains have significantly decreased trans fats in the oils they use to cook food.
decrease your Blood Pressure With [[Dr Atkins Diet Plan|http://www.atkins-diet-advisor.com/]]
showing that you are angry or offended when you think that someone is criticizing you
page 31 Putting your arms across your body in order to play with your handbag or bracelet is another classic defensive gesture.
He got really defensive when I asked why he had left.
OKAY. We KNOW Ashley didn't do anything wrong. Your defensive tweets are getting on my nerves.
to describe clearly and exactly what one is
page 42 Traditions are an important way the British people define themselves.
Symbols help people define themselves.
I just find it so hilarious that [[Richard Carvath|http://www.facebook.com/group.php?gid=200685083686#!/group.php?gid=200685083686&v=info]] defines himself as absolutely moral.
<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>
very happy, especially because something good has happened
page 9 no example sentence
I was delighted to see my old friends again.
Dear favorite socks: I was delighted to discover that you have not gotten divorced and are both still living together in the sock drawer.
to say that you did not do something that someone has accused you of doing
page 34 no example sentence
A spokesman denied that the company had acted irresponsibly.
Warren man denies assaulting officer during arrest
to [[rely|rely on]], especially for support or maintenance
page page 106 Humans existed as hunter-gatherers who depended on wild animals for food and clothing.
Children must depend on their parents.
I aint got nobodyyy, thaaaat I can depend on. Just me myself and I
//Depend//, [[trust]], [[rely|rely on]] share the meaning //to place or have faith or confidence in someone or something. Rely// implies complete confidence. //Trust// stresses confidence arising from belief that is often based on inconclusive evidence. //Depend// implies confidence in the help or support of another.
According to [[Wikipedia|http://en.wikipedia.org/wiki/Designer_clothing]], //designer clothing// is clothing that bears the logo of a recognizable fashion designer.
The word is found only in a listening exercise.
There are customers who desire designer clothing in sizes that are not currently available in our stores.
If i was famous id be rockin the designer clothes and not have to ask my dad for money
a piece of clothing that has been made by a well-known designer
see also http://goo.gl/2fES3
The word is found only in a listening exercise.
Even little kids all want to wear designer labels.
don't break the bank for a designer label that will be gone in 3 yrs
a strong feeling of wanting to have or to do something
page 99 Ann's desire to travel around the world becomes stronger and stronger.
[[Suarez|http://en.wikipedia.org/wiki/Luis_Alberto_Su%C3%A1rez]] stated his desire to play in England.
Love is an irresistible desire to be irresistibly desired.
someone who is disabled is unable to use part of their body or brain properly because of injury or disease
page 59 I'm disabled, not unable.
Disabled American Veterans, I valued your advice and counsel when I was a senator.
Where can I find information about benefits available to me as a disabled American veteran?
Use //disabled// to describe someone who has a permanent condition, especially a physical one, that limits their activities in some way โ for example, a disability that makes someone unable to walk. The older word //handicapped//, which referred to both physical and mental disabilities, is now usually considered offensive. Some people prefer to describe disabled people in general as //people with disabilities//, especially in more formal contexts. You can use //blind// or //deaf// to refer to someone who cannot see or cannot hear, but many people now prefer the expressions //visually impaired// and //hearing impaired//. Some people use the word //challenged// (in compounds like //physically challenged// or //visually challenged//) to describe disabilities in a more positive way.
an illness or medical condition
page 134 Computer addiction is a disorder suffered by people who find virtual reality more attractive than everyday reality.
He had treated her for a stomach disorder.
I think I have a sleepin disorder! I haven't had a good nights sleep in like 5-6 years!
to get someoneโs attention and prevent them from concentrating on something
page 11 I believe that punk hair, rings in noses and dangerous heels are totally unacceptable at school, these things can distract other students from study and look really ridiculous in school environment.
We must let nothing distract us from our purpose.
Fat guys love Hawaiian shirts bc the parrots and palm trees distract you from their fatness.
page 88 It is used when we speak about a sport that is not a team sport.
Ladies should not do weight lifting, a lady with big muscles is the ugliest thing on Earth.
I must tip my hat to all those people that do yoga.
see also [[play (a sport)]]
We play //games//. We go //doing// something. We do non-team sports, martial arts or recreational activities. One notable exception is golf, which can use several forms.
//Mr. Jones golfs every Friday afternoon.
My husband plays golf when the weather is nice. In fact, he is going golfing with his friends this weekend.//
Also note that [[Michael Phelps|http://en.wikipedia.org/wiki/Michael_Phelps]] //swims// (as a professional athlete), but I //go swimming// on Sundays (doing it for fun).
do equal parts of a job, see also [[sharing]]
page 75 I wouldn't object to this if everyone in the house did their fair share.
We've got to do a fair share of thinking between us just now.
Economy Would Be Fine If Everyone Did Their Fair Share
It is a rare phrase. //Do one's fair share// is slightly more common.
to do something that involves the possibility of danger, harm, or failure
page 99 Being an actor can be rather dangerous, sometimes they have to do different risky things.
"Rescuing" the banks makes them more likely to do risky things again, knowing that the government will rescue them.
People think they can control doing risky things
It is a rare phrase. Consider //risk (doing), risk your neck, take/run the risk//.
do things teenagers usually do
page 82 I want to go out and have fun with my friends and do teenage things.
I need a job to help around the house and so that I will stop using up my parents money to do teenage things that I do all the time.
We couldn't find any tweets.
It is a very rare phrase.
or //go without//
to succeed in living or working without someone or something
page 62 ...I really don't buy things I can do without...
Youโll be gone for six days? I think we can do without you for that long.
My [[ipod|http://www.google.com/products?q=ipod&oe=utf-8&rls=org.mozilla:en-US:official&client=firefox-a&um=1&ie=UTF-8&ei=FjRpTPrJM4ekOKiD4bkF&sa=X&oi=mode_link&ct=mode&ved=0CBUQ_AU]], dunno what I'd do without it.
what would we do without chocolate and coffee?
the act of domesticating, or accustoming to home; the action of taming wild animals
page 106 Despite highly developed technology and agriculture and the domestication of many species, modern humans still depend on wild stock.
The Domestication of a Party Girl. Once upon a time, I was a party girl. I never dreamed I would be married and with a kiddo.
current education is the domestication of the human being
It is a rare word. Consider //taming//.
a situation in which one person or thing has more influence or power than any other
The word was not found in the textbook.
With this victory, the team has maintained its dominance of European football.
[[Android|http://en.wikipedia.org/wiki/Android_%28operating_system%29]] poised for dominance in China
trying to control other people and make them obey you
page 66 no example sentence
Critics bite into [[Apple|http://en.wikipedia.org/wiki/Apple_Inc.]] and tech giant's domineering ways.
why are parents so domineering?
It is a rare word. Think of //authoritarian//, or colloquial //bossy//.
money or goods that you give to an organization, especially one that helps people
page 113 giving donations
The bank has promised a donation of $24 million toward the disaster fund.
Support us today with a simple $4 donation!
//no doubt// is used for emphasizing that something seems certain or very likely
page 123 There is no doubt about the advantages of books on-line.
There is no doubt that Thesis lifted lines of code directly from [[WordPress|http://wordpress.com/]].
yeah man no doubt! We'll sort something out sometime, gotta be done
relaxed, calm, and not getting easily upset about things
page 66 no example sentence
Jim is pretty easy-going and friendly, when it doesn't interfere with his duty.
I'm a pretty #Easygoing / #Social / #Caring person. I get along w/ just about "Anybody"
//easygoing// is a more acceptable spelling
to use something such as money or fuel very carefully, so that you [[waste|waste (sth)]] as little as possible
page 62 ...I am trying to economise to put money in my account.
Economizing on food is the only choice we have.
Easy Suggestions to Economize at a Music Festival http://bit.ly/98rDKx
It is the 42,463th word in the British National Corpus. [[Save|save]] is a better choice for a careful writer and a casual speaker.
<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>
<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>
very interested in something or [[excited]] by it
page 9 no example sentence
We are looking for enthusiastic, confident, well mannered individuals in nearly all countries to call potential clients worldwide.
I was all happy and enthusiastic when the sun was out, and now it's gone in I'm all emo.
completely necessary, see also [[essentials]]
page 50 Calypso songs and soca (a mixture of soul and calypso) are also essential elements in the festivities.
Jesus guards us against such greed and turns our hearts to what is essential โ the fullness of life that God wishes to give us.
failure is an essential part of success
something that is needed for life, or needed in a particular situation, see also [[essential]]
page 62 Of course, some essentials, like transport tickets or textbooks, shouldn't be paid for with pocket money.
She packed a few essentials and headed for the airport.
The first essentials, of course, is to know what you want
facts or physical signs that help to prove something
page 106 Evidence of this exists in the remarkable paintings of Palaeolithic people in the caves of southern France.
Doctors found no evidence of infection.
there is a lot of evidence that supports what u said
to test or check the condition or health of
page 110 Wild animals need to be examined by a vet with special knowledge.
I think you should be examined by a doctor.
Looks like fracture, but have a radiologist examine the xrays for a second opinion.
very happy and [[enthusiastic]] because something good is going to happen, especially when this makes you unable to relax
page 9 no example sentence
I was so excited I couldnโt sleep.
Kidz excited to wake up & go to school tomorrow
see [[nervous]], [[excitement]]
the feeling of being [[excited]]
page 99 I do sky diving for the thrill and excitement of this sport.
There was great excitement in the crowd as they waited for the president to arrive.
So... in my excitement... I'm shopping on [[amazon|http://www.amazon.com/]]. My cart is getting expensive. But I cant say no...
a family group that includes grandparents, cousins, aunts, etc.
page 72 Every night the whole extended family sits down to eat together around the table in the bright and cosy kitchen.
I enjoy getting together with my extended family every once in awhile...especially my mom's side.
Dinner w/ my extended Gordon family was awesome.
the situation when an animal, plant, or language no longer exists
page 114 The road to extinction is paved with ivory bracelets. The word was mentioned on page 106 for the first time.
A mass extinction of fish 360 million years ago hit the reset button on life.
seems like good manners such as "thank you", "yes please", "no thank you" are slowly going into extinction
something such as a room or piece of equipment that is provided at a place for people to use
page 59 free facilities
The hotel has excellent recreational facilities.
The fridge is finally plumbed in :) we have fully functioning water and ice facilities :D
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AP8zZgAAAGYA//8zAADMMwD/mTMAAGYzAP8zMwAAADMAzP8AAADMAADMmQAAAGYAAMwzAAAAAADuzAAA3QAAALvMAACqAAAAiMwAAHcAAABVmQAARAAAACKZAAARAADuAJkA3QAAALsAmQCqAAAAiACZAHcAAABVAJkARAAAACIAZgARAADuAABm3QAAALsAAGaqAAAAiAAAZncAAABVAABmRAAAACIAAGYRAAAA7u7uM93d3QC7u7szqqqqAIiIiDN3d3cAVVVVM0RERAAiIiIzERERAAAAADMBAQEBAQEBAQEBpXl5eXl5eXl5eXmlAQEBAQEBAQEBAQEBAQEBAQEBgHl5eXl5eXl5eXl5eXl5gAEBAQEBAQEBAQEBAQEB/Xp5eXlVT04qKioqTk9VeXl5ev0BAQEBAQEBAQEBAaV5eXlPKioqKioqKioqKioqT3l5eaUBAQEBAQEBAQGAeXlVTioqKioqKioqKioqKioqTlV5eYABAQEBAQEBgHl5VSoqKioqKioqKioqKioqKioqKlV5eYABAQEBAaV5eVUqKioqKioqKioqKioqKioqKioqKlV5eaUBAQEBeXlVKioqKioqKioqKioqKioqKioqKioqKlV5eQEBAXl5eU4qKioqKioqKjExMTExMSoqKioqKioqTnl5eQEBeXlPKioqKioqKjEyMjIyMjIyMjEqKioqKioqT3l5AXp5eSoqKioqKioxMjIxBwcHBzEyMjEqKioqKioqeXl6eXlVKioqKioqMTIxBwcHBwcHBwcxMjEqKioqKipVeXl5eU8qKioqKioyMgcHBwcHBwcHBwcyMioqKioqKk95eXl5TioqKioqMTIxBwcHBwcHBwcHBzEyMSoqKioqTnl5eXkqKioqKioxMgcHBwcHBwcHBwcHBzIxKioqKioqeXl5eSoqKioqKjEyBwcHBwcHBwcHBwcHMjEqKioqKip5eXl5KioqKioqMTIHBwcHBwcHBwcHBwcyMSoqKioqKnl5eXkqKioqKioxMgcHBwcHBwcHBwcHBzIxKioqKioqeXl5eU4qKioqKjEyMQcHBwcHBwcHBwcxMjEqKioqKk55eXl5TyoqKioqKjIyBwcHBwcHBwcHBzIyKioqKioqT3l5eXlVKioqKioqMTIxBwcHBwcHBwcxMjEqKioqKipVeXl6eXkqKioqKioqMTIyMQcHBwcxMjIxKioqKioqKnl5egF5eU8qKioqKioqMTIyMjIyMjIyMSoqKioqKipPeXkBAXl5eU4qKioqKioqKjExMTExMSoqKioqKioqTnl5eQEBAXl5VSoqKioqKioqKioqKioqKioqKioqKipVeXkBAQEB+nl5VSoqKioqKioqKioqKioqKioqKioqVXl5+gEBAQEBenl5VSoqKioqKioqKioqKioqKioqKlV5eXoBAQEBAQEBeXl5VU4qKioqKioqKioqKioqKk5VeXl5AQEBAQEBAQEBenl5eU8qKioqKioqKioqKipPeXl5egEBAQEBAQEBAQEB+nl5eXlVT04qKioqTk9VeXl5efoBAQEBAQEBAQEBAQEBAXl5eXl5eXl5eXl5eXl5eXkBAQEBAQEBAQEBAQEBAQEBAQF6eXl5eXl5eXl5eXoBAQEBAQEBAQEB/+AH//+AAf/+AAB//AAAP/gAAB/wAAAP4AAAB8AAAAPAAAADgAAAAYAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAYAAAAHAAAADwAAAA+AAAAfwAAAP+AAAH/wAAD/+AAB//4AB///gB/8oAAAAIAAAAEAAAAABACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAEAAAACAAAAAwAAAAMAAAADAAAABG1bSA61m3JXuqB4mbuhd8m9o3jqvaF4+b2hePm9o3jqu6F3ybqgeJm1m3JXbVtIDgAAAAQAAAADAAAAAwAAAAMAAAACAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAwAAAAUAAAAGAAAACI98Wye0nXWavKF4876kev++pHr/vqR6/76kev++pHr/vqR6/76kev++pHr/vqR6/76kev+8oXjztJ11mo98WycAAAAIAAAABgAAAAUAAAADAAAAAgAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAQAAAAHAAAAChwcHBKulnGJvaN5+L6kev++pHr/y7GJ/9/Fnv/s1K7/9t25//rivv/64r7/9t25/+zUrv/fxZ7/y7GJ/76kev++pHr/vaN5+K6WcYkcHBwSAAAACgAAAAcAAAAEAAAAAgAAAAEAAAAAAAAAAAAAAAEAAAADAAAABwAAAAtuYkUst552z76kev++pHr+1LuS//Latf/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD/8tq1/9S7kv++pHr+vqR6/7eeds9uYkUsAAAACwAAAAcAAAADAAAAAQAAAAAAAAABAAAAAgAAAAQAAAAIi3hbNbqgd+a+pHr/xayD/+3Vr//85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA/+3Vr//FrIP/vqR6/7qgd+aJdVg0AAAACAAAAAQAAAACAAAAAQAAAAEAAAACAAAABIl8WSW8oXjlvqR6/8yyiv/54Lz//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//ngvP/Msor/vqR6/7yheOWJfFklAAAABAAAAAIAAAABAAAAAAAAAAFfXz8Iu6F4zL6kev/Msor/+uK+//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//rivv/Msor/vqR6/7uheMxfXz8IAAAAAQAAAAAAAAAAAAAAAbqid4K+pHr/xayD//ngvP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//fgvP/FrIP/vqR6/7qid4IAAAABAAAAAAAAAAC3l28gvaN5+L6kev7t1a///OXA//zlwP/85cD//OXA//zlwP/85cD//OXA/+/Twv/Qq8f/u5HK/7OGzP+zhsz/u5HK/9Crx//v08L//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA/+3Vr/++pHr+vaN5+LeXbyAAAAAAAAAAALuheJa+pHr/1LuS//zlwP/85cD//OXA//zlwP/85cD//OXA//riwP/Pq8f/r4HM/6+Bzf+vgc3/r4HN/6+Bzf+vgc3/r4HN/6+BzP/Pq8f/+uLA//zlwP/85cD//OXA//zlwP/85cD//OXA/9S5kv++pHr/u6F4lgAAAACii3MLvKF4876kev/y2rX//OXA//zlwP/85cD//OXA//zlwP/64sD/w5vJ/6+Bzf+vg83/w5vc/9W06v/dwPD/3cDw/9W06v/Dm9z/r4PN/6+Bzf/Dm8n/+uLA//zlwP/85cD//OXA//zlwP/85cD/8tq1/76kev+8oXjzootzC72feFW+pHr/y7GJ//zlwP/85cD//OXA//zlwP/85cD//OXA/8+rx/+vgc3/tIfQ/9a16//hw/P/4cPz/+HD8//hw/P/4cPz/+HD8//Wtev/tIfQ/6+Bzf/Pq8f//OXA//zlwP/85cD//OXA//zlwP/85cD/y7GJ/76kev+9n3hVvaF4mL6kev/fxZ7//OXA//zlwP/85cD//OXA//zlwP/v08L/r4HM/6+Dzf/Wtev/4cPz/+HD8//hw/P/4cPz/+HD8//hw/P/4cPz/+HD8//Wtev/r4PN/6+BzP/v08L//OXA//zlwP/85cD//OXA//zlwP/fxZ7/vqR6/72heJi8oXfIvqR6/+zUrv/85cD//OXA//zlwP/85cD//OXA/9Crx/+vgc3/w5vc/+HD8//hw/P/4cPz/+HD8//hw/P/4cPz/+HD8//hw/P/4cPz/+HD8//Dm9z/r4HN/9Crx//85cD//OXA//zlwP/85cD//OXA/+zUrv++pHr/vKF3yL2jeOq+pHr/9t25//zlwP/85cD//OXA//zlwP/85cD/u5HK/6+Bzf/VtOr/4cPz/+HD8//hw/P/4cPz/+HD8//hw/P/4cPz/+HD8//hw/P/4cPz/9W06v+vgc3/u5HK//zlwP/85cD//OXA//zlwP/85cD/9t25/76kev+9o3jqvaF4+b6kev/64r7//OXA//zlwP/85cD//OXA//zlwP+zhsz/r4HN/93A8P/hw/P/4cPz/+HD8//hw/P/4cPz/+HD8//hw/P/4cPz/+HD8//hw/P/3cDw/6+Bzf+zhsz//OXA//zlwP/85cD//OXA//zlwP/64r7/vqR6/72hePm9oXj5vqR6//rivv/85cD//OXA//zlwP/85cD//OXA/7OGzP+vgc3/3cDw/+HD8//hw/P/4cPz/+HD8//hw/P/4cPz/+HD8//hw/P/4cPz/+HD8//dwPD/r4HN/7OGzP/85cD//OXA//zlwP/85cD//OXA//rivv++pHr/vaF4+b2jeOq+pHr/9t25//zlwP/85cD//OXA//zlwP/85cD/u5HK/6+Bzf/VtOr/4cPz/+HD8//hw/P/4cPz/+HD8//hw/P/4cPz/+HD8//hw/P/4cPz/9W06v+vgc3/u5HK//zlwP/85cD//OXA//zlwP/85cD/9t25/76kev+9o3jqvKF3yL6kev/s1K7//OXA//zlwP/85cD//OXA//zlwP/Qq8f/r4HN/8Ob3P/hw/P/4cPz/+HD8//hw/P/4cPz/+HD8//hw/P/4cPz/+HD8//hw/P/w5vc/6+Bzf/Qq8f//OXA//zlwP/85cD//OXA//zlwP/s1K7/vqR6/7yhd8i9oXiYvqR6/9/Fnv/85cD//OXA//zlwP/85cD//OXA/+/Twv+vgcz/r4PN/9a16//hw/P/4cPz/+HD8//hw/P/4cPz/+HD8//hw/P/4cPz/9a16/+vg83/r4HM/+/Twv/85cD//OXA//zlwP/85cD//OXA/9/Fnv++pHr/vaF4mL2feFW+pHr/y7GJ//zlwP/85cD//OXA//zlwP/85cD//OXA/8+rx/+vgc3/tIfQ/9a16//hw/P/4cPz/+HD8//hw/P/4cPz/+HD8//Wtev/tIfQ/6+Bzf/Pq8f//OXA//zlwP/85cD//OXA//zlwP/85cD/y7GJ/76kev+9n3hVootzC7yhePO+pHr/8tq1//zlwP/85cD//OXA//zlwP/85cD/+uLA/8Obyf+vgc3/r4PN/8Ob3P/VtOr/3cDw/93A8P/VtOr/w5vc/6+Dzf+vgc3/w5vJ//riwP/85cD//OXA//zlwP/85cD//OXA//Latf++pHr/vKF486KLcwsAAAAAu6N3l76kev/Uu5L//OXA//zlwP/85cD//OXA//zlwP/85cD/+uLA/8+rx/+vgcz/r4HN/6+Bzf+vgc3/r4HN/6+Bzf+vgc3/r4HM/8+rx//64sD//OXA//zlwP/85cD//OXA//zlwP/85cD/1LmS/76kev+7oXiWAAAAAAAAAAC3l28gvaN5+L6kev7t1a///OXA//zlwP/85cD//OXA//zlwP/85cD//OXA/+/Twv/Qq8f/u5HK/7OGzP+zhsz/u5HK/9Crx//v08L//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA/+3Vr/++pHr+vaN5+LeXbyAAAAAAAAAAAAAAAAC6oneCvqR6/8Wsg//54Lz//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/34Lz/xayD/76kev+6oneCAAAAAAAAAAAAAAAAAAAAAH9/VQa8oHjLvqR6/8yyiv/64r7//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD/+uK+/8yyiv++pHr/vKB4y39/VQYAAAAAAAAAAAAAAAAAAAAAAAAAALKhbh67o3nkvqR6/8yyiv/54Lz//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//ngvP/Msor/vqR6/7ujeeSyoW4eAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALqbdim7o3nkvqR6/8Wsg//t1a///OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/t1a//xayD/76kev+7o3nkupt2KQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALKhbh68oHjLvqR6/76kev7Uu5L/8tq1//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/y2rX/1LmS/76kev6+pHr/vKB4y7Khbh4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH9/VQa6oneCvaN5+L6kev++pHr/y7GJ/9/Fnv/s1K7/9t25//rivv/64r7/9t25/+zUrv/fxZ7/y7GJ/76kev++pHr/vaN5+Lqid4J/f1UGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC3l28gu6F4lryhePO+pHr/vqR6/76kev++pHr/vqR6/76kev++pHr/vqR6/76kev++pHr/vKF487uheJa3l28gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAootzC72feFW9oXiYvKF3yL2jeOq9oXj5vaF4+b2jeOq8oXfIvaF4mL2feFWii3MLAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/gB///gAH//gAAf/wAAD/4AAAf8AAAD+AAAAfAAAADwAAAA4AAAAGAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAGAAAABwAAAA8AAAAPgAAAH8AAAD/gAAB/8AAA//gAAf/+AAf//4Af/
//to be certain of oneself// means //to be [[confident]]//
We could find only //we're uncertain of ourselves// in the textbook.
i am failing other tests too, i can no longer feel certain of myself.
We couldn't find anything on Twitter.
//feel certain of// is not on [[COCA|http://www.americancorpus.org/]]
The synonym is [[feel confident/unconfident (of oneself)]]
//to feel confident// means //to believe in your own abilities and so do not feel nervous or frightened//
//unconfident// is a very rare word: it is only in few dictionaries and it is the 81,539th word in the [[British National Corpus|http://www.natcorp.ox.ac.uk/corpus/index.xml]].
page 31 According to psychologist [[Jane Firbank|http://www.hgi.org.uk/register/Therapists/Jane-Firbank.htm]], crossing your arms is the most telling sign that you are feeling less than confident.
It's the lower part of the body that makes me feel unconfident of wearing shorts and swimsuits.
I got used to [[Django|http://en.wikipedia.org/wiki/Django_%28web_framework%29]] lately, so I feel confident of myself in developing web apps.
The synonym is [[feel certain/uncertain (of oneself)]].
unhappy because someone has something that you would like or can do something that you would like to do
page 78 Obviously, I feel a bit jealous of them when I go to their houses for tea.
Other girls were jealous of her good looks.
all peoples are so jealous to be just like u xD
to think you are confident and safe, and it depends on your emotions rather than on facts or evidence
page 31 no example sentence
The important thing is that children feel secure about being loved.
jgn khawatir, sayang :) Lord, please make me feel secure at last with him :'(
regularly recurring program of cultural performances, exhibitions, or competitions (also see [[carnival]])
page 40 Unscramble the names of three important festivals and match them with the pictures.
page 50 [[St. Patrick's Festival|http://www.stpatricksfestival.ie/cms/home.html]] has been in existence since 1996.
The [[Harbin festival|http://en.wikipedia.org/wiki/Harbin_International_Ice_and_Snow_Sculpture_Festival]] is one of the world's four largest ice and snow festivals.
shanghai expo, the greatest design festival on earth
a lively and enjoyable celebration
page 50 Calypso songs and soca (a mixture of soul and calypso) are also essential elements in the festivities.
Festivities include a parade and an open-air concert.
join us for FREE LINCOLN CENTER festivities tonight at 8:45 i will hit the stage!
to try hard to achieve something
page 58 fight for life
Many of the injured are still fighting for compensation.
WHAT SUCKS IS THAT YOU DON'T FIGHT FOR ME.
the state of being physically healthy and strong
page 89 He is proud of his level of fitness.
I want to help them select the very best health and fitness products.
Dancing, fitness...being healthy...it's all related.
able to make changes or deal with a situation that is changing
page 66 no example sentence
His ability to multi-task and remain flexible is very inspiring. (see [[inspire]])
Women are Angels And when someone breaks our wings....we simply continue to fly. .on a broomstick... We are flexible
to concentrate on something and pay particular attention to it
page 82 I should focus more on my school.
We will focus upon three main topics.
he asked me to focus and i replied: focus on what?
//Focus// makes //focused and focusing// in American English, //focussed and focussing// in British English.
to cross one arm over the other
We could find only //crossing one's arms// in the textbook.
The border guard folded his arms across his chest and stared.
If you fold your arms trying to make the fat look like muscle, it's still fat.
feeling annoyed and impatient because you are prevented from achieving something
page 9 no example sentence
He gets so frustrated at not being able to do things for himself anymore.
I get mad when he doesn't answer me. I get frustrated when he ignores me, but I love him so much.
When an idea gets across or when you get it across, you succeed in making other people understand it.
page 25 Sadly, some are prepared to physically hurt people in an attempt to get their message across.
But, [[Ecademy|http://www.ecademy.com/node.php?id=83715]] offers two absolutely brilliant ways of furthering your cause, of getting your messages across and getting your business noticed.
I can't seem to get my message across
//get off my back// is used for telling someone to stop criticizing you or telling you what to do
page 82 How do I get my parents off my back?
I hope Lauren will get off my back for not having [[facebook|http://simple.wikipedia.org/wiki/Facebook]].
it's only 9am get off my back ma'am
to show an emotion or quality that you are trying to hide
page 31 In fact body language gives away our true feelings so often that politicians are taught not to touch their faces, as placing their hands near the mouth or eyes demonstrates insecurity and suggests an attempt to cover up what you really think.
Her face gave nothing away.
it was the expression on your face :-) lol...was it the camera lens that gave it away?
to leave your house and go somewhere, especially to do something enjoyable
page 82 I want to go out and have fun with my friends and do teenage things.
I wanted the evenings free for going out with friends.
my parents think i don't have a social life because i didn't go out much lately
go crazy
page 82 Please help me before I go out of my mind.
I go out of my mind and burn my whole library to CD's.
I'll go out of my mind with sadness.
to do something much more than is usual or reasonable
page 99 He has done a lot of dangerous sports because he likes to go to extremes.
They are willing to go to extremes, and sometimes they pay a huge price.
She might go to extremes to look like [[Carly Simon|http://en.wikipedia.org/wiki/Carly_Simon]] or [[Cher|http://simple.wikipedia.org/wiki/Cher]]. [:
if someone grows out of a habit, they stop doing it, because they are older or wiser
The word is found only in a listening exercise.
They thought I would grow out of my fear of spiders.
I wonder if I'll ever grow out of talking too much
//ะฝั ัั ะฟะพะฝะตะป//
page 109 picture
Well, to be fair, a guinea pig's little legs are perhaps a bit too short to allow what we consider a true hug.
i need a guinea pig... not the animal but a person to test on
to spend time in a particular place or with particular people
page 82 I don't hang out with a bad crowd.
The happier parenting tip (from the [[SF Gate|http://www.sfgate.com/]] article) that I'm loving is this: Hang out with childless friends.
all my coworkers wanna hang out b4 i leave. guess im makin new friends
have a noisy argument
page 11 In many schools where students are not allowed to wear make-up or jewelery, or to have their own clothes or modern hairstyles, they end up looking the same, and some students get rebellious and have many rows with their parents or teachers.
I miss him, but not for any logical reason other than that he was a good bloke to have a row with.
Had a row with steve about putting the rubbish out. How cliche.
a person or group of people occupying a single dwelling
page 72 And the household doesn't finish there.
But the neat thing about this household is all the pets in the house.
In the UK each household owes ยฃ200.000... not bad ))
the environment connected with houses and other buildings that people live in
page 58 poor housing conditions
A private landlord was heavily fined for dangerous housing conditions.
Recession Erodes Housing Conditions http://bit.ly/9iHa1y
the basic rights and freedoms to which all humans are entitled
page 59 Moraene says that poor people are deprived of human rights.
Joseph Ruyenzi is one of hundreds of human rights activists in the Democratic Republic of Congo who face arrest.
Going to attempt my human rights assignment. Again.
to cause pain or injury
page 25 Sadly, some are prepared to physically hurt people in an attempt to get their message across.
I never meant to hurt your feelings.
The truth will hurt too much
if someone or something impresses you, you admire them
The word is found only in a listening exercise.
You impressed me with your command of Chinese.
I wasn't that impressed by the first episode, but I do want to watch the second, so I guess it was good enough.
to make something better
see also http://nme09.tiddlyspace.com/#improve
page 89 I only hope the weather improves by Saturday.
Our main objective is to improve educational standards.
If youโre living paycheck-to-paycheck things wonโt improve until you have a cushion to back you up.
someone who you are related to by marriage, especially the father or mother of your husband or wife
page 73 He only laughs when he is asked about living with his in-laws.
It always amazes me on how little attention is invested in getting to know one's future in-laws, getting to know the family he/she is about to marry into.
Blessed w/ great in laws :)
to become or to make something become larger in amount or number
page 89 The number of football fans has increased dramatically in the last two years.
The club has been increasing in popularity.
increase your energy savings by putting outdoor and indoor lights on timers.
to allow yourself or someone else to have or do something that you/they enjoy
page 92 Jane is a gymnast, but often indulges in chocolates and ice cream.
He loves his wife and indulges his sons.
can't wait for Wednesday when I get more money and can indulge in [[Ice Jerseys|http://www.icejerseys.com/about_us.php]] customer appreciation sale
When the target of the indulgence is a habit, custom, or form of gratification, this verb is usually intransitive: //one indulges in a given habit//. But when the target of the indulgence is the person seeking that gratification, the verb is transitive and the person is the verb's direct objectโe.g.: //Indulge your inner food lover and take a cooking course in France.//
something special that someone does for pleasure, not because they need to
page 93 Do you have any secret indulgences that you couldn't afford earlier?
My weekly indulgence is a visit to my organic farm shop.
I don't care if I'm broke but I'm allowing myself indulgence in food tonight!
to hurt someone and cause damage to their body
not found in the textbook
Nine people died and 14 were injured in the accident.
[[P!nk|http://www.myspace.com/pinkspage]] Injured During Concert Caught on Tape
physical damage done to a person or a part of their body
page 92 She is suffering from a leg injury.
All the passengers in the vehicle escaped injury.
Praying for the recovery of my friend who is now suffering from brain injury.
a small animal that has six legs and often has wings
no sentence in the textbook
We've heard about hotels for pets like cats and dogs before, but never about one for insects.
Butterfly...what does butter and a fly have in common to be a compound word describing an insect???
//Insect's// synonym //bug// is much more frequently used.
to say very firmly that something must happen or must be done
page 34 no example sentence
She insisted that we stay at her house instead of a hotel.
Why do elderly women insist on wearing [[pop socks|http://www.careclothing.net/shop/ladies-wear/hosiery/pop-socks/prod_37.html]] instead of tights???
to give someone the enthusiasm to do or create something
page 92 Today's literature lesson really inspired me to read more poetry.
We use interactive displays to inspire children to read and write for pleasure.
my kids inspire me to stay strong bc they need me
[[enthusiastic]] or motivated
page 9 no example sentence
You know how sometimes you can take one look at something and just instantly be inspired?
In Chicago for a few days... I always get inspired when I'm in this city.
some but not all of something, essential for it and needed to make it complete
page 127 The PC is becoming an integral part of our private and professional lives.
Home visits by [[staff]] are an integral part of the service.
learning has become an integral part of mainstream society
to try to find out the facts about something in order to learn the truth about it
The word was found only in a listening exercise.
We sent a reporter to investigate the rumor.
Anyone in jersey/new york state/pennsylvania have a haunted house they want my team to investigate for Ghost Patrol?
The phrase is rare and is not registered in online dictionaries. Although the Google Blog Search found about 10,000 instances of //jog your brain//, for example:
Use the ideas you find to jog your brain and develop your own original letter.
According to [[COCA|http://www.americancorpus.org/]] the mutual information score shows the semantic bonding between //jog// and //brain//, but the percentage of all occurrences of the //jog// with //brain// is only 0.01%.
We found this in the [[Macmillan Dictionary|http://www.macmillandictionary.com/dictionary/american/jog]]:
''jog someoneโs memory''
to make someone remember something
page 130 Students still need to be forced to jog their brains.
''jog'' means //to knock something so that it moves slightly//
Police hope to jog the memory of anyone who was in the area at the time of the attack.
I don't remember what I said. Can u jog my memory, por favor?
a situation in which you do not have any, or enough, of the freedom to do things without other people watching you or knowing what you are doing, see also [[lack of sth]]
page 75 One of the worst things about my house is the lack of [[privacy]].
i don't see the problem about the lack of privacy of facebook
This lack of privacy, I don't know if I can stand living at home my college years
a situation in which you do not have any, or enough, of something that you need or want, see also [[lack of privacy]]
page 59 The greatest lack in my life has been lack of education.
The game was canceled because of lack of interest.
Lack of sleep is like a mind altering drug.
the food that remains at the end of a meal after you have finished eating
page 46 When we lived in tribes everyone may have crowded round the carcass, but you can be sure that it was the warrior man who ate first and took the best bits and that the women and children were served last and got leftovers.
Someone else did all the research for you and came up with the best ways to save food and store leftovers (including options other than freezing).
I'm going to eat my leftovers, take a shower, & go to bed. Nighty night ya'll. XOXO.
like-minded people, groups etc have similar tastes, interests, and opinions
page 25 Maybe it is the need to be able to show your solidarity with a group of like-minded friends.
This makes for a great 4-day holiday, meeting like-minded music lovers from all parts of the world
There's a powerful transformative effect when you surround yourself with like-minded people
a [[single parent|http://en.wikipedia.org/wiki/Single-parent]] is a parent who raises their children alone, without a partner
page 59 I'm a lone parent, not an irresponsible one.
The lone parent payment is an anti-poverty measure.
im a victim of a single parent household
having existed for a long time
page 40 One of the long-standing traditions is the belief that the mistletoe plant holds magic powers and protects against disease.
You are so fortunate to have such a close and long-standing friendship.
One of my long-standing to-dos was to update my word list.
//Lasting// is a [[synonym|Synonyms]] with higher [[frequency|Frequency]].
to look at someone when you are talking to them, especially to show that what you are saying is true
page 30 no example sentence
Can you look me in the eye and say that you really love him?
Look me in the eye, try not to lie now..
money (less than average) that you receive for doing your job
page 58 no example sentence
Low pay? It depends on who you are and where you work. A $200 logo or $1000 book cover may not make sense to you as a designer in the USA, but a designer in Estonia, Indonesia or Bangladesh may feel otherwise.
What a PAL 747 pilot receives in one month, I earn in one year. Low pay?
to show people what you think or believe by behaving in a particular way
page 25 Straight edge kids make a statement with their fashion as well as with their philosophy.
I'll make a statement wearing that.
A subtle way of getting your message across and making perhaps a fashion statement out of it is through a t-shirt.
to influence
The word was found only in a listening exercise.
Sheโs an excellent athlete who is already making a real impact in world competition.
Need to write about "someone who has made an impact on your life & explain how & why this person is important to you" but I have no idea who
make written or spoken remarks giving an opinion
page 75 My elder brother is always making nasty little comments about me.
Please don't make comments on such issues if you have no idea what is going on.
I love when people make comments on my blog.
to make jokes about someone or something in an unkind way
page 82 The last time I got clothes my friends saw me with Mum in [[Burton's|http://www.burton.co.uk/webapp/wcs/stores/servlet/StaticPageDisplay?storeId=12551&catalogId=33052&identifier=br2-stores]] and really made fun of me for it.
The other children made fun of her because she was always so serious.
tall people can't make fun of short people
an animal that drinks its motherโs milk as a baby
no sentence in the textbook
Africa's game parks have lost over half of their big mammals, such as the lions and buffaloes.
Elephants are the only mammal that cannot jump.
the detailed study of something in order to discover new facts, especially in a university or medical institution
page 107 Also contributing to human welfare are rhesus monkeys that medical research has used to gain an understanding of human physiology.
It is amazing how much medical research is funded by foundations created by the family members of those with serious conditions.
Itโs a miniature pig used for medical research. they're so cute! http://ow.ly/2qzXy
producing an increased perceptive awareness, expanding knowledge and awareness
page 130 Computers cheat students out of mind-expanding experience.
I love the mind expanding power of computers.
Del and I went to see [["Inception"|http://www.imdb.com/title/tt1375666/]] .. a mind expanding movie guaranteed to shift your thinking about reality and dreaming.
//Mind expanding// is a better spelling.
neither very great nor very small in amount, size, strength, or degree; reasonable and avoiding extreme opinions or actions
not found in the textbook
She was on the moderate wing of the party.
Eat a moderate amount of a wide variety of mostly living, organic, tasty plant foods for optimal health.
sensible behavior, especially behavior that involves not eating or drinking too much of something
page 92 Moderation in eating and physical exercise is the key to good health.
Almost any kind of food and drink in moderation is okay.
Just because it is organic doesn't mean it is healthy. moderation is the key to health.
<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>
a feeling of admiration for someone because of their personal qualities, their achievements, or their status felt in the same way by each of two or more people
meaning explained on page 73
Friendship for me has always been built on mutual respect.
Mutual respect is the path to peace!
to frequently ask someone to do something that they do not want to do
page 75 He keeps nagging me about homework and studying.
My mom keeps nagging me to clean up my room.
mom im NOT cleaning my room, stop nagging.
disliking or not interested in ideas or cultures different from your own
page 26 If you stop accepting any new ideas you become narrow-minded.
There is nothing undemocratic about what has happened since polling day. Take your narrow-minded opinions and go away
Those who call others narrow-minded, are the most narrow-minded of all
an area of land that is protected so that people cannot harm the animals and plants that live there
page 115 In order to preserve areas of land that haven't been yet endangered by people, new nature reserves are founded.
UK coastline changes shape as London Gateway nature reserve is built.
[[Sandwell Valley nature reserve|http://www.rspb.org.uk/reserves/guide/s/sandwellvalley/]] - despite a fab view over the lake, I couldn't bring myself to sit here for lunch.
Some American terms are //nature preserve, wildlife refuge and national/state park//.
feeling [[excited]] and worried, or slightly afraid
page 9 no example sentence
She was nervous about walking home so late.
I'm nervous my heart is in my stomach my breathing is off..every minute feels like a hour..
see [[anxious]]
@@Please do not modify this tiddler; it was created automatically upon space creation.@@
http://www.yourdictionary.com/library/misspelled.html acquire, possession
wordcount: 169 entries
average 7466
47 domineering 32648
47 snobbish 38161
73 amphibian n 38484
35 leftovers 39015
45 economise(on sth) 42463
47 decisiveness 43463
71 domestication n 46664
87 control v 294
35 be held 311
55 staff n 405
81 provide v (sb with sth) 411
71 evidence n (of) 436
73 a matter of 465
61 increase v 571
coca: 226 entries
average 25.73
81 current a 694 141.67
51 security n 706 154.97
81 provide v (sb with sth) 411 171.49
35 be held 311 174.6
71 evidence n (of) 436 174.69
87 control v 294 262.86
17 program 2473 314.53
build bridges 0.00
17 apply for a program 1303 0.01
17 be nominated for a program 7733 0.01
17 break a stereotype 0.01
25 put on a fake smile 0.01
43 lone parent 0.01
53 do a fair share colloc 0.01
57 do teenage things colloc 0.01
67 do risky things colloc 0.01
83 keep track of life colloc 0.01
level: 129 entries
average 6.83
25 be perceived as page 31 Rachel Reeves, social psychologist at Oxford University, says that being perceived as confident and attractive comes down to whether or not we act as if we're uncertain of ourselves. 15.25
35 be served 1617 76.15 page 46 When we lived in tribes everyone may have crowded round the carcass, but you can be sure that it was the warrior man who ate first and took the best bits and that the women and children were served last and got leftovers. 15.45
25 give sth away 2.76 page 31 In fact body language gives away our true feelings so often that politicians are taught not to touch their faces, as placing their hands near the mouth or eyes demonstrates insecurity and suggests an attempt to cover up what you really think. 16.24
21 participate 4788 33.57 page 24 These days straight edgers also participate in animal rights protests, follow a vegetarian diet and are involved in environmental and political issues and protest. 16.4
13 have a row 0.05 page 11 In many schools where students are not allowed to wear make-up or jewelery, or to have their own clothes or modern hairstyles, they end up looking the same, and some students get rebellious and have many rows with their parents or teachers. 16.8
to be opposed to something, or to express your opposition to it in words
page 75 I wouldn't object to this if everyone in the house did their fair share.
While no one objects to [[Japanese cultural centers|http://japaneseculturecenter.com/]], the idea of putting one up at [[Pearl Harbor|http://simple.wikipedia.org/wiki/Attack_on_Pearl_Harbor]] would be offensive.
Dear Mom: I know that you have objected to the idea of purchasing me a [[MacBook pro|http://www.google.com/products?hl=en&client=firefox-a&hs=JQL&rls=org.mozilla:en-US:official&q=MacBook+pro&um=1&ie=UTF-8&ei=IWJpTKeUKKSTOI6VtbgF&sa=X&oi=mode_link&ct=mode&ved=0CBMQ_AU]].
//Object// implies opposition to something, whether openly expressed or not, because of strong dislike or disapproval. //Oppose// is a more frequently used synonym.
not willing to be reasonable and change your plans, ideas, or behavior
page 66 no example sentence
I now see that my obstinate refusal caused problems for everyone.
Ever had a 16 year old go nuts lying to you? Friggin obstinate, arguing kid.
at a special time for something
page 47 In Victorian times family meals were held on special occasions, but these again were occasions where power and importance were demonstrated.
What I like eating with family on special occasions is the fact that I expected to help with preparations.
When I was young we went to [[Pizza Hut|http://www.pizzahut.com/]] on special occasions.
connected to or available through a computer or a computer network (=a group of connected computers), especially the Internet
page 123 There is no doubt about the advantages of books on-line.
More and more people are getting this type of information online.
u can buy the tix online...they are cheaper then buying them there.
//Online// is a more widely accepted spelling.
to disagree with or not approve of a plan or policy
page 110 The [[AVMA|http://www.avma.org/about_avma/default.asp]] opposes the keeping of wild carnivore species of animals as pets.
The direct object of //oppose// here is the gerund. It is often a noun.
Many religious leaders oppose cloning humans.
african americans want jobs, oppose taxes, love freedom and america
to begin to exist or appear for the first time
only in the teacher's book
rivers are inclined to originate from high up on the hills
The concept of factory outlet shopping originated in America.
old and no longer suitable for modern purposes, methods, or situations
page 130 Computers may be soon outdated.
Meat bosses have hit out at vegetarian campaigner [[Sir Paul McCartney|http://www.supportmfm.org/index.cfm]] for 'recycling' outdated information.
I'm not spending $300 on a phone that will be outdated in less than 2 months.
your general attitude to things
page 89 He's got a very positive outlook on life and the world.
They shared the same kind of outlook on life.
Poll: Outlook on Afghanistan war darkens
to succeed in dealing with or controlling a problem
page 89 As a result of doing downhill skiing I overcame my fear of high speed.
Jimmy overcame his difficulties to graduate with a first-class degree.
If he likes you enough he will overcome his shyness & ask you. Just keep showing him your pretty face & saying hi.
a public celebration in which a large group of people move through an area, often with decorated vehicles and bands playing music
see also http://nme07.tiddlyspace.com/#parade
page 50 The parade has become an essential part of the festival.
Leading the parade is a truck packed with speakers blaring the Rwandan national anthem.
I was in a play. And we were waiting backstage.. and i was like Doooont rain on my parade!
to take part in something
page 24 These days straight edgers also participate in animal rights protests, follow a vegetarian diet and are involved in environmental and political issues and protest.
Did congress really exempt themselves from having to participate in the new Health Care Law?
I either want less corruption, or more chance to participate in it
to make someone agree to do something by giving them reasons why they should
page 34 no example sentence
Nobody could persuade her to change her mind.
There's no official video at ~YouTube so I think I have to persuade Dad to buy it at #iTunes :)
page 88 We speak about games in which one tries to win another person or team.
Would you play baseball without a glove?
Why don't cats play poker in the jungle? Too many cheetahs.
see also [[do (a sport)]]
We play //games//. We go //doing// something. We do non-team sports, martial arts or recreational activities. One notable exception is golf, which can use several forms.
//Mr. Jones golfs every Friday afternoon.
My husband plays golf when the weather is nice. In fact, he is going golfing with his friends this weekend.//
Also note that [[Michael Phelps|http://en.wikipedia.org/wiki/Michael_Phelps]] //swims// (as a professional athlete), but I //go swimming// on Sundays (doing it for fun).
to connect a piece of equipment to an electricity supply or to another piece of equipment
page 127 It was a small thing produced here in England, plugged into the TV.
First plug the keyboard into your computer.
My [[GPS|http://simple.wikipedia.org/wiki/Gps]] is plugged into my lighter.
something that you own
The word is found only in a listening exercise.
Their family home and possessions were destroyed in the fire.
Treasure your relationships, not your possessions.
a situation in which someone does not have enough money to pay for their basic needs
page 58 no example sentence
Half the worldโs population is living in poverty.
LOVE THIS 1, PROVERBS 20:13 "IF U LOVE SLEEP U WILL END N POVERTY.."
to say what you think will happen in the future
page 123 I'm just predicting the future in the way I see it.
Theyโre predicting heavy rain for tomorrow.
[[WIRED|http://www.wired.com/]] Predicted the [[iPad|http://simple.wikipedia.org/wiki/IPad]]...11 Years Ago (Picture) http://ff.im/-nZPea
the freedom to do things without other people watching you or knowing what you are doing, also see [[lack of privacy]]
meaning explained on page 73
My attitude toward what other people do in privacy is kind of like Clinton's famous motto: Don't ask, don't tell.
when you are online, do not expect privacy
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
money that a person or organization makes from selling or winning something, or from organizing an event or activity
page 66 [[Gates|http://www.microsoft.com/presspass/exec/billg/?tab=biography]] is also a noted philanthropist who donated the proceeds of his successful books to non-profit educational organisations.
The proceeds will go to the school for refugee children.
I'll start a fundraising company too if I could keep 80% of the proceeds LOL
This noun is pronounced /proh-seeds/, with the accent on the first syllable.
a plan of activities for achieving something or for an event or a series of events
page 19 Did the people know much about Russia before the program?
So dieting can really be a negative health decision without thought given to choosing an effective dieting program
Family programs are the best ways for an entire family to learn about addiction to drugs and alcohol and how to cope with it in a healthy, productive manner.
//prohibit// means to officially stop something from being done, especially by making it illegal
page 11 I think school authorities should allow us to express ourselves to at least "some" degree and there should be a "dress code" i. e.a set of solid rules and regulations about what is allowed and what is prohibited to wear in a certain school.
The sale of alcohol to young people is prohibited by law.
Everything prohibited is desired
//Prohibited// is for signs. //Not allowed// is better in a conversation.
to tell someone that you will definitely do something
page 34 no example sentence
I promise that I will work really hard to stop worrying about what everyone else thinks.
i can't promise to fix all your problems, but i can promise you won't have to face them all alone
to support or encourage something
The word is found only in a listening exercise.
First Lady Michelle Obama will be in South Florida on Monday to promote healthy eating habits for children.
You just promoted his SPAM to all of your followers by doing that. He wins ;)
to keep someone or something safe from harm, injury, damage, or loss
page 40 One of the long-standing traditions is the belief that the mistletoe plant holds magic powers and protects against disease.
This warm jacket will help protect you against the cold.
Tea can protect against heart disease
n. a strong complaint or disagreement
v. to disagree strongly with something, often by making a formal statement or taking action in public
page 26 Punks opposed the values of the society and protested against its materialism.
The organization has made a formal protest against the nuclear testing.
Doctors and patients protested against plans to cut services at the hospital
feeling happy about your achievements, your possessions, or people who you are connected with
page 9 no example sentence
I want my whole family to be proud of me in anything I do, in any career I choose.
RT if ur proud of ur race
to give someone something that they want or need
page 123 It's impossible to provide everybody with books on-line.
The book signing provided him with an opportunity to meet one of his heroes.
Don't provide information, provide solutions.
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
to create a situation in which something unpleasant or dangerous could happen to you
page 12 For example, if you come to sit your final exam, you definitely should have a formal dress on: it is silly to put your future at risk over something really unimportant, like a pierced belly or red hair.
These measures will put many small businesses at risk.
it's for the innocent people she put at risk for being a drunken driver. I feel she needs to pay for that.
see also [[take risks]]
to pretend you are smiling happily
page 30 no example sentence
Do you put on a fake smile when deep down inside you are really angry?
time to put on a fake smile and go out into the world.
opposing authority or accepted ways of doing things
page 11 In many schools where students are not allowed to wear make-up or jewelery, or to have their own clothes or modern hairstyles, they end up looking the same, and some students get rebellious and have many rows with their parents or teachers.
Even as a child pop star Katy Perry was very rebellious and enjoyed going against her Christian pastor parents' will.
since everyone is sinning it's no longer rebellious to sin! Its rebellious not to sin!
a set of instructions for cooking or preparing a particular food
page 64 A budget is like a recipe that sooner or later will help you cook a delicious meal from the ingredients you have.
The recipe begins with a thick simple syrup.
Love it when I play in the kitchen, make up my own recipe & it ROCKS!!!
to make less of the quantity that you measure using a clock
page 127 The PC's main purpose in our lives was to reduce the time it took to get things done.
I wish the blogger would do more to reduce the time it takes for a page to load.
A tip to be a better online journalist: reduce the time you spend (ahem, waste...) online
to think of someone or something in a particular way
page 112 Regard as... (We don't understand how to use that.)
The nuclear reactors, which were regarded as dangerously out of date, were replaced.
If one does not understand a person, one regards him as a fool.
the reduction of pain or the effects of an illness
page 135 using the computer for relief from stress
Itโs a drug commonly prescribed for pain relief.
Aint no cure for insomnia. Only temporary relief.
to need something in order to continue living, existing, or operating
page 130 The students must be taught not to totally rely on computers.
More than 8 million Ethiopians rely on foreign food hand out.
now I rely on my phone to memorize them for me
//Rely//, [[trust]], [[depend|depend on]] share the meaning //to place or have faith or confidence in someone or something. Rely// implies complete confidence. //Trust// stresses confidence arising from belief that is often based on inconclusive evidence. //Depend// implies confidence in the help or support of another.
to continue to be in a particular situation or condition
page 123 Printed books will only remain in scientific libraries.
The economy remains fragile.
Made the Dean's list this semester. Going to work harder to remain on it till I graduate.
to help someone to remember something that they have to do
page 34 no example sentence
Remind Jenny to bring her laptop when she comes.
I need to hire an angry midget to follow me around and remind me that eating after 10 pm is a bad idea.
to get rid of someone or something, and to put a new person or thing in their place
page 123 They are going to replace printed books in future.
The plan is to replace state funding with private money.
Gotta replace one of my tail lights that fell off
to say, write, or do something as an answer
page 34 no example sentence
It took them a week to reply to my letter.
hey dude, have you replied to my request I asked you yesterday?
to speak or act officially for another person, group, or organization to express the views and opinions of a group of people
page 19 no example sentence
Benโs ambition is to represent Britain at the Olympics
a group that represents the interests of the workers in the steel industry
cold-blooded animal that gives birth to young animals as eggs
no sentence in the textbook
In some places around the world, reptiles are becoming a delicacy, but researchers say there are dangerous side effects that come with eating the animals.
this damn alligator I ate is running straight through me.. no more reptile for me
to save someone from a dangerous or unpleasant situation
page 114 When we rescued him, Billy was so weak that couldn't even lift his head.
The crew of the tanker were rescued just minutes before it sank in heavy seas.
The next great [[iPhone|http://simple.wikipedia.org/wiki/IPhone]] kids game is here! rescue the baby bear in [['Oh No! Hunters!'|http://itunes.apple.com/us/app/oh-no-hunters/id377806954?mt=8#iPhone4%20#iPad%201279590241]]
someone who risks loss or injury in the hope of gain or excitement
page 99 Personally I'm not a risk taker, so white water rafting or scuba diving are not for me.
A successful [[Forex|http://www.forex.com/uk/index.html]] trader is a risk taker in nature and is someone who is quite comfortable working with some uncertainties.
If you are a risk taker, try at least to avoid disasters.
someone worthy of imitation
page 35 It's not that I want to be a role model, because I'm not perfect.
He was a nuisance, an unproductive citizen, a bad role model for Prosper's children.
Do you have a role model? โ hmm ... well ... My 'automatic' response would be Jesus.
to please oneself by getting information about something that one has a strong feeling of wanting to find out about
page 99 I just had to satisfy my curiosity, so I opened the box.
Getting a small portion of each dish will satisfy your curiosity as well as control your appetite.
If our updates on [[Facebook|http://simple.wikipedia.org/wiki/Facebook]] aren't enough to satisfy your curiosity, follow us on [[Twitter|http://simple.wikipedia.org/wiki/Twitter]].
to regularly put money in a bank or invest it so that you can use it later
page 62 ...I have saved some money that will help me when I go to university...
Iโve managed to save almost $500 for my holiday.
Man, I really gotta save my money to buy me a new ipod.
<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>
<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>
to pull your nails along your skin, especially because you have an itch that makes you want to do this
page 30 no example sentence
Scratch my back for me, will you.
http://twitpic.com/2cyl4f - My newborn cousin, Fabien <3 he scratched his face so we put those lil gloves lol (;
''search'' means to try to find something or someone by looking carefully
There is no example sentence for //search for info// in the textbook. The phrase //for information// is mentioned on page 127.
Detectives have been brought in to help search for clues.
I've heard of an app whereby you take a photo of a place, your phone will recognise it and search for info about it.
safety from attack, harm, or damage
meaning explained on page 73
Small Twitter Security Hole Could Leave Your Profile Open To 3rd Party Changes
security Warning: you just publicly posted an email address for spammers to collect.
careful process of mating and producing young animals
page 107 Through protection and selective breeding, humans changed early domesticated forms into highly productive cattle.
Original goldfish are yellow, but selective breeding produces them in several colors.
White friend asked me why blk ppl r so athletic..I replied..selective breeding my friend
allowing someone to use or have something you own; using or enjoying something together with others, also see [[do a fair share]]
page 60 Sharing experience can help.
He would never share his toys with me.
sharing is [[caring]]
a temporary place to live for people who do not have their own homes, or for animals who have been treated in a cruel way
page 114 Your money will help the [[RSPCA|http://www.rspca.org.uk/in-action/aboutus]] build and run animal shelters where abandoned animals find safety.
[[The Cornelius Animal Shelter|http://www.corneliuspd.org/police/adoptable-animals]] has pets available for adoption.
I'm at [[Halimun shelter|http://foursquare.com/venue/2232219]] (Jakarta).
(British English) to behave in a way that makes someone who you are with feel embarrassed
page 75 He always shows me up in front of my mates.
He showed me up by snoring during the concert.
my roommate totally showed me up at my own party!
Americans would probably say //set up// or //put down//, like in //I can't believe she put him down like that. //
According to [[Wikipedia|http://en.wikipedia.org/wiki/American_English_and_British_English_differences#School]] and [[Lynneguist|http://separatedbyacommonlanguage.blogspot.com/2006/09/exam-was-sat.html]] one //sits exams// in British English, but one //takes exams// in American English. Some Americans would say //sit for an exam//, according to this [[discussion|http://forum.wordreference.com/showthread.php?t=1151722]].
Best of luck when u sit the exam!
I am about to sit for my first written exam in about 14 years.
behaving in a way that shows you think you are better than other people
page 66 no example sentence
Owners of [[Apple|http://www.google.com/finance?q=apple]]'s high-profile [[iPad|http://www.google.com/products?q=ipad&oe=utf-8&rls=org.mozilla:en-US:official&client=firefox-a&um=1&ie=UTF-8&ei=TxtaTPmDOIm6OJvW-L4P&sa=X&oi=mode_link&ct=mode&ved=0CBgQ_AU]] are likely to be rich and snobbish.
Actors seem snobbish when walk away from big roles & big money.
It is a rare word. Think of //elitist// or //uppity//.
a way to solve a problem or to deal with a bad situation
page 130 The way we find the solutions for our problems is becoming easier.
[[UN|http://www.un.org/en/]] leaders are working hard to find a peaceful solution to the conflict.
Id rather not say anything at all. Just trying to keep the peace. And it seems like this is the only solution
to find an answer or solution to a problem or question; to work out
page 132 solve problems
Did [[Apple|http://topics.nytimes.com/top/news/business/companies/apple_computer_inc/index.html]] solve its PR problem?
I have the same stupid problem, but forgot how to solve it...
to use money to pay for things
page 62 What do you think teenagers should spend pocket money on?
Weโre spending a lot more on food than we used to.
you love to spend money on me, now buy me a [[blackberry|http://www.google.com/products?q=blackberry&oe=utf-8&rls=org.mozilla:en-US:official&client=firefox-a&um=1&ie=UTF-8&ei=s8JYTOGMLIP20wSk3OHbCA&sa=X&oi=mode_link&ct=mode&ved=0CBMQ_AU]]
the ability to achieve something, love for life
page 106 They also found the source of aesthetic pleasure and spiritual strength in animal life about them.
Here is God's secret to spiritual strength: "Quietness and confidence shall be your strength."
There is spiritual strength that only God can give u
the people who work for a particular company, organization, or institution
page 78 I know all the staff in the homes.
It is a small hospital with a staff of just over a hundred.
he heard some teachers talking in the staff room
a variety of objects or things
page 75 She goes through all my stuff. //That was in the previous lesson.//
Whatโs all this stuff on my desk?
Get to work early because I have a ton of stuff to get done.
to have a particular illness or physical problem
page 134 Computer addiction is a disorder suffered by people who find virtual reality more attractive than everyday reality.
What should I do if I suffer from severe burn [[injury]]?
I think I suffer from insomnia... I tried listening to music but I just end up singing along :p
//To suffer from// is to have an affliction. //To suffer with// is to feel pain as a result of an affliction.
the fact or state of continuing to live or exist, especially in difficult conditions
page 40 Evergreens as symbols of survival are associated with this festival.
I and my father are going on what he calls a โRay Mear's camping and survival tripโ and will be catching fish for our food and making fires to cook them.
charles darwin based his "survival of the fittest" theory on chuck norris.
to continue to exist, especially in a difficult or dangerous situation; to manage to deal with something difficult or unpleasant
page 42 ...it is important to people that some traditions do survive...
Of all the museumโs paintings, only one survived the fire.
Stay positive, feel calm and survive with meditation
someone or something that represents a particular idea or quality
page 40 Can you name any Russian or your local festival and its symbol?
Many Catholics saw him as a symbol of hope.
I give you this ring as the pledge of my love and as the symbol of our unity.
//to take sth to extremes// means to do something much more than is usual or reasonable
page 25 The main problem seems to be that straight edge teenagers take their beliefs to different extremes.
they often took their beliefs to extremes and persecuted those who did not follow their lead
no twitter examples
This phrase is rare. We found only one sentence on Google Blogs and nothing on Twitter.
happen
page 50 The carnival has been in existence since 1966 and takes place on the last weekend in August.
The Olympics take place every four years.
what you plan and what takes place aint ever exactly been similar
to do something although you know that something unpleasant or dangerous could happen
page 99 To take risks for no purpose is not a very clever thing.
Don't take risks with extreme diets.
girls prompt young men to take risks
see also [[put at risk]]
a situation in which opposing aims, ideas, or influences cause problems
page 25 The tension between the two groups has led to violent incidents.
The years of his government are remembered for political tension and conflict.
The tension in the house here has reached boiling point.
to carefully consider whether what you are planning to do is a good idea
page 99 Think twice before you do something dangerous. We couldn't find an example for //...before doing something// in the textbook.
Iโd think twice before buying that car if I were you.
Teen shot dead for vandalizing car - http://bit.ly/aXNnP8 Good! maybe his buddies will think twice before vandalizing cars again
a sudden feeling of being very [[excited]] and pleased, also see [[excitement]]
page 99 I do sky diving for the thrill and excitement of this sport.
Today, Oliver's idea of a thrill is a roller coaster at [[Kings Island|http://www.visitkingsisland.com/public/park/rides/thrill_rides/index.cfm]].
I love nights like tonight; the strong gusts of wind, the clash of thunder, and the thrill of lightning!
//Thrill// implies an agreeable sensation even when the exciting cause is potentially distressing or painful.
to behave toward someone in a particular way
page 75 Although I'm nearly fifteen, my Mum and Dad treat me like a baby.
The sales person Al treated me like family.
Mr Robert Niwa treated me like a star
a gradual change or development that produces a particular result
The word is found only in a listening exercise.
Weโve seen a trend toward more violent movies this year.
im sure its gonna be a fashion trend. go anne! be a fashion trendsetter! if you wear it, ill wear it too!
a feeling of confidence in someone that shows you believe they are honest, fair, and reliable
meaning explained on page 73
Jen had confided her secret to Mark, but he betrayed her trust.
Pakistan, India seek to rebuild trust with talks
//Trust//, [[rely|rely on]], [[depend|depend on]] share the meaning //to place or have faith or confidence in someone or something. Rely// implies complete confidence. //Trust// stresses confidence arising from belief that is often based on inconclusive evidence. //Depend// implies confidence in the help or support of another.
wrong or harmful, especially by not reaching usual or accepted standards of behavior, morals, etc.
page 11 I believe that punk hair, rings in noses and dangerous heels are totally unacceptable at school, these things can distract other students from study and look really ridiculous in school environment.
This sort of behavior is totally unacceptable in a civilized society.
ur twitter bio is both hilarious & unacceptable!
not the same as anything or anyone else
see also http://nme09.tiddlyspace.com/#unique
page 41 He thinks that Britain is unique...
They have a totally unique approach to staff training.
Q: What is so unique about you? A: My DNA
We couldn't find the word in the textbook.
We couldn't find the word in the textbook.
a user-friendly system or piece of equipment is easy to use or understand
page 127 The [[Macintosh|http://www.apple.com/mac/]] is very user-friendly.
A user-friendly website will have simple navigation.
Give me the truth. Should I get a [[Mac|http://www.apple.com/mac/]] (laptop)? I need something user friendly & easily portable.
to use more of something than is necessary, or to use it in a way that does not produce the best results
page 62 ...some teenagers waste money to buy a lot of things they really don't need.
Why do you waste your money on lottery tickets?
i'd rather go without than waste money on an [[xbox|http://www.google.com/products?hl=en&client=firefox-a&rls=org.mozilla:en-US:official&q=xbox&um=1&ie=UTF-8&ei=z8RYTPTHK4PfONmVrfoI&sa=X&oi=product_result_group&ct=title&resnum=3&ved=0CEYQrQQwAg]] (also see [[do without sth]])
a measurement of how heavy a person or thing is
page 89 The usual weight of a baby at birth is just about three kilograms.
It was about 12 pounds in weight.
it will help you lose weight without dieting or working out
happening or existing all over the world
The word is found only in a listening exercise.
Our company has 1,500 employees worldwide.
thank u and no worries the MY WORLD Tour will be going worldwide and im excited to share all the craziness with you