<!--{{{-->
<link rel='alternate' type='application/rss+xml' title='RSS' href='index.xml' />
<!--}}}-->
Background: #fff
Foreground: #000
PrimaryPale: #8cf
PrimaryLight: #18f
PrimaryMid: #04b
PrimaryDark: #014
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
Error: #f88
/*{{{*/
body {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}

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

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

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

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

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

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

.wizard {background:[[ColorPalette::PrimaryPale]]; border:1px solid [[ColorPalette::PrimaryMid]];}
.wizard h1 {color:[[ColorPalette::PrimaryDark]]; border:none;}
.wizard h2 {color:[[ColorPalette::Foreground]]; border:none;}
.wizardStep {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];
	border:1px solid [[ColorPalette::PrimaryMid]];}
.wizardStep.wizardStepDone {background:[[ColorPalette::TertiaryLight]];}
.wizardFooter {background:[[ColorPalette::PrimaryPale]];}
.wizardFooter .status {background:[[ColorPalette::PrimaryDark]]; color:[[ColorPalette::Background]];}
.wizard .button {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::SecondaryLight]]; border: 1px solid;
	border-color:[[ColorPalette::SecondaryPale]] [[ColorPalette::SecondaryDark]] [[ColorPalette::SecondaryDark]] [[ColorPalette::SecondaryPale]];}
.wizard .button:hover {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::Background]];}
.wizard .button:active {color:[[ColorPalette::Background]]; background:[[ColorPalette::Foreground]]; border: 1px solid;
	border-color:[[ColorPalette::PrimaryDark]] [[ColorPalette::PrimaryPale]] [[ColorPalette::PrimaryPale]] [[ColorPalette::PrimaryDark]];}
	
.wizard .notChanged {background:transparent;}
.wizard .changedLocally {background:#80ff80;}
.wizard .changedServer {background:#8080ff;}
.wizard .changedBoth {background:#ff8080;}
.wizard .notFound {background:#ffff80;}
.wizard .putToServer {background:#ff80ff;}
.wizard .gotFromServer {background:#80ffff;}

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

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

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

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

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

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

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

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

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

.sparkline {background:[[ColorPalette::PrimaryPale]]; border:0;}
.sparktick {background:[[ColorPalette::PrimaryDark]];}

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

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

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

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

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

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

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

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

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

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

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

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

hr {height:1px;}

a {text-decoration:none;}

dt {font-weight:bold;}

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

.txtOptionInput {width:11em;}

#contentWrapper .chkOptionInput {border:0;}

.externalLink {text-decoration:underline;}

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

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

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

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

.header {position:relative;}
.header a:hover {background:transparent;}
.headerShadow {position:relative; padding:4.5em 0em 1em 1em; left:-1px; top:-1px;}
.headerForeground {position:absolute; padding:4.5em 0em 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:0em 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 .3em 0;}
#sidebarTabs .tabContents {width:15em; overflow:hidden;}

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

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

.tiddlerPopupButton {padding:0.2em 0.2em 0.2em 0.2em;}
.popupTiddler {position: absolute; z-index:300; padding:1em 1em 1em 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 0em;}
.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 0em 0em 0.5em;}
.tab {margin:0em 0em 0em 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 0em 14em;}

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

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

.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:0em 0.25em; padding:0em 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 0em; font-size:.9em;}
.editorFooter .button {padding-top:0px; padding-bottom:0px;}

.fieldsetFix {border:0; padding:0; margin:1px 0px 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 0.3em 0.5em;}
#backstageToolbar {position:relative;}
#backstageArea a {font-weight:bold; margin-left:0.5em; padding:0.3em 0.5em 0.3em 0.5em;}
#backstageButton {display:none; position:absolute; z-index:175; top:0em; right:0em;}
#backstageButton a {padding:0.1em 0.4em 0.1em 0.4em; margin:0.1em 0.1em 0.1em 0.1em;}
#backstage {position:relative; width:100%; z-index:50;}
#backstagePanel {display:none; z-index:100; position:absolute; width:90%; margin:0em 3em 0em 3em; padding:1em 1em 1em 1em;}
.backstagePanelFooter {padding-top:0.2em; float:right;}
.backstagePanelFooter a {padding:0.2em 0.4em 0.2em 0.4em;}
#backstageCloak {display:none; z-index:20; position:absolute; width:100%; height:100px;}

.whenBackstage {display:none;}
.backstageVisible .whenBackstage {display:block;}
/*}}}*/
/***
StyleSheet for use when a translation requires any css style changes.
This StyleSheet can be used directly by languages such as Chinese, Japanese and Korean which need larger font sizes.
***/
/*{{{*/
body {font-size:0.8em;}
#sidebarOptions {font-size:1.05em;}
#sidebarOptions a {font-style:normal;}
#sidebarOptions .sliderPanel {font-size:0.95em;}
.subtitle {font-size:0.8em;}
.viewer table.listView {font-size:0.95em;}
/*}}}*/
/*{{{*/
@media print {
#mainMenu, #sidebar, #messageArea, .toolbar, #backstageButton, #backstageArea {display: none ! important;}
#displayArea {margin: 1em 1em 0em 1em;}
/* Fixes a feature in Firefox 1.5.0.2 where print preview displays the noscript content */
noscript {display:none;}
}
/*}}}*/
<!--{{{-->
<div class='header' macro='gradient vert [[ColorPalette::PrimaryLight]] [[ColorPalette::PrimaryMid]]'>
<div class='headerShadow'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
<div class='headerForeground'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
</div>
<div id='mainMenu' refresh='content' tiddler='MainMenu'></div>
<div id='sidebar'>
<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>
<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>
</div>
<div id='displayArea'>
<div id='messageArea'></div>
<div id='tiddlerDisplay'></div>
</div>
<!--}}}-->
<!--{{{-->
<div class='toolbar' macro='toolbar [[ToolbarCommands::ViewToolbar]]'></div>
<div class='title' macro='view title'></div>
<div class='subtitle'><span macro='view modifier link'></span>, <span macro='view modified date'></span> (<span macro='message views.wikified.createdPrompt'></span> <span macro='view created date'></span>)</div>
<div class='tagging' macro='tagging'></div>
<div class='tagged' macro='tags'></div>
<div class='viewer' macro='view text wikified'></div>
<div class='tagClear'></div>
<!--}}}-->
<!--{{{-->
<div class='toolbar' macro='toolbar [[ToolbarCommands::EditToolbar]]'></div>
<div class='title' macro='view title'></div>
<div class='editor' macro='edit title'></div>
<div macro='annotations'></div>
<div class='editor' macro='edit text'></div>
<div class='editor' macro='edit tags'></div><div class='editorFooter'><span macro='message views.editor.tagPrompt'></span><span macro='tagChooser'></span></div>
<!--}}}-->
To get started with this blank TiddlyWiki, you'll need to modify the following tiddlers:
* SiteTitle & SiteSubtitle: The title and subtitle of the site, as shown above (after saving, they will also appear in the browser title bar)
* MainMenu: The menu (usually on the left)
* DefaultTiddlers: Contains the names of the tiddlers that you want to appear when the TiddlyWiki is opened
You'll also need to enter your username for signing your edits: <<option txtUserName>>
These InterfaceOptions for customising TiddlyWiki are saved in your browser

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

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

----
Also see AdvancedOptions
<<importTiddlers>>
http://ru.wikipedia.org/wiki/Сульфат_магния_(лекарство)

При приеме внутрь оказывает желчегонное (рефлекторное действие на рецепторы слизистой оболочки 12-перстной кишки) и слабительное действие (в связи с плохой всасываемостью препарата в кишечнике в нём создается высокое осмотическое давление, происходит накопление воды в кишечнике, содержимое кишечника разжижается, перистальтика усиливается). Является антидотом при отравлениях солями тяжелых металлов. Начало эффекта - через 0.5-3 ч, продолжительность - 4-6 ч.
В новой версии необходимо:
- Избавится от всего лишнего - типа импорта пакетов из других репозитариев
- Упростить класс Repository:
- - выкинуть функцию check вместо неё, при добавлении или изменении пакета автоматически добавлять или изменять информацию об этом пакете в соответствующем Packages файле.
- Объединить классы Package и SourcePackage - так, чтобы не было разницы в работе с ними:
- - список файлов которые необходимо скопировать
- - тип пакета, который просто бы подставлялся в путь при добавлении его в репозитарий
- - путь данного пакета в pool
Background: #fff
Foreground: #000
PrimaryPale: #8cf
PrimaryLight: #cf0000
PrimaryMid: #04b
PrimaryDark: #014
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
Error: #f88
[[Главная]]
[[О себе]]
[[TranslatedGettingStarted]]
2008-12-28 02:51:49
Нахожусь в ставшем уже родным Debian. Просто зверски надоели его тормоза, отказывающиеся работать драйвера на видео, вдруг появившиеся глюки со звуком, да и вообще давно хотелось что-то поменять. собрать к примеру lfs для более полного понимания сущности Linux. Плюс ко всему прочитал на хабре небольшой обзорный топик про Sabayon 4...

Короче говоря, вооружившись браузером я открыл страницу gentoo.ru а оттуда уже попал на http://www.gentoo.org/doc/ru/handbook/handbook-x86.xml?style=printable&full=1. Что дальше - буду рассказывать по мере изучения (если не надоест =))

2008-12-28 03:02:35
Потихоньку собираю в один флкон источники информации. которые могут пригодиться.... Handbook 9 кеглем обещает распечататься аж на 88 страницах, ужос!
Что мы имеем в самом начале:
1) handbook, ссылка на которую есть выше
2) Сайт gentoo.ru
3) Раздел http://www.gentoo.org/doc/ru/
4) IRC каналы #gentoo, #gentoo-* и gentoo-ru на irc.freenode.ru

2008-12-28 03:19:55
Принято очередное решение - для начала полностью собрать систему на виртуальной машине, чтоб иметь доступ к документации в случае чего...
А также - использовать для сборки install-x86-minimal-2008.0. чтобы понять всю прелесть самостоятельной сборки дистрибутива, ибо как сказано в хэндбуке "Минимальный установочный диск Gentoo, маленький загрузочный компакт-диск без излишеств, единственное назначение которого — загрузить систему, подготовить подключение к сети и перейти к установке Gentoo.".

2008-12-28 03:35:00
Итак, первый практический шаг - скачиваем торренты:
1) http://torrents.gentoo.org/torrents/install-x86-minimal-2008.0.torrent - минимальный установочный дистрибутив.
2) http://torrents.gentoo.org/torrents/stage3-i686-2008.0.torrent - в качестве основного stage файла.

2008-12-28 03:55:51
Приходит понимание, что из торрента я буду качать всё это вечность =((
Удаляю из закачек, нахожу такое зеркало: http://mirror.yandex.ru/gentoo-distfiles/ и тяну след. файлы:
install-x86-minimal-2008.0.iso.CONTENTS
install-x86-minimal-2008.0.iso.DIGESTS
install-x86-minimal-2008.0.iso
stage3-i686-2008.0.tar.bz2.CONTENTS
stage3-i686-2008.0.tar.bz2.DIGESTS
stage3-i686-2008.0.tar.bz2

2008-12-28 04:00:08
Четыре утра, завтра предновогодний корпоратив - УЖОС пора спать УЖОС!

2008-12-28 12:56:58
Внезапно: День рождения Линуса! =))

2008-12-28 16:29:59
Докачал всё необходимое, пока нет времени заниматься установкой.

2008-12-29 11:02:39
Итак, некоторые технические характеристики машины...
CPU: Intel Celeron 2.4
RAM: 1024 Mb
Video: Nvidia GeForce 5200
Как я говорил. сначала будем ставить генту на виртуальную машину. а самая нормальная виртуальная машина, это естественно VirtualBox. У меня под рукой версия 2.1, места на виртуальном HDD вделено ~4 гб, а в качестве хост машины - Debian Lenny.

2008-12-29 20:54:44
Снова открыл handbook. Чуствую себя идиотом, а книгу - пособием для полнейших чайников, ибо абзац "Записав установочный компакт-диск, пора его загрузить. Уберите все компакт-диски из своих приводов CD, перезагрузите компьютер и войдите в BIOS. В зависимости от BIOS, для этого обычно нужно нажать DEL, F1 или ESC. В BIOS измените порядок загрузки так, чтобы обращение к CD-ROM выполнялось до обращения к жесткому диску. Этот параметр часто задается в разделе «CMOS Setup». Если порядок загрузки не изменить, система просто перезагрузится с жесткого диска, игнорируя CD-ROM. " - это уже слишком...

2008-12-29 21:15:17
Собственно загружаю minimal-cd на виртуальной машине, попутно читая различные полезные советы в хэндбуке. Самый важный на мой взгляд совет - сразу после загрузки. создать нового пользователя или поменять пароль пользователя root, сделать вход в другой консоли и открыть gentoo handbook:
useradd -m -G users kafik
passwd kafik
links /mnt/cdrom/docs/html/index.html - просмотреть книгу с диска. Видимо доступно только в полноценной версии.
links http://www.gentoo.org/doc/ru/handbook/handbook-x86.xml - просмотреть книгу из сети (в том случае если сеть работоспособна и настроена). Я попробовал второй вариант и остался доволен - сеть в виртуальной машине работала как надо. Кстати, если сеть уже настроена, то можно дополнительно запустить sshd и издеваться над машиной издалека.

2008-12-29 21:50:29
Удивляет то количество теоретической информации, доходчиво и разжёвано имеющейся в хэндбуке.

2008-12-29 23:05:08
Для начала разметим диск:
# fdisk /dev/hda
Сначала создадим первый раздел. Он будет и загрузочным и корневым.
 n - новый раздел
 p - первичный раздел
 1 - номер раздела
 enter
 +3200M - первы раздел будет у меня аж 3 гб
 p - увидим таблицу разделов и убедимся, что диск создан.
 a - назначение раздела загрузочным
 1 - указание нашего раздела
 p - опять таблица и в колонке boot видна звёздочка. то бишь раздел теперь помечен как загрузочный.
Теперь swap раздел
 n
 p
 2
 enter
 +100M
 t - указать тип ФС
 2 - выбрать раздел подкачки
 82 - указать тип раздела - swap (L - для вывода кодов всех поддерживаемых типов ФС)
 p - видим два раздела - корневой и подкачки
И наконец - раздел для home
 n
 p
 3
 enter
 enter - это подтвердит, что данный раздел займёт всё оставшееся свободное пространство.
 p - смотрим. всё ли так, как нам необходимо
 w - записываем все изменения на диск
Собственно с разбивкой разделов закончено. Запоминаю состояние машины и закрываю её =)

