[[/how_to_use_giewiki/wiki1.png|/how_to_use_giewiki/wiki1.png]]
[[/how_to_use_giewiki/wiki3.png|/how_to_use_giewiki/wiki3.png]]
[[/how_to_use_giewiki/wiki2.png|/how_to_use_giewiki/wiki2.png]]
以下のリンクから、Google クラウドコンソールの画面を開いて下さい。
[[Google クラウドコンソール|https://console.cloud.google.com/]]
マクロを使用すると、特別なコンテンツを挿入できます。一般的に、以下の構文で適用されます。
{{{
<<マクロ名 パラメータ>>
}}}
パラメータの指定方法は各マクロごとに定義されます。複数のパラメータは空白で区切ります。パラメータの値が空白を含む場合は、"引用符で囲みます"
TiddlyWiki で定義されているマクロに加えて、giewiki は様々な目的で独自のマクロを追加しています。
プラグイン(giewiki の youtube プラグインなど)が固有のマクロを定義する場合もあるため、以下のマクロのリストは完全ではないかも知れません。
!!!汎用のマクロ
|!マクロ名|!用途|
|[[tiddler|Help on tiddler macro]]|それが適用された場所に、指定された tiddler のテキストを挿入する|
|[[gradient|Help on gradient macro]]|背景色にグラデーションを付けてテキストを表示する|
|[[slider|Help on slider macro]]|クリックするとスライドしてオープン/クローズするパネルを設置する|
|tabs|複数のタブを設置する (SideBarTabs のように)|
|[[image|Help on image macro]]|カラム幅全体のうちの指定されたパーセントの割合で、左または右にイメージ画像を設置する。|
!!!特殊用途のマクロ
|!マクロ名|!用途|
|today|今日の日付を表示する。オプションで書式を指定する文字列パラメータを指定できる。|
|version|使用されている TiddlyWiki のバージョンを表示する。|
|giewikiversion|使用されている giewiki のバージョンを表示する。|
|search|検索窓を表示する。|
|tag|特定のタグを持つすべての tiddler をリストするボタンを設置する。|
|tags|tagging 機能の一部を構成する。|
|tagging|tagging 機能の一部を構成する。|
|timeline|edit メニューにボタンを定義する。|
|allTags|右のインデックス領域にタグ付きの tiddler のリストを生成する。|
|list|インデックスリストのトップレベルのラッパーを生成する。|
|closeAll|ストーリーカラム内のすべての tiddler を閉じるボタンを作る。|
|permaview|現在表示されている tiddler のアドレスをブラウザのアドレスバーに表示するボタンを作る。|
|comments|このマクロを含む tiddler に対するコメントにアクセスしたりコメントを追加するためのツールバーを作る。|
|option|オプションパネルの実装の一部を構成する。|
|options|拡張オプションダイアログの実装の一部を構成する。|
|newTiddler|新しい tiddler を作るためのボタンを作る。|
|newJournal|newTiddler と同様だが、タイトルに今日の日付を挿入する。|
|message|指定された名前のグローバル変数の内容をテキスト表示する。|
|view|このマクロを含む tiddler の指定された名前のフィールドを表示する。(ViewTemplate 機能で使用される)|
|edit|入力ボックスを作り、初期値として指定された tiddler の内容を設定する。(EditTemplate 機能で使用される)|
|tagChooser|存在するタグの中から選択して tiddler に追加する。(EditTemplate 機能で使用される)|
|toolbar|各 tiddler の上に表示されているようなコマンドボタンの行を作る。|
!!!giewiki 固有のマクロ
|!マクロ名|!用途|
|importTiddlers|importTiddlers マクロを使えばweb上の、あるいはこのwebサイトにある ~TiddlyWiki ないし giewiki 文書を簡単にインポートできます。使い方:<br> {{{<<importTiddlers URL>>}}}<br>URL をあなたが使いたいライブラリのweb アドレスないしファイル名で置き換えて下さい。|
/***
|Name:|HideWhenPlugin|
|Description:|Allows conditional inclusion/exclusion in templates|
|Version:|3.1 ($Rev: 3919 $)|
|Date:|$Date: 2008-03-13 02:03:12 +1000 (Thu, 13 Mar 2008) $|
|Source:|http://mptw.tiddlyspot.com/#HideWhenPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
For use in ViewTemplate and EditTemplate. Example usage:
{{{<div macro="showWhenTagged Task">[[TaskToolbar]]</div>}}}
{{{<div macro="showWhen tiddler.modifier == 'BartSimpson'"><img src="bart.gif"/></div>}}}
***/
//{{{
window.hideWhenLastTest = false;
window.removeElementWhen = function(test,place) {
window.hideWhenLastTest = test;
if (test) {
removeChildren(place);
place.parentNode.removeChild(place);
}
};
merge(config.macros,{
hideWhen: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
removeElementWhen( eval(paramString), place);
}},
showWhen: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
removeElementWhen( !eval(paramString), place);
}},
hideWhenTagged: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
removeElementWhen( tiddler.tags.containsAll(params), place);
}},
showWhenTagged: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
removeElementWhen( !tiddler.tags.containsAll(params), place);
}},
hideWhenTaggedAny: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
removeElementWhen( tiddler.tags.containsAny(params), place);
}},
showWhenTaggedAny: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
removeElementWhen( !tiddler.tags.containsAny(params), place);
}},
hideWhenTaggedAll: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
removeElementWhen( tiddler.tags.containsAll(params), place);
}},
showWhenTaggedAll: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
removeElementWhen( !tiddler.tags.containsAll(params), place);
}},
hideWhenExists: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
removeElementWhen( store.tiddlerExists(params[0]) || store.isShadowTiddler(params[0]), place);
}},
showWhenExists: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
removeElementWhen( !(store.tiddlerExists(params[0]) || store.isShadowTiddler(params[0])), place);
}},
hideWhenTitleIs: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
removeElementWhen( tiddler.title == params[0], place);
}},
showWhenTitleIs: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
removeElementWhen( tiddler.title != params[0], place);
}},
'else': { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
removeElementWhen( !window.hideWhenLastTest, place);
}}
});
//}}}
[[/how_to_use_giewiki/1.png|/how_to_use_giewiki/1.png]]
!運用イメージ
[[必要な準備|SSL証明書を作成するスクリプトをGAEに仕込む]]を済ませたものとして、その後に定期的に発生する更新作業のイメージを示します。
!! リマインダーのメールが届く
更新時期になると、自分で設定しておいたメールが届きます。メールの中に、作業手順と必要なリンクが書いてあります。他人が見ても分からないでしょうが、以下の説明を見れば分かるようになります。私は4つのサイトのSSL証明書をすべて無料で取得していますので、リンクも4個分あります。
<<image ssl1.png|https://wiki.altalk.com/how_to_use_giewiki/ssl1.png>>
!!Google コンソールを開きます。
メールに書いてあるリンクをクリックして、コンソールを開きます。
右上のアイコンから、Google Cloud Shell を開きます。
プロジェクト名をクリックして、対象のプロジェクトを選択します。
左上のバーガーアイコンから、App Engine を選択、左のメニューから設定を選択します。
設定画面のタブから「SSL証明書」を選択します。
<<image ssl2.png|https://wiki.altalk.com/how_to_use_giewiki/ssl2.png>>
!!スクリプトを実行-ステップ1
メールに書いてあるリンクをクリックして、証明書発行スクリプトのURLにアクセスします。
なお、このURLはGAEアプリの管理権限のあるGoogleアカウントでログインした状態でなければアクセスできません。手順通りにやれば、コンソールを開いた時点でログイン済みのはずです。
{{{http://独自ドメイン名/.well-known/acme-challenge/}}}
表示された 「curl ...」 という文字列を Ctrl-C でコピーします。
<<image ssl3.png|https://wiki.altalk.com/how_to_use_giewiki/ssl3.png>>
!!スクリプトを実行-ステップ2
先ほど開いておいた、Google Cloud Shell に Ctrl-V でペーストします。
<<image ssl4.png|https://wiki.altalk.com/how_to_use_giewiki/ssl4.png>>
実行すると、証明書の内容が表示されます。BEGIN と END に挟まれた ~DxjJVGtcknGL... みたいな長い文字列が証明書です。
<<image ssl5.png|https://wiki.altalk.com/how_to_use_giewiki/ssl5.png>>
!!証明書をアップロード
コンソールの画面に戻り、「新しい証明書をアップロード」のボタンをクリックします。
名前は他の証明書と区別する必要があれば入力します。そのままでも構いません。
中央の箱に先ほどのスクリプトの結果の1個目と2個目の BEGIN から END までを(公開鍵)、下の箱に3個目の BEGIN から END までを(秘密鍵)コピー&ペーストします。「アップロード」ボタンをクリックします。
<<image ssl6.png|https://wiki.altalk.com/how_to_use_giewiki/ssl6.png>>
!!証明書を保存します
ドメイン名が表示されるので、チェックボックスをチェックします。「保存」ボタンをクリックします。
<<image ssl7.png|https://wiki.altalk.com/how_to_use_giewiki/ssl7.png>>
!!確認する
以上でSSL証明書の更新(初めてのときも同じ)が完了しました。念のため、確認します。
{{{https://独自ドメイン名}}}
で問題なく表示されたらOKです。私は http => https へのリダイレクトも仕込んであるので、代わりに
{{{http://独自ドメイン名}}}
にアクセスして、ブラウザのURLが https になり、鍵アイコンも表示されていることを確認しています。
/***
|''Name:''|SWFObjectPlugin|
|''Description:''|Adobe Flash Embedding|
|''Version:''|1.0.0|
|''Date:''|Aug 22, 2010|
|''Source:''|http://giewiki.appspot.com/plugins/YoutubePlugin#SWFObjectPlugin|
|''License:''|[[MIT open source license]]|
|''~CoreVersion:''|2.1.0|
|''Browser:''|Chrome; Safari; Firefox; InternetExplorer 6.0|
***/
//{{{
// tags: systemConfig fromTemplate excludeLists excludeSearch
// SWFObject v2.2 (http://code.google.com/p/swfobject/)
// is released under the MIT License (http://www.opensource.org/licenses/mit-license.php)
var swfobject=function(){var D="undefined",r="object",S="Shockwave Flash",W="ShockwaveFlash.ShockwaveFlash",q="application/x-shockwave-flash",R="SWFObjectExprInst",x="onreadystatechange",O=window,j=document,t=navigator,T=false,U=[h],o=[],N=[],I=[],l,Q,E,B,J=false,a=false,n,G,m=true,M=function(){var aa=typeof j.getElementById!=D&&typeof j.getElementsByTagName!=D&&typeof j.createElement!=D,ah=t.userAgent.toLowerCase(),Y=t.platform.toLowerCase(),ae=Y?/win/.test(Y):/win/.test(ah),ac=Y?/mac/.test(Y):/mac/.test(ah),af=/webkit/.test(ah)?parseFloat(ah.replace(/^.*webkit\/(\d+(\.\d+)?).*$/,"$1")):false,X=!+"\v1",ag=[0,0,0],ab=null;if(typeof t.plugins!=D&&typeof t.plugins[S]==r){ab=t.plugins[S].description;if(ab&&!(typeof t.mimeTypes!=D&&t.mimeTypes[q]&&!t.mimeTypes[q].enabledPlugin)){T=true;X=false;ab=ab.replace(/^.*\s+(\S+\s+\S+$)/,"$1");ag[0]=parseInt(ab.replace(/^(.*)\..*$/,"$1"),10);ag[1]=parseInt(ab.replace(/^.*\.(.*)\s.*$/,"$1"),10);ag[2]=/[a-zA-Z]/.test(ab)?parseInt(ab.replace(/^.*[a-zA-Z]+(.*)$/,"$1"),10):0}}else{if(typeof O.ActiveXObject!=D){try{var ad=new ActiveXObject(W);if(ad){ab=ad.GetVariable("$version");if(ab){X=true;ab=ab.split(" ")[1].split(",");ag=[parseInt(ab[0],10),parseInt(ab[1],10),parseInt(ab[2],10)]}}}catch(Z){}}}return{w3:aa,pv:ag,wk:af,ie:X,win:ae,mac:ac}}(),k=function(){if(!M.w3){return}if((typeof j.readyState!=D&&j.readyState=="complete")||(typeof j.readyState==D&&(j.getElementsByTagName("body")[0]||j.body))){f()}if(!J){if(typeof j.addEventListener!=D){j.addEventListener("DOMContentLoaded",f,false)}if(M.ie&&M.win){j.attachEvent(x,function(){if(j.readyState=="complete"){j.detachEvent(x,arguments.callee);f()}});if(O==top){(function(){if(J){return}try{j.documentElement.doScroll("left")}catch(X){setTimeout(arguments.callee,0);return}f()})()}}if(M.wk){(function(){if(J){return}if(!/loaded|complete/.test(j.readyState)){setTimeout(arguments.callee,0);return}f()})()}s(f)}}();function f(){if(J){return}try{var Z=j.getElementsByTagName("body")[0].appendChild(C("span"));Z.parentNode.removeChild(Z)}catch(aa){return}J=true;var X=U.length;for(var Y=0;Y<X;Y++){U[Y]()}}function K(X){if(J){X()}else{U[U.length]=X}}function s(Y){if(typeof O.addEventListener!=D){O.addEventListener("load",Y,false)}else{if(typeof j.addEventListener!=D){j.addEventListener("load",Y,false)}else{if(typeof O.attachEvent!=D){i(O,"onload",Y)}else{if(typeof O.onload=="function"){var X=O.onload;O.onload=function(){X();Y()}}else{O.onload=Y}}}}}function h(){if(T){V()}else{H()}}function V(){var X=j.getElementsByTagName("body")[0];var aa=C(r);aa.setAttribute("type",q);var Z=X.appendChild(aa);if(Z){var Y=0;(function(){if(typeof Z.GetVariable!=D){var ab=Z.GetVariable("$version");if(ab){ab=ab.split(" ")[1].split(",");M.pv=[parseInt(ab[0],10),parseInt(ab[1],10),parseInt(ab[2],10)]}}else{if(Y<10){Y++;setTimeout(arguments.callee,10);return}}X.removeChild(aa);Z=null;H()})()}else{H()}}function H(){var ag=o.length;if(ag>0){for(var af=0;af<ag;af++){var Y=o[af].id;var ab=o[af].callbackFn;var aa={success:false,id:Y};if(M.pv[0]>0){var ae=c(Y);if(ae){if(F(o[af].swfVersion)&&!(M.wk&&M.wk<312)){w(Y,true);if(ab){aa.success=true;aa.ref=z(Y);ab(aa)}}else{if(o[af].expressInstall&&A()){var ai={};ai.data=o[af].expressInstall;ai.width=ae.getAttribute("width")||"0";ai.height=ae.getAttribute("height")||"0";if(ae.getAttribute("class")){ai.styleclass=ae.getAttribute("class")}if(ae.getAttribute("align")){ai.align=ae.getAttribute("align")}var ah={};var X=ae.getElementsByTagName("param");var ac=X.length;for(var ad=0;ad<ac;ad++){if(X[ad].getAttribute("name").toLowerCase()!="movie"){ah[X[ad].getAttribute("name")]=X[ad].getAttribute("value")}}P(ai,ah,Y,ab)}else{p(ae);if(ab){ab(aa)}}}}}else{w(Y,true);if(ab){var Z=z(Y);if(Z&&typeof Z.SetVariable!=D){aa.success=true;aa.ref=Z}ab(aa)}}}}}function z(aa){var X=null;var Y=c(aa);if(Y&&Y.nodeName=="OBJECT"){if(typeof Y.SetVariable!=D){X=Y}else{var Z=Y.getElementsByTagName(r)[0];if(Z){X=Z}}}return X}function A(){return !a&&F("6.0.65")&&(M.win||M.mac)&&!(M.wk&&M.wk<312)}function P(aa,ab,X,Z){a=true;E=Z||null;B={success:false,id:X};var ae=c(X);if(ae){if(ae.nodeName=="OBJECT"){l=g(ae);Q=null}else{l=ae;Q=X}aa.id=R;if(typeof aa.width==D||(!/%$/.test(aa.width)&&parseInt(aa.width,10)<310)){aa.width="310"}if(typeof aa.height==D||(!/%$/.test(aa.height)&&parseInt(aa.height,10)<137)){aa.height="137"}j.title=j.title.slice(0,47)+" - Flash Player Installation";var ad=M.ie&&M.win?"ActiveX":"PlugIn",ac="MMredirectURL="+O.location.toString().replace(/&/g,"%26")+"&MMplayerType="+ad+"&MMdoctitle="+j.title;if(typeof ab.flashvars!=D){ab.flashvars+="&"+ac}else{ab.flashvars=ac}if(M.ie&&M.win&&ae.readyState!=4){var Y=C("div");X+="SWFObjectNew";Y.setAttribute("id",X);ae.parentNode.insertBefore(Y,ae);ae.style.display="none";(function(){if(ae.readyState==4){ae.parentNode.removeChild(ae)}else{setTimeout(arguments.callee,10)}})()}u(aa,ab,X)}}function p(Y){if(M.ie&&M.win&&Y.readyState!=4){var X=C("div");Y.parentNode.insertBefore(X,Y);X.parentNode.replaceChild(g(Y),X);Y.style.display="none";(function(){if(Y.readyState==4){Y.parentNode.removeChild(Y)}else{setTimeout(arguments.callee,10)}})()}else{Y.parentNode.replaceChild(g(Y),Y)}}function g(ab){var aa=C("div");if(M.win&&M.ie){aa.innerHTML=ab.innerHTML}else{var Y=ab.getElementsByTagName(r)[0];if(Y){var ad=Y.childNodes;if(ad){var X=ad.length;for(var Z=0;Z<X;Z++){if(!(ad[Z].nodeType==1&&ad[Z].nodeName=="PARAM")&&!(ad[Z].nodeType==8)){aa.appendChild(ad[Z].cloneNode(true))}}}}}return aa}function u(ai,ag,Y){var X,aa=c(Y);if(M.wk&&M.wk<312){return X}if(aa){if(typeof ai.id==D){ai.id=Y}if(M.ie&&M.win){var ah="";for(var ae in ai){if(ai[ae]!=Object.prototype[ae]){if(ae.toLowerCase()=="data"){ag.movie=ai[ae]}else{if(ae.toLowerCase()=="styleclass"){ah+=' class="'+ai[ae]+'"'}else{if(ae.toLowerCase()!="classid"){ah+=" "+ae+'="'+ai[ae]+'"'}}}}}var af="";for(var ad in ag){if(ag[ad]!=Object.prototype[ad]){af+='<param name="'+ad+'" value="'+ag[ad]+'" />'}}aa.outerHTML='<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"'+ah+">"+af+"</object>";N[N.length]=ai.id;X=c(ai.id)}else{var Z=C(r);Z.setAttribute("type",q);for(var ac in ai){if(ai[ac]!=Object.prototype[ac]){if(ac.toLowerCase()=="styleclass"){Z.setAttribute("class",ai[ac])}else{if(ac.toLowerCase()!="classid"){Z.setAttribute(ac,ai[ac])}}}}for(var ab in ag){if(ag[ab]!=Object.prototype[ab]&&ab.toLowerCase()!="movie"){e(Z,ab,ag[ab])}}aa.parentNode.replaceChild(Z,aa);X=Z}}return X}function e(Z,X,Y){var aa=C("param");aa.setAttribute("name",X);aa.setAttribute("value",Y);Z.appendChild(aa)}function y(Y){var X=c(Y);if(X&&X.nodeName=="OBJECT"){if(M.ie&&M.win){X.style.display="none";(function(){if(X.readyState==4){b(Y)}else{setTimeout(arguments.callee,10)}})()}else{X.parentNode.removeChild(X)}}}function b(Z){var Y=c(Z);if(Y){for(var X in Y){if(typeof Y[X]=="function"){Y[X]=null}}Y.parentNode.removeChild(Y)}}function c(Z){var X=null;try{X=j.getElementById(Z)}catch(Y){}return X}function C(X){return j.createElement(X)}function i(Z,X,Y){Z.attachEvent(X,Y);I[I.length]=[Z,X,Y]}function F(Z){var Y=M.pv,X=Z.split(".");X[0]=parseInt(X[0],10);X[1]=parseInt(X[1],10)||0;X[2]=parseInt(X[2],10)||0;return(Y[0]>X[0]||(Y[0]==X[0]&&Y[1]>X[1])||(Y[0]==X[0]&&Y[1]==X[1]&&Y[2]>=X[2]))?true:false}function v(ac,Y,ad,ab){if(M.ie&&M.mac){return}var aa=j.getElementsByTagName("head")[0];if(!aa){return}var X=(ad&&typeof ad=="string")?ad:"screen";if(ab){n=null;G=null}if(!n||G!=X){var Z=C("style");Z.setAttribute("type","text/css");Z.setAttribute("media",X);n=aa.appendChild(Z);if(M.ie&&M.win&&typeof j.styleSheets!=D&&j.styleSheets.length>0){n=j.styleSheets[j.styleSheets.length-1]}G=X}if(M.ie&&M.win){if(n&&typeof n.addRule==r){n.addRule(ac,Y)}}else{if(n&&typeof j.createTextNode!=D){n.appendChild(j.createTextNode(ac+" {"+Y+"}"))}}}function w(Z,X){if(!m){return}var Y=X?"visible":"hidden";if(J&&c(Z)){c(Z).style.visibility=Y}else{v("#"+Z,"visibility:"+Y)}}function L(Y){var Z=/[\\\"<>\.;]/;var X=Z.exec(Y)!=null;return X&&typeof encodeURIComponent!=D?encodeURIComponent(Y):Y}var d=function(){if(M.ie&&M.win){window.attachEvent("onunload",function(){var ac=I.length;for(var ab=0;ab<ac;ab++){I[ab][0].detachEvent(I[ab][1],I[ab][2])}var Z=N.length;for(var aa=0;aa<Z;aa++){y(N[aa])}for(var Y in M){M[Y]=null}M=null;for(var X in swfobject){swfobject[X]=null}swfobject=null})}}();return{registerObject:function(ab,X,aa,Z){if(M.w3&&ab&&X){var Y={};Y.id=ab;Y.swfVersion=X;Y.expressInstall=aa;Y.callbackFn=Z;o[o.length]=Y;w(ab,false)}else{if(Z){Z({success:false,id:ab})}}},getObjectById:function(X){if(M.w3){return z(X)}},embedSWF:function(ab,ah,ae,ag,Y,aa,Z,ad,af,ac){var X={success:false,id:ah};if(M.w3&&!(M.wk&&M.wk<312)&&ab&&ah&&ae&&ag&&Y){w(ah,false);K(function(){ae+="";ag+="";var aj={};if(af&&typeof af===r){for(var al in af){aj[al]=af[al]}}aj.data=ab;aj.width=ae;aj.height=ag;var am={};if(ad&&typeof ad===r){for(var ak in ad){am[ak]=ad[ak]}}if(Z&&typeof Z===r){for(var ai in Z){if(typeof am.flashvars!=D){am.flashvars+="&"+ai+"="+Z[ai]}else{am.flashvars=ai+"="+Z[ai]}}}if(F(Y)){var an=u(aj,am,ah);if(aj.id==ah){w(ah,true)}X.success=true;X.ref=an}else{if(aa&&A()){aj.data=aa;P(aj,am,ah,ac);return}else{w(ah,true)}}if(ac){ac(X)}})}else{if(ac){ac(X)}}},switchOffAutoHideShow:function(){m=false},ua:M,getFlashPlayerVersion:function(){return{major:M.pv[0],minor:M.pv[1],release:M.pv[2]}},hasFlashPlayerVersion:F,createSWF:function(Z,Y,X){if(M.w3){return u(Z,Y,X)}else{return undefined}},showExpressInstall:function(Z,aa,X,Y){if(M.w3&&A()){P(Z,aa,X,Y)}},removeSWF:function(X){if(M.w3){y(X)}},createCSS:function(aa,Z,Y,X){if(M.w3){v(aa,Z,Y,X)}},addDomLoadEvent:K,addLoadEvent:s,getQueryParamValue:function(aa){var Z=j.location.search||j.location.hash;if(Z){if(/\?/.test(Z)){Z=Z.split("?")[1]}if(aa==null){return L(Z)}var Y=Z.split("&");for(var X=0;X<Y.length;X++){if(Y[X].substring(0,Y[X].indexOf("="))==aa){return L(Y[X].substring((Y[X].indexOf("=")+1)))}}}return""},expressInstallCallback:function(){if(a){var X=c(R);if(X&&l){X.parentNode.replaceChild(l,X);if(Q){w(Q,true);if(M.ie&&M.win){l.style.display="block"}}if(E){E(B)}}a=false}}}}();
//}}}
[[giewikiの使い方]]
[[giewikiとは]]
[[インストール]]
[[Google アカウント|Google アカウント(gmailのアドレスなど)を手に入れる]]
[[プロジェクト作成|GAE プロジェクトを作成する]]
[[SDKインストール|Google Cloud SDK をインストールする]]
[[アップロード|giewikiをGoogleのサーバにアップロードする]]
[[初期設定する]]
[[独自ドメインを使う]]
[[無料でSSL化する]]
|Name|MptwTheme|
|Description|Mptw Theme including custom PageLayout|
|Modified|Added comments div|
|PageTemplate|##PageTemplate|
|ViewTemplate|##ViewTemplate|
|EditTemplate|##EditTemplate|
|StyleSheet|##StyleSheet|
http://mptw.tiddlyspot.com/#MptwTheme ($Rev: 1829 $)
!PageTemplate
<!--{{{-->
<div class='header' macro='gradient vert [[ColorPalette::PrimaryLight]] [[ColorPalette::PrimaryMid]]'>
<div class='headerForeground'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
</div>
<!-- horizontal MainMenu -->
<div id='topMenu' refresh='content' tiddler='MainMenu'></div>
<!-- original MainMenu menu -->
<!-- <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>
<!--}}}-->
!ViewTemplate
<!--{{{-->
<div class="uncollapsedView">
[[MptwTheme##ViewTemplateToolbar]]
<div class="tagglyTagged" macro="tags"></div>
<div class='titleContainer'>
<span class='title' macro='view title'></span>
<span macro="miniTag"></span>
</div>
<div class='subtitle'>
(updated <span macro='view modified date {{config.mptwDateFormat?config.mptwDateFormat:"MM/0DD/YY"}}'></span>
by <span macro='view modifier link'></span>) <span macro='history'></span>
<!--
(<span macro='message views.wikified.createdPrompt'></span>
<span macro='view created date {{config.mptwDateFormat?config.mptwDateFormat:"MM/0DD/YY"}}'></span>)
-->
</div>
<div class='viewer' macro='view versions wikified'></div>
<div macro="showWhen tiddler.tags.containsAny(['css','html','pre','systemConfig']) && !tiddler.text.match('{{'+'{')">
<div class='viewer'><pre macro='view text'></pre></div>
</div>
<div macro="else">
<div class='viewer' macro='view text wikified'></div>
</div>
<div class="tagglyTagging" macro="tagglyTagging"></div>
<div class="comments" macro="comments"></div>
</div>
<div class="collapsedView">
<span class='toolbar'>
<span macro='toolbar closeTiddler'></span>
<span macro='mptwCollapse +'></span>
</span>
<span class='title' macro='view title'></span>
</div>
<!--}}}-->
!ViewTemplateToolbar
<!--{{{-->
<div class='toolbar'>
<span macro="showWhenTagged systemConfig">
<span macro="toggleTag systemConfigDisable . '[[disable|systemConfigDisable]]'"></span>
</span>
<span macro="showWhenTagged systemTheme"><span macro="applyTheme"></span></span>
<span macro="showWhenTagged systemPalette"><span macro="applyPalette"></span></span>
<span macro="showWhen tiddler.tags.contains('css') || tiddler.title == 'StyleSheet'"><span macro="refreshAll"></span></span>
<span style="padding:1em;"></span>
<span macro='toolbar closeTiddler closeOthers +editTiddler deleteTiddler > fields syncing permalink references jump'></span> <span macro='newHere label:"new here"'></span>
<span macro='newJournalHere {{config.mptwJournalFormat?config.mptwJournalFormat:"MM/0DD/YY"}}'></span>
<!--span macro='mptwCollapse -'></span-->
</div>
<!--}}}-->
!EditTemplate
<!--{{{-->
<div class='toolbar' macro='toolbar toolbar +saveTiddler saveCloseTiddler closeOthers -cancelTiddler cancelCloseTiddler lockTiddler deleteTiddler revertTiddler truncateTiddler'></div>
<div class='title' macro='view title'></div>
<fieldset><legend>Title</legend><div class='editor' macro='edit title'></div></fieldset>
<div macro='annotations'></div>
<fieldset><legend>Text</legend><div class='editor' macro='edit text'></div>
<table style='width:100%;'><tr><td><div class='commentToolbar' macro='toolbar [[ToolbarCommands::TextToolbar]]'></td><td align='right'><div class='toolbar' macro='toolbar [[ToolbarCommands::EditToolbar]]'></div></td></tr></table> </fieldset>
<fieldset id='preview' style='display:none'><legend>Preview</legend><div class='preview' ></div></fieldset>
<fieldset id='tag' class='tagFrame'><legend>Tags</legend><div class='editor' macro='edit tags'></div><div class='editorFooter'><span macro='message views.editor.tagPrompt'></span><span macro='tagChooser'></span></div></fieldset>
<!--}}}-->
!StyleSheet
/*{{{*/
/* a contrasting background so I can see where one tiddler ends and the other begins */
body {
background: [[ColorPalette::TertiaryLight]];
}
/* sexy colours and font for the header */
.headerForeground {
color: [[ColorPalette::PrimaryPale]];
}
.headerShadow, .headerShadow a {
color: [[ColorPalette::PrimaryMid]];
}
/* separate the top menu parts */
.headerForeground, .headerShadow {
padding: 1em 1em 0;
}
.headerForeground, .headerShadow {
font-family: 'Trebuchet MS', sans-serif;
font-weight:bold;
}
.headerForeground .siteSubtitle {
color: [[ColorPalette::PrimaryLight]];
}
.headerShadow .siteSubtitle {
color: [[ColorPalette::PrimaryMid]];
}
/* make shadow go and down right instead of up and left */
.headerShadow {
left: 1px;
top: 1px;
}
/* prefer monospace for editing */
.editor textarea, .editor input {
font-family: 'Consolas', monospace;
background-color:[[ColorPalette::TertiaryPale]];
}
/* sexy tiddler titles */
.title {
font-size: 250%;
color: [[ColorPalette::PrimaryLight]];
font-family: 'Trebuchet MS', sans-serif;
}
/* more subtle tiddler subtitle */
.subtitle {
padding:0px;
margin:0px;
padding-left:1em;
font-size: 90%;
color: [[ColorPalette::TertiaryMid]];
}
.subtitle .tiddlyLink {
color: [[ColorPalette::TertiaryMid]];
}
/* a little bit of extra whitespace */
.viewer {
padding-bottom:3px;
}
/* don't want any background color for headings */
h1,h2,h3,h4,h5,h6 {
background-color: transparent;
color: [[ColorPalette::Foreground]];
}
/* give tiddlers 3d style border and explicit background */
.tiddler {
background: [[ColorPalette::Background]];
border-right: 2px [[ColorPalette::TertiaryMid]] solid;
border-bottom: 2px [[ColorPalette::TertiaryMid]] solid;
margin-bottom: 1em;
padding:1em 2em 2em 1.5em;
}
/* make options slider look nicer */
#sidebarOptions .sliderPanel {
border:solid 1px [[ColorPalette::PrimaryLight]];
}
/* the borders look wrong with the body background */
#sidebar .button {
border-style: none;
}
/* this means you can put line breaks in SidebarOptions for readability */
#sidebarOptions br {
display:none;
}
/* undo the above in OptionsPanel */
#sidebarOptions .sliderPanel br {
display:inline;
}
/* horizontal main menu stuff */
#displayArea {
margin: 1em 15.7em 0em 1em; /* use the freed up space */
}
#topMenu br {
display: none;
}
#topMenu {
background: [[ColorPalette::PrimaryMid]];
color:[[ColorPalette::PrimaryPale]];
}
#topMenu {
padding:2px;
}
#topMenu .button, #topMenu .tiddlyLink, #topMenu a {
margin-left: 0.5em;
margin-right: 0.5em;
padding-left: 3px;
padding-right: 3px;
color: [[ColorPalette::PrimaryPale]];
font-size: 115%;
}
#topMenu .button:hover, #topMenu .tiddlyLink:hover {
background: [[ColorPalette::PrimaryDark]];
}
/* make 2.2 act like 2.1 with the invisible buttons */
.toolbar {
visibility:hidden;
}
.selected .toolbar {
visibility:visible;
}
/* experimental. this is a little borked in IE7 with the button
* borders but worth it I think for the extra screen realestate */
.toolbar { float:right; }
/* fix for TaggerPlugin. from sb56637. improved by FND */
.popup li .tagger a {
display:inline;
}
/* makes theme selector look a little better */
#sidebarOptions .sliderPanel .select .button {
padding:0.5em;
display:block;
}
#sidebarOptions .sliderPanel .select br {
display:none;
}
/* make it print a little cleaner */
@media print {
#topMenu {
display: none ! important;
}
/* not sure if we need all the importants */
.tiddler {
border-style: none ! important;
margin:0px ! important;
padding:0px ! important;
padding-bottom:2em ! important;
}
.tagglyTagging .button, .tagglyTagging .hidebutton {
display: none ! important;
}
.headerShadow {
visibility: hidden ! important;
}
.tagglyTagged .quickopentag, .tagged .quickopentag {
border-style: none ! important;
}
.quickopentag a.button, .miniTag {
display: none ! important;
}
}
/* get user styles specified in StyleSheet */
[[StyleSheet]]
/*}}}*/
/***
|Name:|ToggleTagPlugin|
|Description:|Makes a checkbox which toggles a tag in a tiddler|
|Version:|3.1.0 ($Rev: 4907 $)|
|Date:|$Date: 2008-05-13 03:15:46 +1000 (Tue, 13 May 2008) $|
|Source:|http://mptw.tiddlyspot.com/#ToggleTagPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
!!Usage
{{{<<toggleTag }}}//{{{TagName TiddlerName LabelText}}}//{{{>>}}}
* TagName - the tag to be toggled, default value "checked"
* TiddlerName - the tiddler to toggle the tag in, default value the current tiddler
* LabelText - the text (gets wikified) to put next to the check box, default value is '{{{[[TagName]]}}}' or '{{{[[TagName]] [[TiddlerName]]}}}'
(If a parameter is '.' then the default will be used)
* TouchMod flag - if non empty then touch the tiddlers mod date. Note, can set config.toggleTagAlwaysTouchModDate to always touch mod date
!!Examples
|Code|Description|Example|h
|{{{<<toggleTag>>}}}|Toggles the default tag (checked) in this tiddler|<<toggleTag>>|
|{{{<<toggleTag TagName>>}}}|Toggles the TagName tag in this tiddler|<<toggleTag TagName>>|
|{{{<<toggleTag TagName TiddlerName>>}}}|Toggles the TagName tag in the TiddlerName tiddler|<<toggleTag TagName TiddlerName>>|
|{{{<<toggleTag TagName TiddlerName 'click me'>>}}}|Same but with custom label|<<toggleTag TagName TiddlerName 'click me'>>|
|{{{<<toggleTag . . 'click me'>>}}}|dot means use default value|<<toggleTag . . 'click me'>>|
!!Notes
* If TiddlerName doesn't exist it will be silently created
* Set label to '-' to specify no label
* See also http://mgtd-alpha.tiddlyspot.com/#ToggleTag2
!!Known issues
* Doesn't smoothly handle the case where you toggle a tag in a tiddler that is current open for editing
* Should convert to use named params
***/
//{{{
if (config.toggleTagAlwaysTouchModDate == undefined) config.toggleTagAlwaysTouchModDate = false;
merge(config.macros,{
toggleTag: {
createIfRequired: true,
shortLabel: "[[%0]]",
longLabel: "[[%0]] [[%1]]",
handler: function(place,macroName,params,wikifier,paramString,tiddler) {
var tiddlerTitle = tiddler ? tiddler.title : '';
var tag = (params[0] && params[0] != '.') ? params[0] : "checked";
var title = (params[1] && params[1] != '.') ? params[1] : tiddlerTitle;
var defaultLabel = (title == tiddlerTitle ? this.shortLabel : this.longLabel);
var label = (params[2] && params[2] != '.') ? params[2] : defaultLabel;
var touchMod = (params[3] && params[3] != '.') ? params[3] : "";
label = (label == '-' ? '' : label); // dash means no label
var theTiddler = (title == tiddlerTitle ? tiddler : store.getTiddler(title));
var cb = createTiddlyCheckbox(place, label.format([tag,title]), theTiddler && theTiddler.isTagged(tag), function(e) {
if (!store.tiddlerExists(title)) {
if (config.macros.toggleTag.createIfRequired) {
var content = store.getTiddlerText(title); // just in case it's a shadow
store.saveTiddler(title,title,content?content:"",config.options.txtUserName,new Date(),null);
}
else
return false;
}
if ((touchMod != "" || config.toggleTagAlwaysTouchModDate) && theTiddler)
theTiddler.modified = new Date();
store.setTiddlerTag(title,this.checked,tag);
return true;
});
}
}
});
//}}}
Name: MptwTeal
Background: #fff
Foreground: #000
PrimaryPale: #B5D1DF
PrimaryLight: #618FA9
PrimaryMid: #1a3844
PrimaryDark: #000
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #f8f8f8
TertiaryLight: #bbb
TertiaryMid: #999
TertiaryDark: #888
Error: #f88
/***
|Name:|MptwConfigPlugin|
|Description:|Miscellaneous tweaks used by MPTW|
|Version:|1.0 ($Rev: 3646 $)|
|Requires script:|jQuery|
|Date:|$Date: 2008-02-27 02:34:38 +1000 (Wed, 27 Feb 2008) $|
|Source:|http://mptw.tiddlyspot.com/#MptwConfigPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License:|http://mptw.tiddlyspot.com/#MptwConfigPlugin|
!!Note: instead of editing this you should put overrides in MptwUserConfigPlugin
***/
//{{{
config.options.chkHttpReadOnly = false; // means web visitors can experiment with your site by clicking edit
config.options.chkInsertTabs = true; // tab inserts a tab when editing a tiddler
config.views.wikified.defaultText = ""; // don't need message when a tiddler doesn't exist
config.views.editor.defaultText = ""; // don't need message when creating a new tiddler
config.options.chkSaveBackups = true; // do save backups
config.options.txtBackupFolder = 'twbackup'; // put backups in a backups folder
config.options.chkAutoSave = (window.location.protocol == "file:"); // do autosave if we're in local file
config.mptwVersion = "2.5.3";
config.macros.mptwVersion={handler:function(place){wikify(config.mptwVersion,place);}};
if (config.options.txtTheme == '')
config.options.txtTheme = 'MptwTheme';
// add to default GettingStarted
config.shadowTiddlers.GettingStarted += "\n\nSee also [[MPTW]].";
// add select theme and palette controls in default OptionsPanel
config.shadowTiddlers.OptionsPanel = config.shadowTiddlers.OptionsPanel.replace(/(\n\-\-\-\-\nAlso see \[\[AdvancedOptions\]\])/, "{{select{<<selectTheme>>\n<<selectPalette>>}}}$1");
// these are used by ViewTemplate
config.mptwDateFormat = 'DD/MM/YY';
config.mptwJournalFormat = 'Journal DD/MM/YY';
//}}}
/***
|Name:|ExtentTagButtonPlugin|
|Description:|Adds a New tiddler button in the tag drop down|
|Version:|3.2 ($Rev: 3861 $)|
|Date:|$Date: 2008-03-08 10:53:09 +1000 (Sat, 08 Mar 2008) $|
|Source:|http://mptw.tiddlyspot.com/#ExtendTagButtonPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License|http://mptw.tiddlyspot.com/#TheBSDLicense|
***/
//{{{
window.onClickTag_mptw_orig = window.onClickTag;
window.onClickTag = function(e) {
window.onClickTag_mptw_orig.apply(this,arguments);
var tag = this.getAttribute("tag");
var title = this.getAttribute("tiddler");
// Thanks Saq, you're a genius :)
var popup = Popup.stack[Popup.stack.length-1].popup;
createTiddlyElement(createTiddlyElement(popup,"li",null,"listBreak"),"div");
wikify("<<newTiddler label:'New tiddler' tag:'"+tag+"'>>",createTiddlyElement(popup,"li"));
return false;
}
//}}}
無料でSSL証明書を取得して、GoogleAppEngine で使用する方法を説明します。
!Let's Encryptの証明書を~GoogleAppEngineに設定して独自ドメインで運用する
独自ドメインを使うことが前提ですので、まだ適用していないなら[[独自ドメインを使う]]を参照して下さい。逆に、独自ドメインではなくGAEのデフォルトのドメイン名 {{{プロジェクトID.appspot.com}}} を使う場合は、最初からSSL対応済みなので、そのまま https でアクセスできます。
giewiki について説明して来ましたが、この方法は一般の Google App Engine (以下GAE) アプリすべてに適用できます。
なお、ルートドメイン({{{https://mydomain.com}}}の形式) でも同じ方法でSSLが使えます。
ここで説明する方法は、
https://github.com/AirConsole/letsencrypt
の内容そのものですので、元サイトもご参照下さい。
!!Let's Encrypt とは
URLを http://~ ではなく https://~ にすると暗号化されてより安全になります。そのときに必要となるのが、SSL証明書です。
普通、SSL証明書は有料で、年額数万円程度必要になります。 Let's Encrypt はこれを無料にしてくれるサービスです。無料のSSL証明書は従来もありましたが、客寄せ目的の限定的なサービスで、安定して使えないものでした。Let's Encrypt は客寄せではなく無料SSLのための組織で、シスコやアカマイなど著名企業がスポンサーになっているので安定した運用が期待できます。
さて、この無料SSL証明書をGAE で使えることはたいへん素晴らしいのですが、問題は証明書の有効期限が90日に設定されていて、年4回も更新作業が発生することです。~EC2やホスティングサービスを使って Apache を運用しているなら、標準で提供されているスクリプトを使って自動更新ができるので問題ありません。しかしGAEはいまのところ、証明書の登録作業を GUI で行うしかないため、自動化ができません。
ここで説明する方法は、更新回数を減らすのではなく、単にその作業を楽にするというものです。すごく簡単で数分でできるので、私はこれで満足してて、定期的に更新をしてます。
<<image ssl5.png|https://wiki.altalk.com/how_to_use_giewiki/ssl5.png>>
以下で詳しく説明します。
* [[運用イメージ|SSL証明書登録の運用イメージ]]
* [[SSL証明書を作成するスクリプトをGAEに仕込む]]
/***
|Name:|PrettyDatesPlugin|
|Description:|Provides a new date format ('pppp') that displays times such as '2 days ago'|
|Version:|1.0 ($Rev: 3646 $)|
|Date:|$Date: 2008-02-27 02:34:38 +1000 (Wed, 27 Feb 2008) $|
|Source:|http://mptw.tiddlyspot.com/#PrettyDatesPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
!!Notes
* If you want to you can rename this plugin. :) Some suggestions: LastUpdatedPlugin, RelativeDatesPlugin, SmartDatesPlugin, SexyDatesPlugin.
* Inspired by http://ejohn.org/files/pretty.js
***/
//{{{
Date.prototype.prettyDate = function() {
var diff = (((new Date()).getTime() - this.getTime()) / 1000);
var day_diff = Math.floor(diff / 86400);
if (isNaN(day_diff)) return "";
else if (diff < 0) return "in the future";
else if (diff < 60) return "just now";
else if (diff < 120) return "1 minute ago";
else if (diff < 3600) return Math.floor(diff/60) + " minutes ago";
else if (diff < 7200) return "1 hour ago";
else if (diff < 86400) return Math.floor(diff/3600) + " hours ago";
else if (day_diff == 1) return "Yesterday";
else if (day_diff < 7) return day_diff + " days ago";
else if (day_diff < 14) return "a week ago";
else if (day_diff < 31) return Math.ceil(day_diff/7) + " weeks ago";
else if (day_diff < 62) return "a month ago";
else if (day_diff < 365) return "about " + Math.ceil(day_diff/31) + " months ago";
else if (day_diff < 730) return "a year ago";
else return Math.ceil(day_diff/365) + " years ago";
}
Date.prototype.formatString_orig_mptw = Date.prototype.formatString;
Date.prototype.formatString = function(template) {
return this.formatString_orig_mptw(template).replace(/pppp/,this.prettyDate());
}
// for MPTW. otherwise edit your ViewTemplate as required.
// config.mptwDateFormat = 'pppp (DD/MM/YY)';
config.mptwDateFormat = 'pppp';
//}}}
!!SDKをダウンロード、インストールする
以下のリンクから、SDKをダウンロードします。
https://cloud.google.com/sdk/
インストール(Windows)をクリックします。
インストール方法が表示されるので、これに従ってインストールします。
!!SDK を初期化する
インストールしたSDKと、Googleアカウントとを紐づける作業が必要です。
これも「Windows 用のクイックスタート」の画面で説明されていますので、説明に従って設定します。
「デフォルトのゾーン」を選択するときは、asia-east1 とか asia-northeast1 とかが表示されますが、asia-east1 は台湾、asia-northeast1 は東京を表しています。
!!PATHを設定する
コマンドプロンプトで gcloud コマンドが使えるようにするため、環境変数 PATH を設定する必要があります。
具体的な設定方法は「windows 環境変数PATHの設定」などと検索すれば、すぐ分かると思います。設定すべきPATHは、
{{{C:\SDKのインストール先\CloudSDK\google-cloud-sdk\bin}}}
です。
試しにコマンドプロンプトを開き、{{{gcloud version}}} と入力してみて下さい。私の場合、
{{{
(gae) C:\WORK\GCP\PROJ\altalk_dev\default>gcloud version
Google Cloud SDK 135.0.0
app-engine-go
app-engine-go-windows-x86_64 20160927
app-engine-python 1.9.40
bq 2.0.24
bq-win 2.0.24
bundled-python 2.7.10
core 2016.11.11
core-win 2016.11.07
gcloud
gsutil 4.22
gsutil-win 4.20
powershell 0.1.10.0
windows-ssh-tools 2016.05.13
}}}
と表示されました。
Name: MptwSmoke
Background: #fff
Foreground: #000
PrimaryPale: #aaa
PrimaryLight: #777
PrimaryMid: #111
PrimaryDark: #000
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
Error: #f88
<script>
config.macros.STETabInsert = {
handler: function(place, macroName, params) {
var inserter = function() {
var te = resolveTarget(window.event);
var name = te.innerText;
if (SpecialEditorTiddlers.indexOf(name) == -1) {
var stt = store.getTiddler('PageSetup');
var ixp = stt.text.indexOf("'All..'");
stt.text = [ stt.text.substring(0,ixp),"'",name,"' 'Edit ",name,"' 'js;editTiddlerHere;",name,"'\n",stt.text.substring(ixp) ].join('');
SpecialEditorTiddlers.push(name);
Story.prototype.specialCases[name] = Story.prototype.specialCaseEditorOpen;
}
config.options['chkPageSetup'] = name;
story.refreshTiddler('PageSetup',DEFAULT_VIEW_TEMPLATE,true);
};
createTiddlyButton(place,params[0],"Click to edit", inserter);
}
}
</script>''これらは giewiki によって使用される事前に定義された tiddler です。多くの場合、デフォルトの内容を持っていて特別な用途で使用されます。''
|<<STETabInsert AdvancedOptions>>|このtiddlerでは詳細オプションを設定できます|
|<<STETabInsert ColorPalette>>|この隠しtiddlerで設定された各値によって、この~TiddlyWikiでの色の枠組みが規定されます。|
|<<STETabInsert CreateNewPage>>|ページ作成時の画面|
|<<STETabInsert DefaultTiddlers>>|この隠しtiddlerに列挙された各tiddlerは、ページを読み込んだとき自動的に表示されます。|
|<<STETabInsert DefineGroup>>|ユーザグループを定義するときの画面|
|<<STETabInsert EditTemplate>>|この隠しtiddlerにあるHTMLテンプレートは、tiddler編集中の表示方法を決定します。|
|<<STETabInsert EditingMenu>>|編集権限があるときに右のサイドバーに挿入されるメニュー|
|File list|アップロードされたファイルのリスト|
|<<STETabInsert LibraryUsageHelp>>|ヘルプファイル|
|<<STETabInsert MainMenu>>|この隠しtiddlerの内容は「メインメニュー」に表示されます。画面左手に表示されます。|
|<<STETabInsert MoveThisPage>>|現在のページのアドレスを変更するときの画面|
|<<STETabInsert NoAccessMessage>>|DefaultTiddler を表示するとき、ユーザがそのページへのアクセス権がないとき代わりに表示される|
|<<STETabInsert OptionsPanel>>|この隠しtiddlerの内容は、右手のサイドバー内でスライド式のオプションパネルとして表示されます。|
|<<STETabInsert PageProperties>>|ページプロパティを定義するときの画面 (LoD)|
|<<STETabInsert PagePropertiesScript>>|ページプロパティを定義するときの画面で使用されるスクリプト (LoD)|
|<<STETabInsert PageSetup>>|ページ設定画面のトップレベルの tiddler|
|<<STETabInsert PageTemplate>>|この隠しtiddlerにあるHTMLテンプレートは、全体のページレイアウトを決定します。//これは [[ページテンプレート|PageTemplateHelp]] メカニズムとは別の概念です。//|
|<<STETabInsert PageTemplateHelp>>|ページテンプレートメカニズムを説明するヘルプファイル|
|<<STETabInsert PluginManager>>|この隠しtiddlerはプラグインマネージャ機能を提供します。|
|RecentChanges|最近変更された内容のリスト|
|RecentComments|最近のコメントのリスト|
|Recycle bin|削除された tiddler のリスト|
|<<STETabInsert SearchHistory>>|~SearchHistoryScript を用いて検索履歴を表示する (LoD)|
|<<STETabInsert SearchHistoryScript>>|検索履歴を表示するためのスクリプト (LoD)|
|<<STETabInsert SearchPanel>>|検索画面を表示するマクロを起動する|
|<<STETabInsert SearchOptionsPanel>>|検索オプションを設定するユーザインタフェース|
|<<STETabInsert SideBarOptions>>|この隠しtiddlerの内容は右手のサイドバー内のオプションパネルとして表示されます。|
|<<STETabInsert SideBarTabs>>|この隠しtiddlerの内容は右手のサイドバー内にタブパネルとして表示されます。|
|<<STETabInsert SiteMap>>|hidden タグを持たないすべてのページのマップを表示する|
|<<STETabInsert SiteSubtitle>>|この隠しtiddlerはページのサブタイトルとして利用されます。^^*^^|
|<<STETabInsert SiteTitle>>|この隠しtiddlerはページのメインタイトルとして利用されます。^^*^^|
|<<STETabInsert SiteUrl>>|この隠しtiddlerには、このWikiを公開する際のURLを指定します。|
|<<STETabInsert SpecialEditTemplate>>|PageSetup 画面の一部として使用されます|
|<<STETabInsert SpecialTiddlers>>|special tiddler のリストを表示します|
|<<STETabInsert SpecialViewTemplate>>|PageSetup 画面の一部として使用されます|
|<<STETabInsert StyleSheet>>|この隠しtiddlerはカスタムCSSを規定します。|
|<<STETabInsert StyleSheetColors>>|この隠しtiddlerはページ内各要素の色に関するCSSを規定します。このtiddlerを編集しないでください。色を修正するには代わりに StyleSheet 隠しtiddler を編集してください。|
|<<STETabInsert StyleSheetLayout>>|この隠しtiddlerはページ内各要素のレイアウトに関するCSSを規定します。このtiddlerを編集しないでください。レイアウトを修正するには代わりに StyleSheet 隠しtiddler を編集してください。|
|<<STETabInsert StyleSheetLocale>>|この隠しtiddlerはページ内各要素の翻訳ロケールに関するCSSを規定します。|
|<<STETabInsert StyleSheetPrint>>|この隠しtiddlerは印刷に関するCSSを規定します。|
|<<STETabInsert TabAll>>|この隠しtiddlerの内容は右手のサイドバー内「全て」タブに表示されます。|
|<<STETabInsert TabMore>>|この隠しtiddlerの内容は右手のサイドバー内「その他」タブに表示されます。|
|<<STETabInsert TabMoreMissing>>|この隠しtiddlerの内容は右手のサイドバー内「未作成」タブに表示されます。|
|<<STETabInsert TabMoreOrphans>>|この隠しtiddlerの内容は右手のサイドバー内「孤立」タブに表示されます。|
|<<STETabInsert TabMoreShadowed>>|この隠しtiddlerの内容は右手のサイドバー内「隠し」タブに表示されます。|
|<<STETabInsert TabTags>>|この隠しtiddlerの内容は右手のサイドバー内「タグ別」タブに表示されます。|
|<<STETabInsert TabTimeline>>|この隠しtiddlerの内容は右手のサイドバー内「時系列」タブに表示されます。|
|<<STETabInsert TopRightCorner>>|この隠しtiddlerの内容は右上の角に表示されます。|
|<<STETabInsert ToolbarCommands>>|この隠しtiddlerはtiddlerツールバーにどのようなコマンドを表示するかを決定します。|
|<<STETabInsert UploadDialog>>|ファイルアップロード画面を表示します。|
|<<STETabInsert UserMenu>>|ログインしている状態でユーザ名をクリックしたときに右手のサイドバーの最上部にメニューを表示します。|
|<<STETabInsert UserProfile>>|個人設定を定義する画面|
|<<STETabInsert ViewOnlyTemplate>>|この隠しtiddlerにあるHTMLテンプレートはシステム画面を表示するときに使用されます。|
|<<STETabInsert ViewTemplate>>|この隠しtiddlerにあるHTMLテンプレートは、各tiddlerの表示方法を決定します。|
<hr>
(*: SiteTitle & SiteSubtitle: これらの変更の履歴をバージョン管理したいときのみ使用して下さい。そうでなければ PageProperties を使用して下さい。)
Name: MptwGreen
Background: #fff
Foreground: #000
PrimaryPale: #9b9
PrimaryLight: #385
PrimaryMid: #031
PrimaryDark: #020
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
Error: #f88
[[giewikiの使い方]]
[[giewikiとは]]
[[インストール]]
!ホスト登録
先ず wiki サイトのドメイン名を決めます。例えば www.mydomain.com などです。
このうち mydomain.com の部分が独自ドメインで、wwwの部分は自分で好きに選べます。厳密に言うと mydomain.com の部分がドメイン名、 www.mydomain.com はホスト名と呼ぶべきだと思うのですが、あまり区別しないで www.mydomain.com をドメイン名と呼ぶこともあるようです。
サブドメインにすることもできます。例えば mydomain.com を保有している人が、サブドメイン keiri-bu.mydomain.com を作成して、その下に www.keiri-bu.mydomain.com を登録するなどです。
以下、最終的なURLが
{{{http://www.mydomain.com}}}
となる場合を例に説明します。
mydomain.com ドメインを登録するネームサーバー、あるいは別名DNSサーバーに対して、ホスト名 www.mydomain.com を登録します。以下のパラメータを登録します。
* レコードタイプ: CNAME
* データ: ghs.googlehosted.com
* エイリアス: www
この設定は、もし誰かが www.mydomain.com にアクセスしようとしたとき、そのIPアドレスを調べるには www.mydomain.com の代わりに ghs.googlehosted.com のIPアドレスを使いなさい、という別名(エイリアス)を定義していることになります。
なお、www が付かない{{{http://mydomain.com}}} の形式のドメイン名(ルートドメイン、nakedドメインなどと呼ばれる) で GAE を使うこともできます。この場合はネームサーバーへの設定方法が異なります。登録内容は [[GAE に独自ドメイン(カスタムドメイン)を登録する]] の操作をするとコンソールに表示されるので、その通りに設定します。(ネームサーバへの登録を先に説明したのは、反映に時間がかかるためです。手順的に先にやった方が良い)
!必要なもの
* パソコンとインターネット
* クレジットカード
* SMS(ショートメッセージ)を受け取れる携帯電話
本サイトでは主に windows を用いた操作を説明しますが、macやLinuxでも構いません。
クレジットカードは、Google クラウドサービスにサインアップするときに必要です。よほど人気サイトにでもならない限り無料ですが、あくまで有料サービスなので支払い可能な状態にすることが求められます。
SMSはiPhoneやガラケーでたいてい受信できると思いますが、PHSはダメです。携帯はもしかしたら不要かも知れません。どの段階で必要なのか覚えてません。
!手順
<<tiddler giewiki_install_step>>
[[menu]]
[[freessl]]
[[SelectThemePlugin]]
<<selectTheme>>
<<selectPalette>>
[[tubeテスト|Q7VXaC2u38A]]
[[/how_to_use_giewiki/ssl3.png|/how_to_use_giewiki/ssl3.png]]
特別なタグを使用すると、指定した時刻(GMT)にページに対する様々な変更を予定することができます。これらのタグはあなたが編集可能なページでない限り非表示になります。
!!配備(Presence)
属性タグ(特別なタグ)により、指定した未来の時刻に、ページ及びその DefaultTiddlers (既定の tiddler)や MainMenu (メインメニュー)リストに対して tiddler を追加(//''又は削除''//)することができます。これらのタイミングタグは次の形式で、
@アクション@YYYY-MM-DD
ある年-月-日に実行するアクションを指定するか、又はさらに時刻を指定します。
@アクション@YYYY-MM-DD-hh
//アクション// に指定可能なものは、[[announce|Help:announce(特殊タグ)]] ([[EN|announce (special tag)]]), [[promote|Help:promote(特殊タグ)]]([[EN|promote (special tag)]]), [[demote|Help:demote(特殊タグ)]]([[EN|demote (special tag)]]), [[deprecate|Help:deprecate(特殊タグ)]]([[EN|deprecate (special tag)]]) です。
!!カレントバージョンの変更により tiddler の内容を変更する
[[revert|Help:revert(特殊タグ)]]([[EN|revert (special tag)]]) タグは tiddler のカレントバージョンを指定したバージョンに変更するよう予定します。
https://wiki.altalk.com/how_to_use_giewiki/
Name: MptwTeal
Background: #fff
Foreground: #000
PrimaryPale: #B5D1DF
PrimaryLight: #618FA9
PrimaryMid: #1a3844
PrimaryDark: #000
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #f8f8f8
TertiaryLight: #bbb
TertiaryMid: #999
TertiaryDark: #888
Error: #f88
/***
|Name:|SelectThemePlugin|
|Description:|Lets you easily switch theme and palette|
|Version:|1.0.1 ($Rev: 3646 $)|
|Date:|$Date: 2008-02-27 02:34:38 +1000 (Wed, 27 Feb 2008) $|
|Source:|http://mptw.tiddlyspot.com/#SelectThemePlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
!Notes
* Borrows largely from ThemeSwitcherPlugin by Martin Budden http://www.martinswiki.com/#ThemeSwitcherPlugin
* Theme is cookie based. But set a default by setting config.options.txtTheme in MptwConfigPlugin (for example)
* Palette is not cookie based. It actually overwrites your ColorPalette tiddler when you select a palette, so beware.
!Usage
* {{{<<selectTheme>>}}} makes a dropdown selector
* {{{<<selectPalette>>}}} makes a dropdown selector
* {{{<<applyTheme>>}}} applies the current tiddler as a theme
* {{{<<applyPalette>>}}} applies the current tiddler as a palette
* {{{<<applyTheme TiddlerName>>}}} applies TiddlerName as a theme
* {{{<<applyPalette TiddlerName>>}}} applies TiddlerName as a palette
***/
//{{{
// tags: systemConfig fromTemplate excludeLists excludeSearch
config.macros.selectTheme = {
label: {
selectTheme:"テーマ",
selectPalette:"パレット"
},
prompt: {
selectTheme:"Select the current theme",
selectPalette:"Select the current palette"
},
tags: {
selectTheme:'systemTheme',
selectPalette:'systemPalette'
}
};
config.macros.selectTheme.handler = function(place,macroName)
{
var btn = createTiddlyButton(place,this.label[macroName],this.prompt[macroName],this.onClick);
// want to handle palettes and themes with same code. use mode attribute to distinguish
btn.setAttribute('mode',macroName);
};
config.macros.selectTheme.onClick = function(ev)
{
var e = ev ? ev : window.event;
var popup = Popup.create(this);
var mode = this.getAttribute('mode');
var tiddlers = store.getTaggedTiddlers(config.macros.selectTheme.tags[mode]);
// for default
if (mode == "selectPalette") {
var btn = createTiddlyButton(createTiddlyElement(popup,'li'),"(default)","default color palette",config.macros.selectTheme.onClickTheme);
btn.setAttribute('theme',"(default)");
btn.setAttribute('mode',mode);
}
var nameDisp = {
MptwRounded: false,
MptwStandard: false,
MptwTheme: "標準",
MptwTrim: "ミニメニュー",
MptwBlack: "黒(black)",
MptwBlue: "青(blue)",
MptwGreen: "緑(green)",
MptwRed: "赤(red)",
MptwSmoke: "灰(smoke)",
MptwTeal: "青緑(teal)"
};
for(var i=0; i<tiddlers.length; i++) {
var t = tiddlers[i].title;
var name = store.getTiddlerSlice(t,'Name');
var desc = store.getTiddlerSlice(t,'Description');
if(nameDisp[name] === false) continue;
if(nameDisp[name]) name = nameDisp[name];
var btn = createTiddlyButton(createTiddlyElement(popup,'li'), name?name:t, desc?desc:config.macros.selectTheme.label['mode'], config.macros.selectTheme.onClickTheme);
btn.setAttribute('theme',t);
btn.setAttribute('mode',mode);
}
Popup.show();
return stopEvent(e);
};
config.macros.selectTheme.onClickTheme = function(ev)
{
var mode = this.getAttribute('mode');
var theme = this.getAttribute('theme');
if (mode == 'selectTheme')
story.switchTheme(theme);
else // selectPalette
config.macros.selectTheme.updatePalette(theme);
return false;
};
config.macros.selectTheme.updatePalette = function(title)
{
if (title != "") {
store.deleteTiddler("ColorPalette");
if (title != "(default)")
store.saveTiddler("ColorPalette","ColorPalette",store.getTiddlerText(title),
config.options.txtUserName,undefined,"");
refreshAll();
if(config.options.chkAutoSave)
saveChanges(true);
}
};
config.macros.applyTheme = {
label: "apply",
prompt: "apply this theme or palette" // i'm lazy
};
config.macros.applyTheme.handler = function(place,macroName,params,wikifier,paramString,tiddler) {
var useTiddler = params[0] ? params[0] : tiddler.title;
var btn = createTiddlyButton(place,this.label,this.prompt,config.macros.selectTheme.onClickTheme);
btn.setAttribute('theme',useTiddler);
btn.setAttribute('mode',macroName=="applyTheme"?"selectTheme":"selectPalette"); // a bit untidy here
}
config.macros.selectPalette = config.macros.selectTheme;
config.macros.applyPalette = config.macros.applyTheme;
config.macros.refreshAll = { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
createTiddlyButton(place,"refresh","refresh layout and styles",function() { refreshAll(); });
}};
//}}}
imageマクロにより、カラム幅全体または文章の左や右に画像を挿入できます。右に画像を配置するときは
{{{<<画像ファイル名 > XX%>>}}}
と指定し、左に配置するときは
{{{<<画像ファイル名 < XX%>>}}}
と指定し、カラム幅全体に配置するときは
{{{<<画像ファイル名>>}}}
とします。いずれの場合も、画像のとなりに表示される文章の手前にマクロを指定します。//XX// には画像の大きさのパーセントを指定し、//画像ファイル名// には予めアップロードしたファイルの名前を指定します。
(訳註: 以前のバージョンではファイルサイズは 1MB に制限されていましたが、Google Storage に保存されるように改善されたため、現在はこの制限はありません)
"|" 文字で区切って2個のファイル名を指定することもできます。この場合、画像をクリックしたときに2個目のファイル(ないしURL)が開きます。
image マクロは giewiki 固有のものであることに注意して下さい。もしページを TiddlyWiki としてダウンロードしたなら、image マクロが指定された箇所でエラーメッセージが表示されるでしょう。もし [[TiddlyWiki形式の画像|Help:TiddlyWiki形式の画像]] ([[英|TiddlyWiki-style image markup]])の {{{[img[ファイル名]]}}} を代わりに指定した場合(これもサポートされます)、その画像が適切な位置に配置されているかどうかによって、壊れたリンクないし実際の画像が表示されます。
[[/how_to_use_giewiki/gcp4.png|/how_to_use_giewiki/gcp4.png]]
[[/how_to_use_giewiki/gcp5.png|/how_to_use_giewiki/gcp5.png]]
[[/how_to_use_giewiki/gcp2.png|/how_to_use_giewiki/gcp2.png]]
[[/how_to_use_giewiki/gcp3.png|/how_to_use_giewiki/gcp3.png]]
[[/how_to_use_giewiki/gcp1.png|/how_to_use_giewiki/gcp1.png]]
|Name|MptwStandard|
|Description|Mptw Theme with the default TiddlyWiki PageLayout and Styles|
|ViewTemplate|MptwTheme##ViewTemplate|
|EditTemplate|MptwTheme##EditTemplate|
/***
|Name:|QuickOpenTagPlugin|
|Description:|Changes tag links to make it easier to open tags as tiddlers|
|Version:|3.0.1 ($Rev: 3861 $)|
|Date:|$Date: 2008-03-08 10:53:09 +1000 (Sat, 08 Mar 2008) $|
|Source:|http://mptw.tiddlyspot.com/#QuickOpenTagPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
***/
//{{{
config.quickOpenTag = {
dropdownChar: (document.all ? "\u25bc" : "\u25be"), // the little one doesn't work in IE?
createTagButton: function(place,tag,excludeTiddler) {
// little hack so we can do this: <<tag PrettyTagName|RealTagName>>
var splitTag = tag.split("|");
var pretty = tag;
if (splitTag.length == 2) {
tag = splitTag[1];
pretty = splitTag[0];
}
var sp = createTiddlyElement(place,"span",null,"quickopentag");
createTiddlyText(createTiddlyLink(sp,tag,false),pretty);
var theTag = createTiddlyButton(sp,config.quickOpenTag.dropdownChar,
config.views.wikified.tag.tooltip.format([tag]),onClickTag);
theTag.setAttribute("tag",tag);
if (excludeTiddler)
theTag.setAttribute("tiddler",excludeTiddler);
return(theTag);
},
miniTagHandler: function(place,macroName,params,wikifier,paramString,tiddler) {
var tagged = store.getTaggedTiddlers(tiddler.title);
if (tagged.length > 0) {
var theTag = createTiddlyButton(place,config.quickOpenTag.dropdownChar,
config.views.wikified.tag.tooltip.format([tiddler.title]),onClickTag);
theTag.setAttribute("tag",tiddler.title);
theTag.className = "miniTag";
}
},
allTagsHandler: function(place,macroName,params) {
var tags = store.getTags(params[0]);
var filter = params[1]; // new feature
var ul = createTiddlyElement(place,"ul");
if(tags.length == 0)
createTiddlyElement(ul,"li",null,"listTitle",this.noTags);
for(var t=0; t<tags.length; t++) {
var title = tags[t][0];
if (!filter || (title.match(new RegExp('^'+filter)))) {
var info = getTiddlyLinkInfo(title);
var theListItem =createTiddlyElement(ul,"li");
var theLink = createTiddlyLink(theListItem,tags[t][0],true);
var theCount = " (" + tags[t][1] + ")";
theLink.appendChild(document.createTextNode(theCount));
var theDropDownBtn = createTiddlyButton(theListItem," " +
config.quickOpenTag.dropdownChar,this.tooltip.format([tags[t][0]]),onClickTag);
theDropDownBtn.setAttribute("tag",tags[t][0]);
}
}
},
// todo fix these up a bit
styles: [
"/*{{{*/",
"/* created by QuickOpenTagPlugin */",
".tagglyTagged .quickopentag, .tagged .quickopentag ",
" { margin-right:1.2em; border:1px solid #eee; padding:2px; padding-right:0px; padding-left:1px; }",
".quickopentag .tiddlyLink { padding:2px; padding-left:3px; }",
".quickopentag a.button { padding:1px; padding-left:2px; padding-right:2px;}",
"/* extra specificity to make it work right */",
"#displayArea .viewer .quickopentag a.button, ",
"#displayArea .viewer .quickopentag a.tiddyLink, ",
"#mainMenu .quickopentag a.tiddyLink, ",
"#mainMenu .quickopentag a.tiddyLink ",
" { border:0px solid black; }",
"#displayArea .viewer .quickopentag a.button, ",
"#mainMenu .quickopentag a.button ",
" { margin-left:0px; padding-left:2px; }",
"#displayArea .viewer .quickopentag a.tiddlyLink, ",
"#mainMenu .quickopentag a.tiddlyLink ",
" { margin-right:0px; padding-right:0px; padding-left:0px; margin-left:0px; }",
"a.miniTag {font-size:150%;} ",
"#mainMenu .quickopentag a.button ",
" /* looks better in right justified main menus */",
" { margin-left:0px; padding-left:2px; margin-right:0px; padding-right:0px; }",
"#topMenu .quickopentag { padding:0px; margin:0px; border:0px; }",
"#topMenu .quickopentag .tiddlyLink { padding-right:1px; margin-right:0px; }",
"#topMenu .quickopentag .button { padding-left:1px; margin-left:0px; border:0px; }",
"/*}}}*/",
""].join("\n"),
init: function() {
// we fully replace these builtins. can't hijack them easily
window.createTagButton = this.createTagButton;
config.macros.allTags.handler = this.allTagsHandler;
config.macros.miniTag = { handler: this.miniTagHandler };
config.shadowTiddlers["QuickOpenTagStyles"] = this.styles;
store.addNotification("QuickOpenTagStyles",refreshStyles);
}
}
config.quickOpenTag.init();
//}}}
作成したwikiサイトを独自ドメインで使うことができます。wikiサイトのURLを
{{{http://プロジェクトID.appspot.com}}}
の代わりに
{{{http://www.mydomain.com}}}
のようにできるということです。
実際このサイトは
https://wiki.altalk.com/how_to_use_giewiki/
又は
https://altalk-wiki.appspot.com/how_to_use_giewiki/
のどちらでも表示できます。(後者にアクセスすると、前者のURLにリダイレクトされます)
ルートドメイン({{{http://mydomain.com}}})も使えます。
独自ドメインを使用する理由は、色々あるかも知れませんが、サイトのアイデンティティーを主張することも理由の一つと言えるでしょう。インターネットのセキュリティを判断する上で、ドメインが重要となっています。誰でも無料で作れる xxx.appspot.com だと、怪しいサイトの可能性も十分ありうるからです。
独自ドメインを使ったからと言っても、健全さの証拠にはなりません。サイトのコンテンツの価値や魅力と、固有のドメイン名とが相まって次第に認められてゆくものでしょう。独自ドメインはその第一歩となるものです。
wikiサイトに独自ドメインを設定するのは無料ですが、独自ドメインを保有するのは費用がかかります。お持ちでないなら、これもGoogle から買うこともできます。ドメインの管理費が年額 $12 、他にDNSサーバ(Cloud DNS)の使用料が月額 $0.2 ほどかかります。
https://domains.google/
ここではドメインの購入などは説明しません。既に保有されているものとして、wiki に設定する方法を説明します。
giewiki では、テキスト文字列からリンクを生成させる方法が2通りあります。
!自動リンク
後述の明示的なリンク構文に加えて、giewiki は //自動的に// 以下のリンク先リソースへのリンクを生成します。
|リンク先のリソース|パターン|h
|同じページ内のtiddler|WikiWord 形式の名前で参照される。|
|同じフォルダ内のページ|WikiWord 形式の名前で参照される。|
|外部のURL|URLのプロトコルを表す {{{file, http, https, mailto, ftp, irc, news, data}}} のうちのいずれかで始まり、{{{://urlパス名}}}の形式の文字列。<br>例: https://giewiki.appspot.com|
~WikiWord 構文に従う単語に対して自動的にリンクが作られるのを''避けたい''場合は、直前に '~' ("チルダ") 文字を付けます。{{{例: ~WikiWord}}}
!明示的なリンク構文
「美しい」リンクを書くには、以下のパターンに従うと良い。
|リンク先のリソース|パターン|h
|同じページ内のtiddler|{{{[[tiddler名]]}}}|
|サイト内の独立したページ|{{{[[リンクテキスト|/ページのパス]]}}}|
|サイト内の任意のページ内のtiddler|{{{[[リンクテキスト|/ページのパス#tiddler名]]}}}|
|任意のリソース|{{{[[リンクテキスト|完全なURL]]}}}|
<<allTags excludeLists [a-z]>>
<<option chkAutoSyncAddress>> <<permaview>> - <script label="help" title="Information on address bar sync">story.displayTiddler(null, "Help on address bar sync features");</script>
<<option chkRegExpSearch>> Regular expression search
<<option chkCaseSensitiveSearch>> Case-sensitive search
<<option chkAnimate>> Enable animations
''Edit mode:''
<<option chkAutoSave>> Auto-save changes while editing
<<option chkInsertTabs>> Tab key inserts tab character
''//The server saves these and your// AdvancedOptions //in your profile//''
----
<<downloadAsTiddlyWiki>>
!giewikiのダウンロード
以下のサイトからダウンロードする。
https://github.com/PoulStaugaard/giewiki/
右の緑のボタン「Clone or download」をクリック、Download ZIP をクリックします。
!展開
ダウンロードした giewiki-master.zip を右クリック、「すべて展開」を選択して展開します。又は、解凍ソフトで解凍します。
展開したファイルをデスクトップなどに置くとトラブルの元です。例えば C:\GCP のように、日本語やスペースが含まれないパスに置いて下さい。
!app.yaml の編集
1箇所だけ、修正が必要なファイルがあります。新しいバージョンでは、既に修正されている可能性があります。本稿執筆時点(2016/12/5)の最新版 giewiki 1.18.9 では以下のように修正します。
テキストエディタやメモ帳で、展開したフォルダ内の app.yaml ファイルを開いてください。冒頭部分に
{{{
application: giewiki-hrd
version: 1-18-9
runtime: python27
threadsafe: no
api_version: 1
}}}
などと書かれていますが、これを
{{{
runtime: python27
api_version: 1
threadsafe: no
}}}
と修正します。
!Google にアップロードする
SDKが「現在選択しているプロジェクト」を覚えていて、そのプロジェクトにアップロードされます。プロジェクトを変更するには、コマンドプロンプトを開いて
{{{gcloud config set project MY_PROJECT}}}
と入力します。
アップロードするには、app.yaml ファイルがあるフォルダに cd で移動して、
{{{gcloud app deploy app.yaml cron.yaml index.yaml}}}
と入力します。しばらくすると、
{{{Do you want to continue (Y/n)?}}}
と確認を求められるのでそのままenterを押します。
!!エラーになったら
現在、gcloud にバグがあるらしくて、[[(参照)|https://code.google.com/p/google-cloud-sdk/issues/detail?id=984]]
{{{[INFO] WARNING: The credentials file (...) is not writable.}}}
などと表示されて止まってしまうことがあります。この場合は
{{{gcloud config set app/num_file_upload_processes 1}}}
と入力すると回避できます。しかしこうすると処理が遅くなるので、数字を調整した方がいいかも知れません。私は5にしてます。
アップロードを何度もやると、16回目でエラーになります。古いバージョンも全部googleのサーバに残されていて、最大15個までしか置けないためです。
この場合は、[[コンソール|https://console.cloud.google.com/]]を開いて、左上の漢字の「三」みたいなアイコンをクリックして、「App Engine」を選択します。(余談ですが、このアイコンをバーガーアイコンと呼ぶらしいです。ハンバーガーみたい?)
次に左のメニューから「バージョン」を選択して、古いものを削除して下さい。
!wikiサイトを確認する
アップロードすると、wikiが既に動作しているはずです。
ブラウザで以下のURLを開いて確認してください。
{{{http://プロジェクトID.appspot.com}}}
プロジェクトIDはプロジェクトを作成した時の名前です。厳密には、プロジェクトIDとプロジェクト名は違います。[[コンソール|https://console.cloud.google.com/]] で「IAMと管理」を選択し、左のメニューから設定を選択すると、プロジェクト名とプロジェクトIDが表示されます。
!ドメインの確認
Googleクラウド(やgmailなどでも同じ)で独自ドメインを使えるようにするには、そのドメインを所有していることを Google に納得させなければなりません。その確認手続きは Googleにとっては自動なのですが、あなたにとっては自動ではなくて作業を強いられます。
ブラウザで [[Google クラウドコンソール|https://console.cloud.google.com/]] にアクセスします。バーガーアイコンから App Engine を選択します。
左のメニューから設定を選択、「カスタムドメイン」タブを選択します。「カスタムドメインを追加」ボタンをクリックして、「新しいドメインを確認」を選択します。
その下の入力欄にドメイン名「mydomain.com」を入力します。「確認」をクリックします。
すると「ウェブマスター セントラル」という画面が開きます。ここでレジストラの入力を求められます。手順に従ってもいいのですが、多分関係ないので適当なレジストラ、例えば「123Reg」を選択します。
(オプション) {{{正しいレジストラを確認するには、「DNS プロバイダやレジストラが不明な場合」をクリックして、表示された手順に従ってあなたのドメイン mydomain.com を登録した事業者であるドメインレジストラを調べます。ドメインレジストラは、必ずしもあなたがドメインを購入した会社とは限りません。ドメインレジストラはごく少数で、大部分の販売事業者はいわば代理店に過ぎないからです。}}}
次に「問題がある場合 TXT レコードを追加する」と表示されたらこれをクリックします。
すると「google-site-verification=~XXXXXXXXXXXXXXX_XXXXXXXXXXXXXXXX」みたいな長い名前が表示されます。これを先ほどと同じようにネームサーバーに登録します。
* レコードタイプ: TXT
* 名前: 空白または@
* 値: google-site-verification=~XXXXXXXXXXXXXXX_XXXXXXXXXXXXXXXX
DNSサーバに設定したら、「確認」ボタンをクリックします。しばらく時間がかかることがあります。環境によっては一晩かかるかも知れませんが、最近は多分10分ぐらいで反映されるのではないでしょうか。Googleが納得すれば(^_^) 確認済みのプロパティというところにあなたのドメイン名 mydomain.com が表示されます。
!!giewiki はフリー
[[giewiki|https://giewiki.appspot.com]] はフリーのwikiソフトです。[[tiddlywiki|http://tiddlywiki.com/]] を基に、Google App Engine で動作するようにしたものです。
tiddlywiki はブラウザの中で動作するwikiで、本来は個人で手元のPCの中だけでメモ帳のように利用するwikiです。Google App Engine(以下GAE) は、Google が運営するクラウドサービスで、有料のサービスですが、無料枠が大きいため多くの場合は無料で使えます。giewiki とは tiddlywiki をGAE上に載せたものです。このためほぼ無料で使えて、世界中からアクセスできるwikiサーバです。
!!無料wikiサービスとの比較
無料のwikiと言えば、[[@wiki( アット ウィキ )|http://atwiki.jp/]]、[[FC2 WIKI(ウィキ)|http://wiki.fc2.com/]]、[[Seesaa Wiki(ウィキ)|http://wiki.seesaa.jp/]] などなど、無料で簡単に使えるものがありますが、これらは企業が運営するものなので自分で完全にコントロールすることができません。広告が表示され、その広告料収入で運営されています。
giewiki は自分で立ち上げるので、制限なく自由に使えます。(GAE自体の制限を除く)もちろん、人気が出れば自分で広告を載せて収入を得ることも可能です。
GAEの料金のことはほとんど気にする必要はないと思います。実際、無料のwikiサービスの事業が成り立っているくらいですから、無料枠を超えるほどのコンテンツ量と人気が得られれば、そのときは Google に課金される額以上の広告料収入がきっと得られるはずです。
!!データの格納先
wiki のプログラムは GAE に格納されて実行されます。wikiに書き込んだテキストや、アップロードした画像などのファイルは、同じくGoogleのクラウドサービスのデータストアとStorage に格納されます。
データ量が増えると、有料になります。こちらの[[料金表|https://cloud.google.com/storage/pricing]]を参照して下さい。
ここに掲載されている料金シミュレーションでは、50GB格納したときに1ヶ月当たり $2.554 (1$=120円として月額約300円)となっています。東京リージョン(asia-northeast1)を選択した場合は2割りほど割高のようです。
ただし初期設定では無料枠内でしか使えないようになっていますので、大量のデータを格納したいときは、[[コンソール|https://console.cloud.google.com/]]で Storage を選択し、左のメニューから「ブラウザ」を選択して「課金を有効にする」をクリックして有効にする必要があります。
!シンプルな画像
{{{
[img[http://wikitext.tiddlyspace.com/fractalveg.jpg]]
}}}
サンプル:
[img[http://wikitext.tiddlyspace.com/fractalveg.jpg]]
!画像にツールチップを表示する
{{{
[img[tooltip|http://wikitext.tiddlyspace.com/fractalveg.jpg]]
}}}
サンプル:
[img[tooltip|http://wikitext.tiddlyspace.com/fractalveg.jpg]]
!イメージにリンクを貼る
{{{
[img[http://wikitext.tiddlyspace.com/fractalveg.jpg][http://www.flickr.com/photos/jermy/10134618/]]
}}}
サンプル:
[img[http://wikitext.tiddlyspace.com/fractalveg.jpg][http://www.flickr.com/photos/jermy/10134618/]]
!テキストの左に画像を配置する
{{{
[<img[http://wikitext.tiddlyspace.com/fractalveg.jpg]]
}}}
サンプル:
[<img[http://wikitext.tiddlyspace.com/fractalveg.jpg]]
{{{
@@clear:both;display:block; @@
}}}
と書くと回り込みを解除する。
@@clear:both;display:block;このように@@
!テキストの右に画像を配置する
{{{
[>img[http://wikitext.tiddlyspace.com/fractalveg.jpg]]
}}}
サンプル:
[>img[http://wikitext.tiddlyspace.com/fractalveg.jpg]]テキスト@@clear:both;display:block; @@
!参照
[[ヘルプ:画像|Help:画像]] ([[英|Help on image macro]])
[[PageSetup]]
[[SiteMap]]
[[RecentChanges]]
[[RecentComments]]
[[admin]]
[[SelectThemePlugin]]
[[systemConfig]]
ページテンプレートは、再利用できる tiddler のセット(通常はプラグインやデフォルトのシステムtiddler(※)をカスタマイズしたもの)をコンパイルして、他のページに容易に取り込めるようにするものです。もしそのようなtiddler がたくさんある場合、明示的にライブラリページから同様のtiddlerのセットを取り込んだページと比べて、読み込み時間が速くなるでしょう。
※訳註: special tiddler; JavaScript などを含む組み込みの特別なtiddler
ページテンプレートは元のページで予め定義された tiddler タグを含みます。テンプレートを使うページでは、それ自身で定義し直さない限り、その定義を継承します。
* テンプレートは、ページにtemplateタグを追加することでページから作られます(PageSetup 画面で //template// をクリックする)。そのようなページは通常、テンプレート作成のための専用のページとして作成されます。[[ライブラリ|Help:ライブラリの使い方]]([[英|LibraryUsageHelp]]) から取り込む形でそのページを作ることもできます。MPTW のような基本的なテンプレートは、インストール時に指定された静的ライブラリファイルから内部的に作成されることもあります。
* テンプレートを使うページで、PageSetup 画面の ''Template'' で指定することでそのテンプレートが適用されます。
* templateタグを持つページを編集しただけでは、テンプレートは自動的に更新されません。PageSetup 画面で //template// を再度クリックすることでテンプレートが更新されます。既に以前のバージョンのテンプレートを使用しているページに対して、更新されたテンプレートを適用したくない場合もあるかも知れません。その場合は、さらに //version// タグを追加します。これにより、前のバージョンが保持されます。
テンプレートに含まれるコンテンツには属性タグ //excludeLists// と //excludeSearch// が追加され、テンプレートを適用したページからは見えません。テンプレートを定義するページで 'include' タグを適用すると見えるようになります。
テンプレートから取り込まれたすべてのコンテンツには //fromTemplate// タグが適用されます。
# [[Google アカウント(gmailのアドレスなど)を手に入れる]]。
# [[GAE プロジェクトを作成する]]。
# [[Google Cloud SDK をインストールする]]。
# [[giewikiをGoogleのサーバにアップロードする]]。
# [[初期設定する]]。
# (オプション) [[独自ドメインを使う]]
# (オプション) [[無料でSSL化する]]
* [[無料でSSL化する]]
* [[運用イメージ|SSL証明書登録の運用イメージ]]
* [[SSL証明書を作成するスクリプトをGAEに仕込む]]
/***
|''Name:''|YouTubePlugin|
|''Description:''|Facilitates embedding youtube content with optional subtitles|
|''Documentation:''|[[YouTubePlugin documentation]]|
|''Requires:''|[[SWFObjectPlugin]]|
|''Version:''|1.1.3|
|''Date:''|Jan 22, 2011|
|''Source:''|http://giewiki.appspot.com/plugins/YoutubePlugin|
|''Author:''|PoulStaugaard (poul (dot) staugaard (at) gmail (dot) com)|
|''License:''|[[BSD open source license]]|
|''~CoreVersion:''|2.1.0|
|''Browser:''|Chrome; Safari; Firefox; InternetExplorer 6.0|
***/
//{{{
// tags: systemConfig fromTemplate excludeLists excludeSearch
config.macros.youtube = {
textLocation: {},
paused: {},
handler: function (place, macroName, params, wikifier, paramString) {
if (params.length == 0)
throw("Missing required parameter: youtube video id");
var vid = params.shift(); // parameter 1: youtube video id
var t = place;
while (t.tagName != 'td' && !t.className.startsWith('tiddler') && t.parentNode)
t = t.parentNode;
var cw = t.offsetWidth;
var w = cw;
var rh = 80;
if (params.length > 0) { // parameter 2: width,relative-height%
var a2 = params[0];
if (a2 == 'text-location') {
var tn = story.findContainingTiddler(place).getAttribute('tiddler');
config.macros.youtube.textLocation[vid] = createTiddlyElement(place,'span', tn + 'textViewer');
return;
} else {
var dims = a2.split(',');
var da = dims.shift();
var na = parseInt(da);
if (!isNaN(na)) {
params.shift();
if (da.right(1) != '%') {
w = na; da = dims.shift();
}
if (da && da.right(1) == '%')
rh = da.slice(0,da.length-1);
}
}
if (w < 0) {
w = 0 - w;
if (w > cw)
w = cw;
}
}
var h = w * rh / 100;
var playButton = false;
var ats = {};
var aus = {};
var tstn = null;
var plwdClass = 'youtubePlayer';
var nochrome = false;
var altLabel = "YouTube/" + vid;
for (var opt = params.shift(); opt; opt = params.shift()) {
if (opt == 'class') // Player wrapper div class
plwdClass = params.shift();
else if (opt == 'chromeless')
nochrome = true;
else if (opt == 'altlabel')
altLabel = params.shift();
else if (opt == 'pause') {
var player = document.getElementById(vid);
var when = config.macros.youtube.paused[vid];
var cpt = player && player.getCurrentTime();
if (player == null)
wikify("//Player " + vid + " will stop at this point//",place);
else if (!when || cpt < when || cpt > when + 0.2 )
{
//debugger;
player.pauseVideo();
config.macros.youtube.paused[vid] = player.getCurrentTime();
if (params.length && params.shift() == "resume")
createTiddlyButton(place, params.length ? params.shift() : "resume", null, function(ev)
{
var target = resolveTarget(ev || window.event);
target.parentNode.removeChild(target);
//config.macros.youtube.paused[vid] = false;
debugger;
player.playVideo();
});
}
return;
}
else if (opt == 'play' || opt == 'time' || opt == 'text') { // options: auto-play / transcript
aus[opt] = true;
if (opt == 'time' || opt == 'text') {
tstn = params.shift(); // transcript TiddlerName
if (!tstn)
return displayMessage("Missing parameter: TextTiddlerName");
}
var vpid = null;
var iv = window.setInterval(function() {
try {
if (tstn && !aus.textLocation)
config.macros.youtube.setupData(aus,tstn,ats,config.macros.youtube.textLocation[vid],vid);
var player = document.getElementById(vid);
if (!player)
return window.clearInterval(iv); // stop working
var ps = player.getPlayerState();
//if (ps != aus.ps) { displayMessage("State " + ps); aus.ps = ps; }
switch (ps) {
case -1: // unstarted
case 5:
config.macros.youtube.paused[vid] = false;
if (aus.play)
player.playVideo();
if (!aus.transcript && !aus.text) break;
return;
case 0: // ended
clearMessage();
if (aus.changes) config.macros.youtube.updateTiming(aus);
break;
case 1: // playing
var t = player.getCurrentTime();
for (at in ats) {
fat = parseFloat(at);
if (t > fat && t < fat + 0.1) {
removeChildren(aus.textLocation);
wikify(ats[at],aus.textLocation); //-or-: aus.textLocation.innerHTML = ats[at];
break;
}
}
return;
case 2: // paused
if (aus.changes) config.macros.youtube.updateTiming(aus);
return;
case 3: // buffering
return;
//case 5: // cued
return;
}
window.clearInterval(iv);
} catch (x) {
}
},33);
}
else if (opt == 'label' && macroName == 'youtube')
playButton = params.shift();
}
if (playButton)
return createTiddlyButton(place, playButton, null, config.macros.youtube.onClick, "linkbutton", null, null, { args: paramString });
var pen = 'pd'+vid;
var wd = createTiddlyElement(place,"div",pen,plwdClass,null);
if (!swfobject.getFlashPlayerVersion().major)
wd.innerHTML = '<a href="https://www.youtube.com/v/' + vid + '">' + altLabel + '</a>';
else {
var pUrl = nochrome ? 'https://www.youtube.com/apiplayer?video_id=' + vid + '&version=3&enablejsapi=1&playerapiid=ytplayer'
: 'https://www.youtube.com/v/' + vid + '?enablejsapi=1&playerapiid=ytplayer';
swfobject.embedSWF( pUrl, pen, w, h, '8', null, null, { allowScriptAccess: 'always' }, { id: vid });
}
},
onClick: function(ev) {
var t = resolveTarget(ev || window.event);
var args = t.getAttribute('args');
config.macros.youtube.handler(t, 'youtubePlay',args.readMacroParams(), null, args);
},
setupData: function(aus,tstn,ats,tl,vid) {
if (!tl) {
var evid = document.getElementById(vid);
if (!evid.nextSibling)
insertAfter(evid,document.createElement('br'));
tl = insertAfter(evid.nextSibling,document.createElement('span'));
}
aus.textLocation = tl;
var tstext = store.getTiddlerText(tstn);
if (tstext == null)
return displayMessage("Tiddler '" + tstn + "' not found");
var tsls = tstext.split('\n');
for (var i=0; i < tsls.length; i++) {
var tsl = tsls[i];
if (aus.text && tsl.startsWith('|')) { // build timing array from table of lines: |time|Text|
var lps = tsl.split('|');
if (lps.length > 2) {
var it = parseInt(lps[1]);
if (it > 0) ats[it] = lps[2];
}
}
else if (aus.time) {
if (!aus.transcript) {
aus.transcript = tstn;
aus.time = {};
story.displayTiddler(null,tstn,DEFAULT_EDIT_TEMPLATE);
}
var tsde = aus.textLocation; //document.getElementById(tsDiv);
if (tsde == null)
return displayMessage("text-location not found"); //"Element " + tsDiv + " not found");
var lid = vid + '_' + i;
var lel = createTiddlyElement(tsde,'a',lid,null,tsl, { 'href': 'javascript:;' });
aus.time[lid] = { text: tsl };
lel.onclick = function(ev) {
var me = resolveTarget(ev || window.event);
var player = document.getElementById(vid);
aus.time[me.id].time = player.getCurrentTime();
aus.changes = true;
displayMessage(aus.time[me.id].time + ": " + aus.time[me.id].text);
}
createTiddlyElement(tsde,'br');
}
}
},
updateTiming: function(aus) {
var tta = aus.time;
var atb = [];
for (ali in tta) {
var time = tta[ali].time;
var text = tta[ali].text;
if (time && time > 0) {
var tlps = text.split('|');
if (tlps.length == 4) {
tlps[1] = time;
atb.push(tlps.join('|'));
} else
atb.push('|' + time + '|' + text + '|');
} else
atb.push(text);
}
var tstn = aus.transcript;
if (tstn) {
var tiddlerElem = story.getTiddlerField(tstn,'text');
if (tiddlerElem) {
tiddlerElem.value = atb.join('\n');
displayMessage(tstn + " updated");
} else
displayMessage(atb.join("<br>"));
aus.changes = false;
}
}
}
//}}}
|Name|MptwRounded|
|Description|Mptw Theme with some rounded corners (Firefox only)|
|ViewTemplate|MptwTheme##ViewTemplate|
|EditTemplate|MptwTheme##EditTemplate|
|PageTemplate|MptwTheme##PageTemplate|
|StyleSheet|##StyleSheet|
!StyleSheet
/*{{{*/
[[MptwTheme##StyleSheet]]
.tiddler,
.sliderPanel,
.button,
.tiddlyLink,
.tabContents
{ -moz-border-radius: 1em; }
.tab {
-moz-border-radius-topleft: 0.5em;
-moz-border-radius-topright: 0.5em;
}
#topMenu {
-moz-border-radius-bottomleft: 2em;
-moz-border-radius-bottomright: 2em;
}
/*}}}*/
<html><style type="text/css">#topMenu .topMenuCondence .button {margin-left:-10px;} #topMenu .button {border:0px;} #topMenu .sliderPanel .tiddlyLink {margin:0px;padding:0px;}</style></html>
[[giewikiの使い方]]
[[giewikiとは]]
[[インストール]]{{topMenuCondence{<<slider chkGiewikiInstallSlider giewiki_install_step "▼" "giewikiインストール">>}}}
[[独自ドメインを使う]]
[[無料でSSL化する]]
<<selectTheme>>
<<selectPalette>>
[[admin|管理メニュー]]
[[giewikiヘルプ]]{{topMenuCondence{<<slider chkGiewikiHelpSlider [[giewikiヘルプ]] "▼" "giewikiヘルプ">>}}}
あと少しです。
<<image wiki1.png|https://wiki.altalk.com/how_to_use_giewiki/wiki1.png > 50%>>
右のような画面が表示されます。これがこのwikiサイトのトップページの設定になります。
giewiki は複数のページからなり、各ページには複数の tiddler が含まれます。アクセス制御などはページ単位で行います。
トップページは自分だけが編集する設定が良いでしょう。誰かと共同で編集するときは、必要に応じて別のページを作って、そちらに編集許可を与えます。
* Title: トップページのタイトルを設定します。
* Locked: チェックします。これをチェックすると、書き込みできなくなる、という意味と思われます。(正確な意味が分かりません。誰か教えて!)
* Access permissions: Group, Authenticated, Anomymous をすべて view に設定します。
* (オプション)Template: MPTW を選択すると、このページのような外観になります。
* 一番下の Save をクリックします。
* (オプション)[[日本語化プラグイン]]を配布しています。必要に応じて導入して下さい。
以上で完了です。お疲れさまでした。
使い方は、本サイトの[[お砂場|/sandbox/]]を参考にして下さい。
/***
|Name:|RenameTagsPlugin|
|Description:|Allows you to easily rename or delete tags across multiple tiddlers|
|Version:|3.0 ($Rev: 5501 $)|
|Date:|$Date: 2008-06-10 23:11:55 +1000 (Tue, 10 Jun 2008) $|
|Source:|http://mptw.tiddlyspot.com/#RenameTagsPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License|http://mptw.tiddlyspot.com/#TheBSDLicense|
Rename a tag and you will be prompted to rename it in all its tagged tiddlers.
***/
//{{{
config.renameTags = {
prompts: {
rename: "Rename the tag '%0' to '%1' in %2 tidder%3?",
remove: "Remove the tag '%0' from %1 tidder%2?"
},
removeTag: function(tag,tiddlers) {
store.suspendNotifications();
for (var i=0;i<tiddlers.length;i++) {
store.setTiddlerTag(tiddlers[i].title,false,tag);
}
store.resumeNotifications();
store.notifyAll();
},
renameTag: function(oldTag,newTag,tiddlers) {
store.suspendNotifications();
for (var i=0;i<tiddlers.length;i++) {
store.setTiddlerTag(tiddlers[i].title,false,oldTag); // remove old
store.setTiddlerTag(tiddlers[i].title,true,newTag); // add new
}
store.resumeNotifications();
store.notifyAll();
},
storeMethods: {
saveTiddler_orig_renameTags: TiddlyWiki.prototype.saveTiddler,
saveTiddler: function(title,newTitle,newBody,modifier,modified,tags,fields,clearChangeCount,created,creator) {
if (title != newTitle) {
var tagged = this.getTaggedTiddlers(title);
if (tagged.length > 0) {
// then we are renaming a tag
if (confirm(config.renameTags.prompts.rename.format([title,newTitle,tagged.length,tagged.length>1?"s":""])))
config.renameTags.renameTag(title,newTitle,tagged);
if (!this.tiddlerExists(title) && newBody == "")
// dont create unwanted tiddler
return null;
}
}
return this.saveTiddler_orig_renameTags(title,newTitle,newBody,modifier,modified,tags,fields,clearChangeCount,created,creator);
},
removeTiddler_orig_renameTags: TiddlyWiki.prototype.removeTiddler,
removeTiddler: function(title) {
var tagged = this.getTaggedTiddlers(title);
if (tagged.length > 0)
if (confirm(config.renameTags.prompts.remove.format([title,tagged.length,tagged.length>1?"s":""])))
config.renameTags.removeTag(title,tagged);
return this.removeTiddler_orig_renameTags(title);
}
},
init: function() {
merge(TiddlyWiki.prototype,this.storeMethods);
}
}
config.renameTags.init();
//}}}
GAEサイトで独自ドメインを使う方法を説明します。
ここで説明する方法は giewiki に限らず、Google App Engine を用いたどんなアプリにも適用できます。
* [[独自ドメインとは]]
* [[独自ドメインのホスト名を登録する]]
* [[(Googleによる)独自ドメインの確認]]
* [[GAE に独自ドメイン(カスタムドメイン)を登録する]]
* [[独自ドメインの動作確認]]
* [[appspot ドメインにアクセスしたとき独自ドメインにリダイレクトする]]
Google のサービスを利用するので、Google のアカウントが必要です。(無料)
ログイン画面が表示されたら、gmail のメールアドレスとパスワードを入力してログインします。
アカウントの作り方は簡単なので、説明は割愛します。
[[gmail|https://www.google.com/intl/ja/mail/help/about.html]] の画面で右上の「アカウントを作成」をクリックして、手順に従って下さい。
/***
|Name:|SaveCloseTiddlerPlugin|
|Description:|Provides two extra toolbar commands, saveCloseTiddler and cancelCloseTiddler|
|Version:|3.0 ($Rev: 5502 $)|
|Date:|$Date: 2008-06-10 23:31:39 +1000 (Tue, 10 Jun 2008) $|
|Source:|http://mptw.tiddlyspot.com/#SaveCloseTiddlerPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
To use these you must add them to the tool bar in your EditTemplate
***/
//{{{
merge(config.commands,{
saveCloseTiddler: {
text: 'done/close',
tooltip: 'Save changes to this tiddler and close it',
handler: function(ev,src,title) {
var closeTitle = title;
var newTitle = story.saveTiddler(title,ev.shiftKey);
if (newTitle)
closeTitle = newTitle;
return config.commands.closeTiddler.handler(ev,src,closeTitle);
}
},
cancelCloseTiddler: {
text: 'cancel/close',
tooltip: 'Undo changes to this tiddler and close it',
handler: function(ev,src,title) {
// the same as closeTiddler now actually
return config.commands.closeTiddler.handler(ev,src,title);
}
}
});
//}}}
!SSL化とは
作成したwikiサイトをSSL化しましょう。これにより{{{http://...}}}ではじまるURLが{{{https://...}}}のように変わり、暗号化されてより安全になります。
# appspot.com ドメインでは、そのまま無料で https が使えます。
# [[独自ドメインを設定した方は、無料でSSL証明書を発行している https://letsencrypt.org/ を利用することで、無料でSSL化できます。|SSL証明書を作成、登録する]]
## [[運用イメージ|SSL証明書登録の運用イメージ]]
## [[SSL証明書を作成するスクリプトをGAEに仕込む]]
# [[http://... にアクセスされたとき、自動で https://... にリダイレクトさせることができます。|http から https にリダイレクトする]]
[[独自ドメイン|独自ドメインを使う]] を使う方は 2. と 3. の作業を、appspot.com ドメインを使う方は 3. の作業を実施して下さい。せっかくSSL化しても、http でアクセスされたら意味がないので、3.の設定で強制的に https を使って頂くようにします。
Name: MptwRed
Background: #fff
Foreground: #000
PrimaryPale: #eaa
PrimaryLight: #c55
PrimaryMid: #711
PrimaryDark: #500
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
Error: #f88
MPTW is a distribution or edition of TiddlyWiki that includes a standard TiddlyWiki core packaged with some plugins designed to improve usability and provide a better way to organise your information. For more information see http://mptw.tiddlyspot.com/.
<<image wiki2.png|https://giewiki.appspot.com/ > 50%>>
無料で自分のwikiサイトを作れるgiewikiのインストール方法と使い方を説明します。
このサイトは giewiki で作られています。どんなものか使ってみたい方は、[[お砂場|/sandbox/]] で遊んでみて下さい。
[[giewikiとは]]
[[インストール]]
<<tiddler giewiki_install_step>>
[[giewikiヘルプ]]
<<tiddler giewikiヘルプ>>
!見出し
マークアップ:
{{{
!見出しレベル 1
!!見出しレベル 2
!!!見出しレベル 3
!!!!見出しレベル 4
!!!!!見出しレベル 5
!!!!!!見出しレベル 6
}}}
サンプル:
!見出しレベル 1
!!見出しレベル 2
!!!見出しレベル 3
!!!!見出しレベル 4
!!!!!見出しレベル 5
!!!!!!見出しレベル 6
!水平線
ハイフン("-")を4個並べると水平線を表示します。
マークアップ:
{{{
水平線の前
----
水平線の後
}}}
サンプル:
水平線の前
----
水平線の後
HTMLタグ {{{<hr>}}} も使えます。
マークアップ:
{{{
水平線の前<hr>水平線の後
}}}
サンプル:
水平線の前<hr>水平線の後
!HTMLで書く
tiddler内で、生のHTMLを書くこともできます。
マークアップ:
{{{
<html>
生の<strong>HTML</strong>の例。
</html>
}}}
サンプル:
<html>
生の<strong>HTML</strong>の例。
</html>
!!!注意点:
* {{{<div>}}}要素内で有効な静的HTML要素だけが使えます。
* {{{document.write}}}を使って動的にコンテンツを生成することはできません。
* {{{<html>}}}ブロック内で外部の{{{<script>}}}要素を使うことはできません。
!改行
明示的に改行させることができます。
マークアップ:
{{{
文章の途中で<br>改行する例。
}}}
サンプル:
文章の途中で<br>改行する例。
!コード書式
プログラムコードなど、wikiの処理をしないで、
改行もそのままに表示すべきテキストに対して使います。
マークアップ:
{{{
WikiLinksを含むテキストの例。
}}}
サンプル:
{{{
WikiLinksを含むテキストの例。
}}}
/***
|Name:|CloseOnCancelPlugin|
|Description:|Closes the tiddler if you click new tiddler then cancel. Default behaviour is to leave it open|
|Version:|3.0.1 ($Rev: 3861 $)|
|Date:|$Date: 2008-03-08 10:53:09 +1000 (Sat, 08 Mar 2008) $|
|Source:|http://mptw.tiddlyspot.com/#CloseOnCancelPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
***/
//{{{
merge(config.commands.cancelTiddler,{
handler_mptw_orig_closeUnsaved: config.commands.cancelTiddler.handler,
handler: function(event,src,title) {
this.handler_mptw_orig_closeUnsaved(event,src,title);
if (!story.isDirty(title) && !store.tiddlerExists(title) && !store.isShadowTiddler(title))
story.closeTiddler(title,true);
return false;
}
});
//}}}
[[/how_to_use_giewiki/letsencrypt-src.zip|/how_to_use_giewiki/letsencrypt-src.zip]]
以上で、カスタムドメインで wiki にアクセスできるはずです。ブラウザで
{{{http://www.mydomain.com}}}
にアクセスしてみて下さい。
表示されない場合は、DNS サーバへの設定がまだ反映されていない可能性があります。しばらく待ってもダメなら、DNSサーバの設定を確認してください。
Name: MptwBlack
Background: #000
Foreground: #fff
PrimaryPale: #333
PrimaryLight: #555
PrimaryMid: #888
PrimaryDark: #aaa
SecondaryPale: #111
SecondaryLight: #222
SecondaryMid: #555
SecondaryDark: #888
TertiaryPale: #222
TertiaryLight: #666
TertiaryMid: #888
TertiaryDark: #aaa
Error: #300
|Name|MptwTrim|
|Description|Mptw Theme with a reduced header to increase useful space|
|ViewTemplate|MptwTheme##ViewTemplate|
|EditTemplate|MptwTheme##EditTemplate|
|StyleSheet|MptwTheme##StyleSheet|
|PageTemplate|##PageTemplate|
!PageTemplate
<!--{{{-->
<!-- horizontal MainMenu -->
<div id='topMenu' macro='gradient vert [[ColorPalette::PrimaryLight]] [[ColorPalette::PrimaryMid]]'>
<span refresh='content' tiddler='SiteTitle' style="padding-left:1em;font-weight:bold;"></span>:
<span refresh='content' tiddler='MainMenu'></span>
</div>
<div id='sidebar'>
<div id='sidebarOptions'>
<div refresh='content' tiddler='SideBarOptions'></div>
<div style="margin-left:0.1em;"
macro='slider chkTabSliderPanel SideBarTabs {{"tabs \u00bb"}} "Show Timeline, All, Tags, etc"'></div>
</div>
</div>
<div id='displayArea'>
<div id='messageArea'></div>
<div id='tiddlerDisplay'></div>
</div>
|Style|Formatting|h
|''太字''|{{{''太字''}}} - 注:ダブルクォートではなく、シングルクォート(アポストロフィ)2個。|
|//イタリック(斜字体)//|{{{//イタリック(斜字体)//}}}|
|''//太字イタリック//''|{{{''//太字イタリック//''}}}|
|__下線__|{{{__下線__}}}|
|--取り消し線--|{{{--取り消し線--}}}|
|上付き^^文字^^|{{{上付き^^文字^^}}}|
|下付き~~文字~~|{{{下付き~~文字~~}}}|
|@@ハイライト@@|{{{@@ハイライト@@}}}|
|{{{プレーンテキスト}}}|{{{ {{{''書式化'' しないプレーンテキスト}}} }}}|
|/%このテキストは非表示%/非表示テキスト|{{{/%このテキストは非表示%/}}}|
app.yaml ファイルを修正することで、http でアプリにアクセスしたとき、強制的に https に移動させることができます。
テキストエディタで app.yaml ファイルを開いてください。その前に念のためバックアップを作成しておくと良いでしょう。
app.yaml ファイルは以下のような構成になっています。
{{{
runtime: python27
api_version: 1
threadsafe: no
handlers:
- url: XXX
script: XXX
- url: XXX
static_dir: XXX
- url: XXX
static_files: XXX
upload: XXX
(以下繰り返し)
}}}
"-" で始まる行が、新しい定義の開始になっています。これらのそれぞれの定義ごとに {{{" secure: always"}}} の行を追加します。secureの手前の先頭の空白は必要です。他の行と揃えて下さい。以下のようになります。
{{{
runtime: python27
api_version: 1
threadsafe: no
handlers:
- url: XXX
script: XXX
secure: always
- url: XXX
static_dir: XXX
secure: always
- url: XXX
static_files: XXX
upload: XXX
secure: always
(以下繰り返し)
}}}
なお、以下のSSL証明書発行のためのスクリプトについては、secure: always を指定しないように注意が必要です。このスクリプトは http で利用します。
{{{
- url: /\.well\-known\/acme\-challenge\/.*
script: letsencrypt.app
}}}
以上です。
*[[文字フォント|Help:文字フォント]] ([[英|Help On Font Styles]])
*[[ハイパーリンク|Help:ハイパーリンク]] ([[英|Help On Links]])
*[[マークアップ|Help:マークアップ]] ([[英|Help On Markup]])
*[[CSS指定|Help:CSS指定]] ([[英|Help On CSS Formatting]])
*[[テーブル|Help:テーブル]] ([[英|Help On Tables]])
*[[マクロ|Help:マクロ]] ([[英|Help On Macros]])
*[[タイミング|Help:タイミング]] ([[英|Help On Timing]])
*[[テンプレート|Help:テンプレート]] ([[英|PageTemplateHelp]])
*[[LibraryUsageHelp]]
*[[ExtScriptHelp]]
*[[Help on tiddler macro]]
*[[Help on gradient macro]]
*[[スライダー|Help:スライダー]] ([[英|Help on slider macro]])
*[[画像|Help:画像]] ([[英|Help on image macro]])
*[[TiddlyWiki形式の画像|Help:TiddlyWiki形式の画像]] ([[英|TiddlyWiki-style image markup]])
*[[Help on address bar sync features]]
*[[RequiresAttribute]]
/***
|Description:|A place to put your config tweaks so they aren't overwritten when you upgrade MPTW|
See http://www.tiddlywiki.org/wiki/Configuration_Options for other options you can set. In some cases where there are clashes with other plugins it might help to rename this to zzMptwUserConfigPlugin so it gets executed last.
***/
//{{{
// example: set your preferred date format
//config.mptwDateFormat = 'MM/0DD/YY';
//config.mptwJournalFormat = 'Journal MM/0DD/YY';
// example: set the theme you want to start with
//config.options.txtTheme = 'MptwRoundTheme';
// example: switch off autosave, switch on backups and set a backup folder
//config.options.chkSaveBackups = true;
//config.options.chkAutoSave = false;
//config.options.txtBackupFolder = 'backups';
// uncomment to disable 'new means new' functionality for the new journal macro
//config.newMeansNewForJournalsToo = false;
//}}}
スライダーマクロにより、tiddler を他の tiddler の中に組み込むことができます。オプションで組み込んだ内容の表示/非表示を切り替えることもできます。
{{{
<<slider クッキー tiddler名 ラベル ツールチップ>>
}}}
* {{{クッキー}}}: スライダーの状態を保存する変数名 (例えば {{{chkFooSlider}}})
* {{{tiddler名}}}: スライダーに取り込みたい tiddler の名前
* {{{ラベル}}}: スライダーのタイトル文字列
* {{{ツールチップ}}}: スライダーにツールチップ表示する文字列
例えば:
{{{
<<slider chkTestSlider [[OptionsPanel]] "Options" "Options panel">>
}}}
サンプル:
<<slider chkTestSlider [[OptionsPanel]] "Options" "Options panel">>
/***
|''Name:''|GiewikiJapaneseTranslationPlugin|
|''Description:''|Japanese Translation for giewiki|
|''Author:''|Akihiro Yoshikawa|
|''Source:''||
|''Version:''|1.18.2-ja1|
|''Date:''|Dec 11, 2016|
|''License:''|[[MIT License|https://opensource.org/licenses/MIT]]|
|''~CoreVersion:''|2.4.1|
giewiki 1.18.2 用の日本語化プラグインです。
***/
//{{{
// tags: systemConfig
//--
//-- Translateable strings
//--
// Strings in "double quotes" should be translated; strings in 'single quotes' should be left alone
config.locale = "ja"; // W3C language tag
// Messages
merge(config.messages, {
customConfigError: "プラグインの読み込み時に問題が発生しました。詳細は PluginManager をご覧ください",
pluginError: "エラー: %0",
pluginDisabled: "'systemConfigDisable'タグによって実行が禁止されています",
pluginForced: "'systemConfigForce'タグによって強制実行されました",
pluginVersionError: "このプラグインの実行には、新しいバージョンの TiddlyWiki が必要です。",
nothingSelected: "何も選択されていません。一つ以上選択する必要があります。",
subtitleUnknown: "(unknown)",
undefinedTiddlerToolTip: "この tiddler '%0' はまだ作成されていません",
shadowedTiddlerToolTip: "この tiddler '%0' はまだ作成されていませんが、隠された規定値があります",
tiddlerLinkTooltip: "%0 - %1, %2",
externalLinkTooltip: "(外部へのリンク) %0",
noTags: "タグの付いた tiddler はありません",
macroError: "次のマクロでエラー発生 <<\%0>>",
macroErrorDetails: "次のマクロを実行中にエラー発生 <<\%0>>:\n%1",
missingMacro: "マクロがありません",
overwriteWarning: "'%0'という名前のtiddlerはすでに存在します。OKで上書きします",
confirmExit: "変更が保存されていません。このまま続けると変更が失われます",
tiddlerLoadError: "tiddler '%0' の読込時にエラー発生",
wrongSaveFormat: "保存フォーマット '%0' で保存できません。標準フォーマットで保存します",
invalidFieldName: "%0 は不正なフィールド名です",
fieldCannotBeChanged: "フィールド '%0' は変更できません"
});
merge(config.messages.messageClose,{
text: "閉じる",
tooltip: "このメッセージを閉じます"});
merge(config.messages.listView,{
tiddlerTooltip: "このtiddlerのテキスト全体を表示します",
previewUnavailable: "(プレビューがありません)"
});
merge(config.optionsDesc = {
// Options that can be set in the options panel
chkAutoSyncAddress: "表示中の tiddler のURLを自動的にアドレスバーに表示します",
chkAutoSave: "編集中の変更を自動保存します",
chkAutoReloadOnSystemConfigSave: "systemConfigタグが付いた tiddler を保存したとき自動的にリロードします",
chkRegExpSearch: "検索に正規表現を使います",
chkCaseSensitiveSearch: "検索で大文字小文字を区別します",
chkIncrementalSearch: "インクリメンタルサーチを行います",
chkSearchViewSnippets: "結果のスニペットを取得します",
chkAnimate: "アニメーションを許可します",
chkOpenInNewWindow: "外部へのリンクを新しいウィンドウで開きます",
chkToggleLinks: "tiddlerへのリンククリックでtiddlerを閉じます",
chkForceMinorUpdate: "更新時にユーザ名と日付を変更しません",
chkRequireDeleteConfirm: "tiddler を削除する前に確認を求めます",
chkRequireDeleteReason: "削除するときに理由を訊ねます",
chkInsertTabs: "タブキーを押したとき、フィールド間の移動ではなくタブ文字を挿入します",
chkListPrevious: "編集した tidder の以前のバージョンをリストします",
txtEmptyTiddlyWiki: "ダウンロードした TiddlyWiki のソーステンプレート(empty.html)",
txtMaxEditRows: "編集領域の最大行数",
txtEmail: "メッセージを受信するためのメールアドレス",
txtExternalLibrary: "ライブラリその他を経由してリストされた tiddler のソース",
txtLockDuration: "編集をロックするとき、その時間を分で指定します。ロックしないときは空欄にして下さい。"
});
// More messages (rather a legacy layout that should not really be like this)
merge(config.views.wikified.tag,{
labelTags: "タグ: ",
openTag: "'%0' タグを開く",
tooltip: "'%0' タグの付いた tiddler を表示します",
openAllText: "すべて開く",
openAllTooltip: "これらの tiddler をすべて開きます",
popupNone: "'%0' タグの付いたtiddlerは他にありません"});
merge(config.views.wikified,{
defaultText: "tiddler '%0' はまだ作成されていません。ダブルクリックで作成できます。または %0 という名前で新しいページを作成します: <script label=\"click here\" title=\"Create page\">var pe=place.parentElement; wikify(store.getTiddlerText(\"CreateNewPage\"), pe); pe.removeChild(place);</script><br><br>",
defaultModifier: "(missing)",
shadowModifier: "(special tiddler)",
dateFormat: "YYYY.MM.DD", // 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: ""});
merge(config.views.editor.tagChooser,{
text: "タグ",
tooltip: "既存のタグを選択して追加します",
popupNone: "タグが定義されていません",
tagTooltip: "'%0' タグを追加します"
});
// Macros; handlers defined elsewhere
merge(config.macros.search,{
pageLabel: "ページ",
areaLabel: "エリア",
siteLabel: "サイト",
prompt: "このページ内を検索します",
accessKey: "F",
optionsPanel: "SearchOptionsPanel",
successMsg: "%0 件のtiddlerで %1 が見つかりました",
failureMsg: "%0 は見つかりませんでした"
});
merge(config.macros.tagging,{
label: "タグあり: ",
labelNotTag: "タグなし",
tooltip: "'%0' タグを付けたtiddlerリスト"});
merge(config.macros.timeline,{
dateFormat: "YYYY年MM月DD日"});// 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' タグの付いたtiddlerを表示",
noTags: "タグの付いたtiddlerがありません"});
merge(config.macros.closeAll,{
label: "全て閉じる",
prompt: "表示されている全てのtiddlerを閉じます (編集中を除く)"});
merge(config.macros.permaview,{
label: "現況リンク",
prompt: "現在のtiddler表示状態を再現するURLをアドレス欄に生成します"});
merge(config.macros.newTiddler,{
label: "新規作成",
prompt: "新しいtiddlerを作成します",
title: "",
accessKey: "N"});
merge(config.macros.newJournal,{
label: "新規ジャーナル",
prompt: "タイトルに現在日時が設定された新しいtiddlerを作成します",
accessKey: "J"});
merge(config.macros.options,{
wizardTitle: "個人設定",
step1Title: "これらのオプション設定はログインしていればサーバのあなたのプロファイルに保存されます。",
step1Html: "<input type='hidden' name='markList'></input><br><input type='checkbox' checked='false' name='chkUnknown'>未知のオプションを表示</input>",
unknownDescription: "//(未知)//"});
merge(config.macros.options.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.toolbar,{
moreLabel: "その他",
morePrompt: "その他のコマンドも表示します"});
merge(config.macros.refreshDisplay,{
label: "再表示",
prompt: "TiddlyWiki全体を再描画します"});
merge(config.macros.comments,{
listLabel: "%0 コメント",
listPrompt: "コメントのリスト",
notesLabel: "%0 ノート",
messagesLabel: "%0 メッセージ",
listPrompt: "ノートのリスト",
addCommentLabel: "コメント追加",
addCommentPrompt: "上記のコメント",
addMessageLabel: "メッセージ追加",
addMessagePrompt: "著者へのメッセージ",
addNoteLabel: "ノート追加",
addNotePrompt: "個人的なノートを追加",
addTagLabel: "タグを追加",
addTagPrompt: "タグを追加する"
});
// Commands supported by the toolbar macro
merge(config.commands.closeTiddler, {
text: "閉じる",
tooltip: "このtiddlerを閉じます"});
merge(config.commands.closeOthers, {
text: "他を閉じる",
tooltip: "他の全てのtiddlerを閉じます"});
merge(config.commands.editTiddler, {
text: "編集",
tooltip: "このtiddlerを編集します",
readOnlyText: "閲覧",
readOnlyTooltip: "このtiddlerのソースを表示します"});
merge(config.commands.saveTiddler, {
text: "確定",
tooltip: "このtiddlerへの変更を保存します"});
merge(config.commands.applyChanges, {
text: "適用",
tooltip: "保存して変更を適用します"});
merge(config.commands.cancelChanges, {
text: "キャンセル",
tooltip: "変更をキャンセルする"});
merge(config.commands.cancelTiddler, {
text: "キャンセル",
tooltip: "このtiddlerへの変更を破棄します",
warning: "本当に '%0' の変更を破棄して良いですか?",
readOnlyText: "終了",
readOnlyTooltip: "このtiddlerを通常表示にします"});
merge(config.commands.lockTiddler, {
text: "ロック",
tooltip: "この tiddler を永久にロックします",
readOnlyText: "アンロック",
readOnlyTooltip: "tiddler の編集を許可します"});
merge(config.commands.cutTiddler, {
text: "カット",
tooltip: "削除してクリップボードに記憶します"});
merge(config.commands.copyTiddler, {
text: "コピー",
tooltip: "この tiddler をコピーします"
});
merge(config.commands.excludeTiddler, {
text: "除外",
tooltip: "この tiddler を除外します"
});
merge(config.commands.deleteTiddler, {
text: "削除",
tooltip: "このtiddlerをゴミ箱に送ります",
warning: "本当に '%0' を削除して良いですか?",
prompt: "削除理由を入力して下さい。(キャンセルで中断)"});
merge(config.commands.rescueTiddler, {
text: "元に戻す",
tooltip: "この tiddler を元に戻します"});
merge(config.commands.revertTiddler, {
text: "復元",
tooltip: "最後の編集を戻します",
warning: "'%0' をバージョン'%1' に戻していいですか?",
// adminWarning : "Reverting from the most recent version as admin will delete it - proceed ?"
adminWarning : "最新のバージョンから admin で復元させると削除されます。実行しますか?"
});
merge(config.commands.truncateTiddler, {
text: "バージョン削除",
tooltip: "直前のバージョンを削除します",
warning: "以前のすべてのバージョンを削除していいですか?",
adminWarning: "以前のすべてのバージョンを削除していいですか?"
});
merge(config.commands.permalink, {
text: "パーマリンク",
tooltip: "この tiddler へのパーマリンク(恒久的URL)をアドレス欄に表示します"
});
merge(config.commands.references, {
text: "参照一覧",
tooltip: "このtiddlerへの参照を一覧表示します",
popupNone: "参照がありません"});
merge(config.commands.jump, {
text: "ジャンプ",
tooltip: "他に開いているtiddlerへジャンプ"});
merge(config.commands.history, {
text: "履歴",
tooltip: "履歴を表示します"
});
merge(config.commands.preview, {
text: "プレビュー",
tooltip: "書式化したテキストをプレビューします"
});
merge(config.commands.reload, {
text: "リロード",
tooltip: "すべてのマクロを再実行するため、この tiddler をリロードします"
});
merge(config.commands.tag, {
text: "タグ",
tooltip: "タグを追加します"
});
merge(config.commands.attributes, {
text: "属性",
tooltip: "special タグをON/OFFします"
});
merge(config.commands.diff, {
text: "変更",
tooltip: "変更箇所を表示します"
});
merge(config.commands.help, {
text: "ヘルプ",
tooltip: "ヘルプを表示します",
topics: [
"Font Styles", "Links", "Markup", "CSS Formatting", "Tables", "Macros", "Timing"]});
merge(config.commands.fields, {
text: "拡張情報",
tooltip: "このtiddlerの拡張情報を表示します",
emptyText: "このtiddlerには拡張情報がありません"
});
merge(config.commands.fields.listViewTemplate,{
columns: [
{ name: 'Field', field: 'field', title: "項目", type: 'String' },
{ name: 'Value', field: 'value', title: "値", type: 'String'}
]});
//--
//-- Shadow tiddlers
//--
merge(config.shadowTiddlers, {
PluginManager: '<script label="Reload with PluginManager">window.location = UrlInclude("PluginManager.xml")</script>',
DefaultTiddlers: "[[ページ設定|PageSetup]]",
MainMenu: "[[ページ設定|PageSetup]]\n[[サイトマップ|SiteMap]]\n[[更新履歴|RecentChanges]]\n[[最近のコメント|RecentComments]]",
SiteUrl: "",
SideBarOptions: '<<login edit UserMenu "My stuff" m>><<slider chkSliderSearchPanel SearchPanel "検索 \u00bb" "ページ又はサイトを検索">><<closeAll>><<menu "編集" EditingMenu "編集メニュー" e "!readOnly && config.owner">><<slider chkSliderOptionsPanel OptionsPanel "オプション \u00bb" "TiddlyWiki の詳細設定">>',
SearchOptionsPanel: "!!!ページ検索: [[(?)|PageSearchFAQ]]\n<<option chkRegExpSearch>> 正規表現を使用する\n<<option chkCaseSensitiveSearch>> 大文字小文字を区別する\n<<option chkIncrementalSearch>> インクリメンタル検索\n!!!エリア または サイト検索:\n<<option chkSearchViewSnippets>> 結果のスニペットを表示\n<<option chkSearchViewDate>> 結果に日付を表示\n<<option chkShowManyResults>> より多くの結果を表示\n[[検索履歴|SearchHistory]] | [[高度な検索|AdvancedSearch]]",
SideBarTabs: '<<tabs txtMainTab "時系列" "更新時刻順" TabTimeline "全て" "全てのtiddler" TabAll "タグ別" "全てのタグ" TabTags "~js:config.deprecatedCount~Deprecated" "Deprecated tiddlers" "js;DeprecatedTiddlers" "~.." "その他" TabMore>>',
TabMore: '<<tabs txtMoreTab "未作成" "リンクがあるのに存在しないtiddler" TabMoreMissing "孤立" "どこからもリンクされていないtiddler" TabMoreOrphans "隠し" "隠されているtiddler" TabMoreShadowed>>'});
// Strings in "double quotes" should be translated; strings in 'single quotes' should be left alone
config.messages.dates.months = ["1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月"];
config.messages.dates.days = ["日曜日", "月曜日", "火曜日", "水曜日", "木曜日", "金曜日", "土曜日"];
config.messages.dates.shortMonths = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"];
config.messages.dates.shortDays = ["日", "月", "火", "水", "木", "金", "土"];
// suffixes for dates, eg "1st","2nd","3rd"..."30th","31st"
config.messages.dates.daySuffixes = ["日","日","日","日","日","日","日","日","日","日",
"日","日","日","日","日","日","日","日","日","日",
"日","日","日","日","日","日","日","日","日","日",
"日"];
config.messages.dates.am = "am";
config.messages.dates.pm = "pm";
config.macros.list.all.prompt = "アルファベット順 全tiddler";
config.macros.list.missing.prompt = "リンクがあるのに存在しないtiddler";
config.macros.list.orphans.prompt = "どこからもリンクされていないtiddler";
config.macros.list.shadowed.prompt = "規定で隠されているtiddler";
config.macros.list.touched.prompt = "ローカルに変更されているtiddler";
merge(config.annotations,{
AdvancedOptions: "このtiddlerでは詳細オプションを設定できます",
ColorPalette: "この隠しtiddlerで設定された各値によって、この~TiddlyWikiでの色の枠組みが規定されます。",
CreateNewPage: "ページ作成時の画面",
DefaultTiddlers: "この隠しtiddlerに列挙された各tiddlerは、ページを読み込んだとき自動的に表示されます。",
DefineGroup: "ユーザグループを定義するときの画面",
EditTemplate: "この隠しtiddlerにあるHTMLテンプレートは、tiddler編集中の表示方法を決定します。",
EditingMenu: "編集権限があるときに右のサイドバーに挿入されるメニュー",
"File list": "アップロードされたファイルのリスト",
LibraryUsageHelp: "ヘルプファイル",
MainMenu: "この隠しtiddlerの内容は「メインメニュー」に表示されます。画面左手に表示されます。",
MoveThisPage: "現在のページのアドレスを変更するときの画面",
NoAccessMessage: "DefaultTiddler を表示するとき、ユーザがそのページへのアクセス権がないとき代わりに表示される",
OptionsPanel: "この隠しtiddlerの内容は、右手のサイドバー内でスライド式のオプションパネルとして表示されます。",
PageProperties: "ページプロパティを定義するときの画面 (LoD)",
PagePropertiesScript: "ページプロパティを定義するときの画面で使用されるスクリプト (LoD)",
PageSetup: "ページ設定画面のトップレベルの tiddler",
PageTemplate: "この隠しtiddlerにあるHTMLテンプレートは、全体のページレイアウトを決定します。//これは [[ページテンプレート|PageTemplateHelp]] メカニズムとは別の概念です。//",
PageTemplateHelp: "ページテンプレートメカニズムを説明するヘルプファイル",
PluginManager: "この隠しtiddlerはプラグインマネージャ機能を提供します。",
RecentChanges: "最近変更された内容のリスト",
RecentComments: "最近のコメントのリスト",
"Recycle bin": "削除された tiddler のリスト",
SearchHistory: "~SearchHistoryScript を用いて検索履歴を表示する (LoD)",
SearchHistoryScript: "検索履歴を表示するためのスクリプト (LoD)",
SearchPanel: "検索画面を表示するマクロを起動する",
SearchOptionsPanel: "検索オプションを設定するユーザインタフェース",
SideBarOptions: "この隠しtiddlerの内容は右手のサイドバー内のオプションパネルとして表示されます。",
SideBarTabs: "この隠しtiddlerの内容は右手のサイドバー内にタブパネルとして表示されます。",
SiteMap: "hidden タグを持たないすべてのページのマップを表示する",
SiteSubtitle: "この隠しtiddlerはページのサブタイトルとして利用されます。",
SiteTitle: "この隠しtiddlerはページのメインタイトルとして利用されます。",
SiteUrl: "この隠しtiddlerには、このWikiを公開する際のURLを指定します。",
SpecialEditTemplate: "PageSetup 画面の一部として使用されます",
SpecialTiddlers: "special tiddler のリストを表示します",
SpecialViewTemplate: "PageSetup 画面の一部として使用されます",
StyleSheet: "この隠しtiddlerはカスタムCSSを規定します。",
StyleSheetColors: "この隠しtiddlerはページ内各要素の色に関するCSSを規定します。このtiddlerを編集しないでください。色を修正するには代わりに StyleSheet 隠しtiddler を編集してください。",
StyleSheetLayout: "この隠しtiddlerはページ内各要素のレイアウトに関するCSSを規定します。このtiddlerを編集しないでください。レイアウトを修正するには代わりに StyleSheet 隠しtiddler を編集してください。",
StyleSheetLocale: "この隠しtiddlerはページ内各要素の翻訳ロケールに関するCSSを規定します。",
StyleSheetPrint: "この隠しtiddlerは印刷に関するCSSを規定します。",
TabAll: "この隠しtiddlerの内容は右手のサイドバー内「全て」タブに表示されます。",
TabMore: "この隠しtiddlerの内容は右手のサイドバー内「その他」タブに表示されます。",
TabMoreMissing: "この隠しtiddlerの内容は右手のサイドバー内「未作成」タブに表示されます。",
TabMoreOrphans: "この隠しtiddlerの内容は右手のサイドバー内「孤立」タブに表示されます。",
TabMoreShadowed: "この隠しtiddlerの内容は右手のサイドバー内「隠し」タブに表示されます。",
TabTags: "この隠しtiddlerの内容は右手のサイドバー内「タグ別」タブに表示されます。",
TabTimeline: "この隠しtiddlerの内容は右手のサイドバー内「時系列」タブに表示されます。",
TopRightCorner: "この隠しtiddlerの内容は右上の角に表示されます。",
ToolbarCommands: "この隠しtiddlerはtiddlerツールバーにどのようなコマンドを表示するかを決定します。",
UploadDialog: "ファイルアップロード画面を表示します。",
UserMenu: "ログインしている状態でユーザ名をクリックしたときに右手のサイドバーの最上部にメニューを表示します。",
UserProfile: "個人設定を定義する画面",
ViewOnlyTemplate: "この隠しtiddlerにあるHTMLテンプレートはシステム画面を表示するときに使用されます。",
ViewTemplate: "この隠しtiddlerにあるHTMLテンプレートは、各tiddlerの表示方法を決定します。"
});
//}}}
!!インライン形式
CSSプロパティをインライン(同一行内)で指定する方法です。
CSS指定:
{{{
@@color:#4bbbbb;任意のテキスト@@
}}}
サンプル:
@@color:#4bbbbb;任意のテキスト@@
!!CSSクラス
テキストブロックにCSSクラスを適用させることができます。この形式ではHTMLの {{{<span>}}}が作られます。
CSS指定:
{{{
{{クラス名{任意のテキスト}}}
}}}
サンプル:
{{customClassName{任意のテキスト}}}
以下の形式ではHTMLの {{{<div>}}} が作られます。
CSS指定:
{{{
{{クラス名{
任意のテキスト
}}}
}}}
サンプル:
{{customClassName{
任意のテキスト
}}}
For upgrading. See [[ImportTiddlers]].
URL: http://mptw.tiddlyspot.com/upgrade.html
<script>
config.macros.STETabInsert = {
handler: function(place, macroName, params) {
var inserter = function() {
var te = resolveTarget(window.event);
var name = te.innerText;
if (SpecialEditorTiddlers.indexOf(name) == -1) {
var stt = store.getTiddler('PageSetup');
var ixp = stt.text.indexOf("'All..'");
stt.text = [ stt.text.substring(0,ixp),"'",name,"' 'Edit ",name,"' 'js;editTiddlerHere;",name,"'\n",stt.text.substring(ixp) ].join('');
SpecialEditorTiddlers.push(name);
Story.prototype.specialCases[name] = Story.prototype.specialCaseEditorOpen;
}
config.options['chkPageSetup'] = name;
story.refreshTiddler('PageSetup',DEFAULT_VIEW_TEMPLATE,true);
};
createTiddlyButton(place,params[0],"Click to edit", inserter);
}
}
</script>''これらは giewiki によって使用される事前に定義された tiddler です。多くの場合、デフォルトの内容を持っていて特別な用途で使用されます。''
|<<STETabInsert AdvancedOptions>>|このtiddlerでは詳細オプションを設定できます|
|<<STETabInsert ColorPalette>>|この隠しtiddlerで設定された各値によって、この~TiddlyWikiでの色の枠組みが規定されます。|
|<<STETabInsert CreateNewPage>>|ページ作成時の画面|
|<<STETabInsert DefaultTiddlers>>|この隠しtiddlerに列挙された各tiddlerは、ページを読み込んだとき自動的に表示されます。|
|<<STETabInsert DefineGroup>>|ユーザグループを定義するときの画面|
|<<STETabInsert EditTemplate>>|この隠しtiddlerにあるHTMLテンプレートは、tiddler編集中の表示方法を決定します。|
|<<STETabInsert EditingMenu>>|編集権限があるときに右のサイドバーに挿入されるメニュー|
|File list|アップロードされたファイルのリスト|
|<<STETabInsert LibraryUsageHelp>>|ヘルプファイル|
|<<STETabInsert MainMenu>>|この隠しtiddlerの内容は「メインメニュー」に表示されます。画面左手に表示されます。|
|<<STETabInsert MoveThisPage>>|現在のページのアドレスを変更するときの画面|
|<<STETabInsert NoAccessMessage>>|DefaultTiddler を表示するとき、ユーザがそのページへのアクセス権がないとき代わりに表示される|
|<<STETabInsert OptionsPanel>>|この隠しtiddlerの内容は、右手のサイドバー内でスライド式のオプションパネルとして表示されます。|
|<<STETabInsert PageProperties>>|ページプロパティを定義するときの画面 (LoD)|
|<<STETabInsert PagePropertiesScript>>|ページプロパティを定義するときの画面で使用されるスクリプト (LoD)|
|<<STETabInsert PageSetup>>|ページ設定画面のトップレベルの tiddler|
|<<STETabInsert PageTemplate>>|この隠しtiddlerにあるHTMLテンプレートは、全体のページレイアウトを決定します。//これは [[ページテンプレート|PageTemplateHelp]] メカニズムとは別の概念です。//|
|<<STETabInsert PageTemplateHelp>>|ページテンプレートメカニズムを説明するヘルプファイル|
|<<STETabInsert PluginManager>>|この隠しtiddlerはプラグインマネージャ機能を提供します。|
|RecentChanges|最近変更された内容のリスト|
|RecentComments|最近のコメントのリスト|
|Recycle bin|削除された tiddler のリスト|
|<<STETabInsert SearchHistory>>|~SearchHistoryScript を用いて検索履歴を表示する (LoD)|
|<<STETabInsert SearchHistoryScript>>|検索履歴を表示するためのスクリプト (LoD)|
|<<STETabInsert SearchPanel>>|検索画面を表示するマクロを起動する|
|<<STETabInsert SearchOptionsPanel>>|検索オプションを設定するユーザインタフェース|
|<<STETabInsert SideBarOptions>>|この隠しtiddlerの内容は右手のサイドバー内のオプションパネルとして表示されます。|
|<<STETabInsert SideBarTabs>>|この隠しtiddlerの内容は右手のサイドバー内にタブパネルとして表示されます。|
|<<STETabInsert SiteMap>>|hidden タグを持たないすべてのページのマップを表示する|
|<<STETabInsert SiteSubtitle>>|この隠しtiddlerはページのサブタイトルとして利用されます。^^*^^|
|<<STETabInsert SiteTitle>>|この隠しtiddlerはページのメインタイトルとして利用されます。^^*^^|
|<<STETabInsert SiteUrl>>|この隠しtiddlerには、このWikiを公開する際のURLを指定します。|
|<<STETabInsert SpecialEditTemplate>>|PageSetup 画面の一部として使用されます|
|<<STETabInsert SpecialTiddlers>>|special tiddler のリストを表示します|
|<<STETabInsert SpecialViewTemplate>>|PageSetup 画面の一部として使用されます|
|<<STETabInsert StyleSheet>>|この隠しtiddlerはカスタムCSSを規定します。|
|<<STETabInsert StyleSheetColors>>|この隠しtiddlerはページ内各要素の色に関するCSSを規定します。このtiddlerを編集しないでください。色を修正するには代わりに StyleSheet 隠しtiddler を編集してください。|
|<<STETabInsert StyleSheetLayout>>|この隠しtiddlerはページ内各要素のレイアウトに関するCSSを規定します。このtiddlerを編集しないでください。レイアウトを修正するには代わりに StyleSheet 隠しtiddler を編集してください。|
|<<STETabInsert StyleSheetLocale>>|この隠しtiddlerはページ内各要素の翻訳ロケールに関するCSSを規定します。|
|<<STETabInsert StyleSheetPrint>>|この隠しtiddlerは印刷に関するCSSを規定します。|
|<<STETabInsert TabAll>>|この隠しtiddlerの内容は右手のサイドバー内「全て」タブに表示されます。|
|<<STETabInsert TabMore>>|この隠しtiddlerの内容は右手のサイドバー内「その他」タブに表示されます。|
|<<STETabInsert TabMoreMissing>>|この隠しtiddlerの内容は右手のサイドバー内「未作成」タブに表示されます。|
|<<STETabInsert TabMoreOrphans>>|この隠しtiddlerの内容は右手のサイドバー内「孤立」タブに表示されます。|
|<<STETabInsert TabMoreShadowed>>|この隠しtiddlerの内容は右手のサイドバー内「隠し」タブに表示されます。|
|<<STETabInsert TabTags>>|この隠しtiddlerの内容は右手のサイドバー内「タグ別」タブに表示されます。|
|<<STETabInsert TabTimeline>>|この隠しtiddlerの内容は右手のサイドバー内「時系列」タブに表示されます。|
|<<STETabInsert TopRightCorner>>|この隠しtiddlerの内容は右上の角に表示されます。|
|<<STETabInsert ToolbarCommands>>|この隠しtiddlerはtiddlerツールバーにどのようなコマンドを表示するかを決定します。|
|<<STETabInsert UploadDialog>>|ファイルアップロード画面を表示します。|
|<<STETabInsert UserMenu>>|ログインしている状態でユーザ名をクリックしたときに右手のサイドバーの最上部にメニューを表示します。|
|<<STETabInsert UserProfile>>|個人設定を定義する画面|
|<<STETabInsert ViewOnlyTemplate>>|この隠しtiddlerにあるHTMLテンプレートはシステム画面を表示するときに使用されます。|
|<<STETabInsert ViewTemplate>>|この隠しtiddlerにあるHTMLテンプレートは、各tiddlerの表示方法を決定します。|
<hr>
(*: SiteTitle & SiteSubtitle: これらの変更の履歴をバージョン管理したいときのみ使用して下さい。そうでなければ PageProperties を使用して下さい。)
/***
|Name:|NewHerePlugin|
|Description:|Creates the new here and new journal macros|
|Version:|3.0 ($Rev: 3861 $)|
|Date:|$Date: 2008-03-08 10:53:09 +1000 (Sat, 08 Mar 2008) $|
|Source:|http://mptw.tiddlyspot.com/#NewHerePlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License|http://mptw.tiddlyspot.com/#TheBSDLicense|
***/
//{{{
merge(config.macros, {
newHere: {
handler: function(place,macroName,params,wikifier,paramString,tiddler) {
wikify("<<newTiddler "+paramString+" tag:[["+tiddler.title+"]]>>",place,null,tiddler);
}
},
newJournalHere: {
handler: function(place,macroName,params,wikifier,paramString,tiddler) {
wikify("<<newJournal "+paramString+" tag:[["+tiddler.title+"]]>>",place,null,tiddler);
}
}
});
//}}}
[[/how_to_use_giewiki/ssl6.png|/how_to_use_giewiki/ssl6.png]]
[[/how_to_use_giewiki/ssl7.png|/how_to_use_giewiki/ssl7.png]]
[[/how_to_use_giewiki/ssl4.png|/how_to_use_giewiki/ssl4.png]]
[[/how_to_use_giewiki/ssl5.png|/how_to_use_giewiki/ssl5.png]]
[[/how_to_use_giewiki/ssl2.png|/how_to_use_giewiki/ssl2.png]]
/***
|Name:|TagglyTaggingPlugin|
|Description:|tagglyTagging macro is a replacement for the builtin tagging macro in your ViewTemplate|
|Version:|3.3.1 ($Rev: 9828 $)|
|Date:|$Date: 2009-06-03 21:38:41 +1000 (Wed, 03 Jun 2009) $|
|Source:|http://mptw.tiddlyspot.com/#TagglyTaggingPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
!Notes
See http://mptw.tiddlyspot.com/#TagglyTagging
***/
//{{{
merge(String.prototype,{
parseTagExpr: function(debug) {
if (this.trim() == "")
return "(true)";
var anyLogicOp = /(!|&&|\|\||\(|\))/g;
var singleLogicOp = /^(!|&&|\|\||\(|\))$/;
var spaced = this.
// because square brackets in templates are no good
// this means you can use [(With Spaces)] instead of [[With Spaces]]
replace(/\[\(/g," [[").
replace(/\)\]/g,"]] ").
// space things out so we can use readBracketedList. tricky eh?
replace(anyLogicOp," $1 ");
var expr = "";
var tokens = spaced.readBracketedList(false); // false means don't uniq the list. nice one JR!
for (var i=0;i<tokens.length;i++)
if (tokens[i].match(singleLogicOp))
expr += tokens[i];
else
expr += "tiddler.tags.contains('%0')".format([tokens[i].replace(/'/,"\\'")]); // fix single quote bug. still have round bracket bug i think
if (debug)
alert(expr);
return '('+expr+')';
}
});
merge(TiddlyWiki.prototype,{
getTiddlersByTagExpr: function(tagExpr,sortField) {
var result = [];
var expr = tagExpr.parseTagExpr();
store.forEachTiddler(function(title,tiddler) {
if (eval(expr))
result.push(tiddler);
});
if(!sortField)
sortField = "title";
result.sort(function(a,b) {return a[sortField] < b[sortField] ? -1 : (a[sortField] == b[sortField] ? 0 : +1);});
return result;
}
});
config.taggly = {
// for translations
lingo: {
labels: {
asc: "\u2191", // down arrow
desc: "\u2193", // up arrow
title: "title",
modified: "modified",
created: "created",
show: "+",
hide: "-",
normal: "normal",
group: "group",
commas: "commas",
sitemap: "sitemap",
numCols: "cols\u00b1", // plus minus sign
label: "Tagged as '%0':",
exprLabel: "Matching tag expression '%0':",
excerpts: "excerpts",
descr: "descr",
slices: "slices",
contents: "contents",
sliders: "sliders",
noexcerpts: "title only",
noneFound: "(none)"
},
tooltips: {
title: "Click to sort by title",
modified: "Click to sort by modified date",
created: "Click to sort by created date",
show: "Click to show tagging list",
hide: "Click to hide tagging list",
normal: "Click to show a normal ungrouped list",
group: "Click to show list grouped by tag",
sitemap: "Click to show a sitemap style list",
commas: "Click to show a comma separated list",
numCols: "Click to change number of columns",
excerpts: "Click to show excerpts",
descr: "Click to show the description slice",
slices: "Click to show all slices",
contents: "Click to show entire tiddler contents",
sliders: "Click to show tiddler contents in sliders",
noexcerpts: "Click to show entire title only"
},
tooDeepMessage: "* //sitemap too deep...//"
},
config: {
showTaggingCounts: true,
listOpts: {
// the first one will be the default
sortBy: ["title","modified","created"],
sortOrder: ["asc","desc"],
hideState: ["show","hide"],
listMode: ["normal","group","sitemap","commas"],
numCols: ["1","2","3","4","5","6"],
excerpts: ["noexcerpts","excerpts","descr","slices","contents","sliders"]
},
valuePrefix: "taggly.",
excludeTags: ["excludeLists","excludeTagging"],
excerptSize: 50,
excerptMarker: "/%"+"%/",
siteMapDepthLimit: 25
},
getTagglyOpt: function(title,opt) {
var val = store.getValue(title,this.config.valuePrefix+opt);
return val ? val : this.config.listOpts[opt][0];
},
setTagglyOpt: function(title,opt,value) {
// create it silently if it doesn't exist
if (!store.tiddlerExists(title)) {
store.saveTiddler(title,title,config.views.editor.defaultText.format([title]),config.options.txtUserName,new Date(),"");
// <<tagglyTagging expr:"...">> creates a tiddler to store its display settings
// Make those tiddlers less noticeable by tagging as excludeSearch and excludeLists
// Because we don't want to hide real tags, check that they aren't actually tags before doing so
// Also tag them as tagglyExpression for manageability
// (contributed by RA)
if (!store.getTaggedTiddlers(title).length) {
store.setTiddlerTag(title,true,"excludeSearch");
store.setTiddlerTag(title,true,"excludeLists");
store.setTiddlerTag(title,true,"tagglyExpression");
}
}
// if value is default then remove it to save space
return store.setValue(title, this.config.valuePrefix+opt, value == this.config.listOpts[opt][0] ? null : value);
},
getNextValue: function(title,opt) {
var current = this.getTagglyOpt(title,opt);
var pos = this.config.listOpts[opt].indexOf(current);
// supposed to automagically don't let cols cycle up past the number of items
// currently broken in some situations, eg when using an expression
// lets fix it later when we rewrite for jquery
// the columns thing should be jquery table manipulation probably
var limit = (opt == "numCols" ? store.getTaggedTiddlers(title).length : this.config.listOpts[opt].length);
var newPos = (pos + 1) % limit;
return this.config.listOpts[opt][newPos];
},
toggleTagglyOpt: function(title,opt) {
var newVal = this.getNextValue(title,opt);
this.setTagglyOpt(title,opt,newVal);
},
createListControl: function(place,title,type) {
var lingo = config.taggly.lingo;
var label;
var tooltip;
var onclick;
if ((type == "title" || type == "modified" || type == "created")) {
// "special" controls. a little tricky. derived from sortOrder and sortBy
label = lingo.labels[type];
tooltip = lingo.tooltips[type];
if (this.getTagglyOpt(title,"sortBy") == type) {
label += lingo.labels[this.getTagglyOpt(title,"sortOrder")];
onclick = function() {
config.taggly.toggleTagglyOpt(title,"sortOrder");
return false;
}
}
else {
onclick = function() {
config.taggly.setTagglyOpt(title,"sortBy",type);
config.taggly.setTagglyOpt(title,"sortOrder",config.taggly.config.listOpts.sortOrder[0]);
return false;
}
}
}
else {
// "regular" controls, nice and simple
label = lingo.labels[type == "numCols" ? type : this.getNextValue(title,type)];
tooltip = lingo.tooltips[type == "numCols" ? type : this.getNextValue(title,type)];
onclick = function() {
config.taggly.toggleTagglyOpt(title,type);
return false;
}
}
// hide button because commas don't have columns
if (!(this.getTagglyOpt(title,"listMode") == "commas" && type == "numCols"))
createTiddlyButton(place,label,tooltip,onclick,type == "hideState" ? "hidebutton" : "button");
},
makeColumns: function(orig,numCols) {
var listSize = orig.length;
var colSize = listSize/numCols;
var remainder = listSize % numCols;
var upperColsize = colSize;
var lowerColsize = colSize;
if (colSize != Math.floor(colSize)) {
// it's not an exact fit so..
upperColsize = Math.floor(colSize) + 1;
lowerColsize = Math.floor(colSize);
}
var output = [];
var c = 0;
for (var j=0;j<numCols;j++) {
var singleCol = [];
var thisSize = j < remainder ? upperColsize : lowerColsize;
for (var i=0;i<thisSize;i++)
singleCol.push(orig[c++]);
output.push(singleCol);
}
return output;
},
drawTable: function(place,columns,theClass) {
var newTable = createTiddlyElement(place,"table",null,theClass);
var newTbody = createTiddlyElement(newTable,"tbody");
var newTr = createTiddlyElement(newTbody,"tr");
for (var j=0;j<columns.length;j++) {
var colOutput = "";
for (var i=0;i<columns[j].length;i++)
colOutput += columns[j][i];
var newTd = createTiddlyElement(newTr,"td",null,"tagglyTagging"); // todo should not need this class
wikify(colOutput,newTd);
}
return newTable;
},
createTagglyList: function(place,title,isTagExpr) {
switch(this.getTagglyOpt(title,"listMode")) {
case "group": return this.createTagglyListGrouped(place,title,isTagExpr); break;
case "normal": return this.createTagglyListNormal(place,title,false,isTagExpr); break;
case "commas": return this.createTagglyListNormal(place,title,true,isTagExpr); break;
case "sitemap":return this.createTagglyListSiteMap(place,title,isTagExpr); break;
}
},
getTaggingCount: function(title,isTagExpr) {
// thanks to Doug Edmunds
if (this.config.showTaggingCounts) {
var tagCount = config.taggly.getTiddlers(title,'title',isTagExpr).length;
if (tagCount > 0)
return " ("+tagCount+")";
}
return "";
},
getTiddlers: function(titleOrExpr,sortBy,isTagExpr) {
return isTagExpr ? store.getTiddlersByTagExpr(titleOrExpr,sortBy) : store.getTaggedTiddlers(titleOrExpr,sortBy);
},
getExcerpt: function(inTiddlerTitle,title,indent) {
if (!indent)
indent = 1;
var displayMode = this.getTagglyOpt(inTiddlerTitle,"excerpts");
var t = store.getTiddler(title);
if (t && displayMode == "excerpts") {
var text = t.text.replace(/\n/," ");
var marker = text.indexOf(this.config.excerptMarker);
if (marker != -1) {
return " {{excerpt{<nowiki>" + text.substr(0,marker) + "</nowiki>}}}";
}
else if (text.length < this.config.excerptSize) {
return " {{excerpt{<nowiki>" + t.text + "</nowiki>}}}";
}
else {
return " {{excerpt{<nowiki>" + t.text.substr(0,this.config.excerptSize) + "..." + "</nowiki>}}}";
}
}
else if (t && displayMode == "contents") {
return "\n{{contents indent"+indent+"{\n" + t.text + "\n}}}";
}
else if (t && displayMode == "sliders") {
return "<slider slide>\n{{contents{\n" + t.text + "\n}}}\n</slider>";
}
else if (t && displayMode == "descr") {
var descr = store.getTiddlerSlice(title,'Description');
return descr ? " {{excerpt{" + descr + "}}}" : "";
}
else if (t && displayMode == "slices") {
var result = "";
var slices = store.calcAllSlices(title);
for (var s in slices)
result += "|%0|<nowiki>%1</nowiki>|\n".format([s,slices[s]]);
return result ? "\n{{excerpt excerptIndent{\n" + result + "}}}" : "";
}
return "";
},
notHidden: function(t,inTiddler) {
if (typeof t == "string")
t = store.getTiddler(t);
return (!t || !t.tags.containsAny(this.config.excludeTags) ||
(inTiddler && this.config.excludeTags.contains(inTiddler)));
},
// this is for normal and commas mode
createTagglyListNormal: function(place,title,useCommas,isTagExpr) {
var list = config.taggly.getTiddlers(title,this.getTagglyOpt(title,"sortBy"),isTagExpr);
if (this.getTagglyOpt(title,"sortOrder") == "desc")
list = list.reverse();
var output = [];
var first = true;
for (var i=0;i<list.length;i++) {
if (this.notHidden(list[i],title)) {
var countString = this.getTaggingCount(list[i].title);
var excerpt = this.getExcerpt(title,list[i].title);
if (useCommas)
output.push((first ? "" : ", ") + "[[" + list[i].title + "]]" + countString + excerpt);
else
output.push("*[[" + list[i].title + "]]" + countString + excerpt + "\n");
first = false;
}
}
return this.drawTable(place,
this.makeColumns(output,useCommas ? 1 : parseInt(this.getTagglyOpt(title,"numCols"))),
useCommas ? "commas" : "normal");
},
// this is for the "grouped" mode
createTagglyListGrouped: function(place,title,isTagExpr) {
var sortBy = this.getTagglyOpt(title,"sortBy");
var sortOrder = this.getTagglyOpt(title,"sortOrder");
var list = config.taggly.getTiddlers(title,sortBy,isTagExpr);
if (sortOrder == "desc")
list = list.reverse();
var leftOvers = []
for (var i=0;i<list.length;i++)
leftOvers.push(list[i].title);
var allTagsHolder = {};
for (var i=0;i<list.length;i++) {
for (var j=0;j<list[i].tags.length;j++) {
if (list[i].tags[j] != title) { // not this tiddler
if (this.notHidden(list[i].tags[j],title)) {
if (!allTagsHolder[list[i].tags[j]])
allTagsHolder[list[i].tags[j]] = "";
if (this.notHidden(list[i],title)) {
allTagsHolder[list[i].tags[j]] += "**[["+list[i].title+"]]"
+ this.getTaggingCount(list[i].title) + this.getExcerpt(title,list[i].title) + "\n";
leftOvers.setItem(list[i].title,-1); // remove from leftovers. at the end it will contain the leftovers
}
}
}
}
}
var allTags = [];
for (var t in allTagsHolder)
allTags.push(t);
var sortHelper = function(a,b) {
if (a == b) return 0;
if (a < b) return -1;
return 1;
};
allTags.sort(function(a,b) {
var tidA = store.getTiddler(a);
var tidB = store.getTiddler(b);
if (sortBy == "title") return sortHelper(a,b);
else if (!tidA && !tidB) return 0;
else if (!tidA) return -1;
else if (!tidB) return +1;
else return sortHelper(tidA[sortBy],tidB[sortBy]);
});
var leftOverOutput = "";
for (var i=0;i<leftOvers.length;i++)
if (this.notHidden(leftOvers[i],title))
leftOverOutput += "*[["+leftOvers[i]+"]]" + this.getTaggingCount(leftOvers[i]) + this.getExcerpt(title,leftOvers[i]) + "\n";
var output = [];
if (sortOrder == "desc")
allTags.reverse();
else if (leftOverOutput != "")
// leftovers first...
output.push(leftOverOutput);
for (var i=0;i<allTags.length;i++)
if (allTagsHolder[allTags[i]] != "")
output.push("*[["+allTags[i]+"]]" + this.getTaggingCount(allTags[i]) + this.getExcerpt(title,allTags[i]) + "\n" + allTagsHolder[allTags[i]]);
if (sortOrder == "desc" && leftOverOutput != "")
// leftovers last...
output.push(leftOverOutput);
return this.drawTable(place,
this.makeColumns(output,parseInt(this.getTagglyOpt(title,"numCols"))),
"grouped");
},
// used to build site map
treeTraverse: function(title,depth,sortBy,sortOrder,isTagExpr) {
var list = config.taggly.getTiddlers(title,sortBy,isTagExpr);
if (sortOrder == "desc")
list.reverse();
var indent = "";
for (var j=0;j<depth;j++)
indent += "*"
var childOutput = "";
if (depth > this.config.siteMapDepthLimit)
childOutput += indent + this.lingo.tooDeepMessage + "\n";
else
for (var i=0;i<list.length;i++)
if (list[i].title != title)
if (this.notHidden(list[i].title,this.config.inTiddler))
childOutput += this.treeTraverse(list[i].title,depth+1,sortBy,sortOrder,false);
if (depth == 0)
return childOutput;
else
return indent + "[["+title+"]]" + this.getTaggingCount(title) + this.getExcerpt(this.config.inTiddler,title,depth) + "\n" + childOutput;
},
// this if for the site map mode
createTagglyListSiteMap: function(place,title,isTagExpr) {
this.config.inTiddler = title; // nasty. should pass it in to traverse probably
var output = this.treeTraverse(title,0,this.getTagglyOpt(title,"sortBy"),this.getTagglyOpt(title,"sortOrder"),isTagExpr);
return this.drawTable(place,
this.makeColumns(output.split(/(?=^\*\[)/m),parseInt(this.getTagglyOpt(title,"numCols"))), // regexp magic
"sitemap"
);
},
macros: {
tagglyTagging: {
handler: function (place,macroName,params,wikifier,paramString,tiddler) {
var parsedParams = paramString.parseParams("tag",null,true);
var refreshContainer = createTiddlyElement(place,"div");
// do some refresh magic to make it keep the list fresh - thanks Saq
refreshContainer.setAttribute("refresh","macro");
refreshContainer.setAttribute("macroName",macroName);
var tag = getParam(parsedParams,"tag");
var expr = getParam(parsedParams,"expr");
if (expr) {
refreshContainer.setAttribute("isTagExpr","true");
refreshContainer.setAttribute("title",expr);
refreshContainer.setAttribute("showEmpty","true");
}
else {
refreshContainer.setAttribute("isTagExpr","false");
if (tag) {
refreshContainer.setAttribute("title",tag);
refreshContainer.setAttribute("showEmpty","true");
}
else {
refreshContainer.setAttribute("title",tiddler.title);
refreshContainer.setAttribute("showEmpty","false");
}
}
this.refresh(refreshContainer);
},
refresh: function(place) {
var title = place.getAttribute("title");
var isTagExpr = place.getAttribute("isTagExpr") == "true";
var showEmpty = place.getAttribute("showEmpty") == "true";
removeChildren(place);
addClass(place,"tagglyTagging");
var countFound = config.taggly.getTiddlers(title,'title',isTagExpr).length
if (countFound > 0 || showEmpty) {
var lingo = config.taggly.lingo;
config.taggly.createListControl(place,title,"hideState");
if (config.taggly.getTagglyOpt(title,"hideState") == "show") {
createTiddlyElement(place,"span",null,"tagglyLabel",
isTagExpr ? lingo.labels.exprLabel.format([title]) : lingo.labels.label.format([title]));
config.taggly.createListControl(place,title,"title");
config.taggly.createListControl(place,title,"modified");
config.taggly.createListControl(place,title,"created");
config.taggly.createListControl(place,title,"listMode");
config.taggly.createListControl(place,title,"excerpts");
config.taggly.createListControl(place,title,"numCols");
config.taggly.createTagglyList(place,title,isTagExpr);
if (countFound == 0 && showEmpty)
createTiddlyElement(place,"div",null,"tagglyNoneFound",lingo.labels.noneFound);
}
}
}
}
},
// todo fix these up a bit
styles: [
"/*{{{*/",
"/* created by TagglyTaggingPlugin */",
".tagglyTagging { padding-top:0.5em; }",
".tagglyTagging li.listTitle { display:none; }",
".tagglyTagging ul {",
" margin-top:0px; padding-top:0.5em; padding-left:2em;",
" margin-bottom:0px; padding-bottom:0px;",
"}",
".tagglyTagging { vertical-align: top; margin:0px; padding:0px; }",
".tagglyTagging table { margin:0px; padding:0px; }",
".tagglyTagging .button { visibility:hidden; margin-left:3px; margin-right:3px; }",
".tagglyTagging .button, .tagglyTagging .hidebutton {",
" color:[[ColorPalette::TertiaryLight]]; font-size:90%;",
" border:0px; padding-left:0.3em;padding-right:0.3em;",
"}",
".tagglyTagging .button:hover, .hidebutton:hover, ",
".tagglyTagging .button:active, .hidebutton:active {",
" border:0px; background:[[ColorPalette::TertiaryPale]]; color:[[ColorPalette::TertiaryDark]];",
"}",
".selected .tagglyTagging .button { visibility:visible; }",
".tagglyTagging .hidebutton { color:[[ColorPalette::Background]]; }",
".selected .tagglyTagging .hidebutton { color:[[ColorPalette::TertiaryLight]] }",
".tagglyLabel { color:[[ColorPalette::TertiaryMid]]; font-size:90%; }",
".tagglyTagging ul {padding-top:0px; padding-bottom:0.5em; margin-left:1em; }",
".tagglyTagging ul ul {list-style-type:disc; margin-left:-1em;}",
".tagglyTagging ul ul li {margin-left:0.5em; }",
".editLabel { font-size:90%; padding-top:0.5em; }",
".tagglyTagging .commas { padding-left:1.8em; }",
"/* not technically tagglytagging but will put them here anyway */",
".tagglyTagged li.listTitle { display:none; }",
".tagglyTagged li { display: inline; font-size:90%; }",
".tagglyTagged ul { margin:0px; padding:0px; }",
".excerpt { color:[[ColorPalette::TertiaryDark]]; }",
".excerptIndent { margin-left:4em; }",
"div.tagglyTagging table,",
"div.tagglyTagging table tr,",
"td.tagglyTagging",
" {border-style:none!important; }",
".tagglyTagging .contents { border-bottom:2px solid [[ColorPalette::TertiaryPale]]; padding:0 1em 1em 0.5em;",
" margin-bottom:0.5em; }",
".tagglyTagging .indent1 { margin-left:3em; }",
".tagglyTagging .indent2 { margin-left:4em; }",
".tagglyTagging .indent3 { margin-left:5em; }",
".tagglyTagging .indent4 { margin-left:6em; }",
".tagglyTagging .indent5 { margin-left:7em; }",
".tagglyTagging .indent6 { margin-left:8em; }",
".tagglyTagging .indent7 { margin-left:9em; }",
".tagglyTagging .indent8 { margin-left:10em; }",
".tagglyTagging .indent9 { margin-left:11em; }",
".tagglyTagging .indent10 { margin-left:12em; }",
".tagglyNoneFound { margin-left:2em; color:[[ColorPalette::TertiaryMid]]; font-size:90%; font-style:italic; }",
"/*}}}*/",
""].join("\n"),
init: function() {
merge(config.macros,this.macros);
config.shadowTiddlers["TagglyTaggingStyles"] = this.styles;
store.addNotification("TagglyTaggingStyles",refreshStyles);
}
};
config.taggly.init();
//}}}
/***
InlineSlidersPlugin
By Saq Imtiaz
http://tw.lewcid.org/sandbox/#InlineSlidersPlugin
// syntax adjusted to not clash with NestedSlidersPlugin
// added + syntax to start open instead of closed
***/
//{{{
config.formatters.unshift( {
name: "inlinesliders",
// match: "\\+\\+\\+\\+|\\<slider",
match: "\\<slider",
// lookaheadRegExp: /(?:\+\+\+\+|<slider) (.*?)(?:>?)\n((?:.|\n)*?)\n(?:====|<\/slider>)/mg,
lookaheadRegExp: /(?:<slider)(\+?) (.*?)(?:>)\n((?:.|\n)*?)\n(?:<\/slider>)/mg,
handler: function(w) {
this.lookaheadRegExp.lastIndex = w.matchStart;
var lookaheadMatch = this.lookaheadRegExp.exec(w.source)
if(lookaheadMatch && lookaheadMatch.index == w.matchStart ) {
var btn = createTiddlyButton(w.output,lookaheadMatch[2] + " "+"\u00BB",lookaheadMatch[2],this.onClickSlider,"button sliderButton");
var panel = createTiddlyElement(w.output,"div",null,"sliderPanel");
panel.style.display = (lookaheadMatch[1] == '+' ? "block" : "none");
wikify(lookaheadMatch[3],panel);
w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;
}
},
onClickSlider : function(e) {
if(!e) var e = window.event;
var n = this.nextSibling;
n.style.display = (n.style.display=="none") ? "block" : "none";
return false;
}
});
//}}}
[[/how_to_use_giewiki/ssl1.png|/how_to_use_giewiki/ssl1.png]]
!!Google クラウドコンソールを開く
以下のリンクから、Google クラウドコンソールを開きます。
https://console.cloud.google.com/
まだログインしてないときはログイン画面が表示されるので、gmail のメールアドレスとパスワードを入力します。
!!Google クラウドにサインアップする
|右のような画面が表示されます。<br>右上の「無料試用に登録」を選択します。300ドル相当の利用枠がもらえます。私は使いきれずに余りました。たいていの人はそうなると思います。|<<image gcp1.png|https://wiki.altalk.com/how_to_use_giewiki/gcp1.png>>|
|ここで、Google社のクラウドサービスを利用することを登録します。<br>日本は下から10番目くらいにあります。<br>あとは、画面の表示に従ってクレジットカード番号などを入力します。|<<image gcp3.png|https://wiki.altalk.com/how_to_use_giewiki/gcp3.png>>|
!!プロジェクトを作成する
|上部の「Google Cloud Platform」のすぐ右の部分をクリックし、「プロジェクトを作成」を選択します。<br>任意のプロジェクト名を入力します。<br>このときさらに、「詳細設定を表示」を選択して、App Engine の地域を選択します。Googleのサーバが設置されている物理的な位置を表しています。利用するユーザの場所から近い方が応答が速いと期待できます。この項目は後から変更できません。asia-northeast1 が東京を表しています。|<<image gcp4.png|https://wiki.altalk.com/how_to_use_giewiki/gcp4.png>>|
The "requires" attribute is a custom field that you may add to a tiddler to indicate that certain other tiddlers need to accompany it. The value is a list of tiddler names, using {{{[[}}} double square brackets{{{]]}}} for separation if necessary, that tells giewiki which other tiddlers are needed. It is currently used in two places:
* When importing tiddlers from a library, checking a tiddler which requires another, will check that as well.
* When lazyLoading a systemConfig tiddler, typically in [[On-demand-loading macros]], it tells giewiki what other tiddlers are also needed.
!www付きのドメインの場合(www.mydomain.com)
ブラウザで [[Google クラウドコンソール|https://console.cloud.google.com/]] にアクセスします。バーガーアイコンから App Engine を選択します。
左のメニューから設定を選択、「カスタムドメイン」タブを選択します。
「カスタムドメインを追加」ボタンをクリックすると、今度は mydomain.com が選択できるはずです。これを選択します。「続行」ボタンをクリックします。
「次のドメインとサブドメインがマッピングされます」の下の入力欄に、wiki サイトと紐づけたいホスト名「www.mydomain.com」を入力します。wwwの部分は他の名前でも構いません。
注: どうもここのインタフェースの反応が悪いのですが、入力欄の左の方を何度かクリックすると、カーソルが表示されるので、それを待って入力してください。
「続行」ボタンをクリックします。
すると先ほど登録しておいた、
* レコードタイプ: CNAME
* データ: ghs.googlehosted.com
* エイリアス: www
をDNSサーバに登録するようにと表示されます。登録済みなので「完了」をクリックします。
<<image wiki3.png|https://wiki.altalk.com/how_to_use_giewiki/wiki3.png>>
うまく登録できたら、コンソールに上のような画面が表示されるはずです。ただし、SSLサポートはまだ登録してないので空欄になっているはずです。
!ルートドメインの場合(mydomain.com)
上記と同じ操作で、カスタムドメインを入力するときに mydomain.com と入力してください。すると、CNAMEではなく A レコードで Google が指定するIPアドレスをネームサーバーに登録するように表示されます。この通りに設定すればルートドメインでも GAE が使えます。
* レコードタイプ: A
* データ: (画面に表示されたIPアドレス。複数のIPアドレスがあり、全部登録する)
この方法で登録すると以下のようになります。このサイトはGAEで構築しており、 https://altalk.com でも https://www.altalk.com でもアクセスできます。
<<image gcp5.png|https://wiki.altalk.com/how_to_use_giewiki/gcp5.png>>
<<tabs txtMoreTab "Tags" "All Tags" TabAllTags "Miss" "Missing tiddlers" TabMoreMissing "Orph" "Orphaned tiddlers" TabMoreOrphans "Shad" "Shadowed tiddlers" TabMoreShadowed>>
!単純なテーブル
マークアップ:
{{{
|左上|上|右上|
|左|真ん中|右|
|左下|下|右下|
}}}
サンプル:
|左上|上|右上|
|左|真ん中|右|
|左下|下|右下|
!セル(表内のマス)内の書式
*右寄せするには、セル内のテキストの最初に空白文字を置く。
*左寄せするには、セル内のテキストの最後に空白文字を置く。
*中央寄せするには、セル内のテキストの前後に空白文字を置く。
*ヘッダ行にするには、(空白を除く)最初の文字の前に感嘆符({{{!}}})を置く。
マークアップ:
{{{
|!最初のカラム|!次のカラム|!三つ目のカラム|
|左寄せ | 中央寄せ | 右寄せ|
}}}
サンプル:
|!最初のカラム|!二つ目のカラム|!三つ目のカラム|
|左寄せ | 中央寄せ | 右寄せ|
!テーブルのヘッダとフッタ
* 最後に 'h' を置くことで、その行をヘッダにする。
* 最後に 'f' を置くことで、その行をフッタにする。
マークアップ:
{{{
|左上|上|右上|h
|左|真ん中|右|
|左下|下|右下|f
}}}
サンプル:
|左上|上|右上|h
|左|真ん中|右|
|左下|下|右下|f
!テーブルの見出し
最後に 'c' を付けた特別な行を追加することで、テーブルの上または下に、見出しを付けることができます。
マークアップ:
{{{
|テーブルの上に付ける見出し|c
|左上のセル|上のセル|右上のセル|h
|左のセル|真ん中のセル|右のセル|
|左下のセル|下のセル|右下のセル|f
}}}
{{{
|左上のセル|上のセル|右上のセル|h
|左のセル|真ん中のセル|右のセル|
|左下のセル|下のセル|右下のセル|f
|テーブルの下に付ける見出し|c
}}}
サンプル:
|テーブルの上に付ける見出し|c
|左上のセル|上のセル|右上のセル|h
|左のセル|真ん中のセル|右のセル|
|左下のセル|下のセル|右下のセル|f
|左上のセル|上のセル|右上のセル|h
|左のセル|真ん中のセル|右のセル|
|左下のセル|下のセル|右下のセル|f
|テーブルの下に付ける見出し|c
!テーブルセルの連結
セルに{{{>}}}と書くと、その右隣のセルと水平方向に連結されます。
マークアップ:
{{{
|左上のセル|上のセル|右上のセル|
|>|>|左、中央、右のセル|
|左下のセル|下のセル|右下のセル|
}}}
サンプル:
|左上のセル|上のセル|右上のセル|
|>|>|左、中央、右のセル|
|左下のセル|下のセル|右下のセル|
セルに{{{~}}}と書くと、その上隣のセルと垂直方向に連結されます。
マークアップ:
{{{
|左の列|上のセル|右上のセル|
|~|真ん中のセル|右のセル|
|~|下のセル|右下のセル|
}}}
サンプル:
|左の列|上のセル|右上のセル|
|~|真ん中のセル|右のセル|
|~|下のセル|右下のセル|
!テーブルのCSS指定
最後に 'k' を付けた特別な行を追加することで、テーブル全体に対してCSSクラスを付与できます。
マークアップ:
{{{
|クラス名|k
|左上のセル|上のセル|右上のセル|
|左のセル|真ん中のセル|右のセル|
|左下のセル|下のセル|右下のセル|
}}}
セル内のテキストの前にCSSの名前と値のペアを置くことで、テーブルセルにCSSプロパティを追加することができます。二通りの構文があります。
マークアップ:
{{{
|color:red; 左上のセル|opacity:0.5;上のセル|右上のセル|
|color(green):左のセル|真ん中のセル|右のセル|
|左下のセル|下のセル|右下のセル|
}}}
サンプル:
|color:red; 左上のセル|opacity:0.5;上のセル|右上のセル|
|color(green):左のセル|真ん中のセル|右のセル|
|左下のセル|下のセル|右下のセル|
!テーブルストライプ
giewiki は各テーブル行の{{{<TR>}}}要素に対して自動的に {{{oddRow}}} と {{{evenRow}}} クラスを割り当てます。これを用いて StyleSheet でスタイルを付けることができます。
{{{
.viewer tr.oddRow { background-color: #fff; }
.viewer tr.evenRow { background-color: #ffc; }
}}}
!Python GAE アプリの場合
アプリの言語が Python であれば、本体にスクリプトを組み込むことができるので簡単です。giewiki もPython アプリです。
コマンドプロンプトを開き、アプリの app.yaml ファイルがあるディレクトリに移動します。
以下のコマンドを入力します。
{{{
git clone https://github.com/AirConsole/letsencrypt
}}}
次に、app.yaml ファイルをテキストエディタで開き、handlers: 行のすぐ下に以下のように追加します。
{{{
handlers:
- url: /\.well\-known\/acme\-challenge\/.*
script: letsencrypt.app
}}}
これにより、SSL証明書を発行するスクリプトが組み込まれ、
{{{http://www.mydomain.com/.well-known/acme-challenge/}}}
で起動できるようになります。
!Python 以外の GAE アプリの場合
証明書を発行するスクリプトは Python で書かれているので、アプリ本体が Python でないなら別のサービスに分けなければなりません。GAE のディスパッチ機能を利用します。(サービスとは、以前はモジュールと呼ばれていたものです)
* アプリ本体は、例えば Java で書かれているとします。これを default サービスで運用しているとします。
* 証明書発行スクリプトを letsencrypt サービスとしてデプロイします。
* ディスパッチ機能により、{{{http://www.mydomain.com/.well-known/acme-challenge/*}}} というURLパターンのときは letsencrypt を呼び出し、その他のときは default サービスを呼ぶように設定します。
最終的に以下のツリー構造を作成します。
{{{
プロジェクトディレクトリ
├─default … default サービスのディレクトリ
│ └─src
│ └─main
│ ├─java
│ │ └─com
│ │ └─example
│ │ └─appengine
│ │ └─helloworld
│ │ └─HelloServlet.java … Java アプリ
│ └─webapp
│ └─WEB-INF
│ ├─appengine-web.xml
│ ├─dispatch.xml … ディスパッチ設定
│ └─web.xml
└─letsencrypt … letsencrypt サービスのディレクトリ
├─app.yaml … app.yaml ファイル
└─letsencrypt
└─__init__.py … SSL証明書発行スクリプト
}}}
Java アプリについては、以下のドキュメントに書かれている helloworld アプリでテストしました。
https://cloud.google.com/appengine/docs/java/quickstart
このテストアプリは以下のコマンドでダウンロードできます。
{{{
git clone https://github.com/GoogleCloudPlatform/java-docs-samples.git
}}}
!!!letsencrypt サービスの作成
letsencrypt サービスのためのディレクトリを作成し、以下の内容で app.yaml ファイルを作成します。
{{{
service: letsencrypt
runtime: python27
api_version: 1
threadsafe: true
handlers:
- url: /\.well\-known\/acme\-challenge\/.*
script: letsencrypt.app
}}}
先頭行でサービス名を指定していることに注意して下さい。
app.yaml ファイルがあるディレクトリで以下のコマンドを入力します。
{{{
git clone https://github.com/AirConsole/letsencrypt
}}}
デプロイします。
{{{
gcloud app deploy
}}}
以下のURLにアクセスして動作確認します。
{{{
http://letsencrypt-dot-プロジェクトID.appspot.com/.well-known/acme-challenge/
}}}
この時点ではまだ独自ドメインを使っていないので、以下のエラーが表示されます。
{{{
You need to run this script on your domain, not appspot.com.
}}}
!!!アプリ本体側にディスパッチ設定をする
ディスパッチの設定は、default サービスに設定しなければならないと定められています。
ディスパッチ設定の指定方法は言語ごとに異なります。ここではJava での例を示します。
~WEB-INF ディレクトリ配下に以下の内容で dispatch.xml ファイルを作成します。
{{{
<?xml version="1.0" encoding="UTF-8"?>
<dispatch-entries>
<dispatch>
<url>独自ドメイン/.well-known/acme-challenge/*</url>
<module>letsencrypt</module>
</dispatch>
<dispatch>
<url>*/*</url>
<module>default</module>
</dispatch>
</dispatch-entries>
}}}
以下のコマンドで設定をGAEにデプロイします。(defaultディレクトリで実行する)
{{{
appcfg update_dispatch src\main\webapp
}}}
!!!スクリプトをテストする
以下のURLにアクセスして動作確認します。
{{{
http://独自ドメイン/.well-known/acme-challenge/
}}}
以下のように表示されれば成功です。
{{{
Adapt and run the following command in a shell (curl and openssl required). You can...:
curl -s http://独自ドメイン/.well-known/acme-challenge/?script=1 | python - --domain 独自ドメイン --secret XXX...
You can also run this command in the Google Cloud Shell
}}}
!SSL証明書を登録する
証明書発行スクリプトが動作したら、[[SSL証明書登録の運用イメージ]] で説明した手順でSSL証明書を登録します。
なお、SSL証明書の更新作業は90日以内に定期的に実施する必要があるので、リマインダーのメールを仕込んでおくと便利です。私の場合、[[Google カレンダー|https://calendar.google.com]] を使って予定を設定してあります。2ヶ月ごとに繰り返す設定にして、説明欄に以下のように書いておきます。参考にして下さい。
{{{
(1)コンソール開く。Google Cloud Shell も開く。
https://console.cloud.google.com/
(2) 順にキーを表示し、shellで実行する。
http://独自ドメイン/.well-known/acme-challenge/
(3) App Engine -> 設定 => SSL証明書 にアップロードする。
(4) ページ確認(自動でHTTPSになること)
http://独自ドメイン/
}}}
/***
|Name:|NewMeansNewPlugin|
|Description:|If 'New Tiddler' already exists then create 'New Tiddler (1)' and so on|
|Version:|1.1.1 ($Rev: 2263 $)|
|Date:|$Date: 2007-06-13 04:22:32 +1000 (Wed, 13 Jun 2007) $|
|Source:|http://mptw.tiddlyspot.com/empty.html#NewMeansNewPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License|http://mptw.tiddlyspot.com/#TheBSDLicense|
!!Note: I think this should be in the core
***/
//{{{
// change this or set config.newMeansNewForJournalsToo it in MptwUuserConfigPlugin
if (config.newMeansNewForJournalsToo == undefined) config.newMeansNewForJournalsToo = true;
String.prototype.getNextFreeName = function() {
numberRegExp = / \(([0-9]+)\)$/;
var match = numberRegExp.exec(this);
if (match) {
var num = parseInt(match[1]) + 1;
return this.replace(numberRegExp," ("+num+")");
}
else {
return this + " (1)";
}
}
config.macros.newTiddler.checkForUnsaved = function(newName) {
var r = false;
story.forEachTiddler(function(title,element) {
if (title == newName)
r = true;
});
return r;
}
config.macros.newTiddler.getName = function(newName) {
while (store.getTiddler(newName) || config.macros.newTiddler.checkForUnsaved(newName))
newName = newName.getNextFreeName();
return newName;
}
config.macros.newTiddler.onClickNewTiddler = function()
{
var title = this.getAttribute("newTitle");
if(this.getAttribute("isJournal") == "true") {
title = new Date().formatString(title.trim());
}
// ---- these three lines should be the only difference between this and the core onClickNewTiddler
if (config.newMeansNewForJournalsToo || this.getAttribute("isJournal") != "true")
title = config.macros.newTiddler.getName(title);
var params = this.getAttribute("params");
var tags = params ? params.split("|") : [];
var focus = this.getAttribute("newFocus");
var template = this.getAttribute("newTemplate");
var customFields = this.getAttribute("customFields");
if(!customFields && !store.isShadowTiddler(title))
customFields = String.encodeHashMap(config.defaultCustomFields);
story.displayTiddler(null,title,template,false,null,null);
var tiddlerElem = story.getTiddler(title);
if(customFields)
story.addCustomFields(tiddlerElem,customFields);
var text = this.getAttribute("newText");
if(typeof text == "string")
story.getTiddlerField(title,"text").value = text.format([title]);
for(var t=0;t<tags.length;t++)
story.setTiddlerTag(title,tags[t],+1);
story.focusTiddler(title,focus);
return false;
};
//}}}
ここで説明する方法は、giewiki に限らず、どんな GAE アプリでも適用できます。
!appspot ドメインとは
GAEアプリのデフォルトのURLは
{{{
http://プロジェクトID.appspot.com/
}}}
という形式をしています。独自ドメインで運用するときは、
{{{
http://www.mydomain.com/
}}}
というURLになります。この場合でも、元の appspot のURLも引き続き利用できます。
これを便利と思うならこのままで問題ありません。でもせっかく独自ドメインを採用したのですから、appspot はもう使わない方が良いでしょう。
そこで appspot ドメインでアクセスしても独自ドメインの方で表示されるようにします。そのためには、 appspot ドメインでアプリにアクセスしたとき、対応する独自ドメインのURLにリダイレクトする指示をブラウザに返します。ブラウザは、リダイレクトの指示を受けると自動的に新しいURLにアクセスします。
!GAEのディスパッチ機能
リダイレクトさせるには、GAEアプリを改造しなければなりません。自分で作ったアプリならそれも簡単ですが、giewiki のように他人が作ったある程度規模の大きいアプリの改造は容易ではありません。
こんなとき、GAEのディスパッチ機能を利用できます。リダイレクトさせるための小さなアプリを、同じプロジェクト内の別サービスとして作成します。
* アプリ本体は default サービスで動作しているとします。
* リダイレクトアプリを redirect サービスとしてデプロイします。
* ディスパッチ機能により、{{{http(s)://プロジェクトID.appspot.com/*}}} というURLパターンのときは redirect サービスを呼び出し、その他のときは default サービスを呼ぶように設定します。
!redirect サービスの作成
redirect サービスのためのディレクトリを作成し、以下の内容で app.yaml ファイルを作成します。
{{{
service: redirect
runtime: python27
api_version: 1
threadsafe: true
handlers:
- url: .*
script: redirect.app
}}}
先頭行でサービス名を指定していることに注意して下さい。
以下の内容で redirect.py ファイルを作成します。文字コードは utf-8 で保存します。
{{{
# coding=utf-8
"""
URLが appspot ドメインなら所定のドメインにリダイレクトする。
その他の場合は 404 エラーとする。
"""
from __future__ import absolute_import, division, print_function, unicode_literals
import webapp2
class MainPage(webapp2.RequestHandler):
def get(self):
dom = b"www.mydomain.com" # リダイレクト先ドメイン
from urlparse import urlparse, urlunparse
parts = urlparse(self.request.url)
doms = parts[1].split(b':')
if doms[0].endswith(b'.appspot.com'):
# appspot ドメインをリダイレクト
url = urlunparse((parts[0],dom)+parts[2:])
self.redirect(url)
return
# 404 エラーとする
self.response.clear()
self.response.set_status(404)
app = webapp2.WSGIApplication([
("/.*", MainPage),
])
}}}
www.mydomain.com の部分には、独自ドメインを指定します。
ここでは、ドメイン名を確認して appspot ドメインのときはリダイレクトするようにしています。無条件にリダイレクトすると、万一設定ミスのために www.mydomain.com ドメインでこのサービスが起動するとループしてしまいます。安全のため、ドメイン名をチェックしています。
デプロイします。
{{{
gcloud app deploy
}}}
以下のURLにアクセスして動作確認します。
{{{
http://redirect-dot-プロジェクトID.appspot.com/
}}}
リダイレクトにより、ブラウザのアドレスバーに独自ドメインのURLが表示されるはずです。
{{{
http://www.mydomain.com/
}}}
!アプリ本体側にディスパッチ設定をする
ディスパッチ設定の指定方法は言語ごとに異なります。ここではPython での例を示します。
ディスパッチの設定は、default サービスに設定しなければならないと定められています。
アプリ本体の app.yaml があるディレクトリ(トップディレクトリ)に以下の内容で dispatch.yaml ファイルを作成します。
{{{
dispatch:
- url: "*.appspot.com/*"
module: redirect
- url: "*/*"
module: default
}}}
デプロイします。
{{{
gcloud app deploy dispatch.yaml
}}}
なお、ディスパッチ設定を解除したい場合は、 dispatch.yaml ファイルの中身を空にして、同じ手順でデプロイして下さい。
!テストする
以下のURLにアクセスして動作確認します。
{{{
http://プロジェクトID.appspot.com/
}}}
リダイレクトにより、ブラウザのアドレスバーに独自ドメインのURLが表示されるはずです。
{{{
http://www.mydomain.com/
}}}
これは当サイト管理者用です。
!giewiki
[[giewikiの使い方]]
[[giewikiとは]]
[[インストール]]
[[Google アカウント|Google アカウント(gmailのアドレスなど)を手に入れる]]
[[プロジェクト作成|GAE プロジェクトを作成する]]
[[SDKインストール|Google Cloud SDK をインストールする]]
[[アップロード|giewikiをGoogleのサーバにアップロードする]]
[[初期設定する]]
[[独自ドメインを使う]]
[[無料でSSL化する]]
!リンクなど
[[ホーム|/]]
[[お砂場|/sandbox/]]
[[giewiki(英語)|https://giewiki.appspot.com/]]
[[MPTWテンプレート|http://mptw.tiddlyspot.com/]]
[[サイトマップ|SiteMap]]
[[変更履歴|RecentChanges]]
[[コメント履歴|RecentComments]]
![[giewikiヘルプ]]
<<tiddler giewikiヘルプ>>
!管理メニュー
[[ページ設定|PageSetup]]
[[迷子のtiddler]]
[[systemConfig]]
/***
|Name:|InstantTimestampPlugin|
|Description:|A handy way to insert timestamps in your tiddler content|
|Version:|1.0.10 ($Rev: 3646 $)|
|Date:|$Date: 2008-02-27 02:34:38 +1000 (Wed, 27 Feb 2008) $|
|Source:|http://mptw.tiddlyspot.com/#InstantTimestampPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
!!Usage
If you enter {ts} in your tiddler content (without the spaces) it will be replaced with a timestamp when you save the tiddler. Full list of formats:
* {ts} or {t} -> timestamp
* {ds} or {d} -> datestamp
* !ts or !t at start of line -> !!timestamp
* !ds or !d at start of line -> !!datestamp
(I added the extra ! since that's how I like it. Remove it from translations below if required)
!!Notes
* Change the timeFormat and dateFormat below to suit your preference.
* See also http://mptw2.tiddlyspot.com/#AutoCorrectPlugin
* You could invent other translations and add them to the translations array below.
***/
//{{{
config.InstantTimestamp = {
// adjust to suit
timeFormat: 'DD/0MM/YY 0hh:0mm',
dateFormat: 'DD/0MM/YY',
translations: [
[/^!ts?$/img, "'!!{{ts{'+now.formatString(config.InstantTimestamp.timeFormat)+'}}}'"],
[/^!ds?$/img, "'!!{{ds{'+now.formatString(config.InstantTimestamp.dateFormat)+'}}}'"],
// thanks Adapted Cat
[/\{ts?\}(?!\}\})/ig,"'{{ts{'+now.formatString(config.InstantTimestamp.timeFormat)+'}}}'"],
[/\{ds?\}(?!\}\})/ig,"'{{ds{'+now.formatString(config.InstantTimestamp.dateFormat)+'}}}'"]
],
excludeTags: [
"noAutoCorrect",
"noTimestamp",
"html",
"CSS",
"css",
"systemConfig",
"systemConfigDisabled",
"zsystemConfig",
"Plugins",
"Plugin",
"plugins",
"plugin",
"javascript",
"code",
"systemTheme",
"systemPalette"
],
excludeTiddlers: [
"StyleSheet",
"StyleSheetLayout",
"StyleSheetColors",
"StyleSheetPrint"
// more?
]
};
TiddlyWiki.prototype.saveTiddler_mptw_instanttimestamp = TiddlyWiki.prototype.saveTiddler;
TiddlyWiki.prototype.saveTiddler = function(title,newTitle,newBody,modifier,modified,atags,fields,clearChangeCount,created) {
var tags = atags ? atags : []; // just in case atags is null
tags = (typeof(tags) == "string") ? tags.readBracketedList() : tags;
var conf = config.InstantTimestamp;
if ( !tags.containsAny(conf.excludeTags) && !conf.excludeTiddlers.contains(newTitle) ) {
var now = new Date();
var trans = conf.translations;
for (var i=0;i<trans.length;i++) {
newBody = newBody.replace(trans[i][0], eval(trans[i][1]));
}
}
// TODO: use apply() instead of naming all args?
return this.saveTiddler_mptw_instanttimestamp(title,newTitle,newBody,modifier,modified,atags,fields,clearChangeCount,created);
}
// you can override these in StyleSheet
setStylesheet(".ts,.ds { font-style:italic; }","instantTimestampStyles");
//}}}
日本語化プラグインを導入すると、メニューなどの一部の表示が日本語になります。残念ながら、すべての表示を日本語化することはできていません。giewiki のシステムは、それ自身がたくさんの tiddler から作られていて、画面に表示されるメッセージも tiddler の中にちりばめられています。これらを一気に変更するのが難しいのです。
導入後にどうなるかは、このページの表示を見れば分かると思います。見ての通り、例えば右のメニューもオプションの項目が英語のままだったりして不完全です。もしこの程度で良ければ、このページ(giewikiの使い方)に導入している giewiki用の日本語化プラグインをコピーして下さい。
導入方法を説明します。
以下のリンクからプラグインの tiddler を開きます。
GiewikiJapaneseTranslationPlugin
開いた tiddler の右上のview(日本語化した後は「閲覧」)又は edit(編集)をクリックします。Text 欄のどこかをクリックしてから Ctrl-A でText欄内の文字列すべてを選択、Ctrl-C でコピーします。
インストールしたいwiki の右手のメニューからedit(編集)をクリック、new tiddler(新規作成)をクリックします。Text欄にCtrl-V でペーストします。Title欄には GiewikiJapaneseTranslationPlugin と記入(実はtitleは何でもいいけど)。Text欄の下にある tag(タグ)をクリックして、systemConfig と入力します。done(確定)をクリックします。
以上で導入完了です。自動的にページがリロードされ、画面が切り替わります。簡単に仕組みを説明しますと、systemConfig というタグが付いた tiddler は特別に扱われます。Text欄に入力された内容がプラグインのソースコードそのものであり、JavaScript で記述されています。[[PluginManager]] をクリックすると導入したプラグインの一覧を見ることができます。この画面から削除もできます。
同じ要領で、[[SpecialTiddlers]] もコピーすることができます(ただし、systemConfig タグは付けないこと)。これは [[PageSetup]] 画面の右上の All タブに表示される内容を翻訳したものです。view(閲覧)ボタンがクリックできないときは [[PageSetup]] 画面で All タブをクリックして、その中から ~SpecialTiddlers をクリックして下さい。~SpecialTiddlers という名前のタブが開いて、内容が表示されます。
Name: MptwBlue
Background: #fff
Foreground: #000
PrimaryPale: #cdf
PrimaryLight: #57c
PrimaryMid: #114
PrimaryDark: #012
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
Error: #f88
(function($){
merge(config.macros,{
mptwCollapse: {
handler: function(place,macroName,params) {
createTiddlyButton(place, params[0] == '+' ? '\u25AD' : '\u25AC', 'collapse/uncollapse', function(){
$(story.findContainingTiddler(place)).toggleClass('collapsed');
});
}
}
});
/* this doesn't work unless you have a modified ViewTempate */
config.shadowTiddlers["MptwCollapsePluginStyles"] = ""
+".collapsed .uncollapsedView { display:none; }"
+".collapsedView { display:none; }"
+".collapsed .collapsedView { display:block; }"
+".tiddler.collapsed { padding-bottom:1em; }"
+".tiddler.collapsed .title { font-size:100%; }"
;
store.addNotification("MptwCollapsePluginStyles",refreshStyles);
})(jQuery);