2008-12-30 13:28:00
Пришло время создать ФС на виртуальной машине =) Так как недавно вышло ядрышко с поддержкой ext4, то попробовать захотел я именно её. Попросив совета на #gentoo-ru я узнал, что достаточно создать на разделах фс ext3, а потом после компиляции ядра просто заменить в /etc/fstab её тип на ext4 что приведёт к автоматической конвертации и апгрейда ФС до новой версии. Вот только потом её уже не подмонтируешь как ext3.
Кстати насчёт новой ФС есть отличная статья, находящаяся по адресу http://www.ibm.com/developerworks/ru/library/l-ext4/index.html
Итак...
Создаём разделы:
 # mkfs.ext3 /dev/hda1
 # mkfs.ext3 /dev/hda3
Создаём раздел подкачки:
 # mkswap /dev/hda2
Подключим swap раздел к нашей live-cd системе:
 # swapon /dev/hda2

Следующий шаг - смонтировать все разделы...
 # mount /dev/hda1 /mnt/gentoo
 # mkdir /mnt/gentoo/home
 # mount /dev/hda2 /mnt/gentoo/home

2008-12-30 13:51:18
Приступил к установке базовых элементов системы. То есть того самого stage3 архива. Но для начала - нужно установить правильные дату и время:
 # date 123014002008

Теперь нужно заполучить сам файл в загруженной в virtualbox системе. В хэндбуке предлагалось два варианта 1 скачать её из интернета или использовать с диска. если это универсал-диск. У меня же диск минимал, а качать её в лом так как она уже лежит в хост системе. Так что я просто поднял на локальной машине веб-сервер и сделал из него доступным раздел /home:
 $ sudo apt-get install apache2
 $ sudo ln -s /home/ /var/www/kf-home/
И уже из виртуальной машины достучавшись собственно до своей хост машины скачал все три файла относящиеся в stage3:
 # cd /mnt/gentoo
 # wget 192.168.1.100/home/kafik/soft/system/gentoo/stage3-i686-2008.0.tar.bz2.DIGESTS
 # wget 192.168.1.100/home/kafik/soft/system/gentoo/stage3-i686-2008.0.tar.bz2.CONTENTS
 # wget 192.168.1.100/home/kafik/soft/system/gentoo/stage3-i686-2008.0.tar.bz2
 # ls
Кстати надо бы ещё докопаться до своего adsl модема, чё это он мне выдал адрес аж *.100...
Тут же можно проверить целостность скачанного архива и сопутствующих ему файлов:
 # md5sum -c ./stage3-i686-2008.0.tar.bz2.DIGESTS

2008-12-30 14:47:40
Распаковал архив:
 # tar xvjpf ./stage3-i686-2008.0.tar.bz2

Теперь как оказалось, надо скачать дерево портежей дженты. В хэндбуке конечно же советуют загружать его сразу в виртуальную машину, но мну решил таки скачать его файлы на локальную машину и потом уже использовать их утянув по http.
Так что зайдя на яндексовом зеркале в каталог snapshots/ я забрал оттуда три фйла:
 portage-latest.tar.bz2.gpgsig
 portage-latest.tar.bz2.md5sum
 portage-latest.tar.bz2
и положил вместе с остальным дженту-стафом... А пока оно качается - ушёл читать хабр =)

2008-12-30 15:23:42
Посмотрел, чего там мне нараспаковалось из stage3. Мдя... Ынтересный у них бутстрап однако =) Ну да ладно, для начала я решил запомнить и даже записать, что немного позже как минимум нужно будет заменить стандартное содержимое fstab...
А тем временем, дерево портов уже почти докачалось (всего 33 Мб) и я слил его с хост машины в виртуальную, положив всё в тот же каталог - /mnt/gentoo/
И распаковал:
 tar xvjf /mnt/gentoo/portage-latest.tar.bz2 -C /mnt/gentoo/usr

2008-12-30 15:53:19
ВНЕЗАПНО: понадобилось зазеркалить http://kde42.debian.net/debian/ =(( Прости меня. гента, ты отходишь на второй план...

2008-12-30 17:40:43
Следующий этап - настройка параметров сборки. То есть просто редактировать /mnt/gentoo/etc/make.conf
Выбираем зеркало (откуда брать все порты):
 # mirrorselect -i -o >>/mnt/gentoo/etc/make.conf
Выбираем rsync-сервер (для обновления коллекции ebuild-файлов):
 # mirrorselect -i -r -o >> /mnt/gentoo/etc/make.conf
Теперь проверим ещё раз make.conf и пойдём дальше...

А дальше нам осталось только скопировать информацию о DNS серверах в подготавливаемую нами chroot систему.
 # cp -L /etc/resolv.conf /mnt/gentoo/etc/resolv.conf

Последний шаг перед выполнением chroot - монтирование proc и dev:
 # mount -t proc none /mnt/gentoo/proc
 # mount -o bind /dev /mnt/gentoo/dev

2008-12-30 18:16:03
Ну и наконец меняем корень на /mnt/gentoo. По описанию из handbook правильно будет это сделать так:
 # chroot /mnt/gentoo /bin/bash
 # env-update
 # source /etc/profile
 # export PS1="(chroot) $PS1"

Собственно говоря, после этого шага мы уже находимся внутри нашей собственной Gento установленной на нашем HDD. На нашем виртуальном HDD.

Первое действие в новой среде - синхронизация дерева Portage(аха, вдруг оно у меня устарело за два часа):
 # emerge -- sync

Теперь можно указать свои собственные USE флаги и выбрать необходимый профиль. Меня устраивают значения по умолчанию, поэтому ничего менять я не стал...

Теперь настроим региональные параметры:
 # cat "en_US.UTF-8 UTF-8" >>/etc/locale.gen
 # cat "ru_RU.UTF-8 UTF-8" >>/etc/locale.gen
 # locale-gen
Жаль только, что "Настройки, подобной приведенной, для поддержки русского языка недостаточно. За дополнительными сведениями обращайтесь к отдельным руководствам по русификации Gentoo. — прим. пер." =))

2008-12-30 22:02:11
Дале... дале... дале...
А дале как оказалось надо бы сделать так:
 # cp /usr/share/zoneinfo/Asia/Almaty /etc/localtime

То есть выставить моё локальное время. А вот тут уже немножко непонятно... С одной стороны вроде как emerge скачивает, компилит и ставит всё и вся. но тем не менее, следующий шаг установки должен выглядеть так:
 # USE="-doc symlink" emerge gentoo-sources
Эт значит, что не будут на данном этапе установлены связанные с ядром пакеты (-doc) а также будет создана нормальная ссылка /usr/src/linux указывающая на правильный каталог с исходниками ядра. Параметр нужен при первой установке ОС на ПК.

2008-12-30 22:25:53
Тьфу блин. Как оказалось сеть в чруте у меня не работает. Что хреново. А ещё я внезапно перезагрузил виртуальную машину, что совсем хреново. Надо снова будет проходить этап вхождения в новую среду =(

2008-12-30 22:38:26
Хм.. сделал снова чрут сеть заработала... я админ? Кстати, в чруте (то есть в stage3) отсутствуют даже консольные браузеры, что плохо...

2008-12-30 23:33:22
Оно хотело заставить меня установить ядро  2.6.27. Мне это не нужно! Размаскируем пакет ядра с версией 2.6.28 =) От так:
 # mkdir -p /etc/portage
 # echo "sys-kernel/gentoo-sources" >> /etc/portage/package.keywords
Кстати по теме - нашёл ещё один источник информации. Правда он сильно смахивает на стандартный дженту-фак. ну да ладно http://linuxforum.ru/index.php?showtopic=30352

Ну и теперь снова и со спокойной совестью выполняем
 # USE="-doc symlink" emerge gentoo-sources
и ждём. пкоа скачаются и установятся исходники ядрышка... =)

2008-12-31 22:41:38
Раз уж появилась пара свободных минут, то я решил по быстрому сконфигурировать скачанные и установленные исходники ядра. Чтобы оно компилировалось, в момент наступления НГ =)
 # make menuconfig 
 # make && make modules_install

Кстати, настроить ядро в генте можно двумя способами - вручную и с помощью скрипта genkernel. Данный скрипт создаст ядро. которое по своей настройке будет идентично ядру на live-cd  системе, т оест ьпри каждой загрузке будет подгружаться кууча всякой всячины для проверки устройств...

2009-01-01 03:20:16

Коли этот бред кто-то (возможно) будет в будущем читать, то заранее поздравляю читателя с новым годом и с моим днём рожденья! А пока я не напился, спешу сообщить, шо компиляйшын оф йадро не прошло, ибо "disk is full, насяльника". Так что дальше видимо нужно будет либо переносить установку на отдельный раздел в хост машине либо... либо... =) Посмотрим... Через пару деньков... или скорее тройку.

2009-01-03 23:51:04

Всё собираюсь. собираюсь.... Но как же мне лень перезагрузить машину и немного переразметить, отрезав от корневого раздела 7 Гб...
/***
|''Name:''|LoadRemoteFileThroughProxy (previous LoadRemoteFileHijack)|
|''Description:''|When the TiddlyWiki file is located on the web (view over http) the content of [[SiteProxy]] tiddler is added in front of the file url. If [[SiteProxy]] does not exist "/proxy/" is added. |
|''Version:''|1.1.0|
|''Date:''|mar 17, 2007|
|''Source:''|http://tiddlywiki.bidix.info/#LoadRemoteFileHijack|
|''Author:''|BidiX (BidiX (at) bidix (dot) info)|
|''License:''|[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D ]]|
|''~CoreVersion:''|2.2.0|
***/
//{{{
version.extensions.LoadRemoteFileThroughProxy = {
 major: 1, minor: 1, revision: 0, 
 date: new Date("mar 17, 2007"), 
 source: "http://tiddlywiki.bidix.info/#LoadRemoteFileThroughProxy"};

if (!window.bidix) window.bidix = {}; // bidix namespace
if (!bidix.core) bidix.core = {};

bidix.core.loadRemoteFile = loadRemoteFile;
loadRemoteFile = function(url,callback,params)
{
 if ((document.location.toString().substr(0,4) == "http") && (url.substr(0,4) == "http")){ 
 url = store.getTiddlerText("SiteProxy", "/proxy/") + url;
 }
 return bidix.core.loadRemoteFile(url,callback,params);
}
//}}}
[[О себе]]
[[TiddlyWiki или своя маленькая википедия...]]
[[Разработка Debian]]
[[Gentoo]]
[[APTGod]]
----
~~[[Настроить меню|MainMenu]]~~
~~Версия <<version>>~~
----
[[Плагины]]
[[Ссылки]]
----
<<tagCloud>>
Введите текст для 'New Tiddler'
/***
|''Name:''|PasswordOptionPlugin|
|''Description:''|Extends TiddlyWiki options with non encrypted password option.|
|''Version:''|1.0.2|
|''Date:''|Apr 19, 2007|
|''Source:''|http://tiddlywiki.bidix.info/#PasswordOptionPlugin|
|''Author:''|BidiX (BidiX (at) bidix (dot) info)|
|''License:''|[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D ]]|
|''~CoreVersion:''|2.2.0 (Beta 5)|
***/
//{{{
version.extensions.PasswordOptionPlugin = {
	major: 1, minor: 0, revision: 2, 
	date: new Date("Apr 19, 2007"),
	source: 'http://tiddlywiki.bidix.info/#PasswordOptionPlugin',
	author: 'BidiX (BidiX (at) bidix (dot) info',
	license: '[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D]]',
	coreVersion: '2.2.0 (Beta 5)'
};

config.macros.option.passwordCheckboxLabel = "Save this password on this computer";
config.macros.option.passwordInputType = "password"; // password | text
setStylesheet(".pasOptionInput {width: 11em;}\n","passwordInputTypeStyle");

merge(config.macros.option.types, {
	'pas': {
		elementType: "input",
		valueField: "value",
		eventName: "onkeyup",
		className: "pasOptionInput",
		typeValue: config.macros.option.passwordInputType,
		create: function(place,type,opt,className,desc) {
			// password field
			config.macros.option.genericCreate(place,'pas',opt,className,desc);
			// checkbox linked with this password "save this password on this computer"
			config.macros.option.genericCreate(place,'chk','chk'+opt,className,desc);			
			// text savePasswordCheckboxLabel
			place.appendChild(document.createTextNode(config.macros.option.passwordCheckboxLabel));
		},
		onChange: config.macros.option.genericOnChange
	}
});

merge(config.optionHandlers['chk'], {
	get: function(name) {
		// is there an option linked with this chk ?
		var opt = name.substr(3);
		if (config.options[opt]) 
			saveOptionCookie(opt);
		return config.options[name] ? "true" : "false";
	}
});

merge(config.optionHandlers, {
	'pas': {
 		get: function(name) {
			if (config.options["chk"+name]) {
				return encodeCookie(config.options[name].toString());
			} else {
				return "";
			}
		},
		set: function(name,value) {config.options[name] = decodeCookie(value);}
	}
});

// need to reload options to load passwordOptions
loadOptionsCookie();

/*
if (!config.options['pasPassword'])
	config.options['pasPassword'] = '';

merge(config.optionsDesc,{
		pasPassword: "Test password"
	});
*/
//}}}
http://symmetrica.net/qt4/ - Программирование в Qt 4.Graphics View Framework !!!!!!!!!!
<<search>><<closeAll>><<permaview>><<newTiddler>><<newJournal "DD MMM YYYY" "журнал">><<saveChanges>><<slider chkSliderOptionsPanel OptionsPanel "опции »" "Изменить расширенные опции TiddlyWiki">><<upload http://kafik.tiddlyspot.com/store.cgi index.html . .  kafik>><html><a href='http://kafik.tiddlyspot.com/download' class='button'>download</a></html>
Ах эти ночи, карие очи, сладкая тайна первой любви...
Заметки KAFEGа
http://kafik.tiddlyspot.com/
/*{{{*/
#sidebarOptions .sliderPanel a {display:block; padding : 0.2em 0}
#sidebarOptions .sliderPanel .sliderPanel a {display:inline}
#sidebarOptions .button {margin:0em 0.2em;padding:0.2em 0.3em}
#tiddlersBar .tab {-moz-border-radius : 0.4em 0.4em 0 0}
.tiddler {-moz-border-radius : 0.4em; padding-bottom : 1em}
.popup {padding:0.4em;}
#nestedpopup {background:[[ColorPalette::TertiaryPale]]; color:[[ColorPalette::TertiaryDark]]; border-left:1px solid [[ColorPalette::TertiaryMid]]; border-top:1px solid [[ColorPalette::TertiaryMid]]; border-right:2px solid [[ColorPalette::TertiaryDark]]; border-bottom:2px solid [[ColorPalette::TertiaryDark]];}
.popup a, .popup a:visited {color:[[ColorPalette::Foreground]]; border: none;}
.popup a:hover {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; border: none;}
.popup a:active {background:[[ColorPalette::SecondaryPale]]; color:[[ColorPalette::Foreground]]; border: 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 0em 1em 1em; left:-1px; top:-1px;}
.headerForeground {position:absolute; padding:4.5em 0em 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:18em; font-size:.9em;}
#sidebarOptions {padding-top:0.3em;}
#sidebarOptions a {margin:0em 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 .3em 0;}
#sidebarTabs .tabContents {width:17em; overflow:hidden;}

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

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

.tiddlerPopupButton {padding:0.2em 0.2em 0.2em 0.2em;}
.popupTiddler {position: absolute; z-index:300; padding:1em 1em 1em 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 0em;}
.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 0em 0em 0.5em;}
.tab {margin:0em 0em 0em 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 0em 14em;}

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

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

.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:0em 0.25em; padding:0em 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 0em; font-size:.9em;}
.editorFooter .button {padding-top:0px; padding-bottom:0px;}

.fieldsetFix {border:0; padding:0; margin:1px 0px 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 0.3em 0.5em;}
#backstageToolbar {position:relative;}
#backstageArea a {font-weight:bold; margin-left:0.5em; padding:0.3em 0.5em 0.3em 0.5em;}
#backstageButton {display:none; position:absolute; z-index:175; top:0em; right:0em;}
#backstageButton a {padding:0.1em 0.4em 0.1em 0.4em; margin:0.1em 0.1em 0.1em 0.1em;}
#backstage {position:relative; width:100%; z-index:50;}
#backstagePanel {display:none; z-index:100; position:absolute; width:90%; margin:0em 3em 0em 3em; padding:1em 1em 1em 1em;}
.backstagePanelFooter {padding-top:0.2em; float:right;}
.backstagePanelFooter a {padding:0.2em 0.4em 0.2em 0.4em;}
#backstageCloak {display:none; z-index:20; position:absolute; width:100%; height:100px;}

.whenBackstage {display:none;}
.backstageVisible .whenBackstage {display:block;}
/*}}}*/
/***
|''Name:''|SyncFromSourcePlugin|
|''Description:''|Synchronizes plugins from their original source (issued from plugin info) instead of imported url. So, plugins can be imported from any existing tiddlywiki and still be synchronized with their original source.|
|''Version:''|1.0.0|
|''Date:''|Dec 21,2007|
|''Source:''|http://visualtw.ouvaton.org/VisualTW.html|
|''Author:''|Pascal Collin|
|''License:''|[[BSD open source license|License]]|
|''~CoreVersion:''|2.2.0|
|''Browser:''|Firefox 1.5; InternetExplorer 6.0|
!Usage
#import the plugin, save and reload.
#a new column (source) is available in ''sync task'' from the ''backstage button''. If the plugin's source mismatches the plugin server.host (the place from which is was last imported), the source value is displayed.
#a new button is also available : ''reset source''. Click on this button applies plugin's ''source'' as server.host for the checked lines.
Look at this [[example|SyncFromSourceDemo]] on plugin [[homepage|http://visualtw.ouvaton.org/VisualTW.html]].
!Patch required for TiddlyWiki 2.3.0
A bug in TW2.3.0 requires [[SyncPatch]].
!Code
***/
//{{{
config.macros.sync.getSyncableTiddlersWithoutSource = config.macros.sync.getSyncableTiddlersWithoutSource ? config.macros.sync.getSyncableTiddlersWithoutSource : config.macros.sync.getSyncableTiddlers;

config.macros.sync.startSyncWithoutSource = config.macros.sync.startSyncWithoutSource ? config.macros.sync.startSyncWithoutSource : config.macros.sync.startSync;

config.macros.sync.getSyncableTiddlers = function(){
	var syncs = config.macros.sync.getSyncableTiddlersWithoutSource();
	for(var cpt=0;cpt<syncs.length;cpt++){
		var s= getPluginInfo(syncs[cpt].tiddler).Source;
		if (s) {
			var source = FileAdaptor.minHostName(s);
			source = source.replace(/#[^#]*$/,"").replace(/\/*$/,"");
			syncs[cpt].source = (source==syncs[cpt].tiddler.fields["server.host"]) ? "": source;
		}
		else syncs[cpt].source = "";
	}
	return syncs;
}

config.macros.sync.startSync = function(place) {
	config.macros.sync.startSyncWithoutSource(place);
	var w = new Wizard(place.getElementsByTagName("form")[0]);
	w.setButtons([
			{caption: this.syncLabel, tooltip: this.syncPrompt, onClick: this.doSync},
			{caption: this.syncSourceLabel, tooltip: this.syncSourcePrompt, onClick: this.doSyncSource}
		]);
}

merge(config.macros.sync,{
	syncSourceLabel : "reset source",
	syncSourcePrompt : "reset synchronization to plugin source, if available"
})

config.macros.sync.doSyncSource = function(e)
{
	var rowNames = ListView.getSelectedRows(currSync.listView);
	for(var t=0; t<currSync.syncList.length; t++) {
		var si = currSync.syncList[t];
		if((rowNames.indexOf(si.title) != -1)&&si.source) {
			si.tiddler.fields["server.host"]=si.source;
			si.tiddler.fields["server.type"]="file";
			store.setDirty(true);
		}
	}
	backstage.switchTab(null);
	return false;
};

config.macros.sync.listViewTemplate.columns.push({name: 'Source', field: 'source', title: "Source", type: 'Link'});

//}}}
/***
|Name|TagCloudPlugin|
|Source|http://www.TiddlyTools.com/#TagCloudPlugin|
|Version|1.4.2|
|Author|Eric Shulman|
|Original Author|Clint Checketts|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides||
|Description|present a 'cloud' of tags using proportional font display|
!Usage
<<<
show all tags in the document:
{{{
<<tagCloud>>
<<tagCloud limit:N>>
}}}
show all tags except those listed as parameters
{{{
<<tagCloud tag tag tag...>>
<<tagCloud limit:N tag tag tag...>>
}}}
show all tags listed within {{{TiddlerName}}} (using a space-separated, bracketed list)
{{{
<<tagCloud +TiddlerName>>
<<tagCloud limit:N +TiddlerName>>
}}}
show only tags that are themselves tagged with the indicated tag value (i.e., ~TagglyTagging usage)
{{{
<<tagCloud =tagvalue>>
<<tagCloud limit:N =tagvalue>>
}}}
For all uses, you can specify an //optional// ''limit:...'' parameter to restrict the tag display to only show the top N most popular tags.
<<<
!Examples
<<<
{{{<<tagCloud>>}}} - //show all tags//
<<tagCloud>>
----
{{{<<tagCloud limit:10>>}}} - //show top 10 tags//
<<tagCloud limit:10>>
----
{{{<<tagCloud +FavoriteTags>>}}} - //show tags listed in// [[FavoriteTags]]
<<tagCloud +FavoriteTags>>
----
{{{<<tagCloud =package>>}}} - //show tags tagged with 'package'//
<<tagCloud =package>>
<<<
!Revisions
<<<
2008.12.16 [1.4.2] ELS: corrected group calculation to prevent 'group=0' error
2008.12.16 [1.4.1] ELS: revised tag filtering so excluded tags don't affect calculations
2008.12.15 [1.4.0] ELS: added {{{limit:...}}} parameter to restrict the number of tags displayed to the top N most popular
2008.11.15 [1.3.0] ELS: added {{{+TiddlerName}}} parameter to include only tags that are listed in the indicated tiddler
2008.09.05 [1.2.0] ELS: added '=tagname' parameter to include only tags that are themselves tagged with the specified value (i.e., ~TagglyTagging usage)
2008.07.03 [1.1.0] ELS: added 'segments' property to macro object.  Extensive code cleanup
<<<
!Code
***/
//{{{
version.extensions.TagCloudPlugin= {major: 1, minor: 4 , revision: 2, date: new Date(2008,12,16)};
//Originally created by Clint Checketts, contributions by Jonny Leroy and Eric Shulman
//Currently maintained and enhanced by Eric Shulman

config.shadowTiddlers.TagCloud="<<tagCloud>>";

setStylesheet("\
	.tagCloud span{height: 3.5em;margin: 3px;}\
	.tagCloud1{font-size: 80%;}\
	.tagCloud2{font-size: 100%;}\
	.tagCloud3{font-size: 120%;}\
	.tagCloud4{font-size: 150%;}\
	.tagCloud5{font-size: 180%;}\
	.tagCloud6{font-size: 200%;}\
	",
	"tagCloudsStyles");

config.macros.tagCloud = {
	noTags: "No tag cloud created because there are no tags.",
	tooltip: "%1 tiddlers tagged with '%0'",
	groups: 6,
	handler: function(place,macroName,params) {

		var inc=[]; var ex=[]; var limit=0;
		if (params[0]&&params[0].substr(0,6).toLowerCase()=='limit:')
			limit=parseInt(params.shift().substr(6));
		if (params.length) {
			if (params[0].substr(0,1)=="+") { // get tag list from tiddler
				var inc=store.getTiddlerText(params[0].substr(1),'').readBracketedList();
			} else if (params[0].substr(0,1)=="=") { // get tag list using tagged tags
				var tagged=store.getTaggedTiddlers(params[0].substr(1));
				for (var t=0; t<tagged.length; t++) inc.push(tagged[t].title);
			} else ex=params; // exclude params
		}

		// get all tags, sorted by frequency of use (descending)
		// then include/exclude specific tags and limit length (optional)
		var allTags=store.getTags();
		allTags=allTags.sort(function(a,b){return(a[1]==b[1])?0:(a[1]>b[1]?-1:1);});
		var tags=[]; for (var t=0; t<allTags.length; t++) {
			if ((!inc.length||inc.contains(allTags[t][0]))&&(!ex.length||!ex.contains(allTags[t][0])))
				tags.push(allTags[t]);
			if (limit && tags.length==limit) break;
		}

		// find most frequently used tag and calculate tagCloud segment sizes
		var mostTags=tags[0][1]; var leastTags=tags[tags.length-1][1];
		var groupSize=(mostTags-leastTags+1)/config.macros.tagCloud.groups;

		// alpha sort for display
		tags=tags.sort(function(a,b){return(a[0]==b[0])?0:(a[0]>b[0]?1:-1);});

		// render the cloud
		var tagCloudWrapper = createTiddlyElement(place,"div",null,"tagCloud",null);
		if(!tags.length) createTiddlyElement(tagCloudWrapper,"span",null,null,this.noTags);
		else for (var t=0; t<tags.length; t++) if (tags[t][0].length > 0){
			tagCloudWrapper.appendChild(document.createTextNode(" "));
			var group=Math.ceil((tags[t][1]-leastTags)/groupSize)||1;
			var theTag = createTiddlyButton(tagCloudWrapper,tags[t][0],
				this.tooltip.format(tags[t]),onClickTag,"tagCloudtag tagCloud"+group);
			theTag.setAttribute("tag",tags[t][0]);
		}
	}
};
//}}}
/***
|''Name:''|TiddlersBarPlugin|
|''Description:''|A bar to switch between tiddlers through tabs (like browser tabs bar).|
|''Version:''|1.2.5|
|''Date:''|Jan 18,2008|
|''Source:''|http://visualtw.ouvaton.org/VisualTW.html|
|''Author:''|Pascal Collin|
|''License:''|[[BSD open source license|License]]|
|''~CoreVersion:''|2.1.0|
|''Browser:''|Firefox 2.0; InternetExplorer 6.0, others|
!Demos
On [[homepage|http://visualtw.ouvaton.org/VisualTW.html]], open several tiddlers to use the tabs bar.
!Installation
#import this tiddler from [[homepage|http://visualtw.ouvaton.org/VisualTW.html]] (tagged as systemConfig)
#save and reload
#''if you're using a custom [[PageTemplate]]'', add {{{<div id='tiddlersBar' refresh='none' ondblclick='config.macros.tiddlersBar.onTiddlersBarAction(event)'></div>}}} before {{{<div id='tiddlerDisplay'></div>}}}
#optionally, adjust StyleSheetTiddlersBar
!Tips
*Doubleclick on the tiddlers bar (where there is no tab) create a new tiddler.
*Tabs include a button to close {{{x}}} or save {{{!}}} their tiddler.
*By default, click on the current tab close all others tiddlers.
!Configuration options 
<<option chkDisableTabsBar>> Disable the tabs bar (to print, by example).
<<option chkHideTabsBarWhenSingleTab >> Automatically hide the tabs bar when only one tiddler is displayed. 
<<option txtSelectedTiddlerTabButton>> ''selected'' tab command button.
<<option txtPreviousTabKey>> previous tab access key.
<<option txtNextTabKey>> next tab access key.
!Code
***/
//{{{
config.options.chkDisableTabsBar = config.options.chkDisableTabsBar ? config.options.chkDisableTabsBar : false;
config.options.chkHideTabsBarWhenSingleTab  = config.options.chkHideTabsBarWhenSingleTab  ? config.options.chkHideTabsBarWhenSingleTab  : false;
config.options.txtSelectedTiddlerTabButton = config.options.txtSelectedTiddlerTabButton ? config.options.txtSelectedTiddlerTabButton : "closeOthers";
config.options.txtPreviousTabKey = config.options.txtPreviousTabKey ? config.options.txtPreviousTabKey : "";
config.options.txtNextTabKey = config.options.txtNextTabKey ? config.options.txtNextTabKey : "";
config.macros.tiddlersBar = {
	tooltip : "see ",
	tooltipClose : "click here to close this tab",
	tooltipSave : "click here to save this tab",
	promptRename : "Enter tiddler new name",
	currentTiddler : "",
	previousState : false,
	previousKey : config.options.txtPreviousTabKey,
	nextKey : config.options.txtNextTabKey,	
	tabsAnimationSource : null, //use document.getElementById("tiddlerDisplay") if you need animation on tab switching.
	handler: function(place,macroName,params) {
		var previous = null;
		if (config.macros.tiddlersBar.isShown())
			story.forEachTiddler(function(title,e){
				if (title==config.macros.tiddlersBar.currentTiddler){
					var d = createTiddlyElement(null,"span",null,"tab tabSelected");
					config.macros.tiddlersBar.createActiveTabButton(d,title);
					if (previous && config.macros.tiddlersBar.previousKey) previous.setAttribute("accessKey",config.macros.tiddlersBar.nextKey);
					previous = "active";
				}
				else {
					var d = createTiddlyElement(place,"span",null,"tab tabUnselected");
					var btn = createTiddlyButton(d,title,config.macros.tiddlersBar.tooltip + title,config.macros.tiddlersBar.onSelectTab);
					btn.setAttribute("tiddler", title);
					if (previous=="active" && config.macros.tiddlersBar.nextKey) btn.setAttribute("accessKey",config.macros.tiddlersBar.previousKey);
					previous=btn;
				}
				var isDirty =story.isDirty(title);
				var c = createTiddlyButton(d,isDirty ?"!":"x",isDirty?config.macros.tiddlersBar.tooltipSave:config.macros.tiddlersBar.tooltipClose, isDirty ? config.macros.tiddlersBar.onTabSave : config.macros.tiddlersBar.onTabClose,"tabButton");
				c.setAttribute("tiddler", title);
				if (place.childNodes) {
					place.insertBefore(document.createTextNode(" "),place.firstChild); // to allow break line here when many tiddlers are open
					place.insertBefore(d,place.firstChild); 
				}
				else place.appendChild(d);
			})
	}, 
	refresh: function(place,params){
		removeChildren(place);
		config.macros.tiddlersBar.handler(place,"tiddlersBar",params);
		if (config.macros.tiddlersBar.previousState!=config.macros.tiddlersBar.isShown()) {
			story.refreshAllTiddlers();
			if (config.macros.tiddlersBar.previousState) story.forEachTiddler(function(t,e){e.style.display="";});
			config.macros.tiddlersBar.previousState = !config.macros.tiddlersBar.previousState;
		}
	},
	isShown : function(){
		if (config.options.chkDisableTabsBar) return false;
		if (!config.options.chkHideTabsBarWhenSingleTab) return true;
		var cpt=0;
		story.forEachTiddler(function(){cpt++});
		return (cpt>1);
	},
	selectNextTab : function(){  //used when the current tab is closed (to select another tab)
		var previous="";
		story.forEachTiddler(function(title){
			if (!config.macros.tiddlersBar.currentTiddler) {
				story.displayTiddler(null,title);
				return;
			}
			if (title==config.macros.tiddlersBar.currentTiddler) {
				if (previous) {
					story.displayTiddler(null,previous);
					return;
				}
				else config.macros.tiddlersBar.currentTiddler=""; 	// so next tab will be selected
			}
			else previous=title;
			});		
	},
	onSelectTab : function(e){
		var t = this.getAttribute("tiddler");
		if (t) story.displayTiddler(null,t);
		return false;
	},
	onTabClose : function(e){
		var t = this.getAttribute("tiddler");
		if (t) {
			if(story.hasChanges(t) && !readOnly) {
				if(!confirm(config.commands.cancelTiddler.warning.format([t])))
				return false;
			}
			story.closeTiddler(t);
		}
		return false;
	},
	onTabSave : function(e) {
		var t = this.getAttribute("tiddler");
		if (!e) e=window.event;
		if (t) config.commands.saveTiddler.handler(e,null,t);
		return false;
	},
	onSelectedTabButtonClick : function(event,src,title) {
		var t = this.getAttribute("tiddler");
		if (!event) event=window.event;
		if (t && config.options.txtSelectedTiddlerTabButton && config.commands[config.options.txtSelectedTiddlerTabButton])
			config.commands[config.options.txtSelectedTiddlerTabButton].handler(event, src, t);
		return false;
	},
	onTiddlersBarAction: function(event) {
		var source = event.target ? event.target.id : event.srcElement.id; // FF uses target and IE uses srcElement;
		if (source=="tiddlersBar") story.displayTiddler(null,'New Tiddler',DEFAULT_EDIT_TEMPLATE,false,null,null);
	},
	createActiveTabButton : function(place,title) {
		if (config.options.txtSelectedTiddlerTabButton && config.commands[config.options.txtSelectedTiddlerTabButton]) {
			var btn = createTiddlyButton(place, title, config.commands[config.options.txtSelectedTiddlerTabButton].tooltip ,config.macros.tiddlersBar.onSelectedTabButtonClick);
			btn.setAttribute("tiddler", title);
		}
		else
			createTiddlyText(place,title);
	}
}

story.coreCloseTiddler = story.coreCloseTiddler? story.coreCloseTiddler : story.closeTiddler;
story.coreDisplayTiddler = story.coreDisplayTiddler ? story.coreDisplayTiddler : story.displayTiddler;

story.closeTiddler = function(title,animate,unused) {
	if (title==config.macros.tiddlersBar.currentTiddler)
		config.macros.tiddlersBar.selectNextTab();
	story.coreCloseTiddler(title,false,unused); //disable animation to get it closed before calling tiddlersBar.refresh
	var e=document.getElementById("tiddlersBar");
	if (e) config.macros.tiddlersBar.refresh(e,null);
}

story.displayTiddler = function(srcElement,tiddler,template,animate,unused,customFields,toggle){
	story.coreDisplayTiddler(config.macros.tiddlersBar.tabsAnimationSource,tiddler,template,animate,unused,customFields,toggle);
	var title = (tiddler instanceof Tiddler)? tiddler.title : tiddler;  
	if (config.macros.tiddlersBar.isShown()) {
		story.forEachTiddler(function(t,e){
			if (t!=title) e.style.display="none";
			else e.style.display="";
		})
		config.macros.tiddlersBar.currentTiddler=title;
	}
	var e=document.getElementById("tiddlersBar");
	if (e) config.macros.tiddlersBar.refresh(e,null);
}

var coreRefreshPageTemplate = coreRefreshPageTemplate ? coreRefreshPageTemplate : refreshPageTemplate;
refreshPageTemplate = function(title) {
	coreRefreshPageTemplate(title);
	if (config.macros.tiddlersBar) config.macros.tiddlersBar.refresh(document.getElementById("tiddlersBar"));
}

ensureVisible=function (e) {return 0} //disable bottom scrolling (not useful now)

config.shadowTiddlers.StyleSheetTiddlersBar = "/*{{{*/\n";
config.shadowTiddlers.StyleSheetTiddlersBar += "#tiddlersBar .button {border:0}\n";
config.shadowTiddlers.StyleSheetTiddlersBar += "#tiddlersBar .tab {white-space:nowrap}\n";
config.shadowTiddlers.StyleSheetTiddlersBar += "#tiddlersBar {padding : 1em 0.5em 2px 0.5em}\n";
config.shadowTiddlers.StyleSheetTiddlersBar += ".tabUnselected .tabButton, .tabSelected .tabButton {padding : 0 2px 0 2px; margin: 0 0 0 4px;}\n";
config.shadowTiddlers.StyleSheetTiddlersBar += ".tiddler, .tabContents {border:1px [[ColorPalette::TertiaryPale]] solid;}\n";
config.shadowTiddlers.StyleSheetTiddlersBar +="/*}}}*/";
store.addNotification("StyleSheetTiddlersBar", refreshStyles);

config.refreshers.none = function(){return true;}
config.shadowTiddlers.PageTemplate=config.shadowTiddlers.PageTemplate.replace(/<div id='tiddlerDisplay'><\/div>/m,"<div id='tiddlersBar' refresh='none' ondblclick='config.macros.tiddlersBar.onTiddlersBarAction(event)'></div>\n<div id='tiddlerDisplay'></div>");

//}}}
Статья, которую я размещал на хабре как только сам увидел TiddlyWiki

"TiddlyWiki — вики-движок и вики-концепция, заключающаяся в том, что весь вики-сайт представляет собой одну HTML-страницу, интерактивность которой обеспечивается скриптами."

Так говорит про этот замечательный полёт мысли программистов настоящая википедия. А что же это на самом деле? Это то, о чём мечтают если не все, то многие - локальная, маленькая, компактная и транспортабельная вики-база знаний, не зависящая от WEB-сервера и серверных языков с возможностью синхронизации с далёким-далёким сервером. Лично для себя я открыл её буквально вчера, когда мне лень было копаться с веб-программированием и создавать сайт на Сети.

<habracut />

Для начала пробежимся по возможностям движка:

* Полный AJAX так сказать, точнее его клиентская часть - всё работает без единой перезагрузки
* Весь движок умещается в одном единственном HTML файле
* Можно создавать, редактировать и удалять любые записи с некоей вики-подобной разметкой, которые будут сохранятся всё в том же файле
* Поддержка плагинов
* Возможность автообновления основного кода движка
* Поиск по записям
* Назначение меток каждой записи
* Полностью настраиваемый интерфейс. за счёт пользовательских CSS и изменения стандартного HTML шаблона
* Возможность синхронизации с другими файлами и с файлами на сервере
* Импорт из других файлов и серверов
* ...

В общем умеет оно очень многое, но самое главное, что оно дотаточно удобно и пожалуй достойно внимания. Единственный недостаток, с которым я столкнулся - это отстутствие русского перевода. Впрочем эта проблема решается просто написанием соответсвующего плагина, что я и сделал - добавил свой немного корявый перевод, скачать который можно <a href="http://narod.ru/disk/4511434000/locale.ru.js.html">здесь</a>.

Теперь о том, как получить и как начать пользоваться TiddlyWiki. Для этого необходимо зайти на сайт http://www.tiddlywiki.com/ и скачать последнюю версию движка, сейчас это 2.4.1. В принципе - это всё - дальше остаётся только открыть сам файл, указать своё имя, сменить заголовки и начать добавлять свои записи. Но я советую поступить немного иначе. существует сайт http://tiddlyspot.com который является ни чем иным, как бесплатным хостингом для TiddlyWiki.

Зарегистрировавшись на данном сайте, вы получаете в своё распоряжение поддомен и готовую к использованию страничку TiddlyWiki. Остаётся только сохранить её на локальном диске, жмякнув по кнопке "download" справа и открыв сохранённую страничку в браузере ввести свой пароль на http://tiddlyspot.com (скрытая запись TspotOptions), установить по желанию сделанный мною перевод основной части движка (как устанавливать переводы и другие плагины описано <a href="http://trac.tiddlywiki.org/wiki/Translations">здесь</a>) и всё! Теперь после любых правок следут лишь жмякать по кнопке "upload" и радоваться =))

Дополнительную информацию можно получить по следующим адресам:

http://www.tiddlywiki.com/ - официальный сайт. Построен собтвенно на TiddlyWiki, можно глянуть её так сказать в деле...
http://ru.wikipedia.org/wiki/TiddlyWiki - малёхонькая обзорная статья в википедии.
http://www.tiddlywiki.org - Вики-сайт сообщества. Достаточно информации по системе как для пользователей. так и для разработчиков. В общем здесь есть всё что нужно.

PS: Не судите строго за перевод - учил английский по C++ и pascal =))
tiddlyspot password:
<<option pasUploadPassword>>
/***
Description: Contains the stuff you need to use Tiddlyspot
Note, you also need UploadPlugin, PasswordOptionPlugin and LoadRemoteFileThroughProxy
from http://tiddlywiki.bidix.info for a complete working Tiddlyspot site.
***/
//{{{

// edit this if you are migrating sites or retrofitting an existing TW
config.tiddlyspotSiteId = 'kafik';

// make it so you can by default see edit controls via http
config.options.chkHttpReadOnly = false;
window.readOnly = false; // make sure of it (for tw 2.2)
window.showBackstage = true; // show backstage too

// disable autosave in d3
if (window.location.protocol != "file:")
	config.options.chkGTDLazyAutoSave = false;

// tweak shadow tiddlers to add upload button, password entry box etc
with (config.shadowTiddlers) {
	SiteUrl = 'http://'+config.tiddlyspotSiteId+'.tiddlyspot.com';
	SideBarOptions = SideBarOptions.replace(/(<<saveChanges>>)/,"$1<<tiddler TspotSidebar>>");
	OptionsPanel = OptionsPanel.replace(/^/,"<<tiddler TspotOptions>>");
	DefaultTiddlers = DefaultTiddlers.replace(/^/,"[[WelcomeToTiddlyspot]] ");
	MainMenu = MainMenu.replace(/^/,"[[WelcomeToTiddlyspot]] ");
}

// create some shadow tiddler content
merge(config.shadowTiddlers,{

'WelcomeToTiddlyspot':[
 "This document is a ~TiddlyWiki from tiddlyspot.com.  A ~TiddlyWiki is an electronic notebook that is great for managing todo lists, personal information, and all sorts of things.",
 "",
 "@@font-weight:bold;font-size:1.3em;color:#444; //What now?// &nbsp;&nbsp;@@ Before you can save any changes, you need to enter your password in the form below.  Then configure privacy and other site settings at your [[control panel|http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/controlpanel]] (your control panel username is //" + config.tiddlyspotSiteId + "//).",
 "<<tiddler TspotControls>>",
 "See also GettingStarted.",
 "",
 "@@font-weight:bold;font-size:1.3em;color:#444; //Working online// &nbsp;&nbsp;@@ You can edit this ~TiddlyWiki right now, and save your changes using the \"save to web\" button in the column on the right.",
 "",
 "@@font-weight:bold;font-size:1.3em;color:#444; //Working offline// &nbsp;&nbsp;@@ A fully functioning copy of this ~TiddlyWiki can be saved onto your hard drive or USB stick.  You can make changes and save them locally without being connected to the Internet.  When you're ready to sync up again, just click \"upload\" and your ~TiddlyWiki will be saved back to tiddlyspot.com.",
 "",
 "@@font-weight:bold;font-size:1.3em;color:#444; //Help!// &nbsp;&nbsp;@@ Find out more about ~TiddlyWiki at [[TiddlyWiki.com|http://tiddlywiki.com]].  Also visit [[TiddlyWiki.org|http://tiddlywiki.org]] for documentation on learning and using ~TiddlyWiki. New users are especially welcome on the [[TiddlyWiki mailing list|http://groups.google.com/group/TiddlyWiki]], which is an excellent place to ask questions and get help.  If you have a tiddlyspot related problem email [[tiddlyspot support|mailto:support@tiddlyspot.com]].",
 "",
 "@@font-weight:bold;font-size:1.3em;color:#444; //Enjoy :)// &nbsp;&nbsp;@@ We hope you like using your tiddlyspot.com site.  Please email [[feedback@tiddlyspot.com|mailto:feedback@tiddlyspot.com]] with any comments or suggestions."
].join("\n"),

'TspotControls':[
 "| tiddlyspot password:|<<option pasUploadPassword>>|",
 "| site management:|<<upload http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/store.cgi index.html . .  " + config.tiddlyspotSiteId + ">>//(requires tiddlyspot password)//<br>[[control panel|http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/controlpanel]], [[download (go offline)|http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/download]]|",
 "| links:|[[tiddlyspot.com|http://tiddlyspot.com/]], [[FAQs|http://faq.tiddlyspot.com/]], [[blog|http://tiddlyspot.blogspot.com/]], email [[support|mailto:support@tiddlyspot.com]] & [[feedback|mailto:feedback@tiddlyspot.com]], [[donate|http://tiddlyspot.com/?page=donate]]|"
].join("\n"),

'TspotSidebar':[
 "<<upload http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/store.cgi index.html . .  " + config.tiddlyspotSiteId + ">><html><a href='http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/download' class='button'>download</a></html>"
].join("\n"),

'TspotOptions':[
 "tiddlyspot password:",
 "<<option pasUploadPassword>>",
 ""
].join("\n")

});
//}}}
| !date | !user | !location | !storeUrl | !uploadDir | !toFilename | !backupdir | !origin |
| 21/12/2008 00:24:48 | kafik | [[kafik.html|file:///home/Arhive/Soft/tiddyWiki/2.4.1/kafik/kafik.html]] | [[store.cgi|http://kafik.tiddlyspot.com/store.cgi]] | . | [[index.html | http://kafik.tiddlyspot.com/index.html]] | . | ok |
| 21/12/2008 02:01:25 | kafik | [[kafik.html|file:///home/Arhive/Soft/tiddyWiki/2.4.1/kafik/kafik.html]] | [[store.cgi|http://kafik.tiddlyspot.com/store.cgi]] | . | [[index.html | http://kafik.tiddlyspot.com/index.html]] | . | ok |
| 21/12/2008 15:18:26 | kafik | [[kafik.html|file:///home/Arhive/Soft/tiddyWiki/2.4.1/kafik/kafik.html]] | [[store.cgi|http://kafik.tiddlyspot.com/store.cgi]] | . | [[index.html | http://kafik.tiddlyspot.com/index.html]] | . | ok |
| 21/12/2008 21:55:49 | kafik | [[kafik.html|file:///home/Arhive/Soft/tiddyWiki/2.4.1/kafik/kafik.html]] | [[store.cgi|http://kafik.tiddlyspot.com/store.cgi]] | . | [[index.html | http://kafik.tiddlyspot.com/index.html]] | . | ok |
| 28/12/2008 02:56:55 | kafik | [[kafik.html|file:///home/Arhive/Soft/tiddyWiki/2.4.1/kafik/kafik.html]] | [[store.cgi|http://kafik.tiddlyspot.com/store.cgi]] | . | [[index.html | http://kafik.tiddlyspot.com/index.html]] | . | ok |
| 29/12/2008 23:03:29 | kafik | [[kafik.html|file:///home/Arhive/Soft/tiddyWiki/2.4.1/kafik/kafik.html]] | [[store.cgi|http://kafik.tiddlyspot.com/store.cgi]] | . | [[index.html | http://kafik.tiddlyspot.com/index.html]] | . | ok |
| 30/12/2008 15:16:53 | kafik | [[kafik.html|file:///home/Arhive/Soft/tiddyWiki/2.4.1/kafik/kafik.html]] | [[store.cgi|http://kafik.tiddlyspot.com/store.cgi]] | . | [[index.html | http://kafik.tiddlyspot.com/index.html]] | . | ok |
| 31/12/2008 00:04:20 | kafik | [[kafik.html|file:///home/Arhive/Soft/tiddyWiki/2.4.1/kafik/kafik.html]] | [[store.cgi|http://kafik.tiddlyspot.com/store.cgi]] | . | [[index.html | http://kafik.tiddlyspot.com/index.html]] | . | ok |
| 01/01/2009 02:55:40 | kafik | [[kafik.html|file:///home/Arhive/Soft/tiddyWiki/2.4.1/kafik/kafik.html]] | [[store.cgi|http://kafik.tiddlyspot.com/store.cgi]] | . | [[index.html | http://kafik.tiddlyspot.com/index.html]] | . | ok |
| 21/02/2009 21:55:59 | kafik | [[kafik.html|file:///home/Arhive/Soft/tiddyWiki/2.4.1/kafik/kafik.html]] | [[store.cgi|http://kafik.tiddlyspot.com/store.cgi]] | . | [[index.html | http://kafik.tiddlyspot.com/index.html]] | . |
/***
|''Name:''|UploadPlugin|
|''Description:''|Save to web a TiddlyWiki|
|''Version:''|4.1.3|
|''Date:''|Feb 24, 2008|
|''Source:''|http://tiddlywiki.bidix.info/#UploadPlugin|
|''Documentation:''|http://tiddlywiki.bidix.info/#UploadPluginDoc|
|''Author:''|BidiX (BidiX (at) bidix (dot) info)|
|''License:''|[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D ]]|
|''~CoreVersion:''|2.2.0|
|''Requires:''|PasswordOptionPlugin|
***/
//{{{
version.extensions.UploadPlugin = {
	major: 4, minor: 1, revision: 3,
	date: new Date("Feb 24, 2008"),
	source: 'http://tiddlywiki.bidix.info/#UploadPlugin',
	author: 'BidiX (BidiX (at) bidix (dot) info',
	coreVersion: '2.2.0'
};

//
// Environment
//

if (!window.bidix) window.bidix = {}; // bidix namespace
bidix.debugMode = false;	// true to activate both in Plugin and UploadService
	
//
// Upload Macro
//

config.macros.upload = {
// default values
	defaultBackupDir: '',	//no backup
	defaultStoreScript: "store.php",
	defaultToFilename: "index.html",
	defaultUploadDir: ".",
	authenticateUser: true	// UploadService Authenticate User
};
	
config.macros.upload.label = {
	promptOption: "Save and Upload this TiddlyWiki with UploadOptions",
	promptParamMacro: "Save and Upload this TiddlyWiki in %0",
	saveLabel: "save to web", 
	saveToDisk: "save to disk",
	uploadLabel: "upload"	
};

config.macros.upload.messages = {
	noStoreUrl: "No store URL in parmeters or options",
	usernameOrPasswordMissing: "Username or password missing"
};

config.macros.upload.handler = function(place,macroName,params) {
	if (readOnly)
		return;
	var label;
	if (document.location.toString().substr(0,4) == "http") 
		label = this.label.saveLabel;
	else
		label = this.label.uploadLabel;
	var prompt;
	if (params[0]) {
		prompt = this.label.promptParamMacro.toString().format([this.destFile(params[0], 
			(params[1] ? params[1]:bidix.basename(window.location.toString())), params[3])]);
	} else {
		prompt = this.label.promptOption;
	}
	createTiddlyButton(place, label, prompt, function() {config.macros.upload.action(params);}, null, null, this.accessKey);
};

config.macros.upload.action = function(params)
{
		// for missing macro parameter set value from options
		if (!params) params = {};
		var storeUrl = params[0] ? params[0] : config.options.txtUploadStoreUrl;
		var toFilename = params[1] ? params[1] : config.options.txtUploadFilename;
		var backupDir = params[2] ? params[2] : config.options.txtUploadBackupDir;
		var uploadDir = params[3] ? params[3] : config.options.txtUploadDir;
		var username = params[4] ? params[4] : config.options.txtUploadUserName;
		var password = config.options.pasUploadPassword; // for security reason no password as macro parameter	
		// for still missing parameter set default value
		if ((!storeUrl) && (document.location.toString().substr(0,4) == "http")) 
			storeUrl = bidix.dirname(document.location.toString())+'/'+config.macros.upload.defaultStoreScript;
		if (storeUrl.substr(0,4) != "http")
			storeUrl = bidix.dirname(document.location.toString()) +'/'+ storeUrl;
		if (!toFilename)
			toFilename = bidix.basename(window.location.toString());
		if (!toFilename)
			toFilename = config.macros.upload.defaultToFilename;
		if (!uploadDir)
			uploadDir = config.macros.upload.defaultUploadDir;
		if (!backupDir)
			backupDir = config.macros.upload.defaultBackupDir;
		// report error if still missing
		if (!storeUrl) {
			alert(config.macros.upload.messages.noStoreUrl);
			clearMessage();
			return false;
		}
		if (config.macros.upload.authenticateUser && (!username || !password)) {
			alert(config.macros.upload.messages.usernameOrPasswordMissing);
			clearMessage();
			return false;
		}
		bidix.upload.uploadChanges(false,null,storeUrl, toFilename, uploadDir, backupDir, username, password); 
		return false; 
};

config.macros.upload.destFile = function(storeUrl, toFilename, uploadDir) 
{
	if (!storeUrl)
		return null;
		var dest = bidix.dirname(storeUrl);
		if (uploadDir && uploadDir != '.')
			dest = dest + '/' + uploadDir;
		dest = dest + '/' + toFilename;
	return dest;
};

//
// uploadOptions Macro
//

config.macros.uploadOptions = {
	handler: function(place,macroName,params) {
		var wizard = new Wizard();
		wizard.createWizard(place,this.wizardTitle);
		wizard.addStep(this.step1Title,this.step1Html);
		var markList = wizard.getElement("markList");
		var listWrapper = document.createElement("div");
		markList.parentNode.insertBefore(listWrapper,markList);
		wizard.setValue("listWrapper",listWrapper);
		this.refreshOptions(listWrapper,false);
		var uploadCaption;
		if (document.location.toString().substr(0,4) == "http") 
			uploadCaption = config.macros.upload.label.saveLabel;
		else
			uploadCaption = config.macros.upload.label.uploadLabel;
		
		wizard.setButtons([
				{caption: uploadCaption, tooltip: config.macros.upload.label.promptOption, 
					onClick: config.macros.upload.action},
				{caption: this.cancelButton, tooltip: this.cancelButtonPrompt, onClick: this.onCancel}
				
			]);
	},
	options: [
		"txtUploadUserName",
		"pasUploadPassword",
		"txtUploadStoreUrl",
		"txtUploadDir",
		"txtUploadFilename",
		"txtUploadBackupDir",
		"chkUploadLog",
		"txtUploadLogMaxLine"		
	],
	refreshOptions: function(listWrapper) {
		var opts = [];
		for(i=0; i<this.options.length; i++) {
			var opt = {};
			opts.push();
			opt.option = "";
			n = this.options[i];
			opt.name = n;
			opt.lowlight = !config.optionsDesc[n];
			opt.description = opt.lowlight ? this.unknownDescription : config.optionsDesc[n];
			opts.push(opt);
		}
		var listview = ListView.create(listWrapper,opts,this.listViewTemplate);
		for(n=0; n<opts.length; n++) {
			var type = opts[n].name.substr(0,3);
			var h = config.macros.option.types[type];
			if (h && h.create) {
				h.create(opts[n].colElements['option'],type,opts[n].name,opts[n].name,"no");
			}
		}
		
	},
	onCancel: function(e)
	{
		backstage.switchTab(null);
		return false;
	},
	
	wizardTitle: "Upload with options",
	step1Title: "These options are saved in cookies in your browser",
	step1Html: "<input type='hidden' name='markList'></input><br>",
	cancelButton: "Cancel",
	cancelButtonPrompt: "Cancel prompt",
	listViewTemplate: {
		columns: [
			{name: 'Description', field: 'description', title: "Description", type: 'WikiText'},
			{name: 'Option', field: 'option', title: "Option", type: 'String'},
			{name: 'Name', field: 'name', title: "Name", type: 'String'}
			],
		rowClasses: [
			{className: 'lowlight', field: 'lowlight'} 
			]}
};

//
// upload functions
//

if (!bidix.upload) bidix.upload = {};

if (!bidix.upload.messages) bidix.upload.messages = {
	//from saving
	invalidFileError: "The original file '%0' does not appear to be a valid TiddlyWiki",
	backupSaved: "Backup saved",
	backupFailed: "Failed to upload backup file",
	rssSaved: "RSS feed uploaded",
	rssFailed: "Failed to upload RSS feed file",
	emptySaved: "Empty template uploaded",
	emptyFailed: "Failed to upload empty template file",
	mainSaved: "Main TiddlyWiki file uploaded",
	mainFailed: "Failed to upload main TiddlyWiki file. Your changes have not been saved",
	//specific upload
	loadOriginalHttpPostError: "Can't get original file",
	aboutToSaveOnHttpPost: 'About to upload on %0 ...',
	storePhpNotFound: "The store script '%0' was not found."
};

bidix.upload.uploadChanges = function(onlyIfDirty,tiddlers,storeUrl,toFilename,uploadDir,backupDir,username,password)
{
	var callback = function(status,uploadParams,original,url,xhr) {
		if (!status) {
			displayMessage(bidix.upload.messages.loadOriginalHttpPostError);
			return;
		}
		if (bidix.debugMode) 
			alert(original.substr(0,500)+"\n...");
		// Locate the storeArea div's 
		var posDiv = locateStoreArea(original);
		if((posDiv[0] == -1) || (posDiv[1] == -1)) {
			alert(config.messages.invalidFileError.format([localPath]));
			return;
		}
		bidix.upload.uploadRss(uploadParams,original,posDiv);
	};
	
	if(onlyIfDirty && !store.isDirty())
		return;
	clearMessage();
	// save on localdisk ?
	if (document.location.toString().substr(0,4) == "file") {
		var path = document.location.toString();
		var localPath = getLocalPath(path);
		saveChanges();
	}
	// get original
	var uploadParams = new Array(storeUrl,toFilename,uploadDir,backupDir,username,password);
	var originalPath = document.location.toString();
	// If url is a directory : add index.html
	if (originalPath.charAt(originalPath.length-1) == "/")
		originalPath = originalPath + "index.html";
	var dest = config.macros.upload.destFile(storeUrl,toFilename,uploadDir);
	var log = new bidix.UploadLog();
	log.startUpload(storeUrl, dest, uploadDir,  backupDir);
	displayMessage(bidix.upload.messages.aboutToSaveOnHttpPost.format([dest]));
	if (bidix.debugMode) 
		alert("about to execute Http - GET on "+originalPath);
	var r = doHttp("GET",originalPath,null,null,username,password,callback,uploadParams,null);
	if (typeof r == "string")
		displayMessage(r);
	return r;
};

bidix.upload.uploadRss = function(uploadParams,original,posDiv) 
{
	var callback = function(status,params,responseText,url,xhr) {
		if(status) {
			var destfile = responseText.substring(responseText.indexOf("destfile:")+9,responseText.indexOf("\n", responseText.indexOf("destfile:")));
			displayMessage(bidix.upload.messages.rssSaved,bidix.dirname(url)+'/'+destfile);
			bidix.upload.uploadMain(params[0],params[1],params[2]);
		} else {
			displayMessage(bidix.upload.messages.rssFailed);			
		}
	};
	// do uploadRss
	if(config.options.chkGenerateAnRssFeed) {
		var rssPath = uploadParams[1].substr(0,uploadParams[1].lastIndexOf(".")) + ".xml";
		var rssUploadParams = new Array(uploadParams[0],rssPath,uploadParams[2],'',uploadParams[4],uploadParams[5]);
		var rssString = generateRss();
		// no UnicodeToUTF8 conversion needed when location is "file" !!!
		if (document.location.toString().substr(0,4) != "file")
			rssString = convertUnicodeToUTF8(rssString);	
		bidix.upload.httpUpload(rssUploadParams,rssString,callback,Array(uploadParams,original,posDiv));
	} else {
		bidix.upload.uploadMain(uploadParams,original,posDiv);
	}
};

bidix.upload.uploadMain = function(uploadParams,original,posDiv) 
{
	var callback = function(status,params,responseText,url,xhr) {
		var log = new bidix.UploadLog();
		if(status) {
			// if backupDir specified
			if ((params[3]) && (responseText.indexOf("backupfile:") > -1))  {
				var backupfile = responseText.substring(responseText.indexOf("backupfile:")+11,responseText.indexOf("\n", responseText.indexOf("backupfile:")));
				displayMessage(bidix.upload.messages.backupSaved,bidix.dirname(url)+'/'+backupfile);
			}
			var destfile = responseText.substring(responseText.indexOf("destfile:")+9,responseText.indexOf("\n", responseText.indexOf("destfile:")));
			displayMessage(bidix.upload.messages.mainSaved,bidix.dirname(url)+'/'+destfile);
			store.setDirty(false);
			log.endUpload("ok");
		} else {
			alert(bidix.upload.messages.mainFailed);
			displayMessage(bidix.upload.messages.mainFailed);
			log.endUpload("failed");			
		}
	};
	// do uploadMain
	var revised = bidix.upload.updateOriginal(original,posDiv);
	bidix.upload.httpUpload(uploadParams,revised,callback,uploadParams);
};

bidix.upload.httpUpload = function(uploadParams,data,callback,params)
{
	var localCallback = function(status,params,responseText,url,xhr) {
		url = (url.indexOf("nocache=") < 0 ? url : url.substring(0,url.indexOf("nocache=")-1));
		if (xhr.status == 404)
			alert(bidix.upload.messages.storePhpNotFound.format([url]));
		if ((bidix.debugMode) || (responseText.indexOf("Debug mode") >= 0 )) {
			alert(responseText);
			if (responseText.indexOf("Debug mode") >= 0 )
				responseText = responseText.substring(responseText.indexOf("\n\n")+2);
		} else if (responseText.charAt(0) != '0') 
			alert(responseText);
		if (responseText.charAt(0) != '0')
			status = null;
		callback(status,params,responseText,url,xhr);
	};
	// do httpUpload
	var boundary = "---------------------------"+"AaB03x";	
	var uploadFormName = "UploadPlugin";
	// compose headers data
	var sheader = "";
	sheader += "--" + boundary + "\r\nContent-disposition: form-data; name=\"";
	sheader += uploadFormName +"\"\r\n\r\n";
	sheader += "backupDir="+uploadParams[3] +
				";user=" + uploadParams[4] +
				";password=" + uploadParams[5] +
				";uploaddir=" + uploadParams[2];
	if (bidix.debugMode)
		sheader += ";debug=1";
	sheader += ";;\r\n"; 
	sheader += "\r\n" + "--" + boundary + "\r\n";
	sheader += "Content-disposition: form-data; name=\"userfile\"; filename=\""+uploadParams[1]+"\"\r\n";
	sheader += "Content-Type: text/html;charset=UTF-8" + "\r\n";
	sheader += "Content-Length: " + data.length + "\r\n\r\n";
	// compose trailer data
	var strailer = new String();
	strailer = "\r\n--" + boundary + "--\r\n";
	data = sheader + data + strailer;
	if (bidix.debugMode) alert("about to execute Http - POST on "+uploadParams[0]+"\n with \n"+data.substr(0,500)+ " ... ");
	var r = doHttp("POST",uploadParams[0],data,"multipart/form-data; ;charset=UTF-8; boundary="+boundary,uploadParams[4],uploadParams[5],localCallback,params,null);
	if (typeof r == "string")
		displayMessage(r);
	return r;
};

// same as Saving's updateOriginal but without convertUnicodeToUTF8 calls
bidix.upload.updateOriginal = function(original, posDiv)
{
	if (!posDiv)
		posDiv = locateStoreArea(original);
	if((posDiv[0] == -1) || (posDiv[1] == -1)) {
		alert(config.messages.invalidFileError.format([localPath]));
		return;
	}
	var revised = original.substr(0,posDiv[0] + startSaveArea.length) + "\n" +
				store.allTiddlersAsHtml() + "\n" +
				original.substr(posDiv[1]);
	var newSiteTitle = getPageTitle().htmlEncode();
	revised = revised.replaceChunk("<title"+">","</title"+">"," " + newSiteTitle + " ");
	revised = updateMarkupBlock(revised,"PRE-HEAD","MarkupPreHead");
	revised = updateMarkupBlock(revised,"POST-HEAD","MarkupPostHead");
	revised = updateMarkupBlock(revised,"PRE-BODY","MarkupPreBody");
	revised = updateMarkupBlock(revised,"POST-SCRIPT","MarkupPostBody");
	return revised;
};

//
// UploadLog
// 
// config.options.chkUploadLog :
//		false : no logging
//		true : logging
// config.options.txtUploadLogMaxLine :
//		-1 : no limit
//      0 :  no Log lines but UploadLog is still in place
//		n :  the last n lines are only kept
//		NaN : no limit (-1)

bidix.UploadLog = function() {
	if (!config.options.chkUploadLog) 
		return; // this.tiddler = null
	this.tiddler = store.getTiddler("UploadLog");
	if (!this.tiddler) {
		this.tiddler = new Tiddler();
		this.tiddler.title = "UploadLog";
		this.tiddler.text = "| !date | !user | !location | !storeUrl | !uploadDir | !toFilename | !backupdir | !origin |";
		this.tiddler.created = new Date();
		this.tiddler.modifier = config.options.txtUserName;
		this.tiddler.modified = new Date();
		store.addTiddler(this.tiddler);
	}
	return this;
};

bidix.UploadLog.prototype.addText = function(text) {
	if (!this.tiddler)
		return;
	// retrieve maxLine when we need it
	var maxLine = parseInt(config.options.txtUploadLogMaxLine,10);
	if (isNaN(maxLine))
		maxLine = -1;
	// add text
	if (maxLine != 0) 
		this.tiddler.text = this.tiddler.text + text;
	// Trunck to maxLine
	if (maxLine >= 0) {
		var textArray = this.tiddler.text.split('\n');
		if (textArray.length > maxLine + 1)
			textArray.splice(1,textArray.length-1-maxLine);
			this.tiddler.text = textArray.join('\n');		
	}
	// update tiddler fields
	this.tiddler.modifier = config.options.txtUserName;
	this.tiddler.modified = new Date();
	store.addTiddler(this.tiddler);
	// refresh and notifiy for immediate update
	story.refreshTiddler(this.tiddler.title);
	store.notify(this.tiddler.title, true);
};

bidix.UploadLog.prototype.startUpload = function(storeUrl, toFilename, uploadDir,  backupDir) {
	if (!this.tiddler)
		return;
	var now = new Date();
	var text = "\n| ";
	var filename = bidix.basename(document.location.toString());
	if (!filename) filename = '/';
	text += now.formatString("0DD/0MM/YYYY 0hh:0mm:0ss") +" | ";
	text += config.options.txtUserName + " | ";
	text += "[["+filename+"|"+location + "]] |";
	text += " [[" + bidix.basename(storeUrl) + "|" + storeUrl + "]] | ";
	text += uploadDir + " | ";
	text += "[[" + bidix.basename(toFilename) + " | " +toFilename + "]] | ";
	text += backupDir + " |";
	this.addText(text);
};

bidix.UploadLog.prototype.endUpload = function(status) {
	if (!this.tiddler)
		return;
	this.addText(" "+status+" |");
};

//
// Utilities
// 

bidix.checkPlugin = function(plugin, major, minor, revision) {
	var ext = version.extensions[plugin];
	if (!
		(ext  && 
			((ext.major > major) || 
			((ext.major == major) && (ext.minor > minor))  ||
			((ext.major == major) && (ext.minor == minor) && (ext.revision >= revision))))) {
			// write error in PluginManager
			if (pluginInfo)
				pluginInfo.log.push("Requires " + plugin + " " + major + "." + minor + "." + revision);
			eval(plugin); // generate an error : "Error: ReferenceError: xxxx is not defined"
	}
};

bidix.dirname = function(filePath) {
	if (!filePath) 
		return;
	var lastpos;
	if ((lastpos = filePath.lastIndexOf("/")) != -1) {
		return filePath.substring(0, lastpos);
	} else {
		return filePath.substring(0, filePath.lastIndexOf("\\"));
	}
};

bidix.basename = function(filePath) {
	if (!filePath) 
		return;
	var lastpos;
	if ((lastpos = filePath.lastIndexOf("#")) != -1) 
		filePath = filePath.substring(0, lastpos);
	if ((lastpos = filePath.lastIndexOf("/")) != -1) {
		return filePath.substring(lastpos + 1);
	} else
		return filePath.substring(filePath.lastIndexOf("\\")+1);
};

bidix.initOption = function(name,value) {
	if (!config.options[name])
		config.options[name] = value;
};

//
// Initializations
//

// require PasswordOptionPlugin 1.0.1 or better
bidix.checkPlugin("PasswordOptionPlugin", 1, 0, 1);

// styleSheet
setStylesheet('.txtUploadStoreUrl, .txtUploadBackupDir, .txtUploadDir {width: 22em;}',"uploadPluginStyles");

//optionsDesc
merge(config.optionsDesc,{
	txtUploadStoreUrl: "Url of the UploadService script (default: store.php)",
	txtUploadFilename: "Filename of the uploaded file (default: in index.html)",
	txtUploadDir: "Relative Directory where to store the file (default: . (downloadService directory))",
	txtUploadBackupDir: "Relative Directory where to backup the file. If empty no backup. (default: ''(empty))",
	txtUploadUserName: "Upload Username",
	pasUploadPassword: "Upload Password",
	chkUploadLog: "do Logging in UploadLog (default: true)",
	txtUploadLogMaxLine: "Maximum of lines in UploadLog (default: 10)"
});

// Options Initializations
bidix.initOption('txtUploadStoreUrl','');
bidix.initOption('txtUploadFilename','');
bidix.initOption('txtUploadDir','');
bidix.initOption('txtUploadBackupDir','');
bidix.initOption('txtUploadUserName','');
bidix.initOption('pasUploadPassword','');
bidix.initOption('chkUploadLog',true);
bidix.initOption('txtUploadLogMaxLine','10');


// Backstage
merge(config.tasks,{
	uploadOptions: {text: "upload", tooltip: "Change UploadOptions and Upload", content: '<<uploadOptions>>'}
});
config.backstageTasks.push("uploadOptions");


//}}}
/***
|''Name:''|EnglishTranslationPlugin|
|''Description:''|Translation of TiddlyWiki into Russian|
|''Author:''|VitalyPetrov (v31337 (at) gmail (dot) com)|
|''Source:''|www.example.com |
|''CodeRepository:''|http://svn.tiddlywiki.org/Trunk/association/locales/core/ru/locale.ru.js |
|''Version:''|0.0.1|
|''Date:''|Jul 6, 2007|
|''Comments:''|Please make comments at http://groups.google.co.uk/group/TiddlyWikiDev |
|''License:''|[[Creative Commons Attribution-ShareAlike 3.0 License|http://creativecommons.org/licenses/by-sa/3.0/]] |
|''~CoreVersion:''|2.4|
***/

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

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

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

if (config.options.txtUserName == 'YourName') // do not translate this line, but do translate the next line
	merge(config.options,{txtUserName: "VitalyPetrov"});

merge(config.tasks,{
	save: {text: "сохранить", tooltip: "Сохранить изменения в текущей TiddlyWiki", action: saveChanges},
	sync: {text: "синхронизировать", tooltip: "Синхронизировать все изменения с другими файлами и серверами TiddlyWiki", content: '<<sync>>'},
	importTask: {text: "импорт", tooltip: "Импорт записей и дополнений из других файлов и серверов TiddlyWiki", content: '<<importTiddlers>>'},
	tweak: {text: "настроки", tooltip: "Настроить внешний вид и поведение TiddlyWiki", content: '<<options>>'},
	upgrade: {text: "обновить", tooltip: "Обновить основной код TiddlyWiki", content: '<<upgrade>>'},
	plugins: {text: "дополнения", tooltip: "Управление установленными дополнениями", content: '<<plugins>>'}
});

// Options that can be set in the options panel and/or cookies
merge(config.optionsDesc,{
	txtUserName: "Имя пользователя для подписи ваших записей",
	chkRegExpSearch: "Разрешить использование регулярных выражений в поиске",
	chkCaseSensitiveSearch: "Поиск с учётом регистра",
	chkIncrementalSearch: "Поиск по мере набора текста",
	chkAnimate: "Разрешить анимацию",
	chkSaveBackups: "Сохранять резервную копию файла при сохранении изменений",
	chkAutoSave: "Авто-сохранение изменений",
	chkGenerateAnRssFeed: "Генерировать данные RSS-канала при сохранении изменений",
	chkSaveEmptyTemplate: "Гененрировать пустой шаблон при сохранении изменений",
	chkOpenInNewWindow: "Открывать внешние ссылки в новом окне",
	chkToggleLinks: "Нажимая на ссылку для открытия записи указывать причины её закрытия (Не понял как правильно перевести)",
	chkHttpReadOnly: "Запрещать редактирование при доступе через HTTP",
	chkForceMinorUpdate: "не обновлять имя пользователя и дату при изменении записи",
	chkConfirmDelete: "Выдавать запрос на подтверждение перед удалением записи",
	chkInsertTabs: "Использовать клавишу tab для вставки символа табуляции вместо перехода между полями",
	txtBackupFolder: "Каталог для сохранения резервных копий",
	txtMaxEditRows: "Максимальное количество строк в полях редактирования",
	txtFileSystemCharSet: "Кодировка по умолчанию (только для Firefox/Mozilla)"});

merge(config.messages,{
	customConfigError: "Появились проблемы при загрузке плагинов. Смотрите раздел PluginManager для более подробных сведений",
	pluginError: "Ошибка: %0",
	pluginDisabled: "Дополнение не будет выполняться потому как установлена метка 'systemConfigDisable'",
	pluginForced: "Дополнение будет выполняться принудительно потому как установлена метка 'systemConfigForce'",
	pluginVersionError: "Дополнение не будет выполняться так как требует другой версии TiddlyWiki",
	nothingSelected: "Ничего не выделено. Сначала вы должны выделить одно или несколько значений",
	savedSnapshotError: "Похоже, что TiddlyWiki был сохранен некорректно. Смотрите http://www.tiddlywiki.com/#DownloadSoftware для более подробных сведений",
	subtitleUnknown: "(неизвестно)",
	undefinedTiddlerToolTip: "Запись '%0' не существует",
	shadowedTiddlerToolTip: "Запись '%0' не существует, но имеет предопределённое скрытое значение",
	tiddlerLinkTooltip: "%0 - %1, %2",
	externalLinkTooltip: "Внешняя ссылка на %0",
	noTags: "Нет записей с подобной меткой",
	notFileUrlError: "Вы должны записать текущую TiddlyWiki в файл перед сохранением изменений",
	cantSaveError: "Невозможно сохранить изменения. Возможные причины:\n- Ваш браузер не поддерживает сохранения (В Firefox, Internet Explorer, Safari и в Opera есть поддержка сохранения)\n- Путь к вашему файлу TiddlyWiki содержит недопустимые символы\n- HTML файл TiddlyWiki был перемещён или переименован",
	invalidFileError: "Файл '%0' не является стандартным TiddlyWiki файлом",
	backupSaved: "Резервная копия сохранена",
	backupFailed: "Ошибка сохранения резервной копии",
	rssSaved: "Файл RSS-канала сохранён",
	rssFailed: "Ошибка сохранения файла с RSS каналом",
	emptySaved: "Пустой шаблон сохранён",
	emptyFailed: "Ошибка сохранения пустого шаблона",
	mainSaved: "Основной файл TiddlyWiki сохранён",
	mainFailed: "Ошибка сохранения основного файла TiddlyWiki. Ваши изменения не будут сохранены",
	macroError: "Ошибка в макросе <<\%0>>",
	macroErrorDetails: "ошибка исполнения макроса <<\%0>>:\n%1",
	missingMacro: "Нет подобного макроса",
	overwriteWarning: "Запись с именем '%0' уже существует. Нажмите OK для её замены",
	unsavedChangesWarning: "ВНИМАНИЕ! Существуют несохранённые изменения в TiddlyWiki\n\nНажмите OK для сохранения\nНажмите CANCEL для отмены",
	confirmExit: "--------------------------------\n\nСуществуют несохранённые изменения в TiddlyWiki. При продолжении будут потеряны все несохранённые изменения\n\n--------------------------------",
	saveInstructions: "СохранитьИзменения",
	unsupportedTWFormat: "Формат '%0' не поддерживается TiddlyWiki",
	tiddlerSaveError: "Ошибка сохранения записи '%0'",
	tiddlerLoadError: "Ошибка загрузки записи '%0'",
	wrongSaveFormat: "Не удаётся сохранить в формате '%0'. Используйте стандартный формат для сохранения.",
	invalidFieldName: "Неверное значение в поле %0",
	fieldCannotBeChanged: "Поле '%0' не может быть изменено",
	loadingMissingTiddler: "Пытаюсь получить запись '%0' с сервера '%1':\n\n'%2' в рабочей области '%3'",
	upgradeDone: "Обновление до версии %0 завершено\n\nНажмите 'OK' для загрузки обновлённой версии TiddlyWiki"});

merge(config.messages.messageClose,{
	text: "закрыть",
	tooltip: "закрыть данную информационную область"});

config.messages.backstage = {
	open: {text: "дополнительно", tooltip: "Открыть дополнительную область редактирования"},
	close: {text: "скрыть", tooltip: "Закрыть дополнительную область"},
	prompt: "дополнительно: ",
	decal: {
		edit: {text: "редактировать", tooltip: "Редактировать запись '%0'"}
	}
};

config.messages.listView = {
	tiddlerTooltip: "Нажмите для простотра записи целиком",
	previewUnavailable: "(предпросмотр не поддерживается)"
};

config.messages.dates.months = ["Январь", "Февраль", "Март", "Апрель", "Мая", "Июнь", "Июль", "Август", "Сентябрь", "Октябрь", "Ноябрь","Декабрь"];
config.messages.dates.days = ["Воскресенье", "Понедельник", "Вторник", "Среда", "Четверг", "Пятница", "Суббота"];
config.messages.dates.shortMonths = ["Янв", "Фев", "Мар", "Апр", "Май", "Июн", "Июл", "Авг", "Сен", "Окт", "Ноя", "Дек"];
config.messages.dates.shortDays = ["Вск", "Пон", "Втр", "Срд", "Чтв", "Птн", "Сбт"];
// suffixes for dates, eg "1st","2nd","3rd"..."30th","31st"
config.messages.dates.daySuffixes = ["ое","ое","ье","ое","ое","ое","ое","ое","ое","ое",
		"ое","ое","ое","ое","ое","ое","ое","ое","ое","ое",
		"ое","ое","ье","ое","ое","ое","ое","ое","ое","ое",
		"st"];
config.messages.dates.am = "ут";
config.messages.dates.pm = "вч";

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

merge(config.views.wikified.tag,{
	labelNoTags: "нет меток",
	labelTags: "метки: ",
	openTag: "Открыть метку '%0'",
	tooltip: "Показать записи помеченные как '%0'",
	openAllText: "Открыть всё",
	openAllTooltip: "Открыть все эти записи",
	popupNone: "Нет записей с меткой '%0'"});

merge(config.views.wikified,{
	defaultText: "Запись '%0' не существует. Щёлкните два раза для её создания",
	defaultModifier: "(потеряно)",
	shadowModifier: "(создание скрытой записи)",
	dateFormat: "DD MMM YYYY", // use this to change the date format for your locale, eg "YYYY MMM DD", do not translate the Y, M or D
	createdPrompt: "создано"});

merge(config.views.editor,{
	tagPrompt: "Введите метки, разделяя их пробелами, [[используя такие кавычки]] при необходимости, или добавьте существующие",
	defaultText: "Введите текст для '%0'"});

merge(config.views.editor.tagChooser,{
	text: "метки",
	tooltip: "Выбрать существующие метки, для добавления к текущей записи",
	popupNone: "Нет определённых меток",
	tagTooltip: "Добавить метку '%0'"});

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

merge(config.macros.search,{
	label: "поиск",
	prompt: "Поиск в текущей TiddlyWiki",
	accessKey: "F",
	successMsg: "%0 записи соответсвуют %1",
	failureMsg: "Нет записей соответсвующих %0"});

merge(config.macros.tagging,{
	label: "помечено: ",
	labelNotTag: "нет меток",
	tooltip: "Список записей с меткой '%0'"});

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

merge(config.macros.allTags,{
	tooltip: "Показать записи с меткой '%0'",
	noTags: "Нет помеченных записей"});

config.macros.list.all.prompt = "Все записи в алфавитном порядке";
config.macros.list.missing.prompt = "Записи на которые ссылаются другие записи, но они не были определены";
config.macros.list.orphans.prompt = "Записи на которые не ссылаются другие записи";
config.macros.list.shadowed.prompt = "Скрытые записи с содержимым по умолчанию";
config.macros.list.touched.prompt = "Записи, изменённые локально";

merge(config.macros.closeAll,{
	label: "закрыть всё",
	prompt: "Закрыть все отображающиеся записи (исключая редактируемые в данный момент)"});

merge(config.macros.permaview,{
	label: "прямая ссылка",
	prompt: "URL-ссылка. отображающая все открытые в данный момент записи"});

merge(config.macros.saveChanges,{
	label: "сохранить изменения",
	prompt: "Сохранить все записи для создания новой TiddlyWiki",
	accessKey: "S"});

merge(config.macros.newTiddler,{
	label: "новая запись",
	prompt: "Создать новую запись",
	title: "Новая запись",
	accessKey: "N"});

merge(config.macros.newJournal,{
	label: "новая запись в журнале",
	prompt: "Создать новую запись с использованием текущих даты и времени",
	accessKey: "J"});

merge(config.macros.options,{
	wizardTitle: "Настроить расширенные опции",
	step1Title: "Данные опции будут сохранены в cookies вашего браузера",
	step1Html: "<input type='hidden' name='markList'></input><br><input type='checkbox' checked='false' name='chkUnknown'>Показать неизвестные опции</input>",
	unknownDescription: "//(неизвестно)//",
	listViewTemplate: {
		columns: [
			{name: 'Option', field: 'option', title: "Опция", type: 'String'},
			{name: 'Description', field: 'description', title: "Описание", type: 'WikiText'},
			{name: 'Name', field: 'name', title: "Имя", type: 'String'}
			],
		rowClasses: [
			{className: 'lowlight', field: 'lowlight'}
			]}
	});

merge(config.macros.plugins,{
	wizardTitle: "Управление дополнениями",
	step1Title: "Загруженные сейчас дополнения",
	step1Html: "<input type='hidden' name='markList'></input>", // DO NOT TRANSLATE
	skippedText: "(данное дополнение не может быть выполненым, так как было добавлено после запуска)",
	noPluginText: "нет установленных дополнений",
	confirmDeleteText: "Подтвердите удаление следующие дополнения:\n\n%0",
	removeLabel: "удалить метку systemConfig",
	removePrompt: "Удалить метку systemConfig",
	deleteLabel: "удалить",
	deletePrompt: "Удалить эти записи навсегда",
	listViewTemplate: {
		columns: [
			{name: 'Selected', field: 'Selected', rowName: 'title', type: 'Selector'},
			{name: 'Tiddler', field: 'tiddler', title: "Tiddler", type: 'Tiddler'},
			{name: 'Size', field: 'size', tiddlerLink: 'size', title: "Size", type: 'Size'},
			{name: 'Forced', field: 'forced', title: "Forced", tag: 'systemConfigForce', type: 'TagCheckbox'},
			{name: 'Disabled', field: 'disabled', title: "Disabled", tag: 'systemConfigDisable', type: 'TagCheckbox'},
			{name: 'Executed', field: 'executed', title: "Loaded", type: 'Boolean', trueText: "Yes", falseText: "No"},
			{name: 'Startup Time', field: 'startupTime', title: "Startup Time", type: 'String'},
			{name: 'Error', field: 'error', title: "Status", type: 'Boolean', trueText: "Error", falseText: "OK"},
			{name: 'Log', field: 'log', title: "Log", type: 'StringList'}
			],
		rowClasses: [
			{className: 'error', field: 'error'},
			{className: 'warning', field: 'warning'}
			]}
	});

merge(config.macros.toolbar,{
	moreLabel: "больше",
	morePrompt: "Показать больше команд"
	});

merge(config.macros.refreshDisplay,{
	label: "обновить",
	prompt: "Обновить всю TiddlyWiki"
	});

merge(config.macros.importTiddlers,{
	readOnlyWarning: "Запрещн импорт в файл TiddlyWiki доступный только для чтения. Попробуйте открыть файл через протокол file://",
	wizardTitle: "Импорт записей из другого файла или сервера",
	step1Title: "Шаг 1: Укажите сервер или файл TiddlyWiki",
	step1Html: "Укажите тип сервера: <select name='selTypes'><option value=''>Выбор...</option></select><br>Введите URL или путь здесь: <input type='text' size=50 name='txtPath'><br>...или выберите файл: <input type='file' size=50 name='txtBrowse'><br><hr>...или выберите предопределённый канал: <select name='selFeeds'><option value=''>Выбор...</option></select>",
	openLabel: "открыть",
	openPrompt: "Открыть соединение с данным файлом или сервером",
	openError: "Произошли проблемы при открытии tiddlywiki файла",
	statusOpenHost: "Открываем хост",
	statusGetWorkspaceList: "Получаем список доступных рабочих областей",
	step2Title: "Шаг 2: Выбор рабочих областей",
	step2Html: "Введите имя рабочей области: <input type='text' size=50 name='txtWorkspace'><br>...или выберите рабочую область: <select name='selWorkspace'><option value=''>Выбор...</option></select>",
	cancelLabel: "отмена",
	cancelPrompt: "Отмена импорта",
	statusOpenWorkspace: "Открываем рабочую область",
	statusGetTiddlerList: "Получаем список доступных записей",
	errorGettingTiddlerList: "Ошибка при получении списка доступных записей, нажмите Отмена для повторной попытки",
	step3Title: "Шаг 3: Выберите записи для импорта",
	step3Html: "<input type='hidden' name='markList'></input><br><input type='checkbox' checked='true' name='chkSync'>Сохранить связь данных записей с этим сервером, для последующей синхронизации</input><br><input type='checkbox' name='chkSave'>Сохранить информацию об этом сервере в записи 'systemServer' вызовом:</input> <input type='text' size=25 name='txtSaveTiddler'>",
	importLabel: "импорт",
	importPrompt: "Импорт выбранных записей",
	confirmOverwriteText: "Поддтвердите перезапись следующих записей:\n\n%0",
	step4Title: "Шаг 4: Импорт записи %0",
	step4Html: "<input type='hidden' name='markReport'></input>", // DO NOT TRANSLATE
	doneLabel: "готово",
	donePrompt: "Закрыть мастер",
	statusDoingImport: "Импорт записей",
	statusDoneImport: "Все записи импортированы",
	systemServerNamePattern: "%2 на %1",
	systemServerNamePatternNoWorkspace: "%1",
	confirmOverwriteSaveTiddler: "Запись '%0' уже существует. Нажмите 'OK' для перезаписи её вместе с информаций об этом сервере, или 'Отмена' для выхода без сохранения изменений",
	serverSaveTemplate: "|''Тип:''|%0|\n|''URL:''|%1|\n|''Рабочай область:''|%2|\n\nДанная запись создана автоматически, для сохранения информации о сервере",
	serverSaveModifier: "(Система)",
	listViewTemplate: {
		columns: [
			{name: 'Selected', field: 'Selected', rowName: 'title', type: 'Selector'},
			{name: 'Tiddler', field: 'tiddler', title: "Запись", type: 'Tiddler'},
			{name: 'Size', field: 'size', tiddlerLink: 'size', title: "Размер", type: 'Size'},
			{name: 'Tags', field: 'tags', title: "Метки", type: 'Tags'}
			],
		rowClasses: [
			]}
	});

merge(config.macros.upgrade,{
	wizardTitle: "Обновить основной код TiddlyWiki",
	step1Title: "Обновить или восстановить TiddlyWiki до последнего выпуска",
	step1Html: "Вы собираетесь обновить основной код TiddlyWiki до последнего выпуска (из <a href='%0' class='externalLink' target='_blank'>%1</a>). Ваши данные будут сохранены при обновлении<br><br>Заметим, что при обновлении основного кода будут учтены установленные прежде дополнения. Если у Вас появились проблемы с обновлённым файлом, смотрите <a href='http://www.tiddlywiki.org/wiki/CoreUpgrades' class='externalLink' target='_blank'>http://www.tiddlywiki.org/wiki/CoreUpgrades</a>",
	errorCantUpgrade: "Невозможно обновить текущую TiddlyWiki. Вы мождете обновить только TiddlyWiki файлы которых хранятся у вас локально",
	errorNotSaved: "Вы должны сохранить все изменения перед обновлением",
	step2Title: "Подтверждение подробностей обновления",
	step2Html_downgrade: "Вы желаете понизить версию TiddlyWiki до %0 с %1.<br><br>Снижение версии основного кода не рекомендуется",
	step2Html_restore: "Данная TiddlyWiki уже использует последнюю версию основного кода (%0).<br><br>Тем не менее вы можете продолжить обновление, для обеспечения того, чтобы основной код не был повреждён",
	step2Html_upgrade: "Вы желаете обновить TiddlyWiki до версии %0 с %1",
	upgradeLabel: "обновить",
	upgradePrompt: "Подготовка к процессу обновления",
	statusPreparingBackup: "Подготовка к созданию резервной копии",
	statusSavingBackup: "Сохранение файла резервной копии",
	errorSavingBackup: "Появились проблемы при сохранении файл с резервной копией",
	statusLoadingCore: "загрузка основного кода",
	errorLoadingCore: "Ошибка загрузки основного кода",
	errorCoreFormat: "Ошибка в обновлённом основном коде",
	statusSavingCore: "Сохранение обновленного основного кода",
	statusReloadingCore: "Перезагрузка обновленного основного кода",
	startLabel: "старт",
	startPrompt: "Начать процесс обновления",
	cancelLabel: "отмена",
	cancelPrompt: "Отмена обновления",
	step3Title: "Обновление отменено",
	step3Html: "Вы отменили обновление программы"
	});

merge(config.macros.sync,{
	listViewTemplate: {
		columns: [
			{name: 'Selected', field: 'selected', rowName: 'title', type: 'Selector'},
			{name: 'Tiddler', field: 'tiddler', title: "Запись", type: 'Tiddler'},
			{name: 'Server Type', field: 'serverType', title: "Тип сервера", type: 'String'},
			{name: 'Server Host', field: 'serverHost', title: "Имя сервера", type: 'String'},
			{name: 'Server Workspace', field: 'serverWorkspace', title: "Рабочая область сервера", type: 'String'},
			{name: 'Status', field: 'status', title: "Статус синхронизации", type: 'String'},
			{name: 'Server URL', field: 'serverUrl', title: "URL сервера", text: "Вид", type: 'Link'}
			],
		rowClasses: [
			],
		buttons: [
			{caption: "Синхронизировать выбранные записи", name: 'sync'}
			]},
	wizardTitle: "Синхронизация с внешними серверами и файлами",
	step1Title: "Выберите записи, которые вы желаете синхронизировать",
	step1Html: "<input type='hidden' name='markList'></input>", // DO NOT TRANSLATE
	syncLabel: "синхронизировать",
	syncPrompt: "Синхронизировать выбранные записи",
	hasChanged: "Изменено локально",
	hasNotChanged: "Без изменения локально",
	syncStatusList: {
		none: {text: "...", color: "прозрачность", display:null},
		changedServer: {text: "Изменения на сервере", color: '#8080ff', display:null},
		changedLocally: {text: "Изменено локально", color: '#80ff80', display:null},
		changedBoth: {text: "Изменено локально и на сервере", color: '#ff8080', display:null},
		notFound: {text: "Сервер не найден", color: '#ffff80', display:null},
		putToServer: {text: "Обновлённая версия сохранена на сервере", color: '#ff80ff', display:null},
		gotFromServer: {text: "Получение обновления с сервера", color: '#80ffff', display:null}
		}
	});

merge(config.commands.closeTiddler,{
	text: "закрыть",
	tooltip: "Закрыть данную запись"});

merge(config.commands.closeOthers,{
	text: "закрыть остальные",
	tooltip: "Закрыть все записи кроме данной"});

merge(config.commands.editTiddler,{
	text: "редактировать",
	tooltip: "Редактировать запись",
	readOnlyText: "вид",
	readOnlyTooltip: "Просмотреть исходник записи"});

merge(config.commands.saveTiddler,{
	text: "готово",
	tooltip: "Сохранить запись"});

merge(config.commands.cancelTiddler,{
	text: "отмена",
	tooltip: "отменить все изменения записи",
	warning: "Вы действительно хотите отказаться от изменения '%0'?",
	readOnlyText: "готово",
	readOnlyTooltip: "Просмотр записи в нормальном режиме"});

merge(config.commands.deleteTiddler,{
	text: "удалить",
	tooltip: "Удалить текущую запись",
	warning: "Вы действительно желаете удалить запись '%0'?"});

merge(config.commands.permalink,{
	text: "прямая ссылка",
	tooltip: "Прямая ссылка на данную запись"});

merge(config.commands.references,{
	text: "ссылки",
	tooltip: "Показать записи ссылающиеся на данную",
	popupNone: "Нет ссылок"});

merge(config.commands.jump,{
	text: "переход",
	tooltip: "Перейти к другой открытой записи"});

merge(config.commands.syncing,{
	text: "синхронизация",
	tooltip: "Контролировать синхронизацию данной записи с внешними серверами и записями",
	currentlySyncing: "<div>В настоящее время синхронизировано с <span class='popupHighlight'>'%0'</span> to:</"+"div><div>host: <span class='popupHighlight'>%1</span></"+"div><div>рабочая область: <span class='popupHighlight'>%2</span></"+"div>", // Note escaping of closing <div> tag
	notCurrentlySyncing: "Не синхронизировано в настоящее время",
	captionUnSync: "Отсавноить синхронизацию данной записи",
	chooseServer: "Синхронизировать данную запись с другим сервером:",
	currServerMarker: "\u25cf ",
	notCurrServerMarker: "  "});

merge(config.commands.fields,{
	text: "поля",
	tooltip: "Показать дополнительные поля данной записи",
	emptyText: "нет расширенных полей для данной записи",
	listViewTemplate: {
		columns: [
			{name: 'Field', field: 'field', title: "Поле", type: 'String'},
			{name: 'Value', field: 'value', title: "Значение", type: 'String'}
			],
		rowClasses: [
			],
		buttons: [
			]}});

merge(config.shadowTiddlers,{
	DefaultTiddlers: "[[TranslatedGettingStarted]]",
	MainMenu: "[[TranslatedGettingStarted]]\n\n\n^^~TiddlyWiki версия <<version>>\n© 2007 [[UnaMesa|http://www.unamesa.org/]]^^",
	TranslatedGettingStarted: "Чтобы начать работу с пустой TiddlyWiki, вы должны изменить некоторые записи:\n* SiteTitle & SiteSubtitle: Заголовок и подзаголовок сайта, как показано выше (после сохранения они также будут показаны в заголовке сайта)\n* MainMenu: Главное меню (Обычно расположено слева)\n* DefaultTiddlers: Записи которые вы бы хотели видеть при запуске TiddlyWiki\nВы должны ввести ваше имя для обозначения автора записей: <<option txtUserName>>",
	SiteTitle: "Моя TiddlyWiki",
	SiteSubtitle: "нелинейный персональный WEB-блокнот",
	SiteUrl: "http://www.tiddlywiki.com/",
	OptionsPanel: "Данный интерфейс посзволяет изменять настройки TiddlyWiki сохраняемые в вашем браузере\n\nВашим именем будут подписаны ваши записи. Запишите его, как в WikiWord (например JoeBloggs)\n<<option txtUserName>>\n\n<<option chkSaveBackups>> Сохранять резервные копии\n<<option chkAutoSave>> Авто сохранение\n<<option chkRegExpSearch>> Поиск с использованием регулярных выражений\n<<option chkCaseSensitiveSearch>> Поиск с учётом регистра\n<<option chkAnimate>> Разрешить анимацию\n\n----\nСмотрите также [[расширенные опиции|AdvancedOptions]]",
	SideBarOptions: '<<search>><<closeAll>><<permaview>><<newTiddler>><<newJournal "DD MMM YYYY" "журнал">><<saveChanges>><<slider chkSliderOptionsPanel OptionsPanel "опции \u00bb" "Изменить расширенные опции TiddlyWiki">>',
	SideBarTabs: '<<tabs txtMainTab "Хронология" "Хронология" TabTimeline "Все" "Все записи" TabAll "Метки" "Все метки" TabTags "Ещё" "Ещё списки" TabMore>>',
	TabMore: '<<tabs txtMoreTab "Потерянные" "Потерянные записи" TabMoreMissing "Сироты" "Осиротевшие записи" TabMoreOrphans "Скрытые" "Скрытые записи" TabMoreShadowed>>'
	});

merge(config.annotations,{
	AdvancedOptions: "Данная запись предоставляет доступ к расширенным настройкам",
	ColorPalette: "Изменяя значения данной записи вы сможете изменять цветовую схему оформления ~TiddlyWiki",
	DefaultTiddlers: "Записи перечисленные здесь автоматически показываются при запуске ~TiddlyWiki",
	EditTemplate: "HTML шаблон в этой записи определяет как будут выглядеть записи при их редактировании",
	GettingStarted: "Здесь перечислены базовые инструкции по использованию программы",
	ImportTiddlers: "Используя эту запись вы сможете импортировать другие записи",
	MainMenu: "Здесь перечислено содержимое главного меню, отображаемого слева на экране",
	MarkupPreHead: "Эта запись будет вставлена в вершину секции <head> HTML файла TiddlyWiki",
	MarkupPostHead: "Эта запись будет вставлена снизу секции <head> HTML файла TiddlyWiki",
	MarkupPreBody: "Эта запись будет вставлена в вершину секции <body> HTML файла TiddlyWiki",
	MarkupPostBody: "Эта запись будет вставлена снизу секции <body> HTML файла TiddlyWiki после бюлока скриптов",
	OptionsPanel: "Здесь определно содержимое выпадающей справа панели настроек",
	PageTemplate: "HTML шаблон внутри этой записи определяет общий макет ~TiddlyWiki",
	PluginManager: "Доступ к панели управления дополнениями",
	SideBarOptions: "Позволяет отредактировать содержимое панели опций справа",
	SideBarTabs: "Содержимое панели закладок справа",
	SiteSubtitle: "Содержимое подзаголовка сайта",
	SiteTitle: "Содержимое заголовка сайта",
	SiteUrl: "URL сайта для публикации",
	StyleSheetColors: "Содержимое CSS определяющий цвета элементов страницы. ''НЕ РЕДАКТИРУЙТЕ ЭТУ ЗАПИСЬ'', вносите свои изменения в скрытую запись StyleSheet",
	StyleSheet: "Эта запись определяет пользователский CSS",
	StyleSheetLayout: "Соджержит CSS определяющий расположение элементов на странице. ''НЕ РЕДАКТИРУЙТЕ ЭТУ ЗАПИСЬ'', вносите свои изменения в скрытую запись StyleSheet",
	StyleSheetLocale: "Содержит CSS определяющий особенности первода",
	StyleSheetPrint: "Содержит CSS определяющий парааметры печати",
	TabAll: "Содержимое вкладки 'Всё' на правой на правой боковй панели",
	TabMore: "Содержимое вкладки 'Ещё' на правой на правой боковй панели",
	TabMoreMissing: "Содержимое вкладки 'Потерянные' на правой на правой боковй панели",
	TabMoreOrphans: "Содержимое вкладки 'Сироты' на правой на правой боковй панели",
	TabMoreShadowed: "Содержимое вкладки 'Скрытые' на правой на правой боковй панели",
	TabTags: "Содержимое вкладки 'Метки' на правой на правой боковй панели",
	TabTimeline: "Содержимое вкладки 'Хронология' на правой на правой боковй панели",
	ToolbarCommands: "Определяет команды панели инструментов",
	ViewTemplate: "HTML шаблон в этой записи определяет как будут отображаться записи"
	});

//}}}
Привествую, товарищи!
Введите текст для 'Новая запись'
А кто мну? А мну кафик =)) Связаться со мной можно так:
E-mail: v31337 ( at ) gmail ( dot ) com
ICQ: 578-126

Что люблю и чем занимаюсь? Люблю программирование, пиво, открытые технологии, хорошую музыку (русский рок типа Чайфов или Машины времени. а также шансона, только нормального, как у Трофима). Терпеть не могу вирусные лицензии, когда мой кот меня кусает, тормоза огнелиса и GTK.

Ну как-то так...

Кстати, я есть много где, например:

http://vkontakte.ru/id13577027 - Я в контакте
http://my.mail.ru/mail/antilamer_nospam - Я в моём мире
http://vitaly-kf.habrahabr.ru/ - Я на хабре
http://www.lastfm.ru/user/kafik-fafik - Я на last.fm
Здесь постараюсь собрать интересные дополнения для TiddlyWiki

[[TiddlersBarPlugin]] - показывает все записи вкладками. вместо одной сплоной полосы.

[[SyncFromSourcePlugin]] - синхронизация всех плагинов с их последними версиями. Ну или автообновление по лругому.

TagCloudPlugin - облако тегов

[[ru]] - перевод основного кода версии 2.4.1 на русский язык
Кое-что по сборке пакетов с оптимизацией:
http://iportnov.blogspot.com/2007/08/debian.html?showComment=1187701380000
Ссылки на различные сайты, посвящённые TiddlyWiki

http://www.tiddlywiki.com/ - официальный сайт.
http://ru.wikipedia.org/wiki/TiddlyWiki - малёхонькая обзорная статья в википедии.
http://www.tiddlywiki.org - Вики-сайт сообщества.
http://visualtw.ouvaton.org/VisualTW.html - Wysiwyg, tabs, fields editor and encryption plugins
http://tw.lewcid.org/ - a repository of my extensions for TW
http://www.tiddlytools.com/ - small tools for big ideas
Re: Защита прав гомосексуалистов расколола ООН
>>>Где-нибудь сажают за то, что ты гомосексуалист?>>Не поверишь, ст. 121 УК СССР>Бугога, откуда номер статьи знаешь?Хочу купить макбук, интересуюсь историей вопроса
--ist76 (linux.org.ru)