last update: Tue, 14 Apr 2015 09:39:29 GMT ( 9 years ago )
- HTMLのdiv要素・iframe要素 ブロックにdiv要素・iframe要素を配置する場合はそれぞれ、
- フォーム・テーブル
- テキストエリア・リッチテキストエディタ・スクリプトエディタ ブロックにテキストエリア・リッチテキストエディタ・スクリプトエディタを配置する場合はそれぞれ、
Division
ECDB.prototype.Divide
は指定されたブロックを分割し、新たなブロックを作成します。ECDB.prototype.Divide
はDivisionインスタンスを返します。分割された要素および分割している要素(スペーサー)を、Divisionインスタンスのそれぞれdivided
関数およびdivider
関数を用いて取得することができます。
また、ECDB.prototype.Divide
の第3引数にオプションとして vertical プロパティに true を指定することにより、ブロックを縦方向に分割することができます。(指定しない場合は横方向の分割になります。)
表示切替function beforeLaunch(top) {
var division = top.Divide
('_BODY_', {
'left_block': '30%',
'right_block': '70%'
});
var leftBlock = division.divided
(0).css('background-color', '#333333');
var spacer = division.divide
r(0);
var rightDivision = top.Divide
('right_block', {
'right_block_0': '25%',
'right_block_1': '25%',
'right_block_2': '25%',
'right_block_3': '25%'
}, {
'vertical': true
});
var rightBlock0 = rightDivision.divided
(0).css('background-color', '#ffffff');
var rightBlock1 = rightDivision.divided
(1).css('background-color', '#cccccc');
var rightBlock2 = rightDivision.divided
(2).css('background-color', '#999999');
var rightBlock3 = rightDivision.divided
(3).css('background-color', '#666666');
}function beforeLaunch(top) {
var division = top.Divide('_BODY_', {
'left_block': '30%',
'right_block': '70%'
});
var leftBlock = division.divided(0).css('background-color', '#333333');
var spacer = division.divider(0);
var rightDivision = top.Divide('right_block', {
'right_block_0': '25%',
'right_block_1': '25%',
'right_block_2': '25%',
'right_block_3': '25%'
}, {
'vertical': true
});
var rightBlock0 = rightDivision.divided(0).css('background-color', '#ffffff');
var rightBlock1 = rightDivision.divided(1).css('background-color', '#cccccc');
var rightBlock2 = rightDivision.divided(2).css('background-color', '#999999');
var rightBlock3 = rightDivision.divided(3).css('background-color', '#666666');
}
function beforeLogout(top) {
}
// ----------------------------------------------------------------
new ECDB({
"title":"ECDB.prototype.Divide",
"db":"",
"version":"",
"structure":{},
"beforeLaunch":beforeLaunch,
"beforeLogout":beforeLogout,
"style":{}
});実行結果例
Layer composition
ECDB.prototype.Multiple
は指定されたブロックをレイヤー構成にします。ECDB.prototype.Multiple
はLayerインスタンスを返します。レイヤーを構成する要素を取得するためにはLayerインスタンスのbody
関数を使用します。
初期表示は第2引数で指定した配列の最初の要素になります。表示を切り替える場合はLayerインスタンスのshow
関数またはdisplay
関数を用います。
表示切替function beforeLaunch(top) {
var division = top.Divide(top.Body(), {
'left_block': '10%',
'right_block': '90%'
});
var layers = top.Multiple
('right_block', ['layer0', 'layer1', 'layer2']);
var layer0 = layers.body
(0).css('background-color', 'green');
var layer1 = layers.body
(1).css('background-color', 'blue');
var layer2 = layers.body
(2).css('background-color', 'red');
layers.display
('layer1');
division.divided(0).on('mouseover', function() {
layers.show
(0);
}).on('click', function() {
layers.show
(1);
}).on('dblclick', function() {
layers.show
(2);
});
}function beforeLaunch(top) {
var division = top.Divide(top.Body(), {
'left_block': '10%',
'right_block': '90%'
});
var layers = top.Multiple('right_block', ['layer0', 'layer1', 'layer2']);
var layer0 = layers.body(0).css('background-color', 'green');
var layer1 = layers.body(1).css('background-color', 'blue');
var layer2 = layers.body(2).css('background-color', 'red');
layers.display('layer1');
division.divided(0).on('mouseover', function() {
layers.show(0);
}).on('click', function() {
layers.show(1);
}).on('dblclick', function() {
layers.show(2);
});
}
function beforeLogout(top) {
}
// ----------------------------------------------------------------
new ECDB({
"title":"ECDB.prototype.Multiple",
"db":"",
"version":"",
"structure":{ },
"beforeLaunch":beforeLaunch,
"beforeLogout":beforeLogout,
"style":{}
});実行結果例
mouseover click dblclick
Deployment of elements
ECDB.prototype.Divide
やECDB.prototype.Multiple
で作成したブロックには、HTMLのdiv要素、iframe要素の他、BOOK
で定義したフォームやテーブルを配置することができます。また、テキストエリア、リッチテキストエディタやスクリプトエディタを配置することもできます。ECBOOK.prototype.InlineDiv
関数・ECBOOK.prototype.InlineFrame
関数を使用します。戻り値がそれぞれの要素となります。
表示切替function beforeLaunch(top) {
top.Divide(top.Body(), {'div_el': '50%', 'iframe_el': '50%'});
var book = top.BOOK({});
book.InlineDiv
('div_el').css('background-image', 'url(/synquery/img/logo.png)');
book.InlineFrame
('iframe_el').attr('src', 'http://www.east-cloud.co.jp/');
}function beforeLaunch(top) {
実行結果例
top.Divide(top.Body(), {'div_el': '50%', 'iframe_el': '50%'});
var book = top.BOOK({});
book.InlineDiv('div_el').css('background-image', 'url(/synquery/img/logo.png)');
book.InlineFrame('iframe_el').attr('src', 'http://www.east-cloud.co.jp/');
}
function beforeLogout(top) {
}
// ----------------------------------------------------------------
new ECDB({
"title":"ECBOOK.prototype.InlineDiv/ECBOOK.prototype.InlineFrame",
"db":"",
"version":"",
"structure":{},
"beforeLaunch":beforeLaunch,
"beforeLogout":beforeLogout,
"style":{}
});BOOK
のフォーム・テーブルを配置する場合はそれぞれ、ECBOOK.prototype.InlineForm
関数・ECBOOK.prototype.InlineTable
関数を使用します。
表示切替var rsd = {};
function beforeLaunch(top) {
var division = top.Divide(top.Body(), [50, 50]);
var book = top.BOOK(rsd);
book.InlineForm
(division.divided(0));
book.InlineTable
(division.divided(1));
}function put() {
実行結果例
var objs = [];
for(var i = 1000; i--;) {
var obj = {};
obj['integer'] = [100 * Math.random() | 0, 1000 * Math.random() | 0, 10000 * Math.random() | 0, 100000 * Math.random() | 0];
obj['account'] = [100 * Math.random() | 0, 1000 * Math.random() | 0, 10000 * Math.random() | 0, 100000 * Math.random() | 0];
objs.push(obj);
}
this.Put(objs);
};
function beforeLaunch(top) {
var division = top.Divide(top.Body(), [50, 50]);
var book = top.BOOK(rsd);
// put.call(book);
book.InlineForm(division.divided(0));
book.InlineTable(division.divided(1));
}
var rsd = {
title: 'Form/Table',
db: 'form',
table: 'table',
name: 'form.table',
structure:[
["integer[0]", "INTEGER(default)", "integer","","",25],
["integer[1]", "INTEGER(hide_zero)", "integer","","hide_zero",25],
["integer[2]", "INTEGER(between[0-30])", "integer","","min(0)|max(30)",25],
["integer[3]", "INTEGER(fill_zero(8))", "integer","","hide_zero|fill_zero(8)|min(1)|max(99999999)",25],
["acount[0]", "ACCOUNT(default)", "account","","",25],
["acount[1]", "ACCOUNT(round(-3))", "account","","round(-3)",25],
["acount[2]", "ACCOUNT(floor(3))", "account","","floor(3)",25],
["acount[3]", "ACCOUNT(ceil(4)|hide_zero)","account","","ceil(4)|hide_zero",25],
["float[0]", "FLOAT(default)", "float","","",25],
["float[1]", "FLOAT(decimal:3)", "float","","round(3)",25],
["percent[0]", "PERCENT(default)", "percent","","",25],
["percent[1]", "PERCENT(round:2)", "percent","","round(2)",25],
["date[0]", "DATE(default=0)", "date","","default(0)",25],
["date[1]", "DATE(no_picker)", "date","","no_picker",25],
["date[2]", "DATE(month first)", "date","","no_picker(%MONTH%-%DATE%-%year%)",25],
["date[3]", "DATE(japanese)", "date","","no_picker(%JA% %year%年 %month%月 %date%日 (%day%))",25],
["time[0]", "TIME(default)", "time","","",25],
["time[1]", "TIME(hh:mm)", "time","","format(%HOUR%:%MINUT%)",25],
["time[2]", "TIME(japanese)", "time","","format(%hour%時 %minut%分)",25],
["time[3]", "TIME(japanese/AM-PM)", "time","","format(%AP% %hour%時 %MINUT%分)",25],
["datim[0]", "DATIM(default)", "datim","","",50],
["datim[1]", "DATIM(japanese)", "datim","","format(%JA% %year%年 %month%月 %date%日 (%day%) %AP% %hour%時 %MINUT%分)",50],
["select[0]", "SELECT(must select)", "select", "{AAA:1, BBB:2, CCC:3}", "", 25],
["select[1]", "SELECT(w/noselect)", "select", "{'':0, AAA:1, BBB:2, CCC:3}", "", 25],
["select[2]", "SELECT(w/default(BBB))", "select", "{AAA:1, BBB:2, CCC:3}", "default(2)", 25],
["select[3]", "SELECT(color)", "select", {'#fff':0,"#f00":1,"#f80":2,"#ff0":3,"#0f0":4,"#080":5,"#00c":6,"#80c":7},,25],
["string[0]", "STRING(default)", "string","","",25],
["string[1]", "STRING(default=AA)", "string","","default(AA)",25],
["string[2]", "STRING(length(2-3))", "string","","min(2)|max(3)",25],
["string[3]", "STRING(regex[A-Z]{4})", "string","","regex(^[A-Z]{4}$)",25],
["etc[0]", "ZIP", "zip","","",25],
["etc[1]", "PHONE", "phone","","",25],
["etc[2]", "EMAIL", "email","","",25],
["etc[3]", "URL", "url","","",25],
["", "HTML BLOCK", "html", $(''), "css({height:'211px'})", 25],
["text[0]", "TEXT(height:50)", "text", 50, "resize", 25],
["text[1]", "RICHTEXT(height:100)", "richtext", 150, "resize", 50],
["", "LABEL", "label", "This is a label.", "css({fontSize:'16px'})", 25],
["etc[4]", "PASSWORD", "password","","",25],
["togle[0]", "TOGGLE(default:0)", "toggle", "", "", 25],
["togle[1]", "TOGGLE(default:1)", "toggle", "", "default(1)", 25],
["image", "IMAGE(picture)", "image", "", "", 25],
["color", "Color Selection", "color", "", "", 25],
ECDB.HR(),
["","","button","Calculation Check","", 25],
["","","button","Structure Test","", 25],
["","","button","Show Values","", 25]
],
beforeShowTable: function() {
var x = this;
this.sel(0, function(res) {
var ids = $.map(res, function(r) {
return r['_id'];
});
x.DrawTable(ids);
});
}
};
function beforeLogout(top) {
}
// ----------------------------------------------------------------
new ECDB({
"title":"ECBOOK.prototype.InlineForm/ECBOOK.prototype.InlineTable",
"db":"",
"version":"",
"structure":{},
"beforeLaunch":beforeLaunch,
"beforeLogout":beforeLogout,
"style":{}
});ECBOOK.prototype.InlineText
関数・ECBOOK.prototype.InlineRichtext
関数・ECBOOK.prototype.InlineScript
関数を使用します。
戻り値オブジェクトにはread
関数・write
関数が用意されており、要素に対して値を読み書きすることができます。
表示切替function beforeLaunch(top) {
top.Divide(top.Body(), {
'ta_block': '30%',
'rte_block': '30%',
'script_block': '40%'
});
var book = top.BOOK({});
var ta = book.InlineText
('ta_block');
var rte = book.InlineRichtext
('rte_block');
var script = book.InlineScript
('script_block');
ta.write
('This is a textarea.\n' + text);
rte.write
('<h1>This is a rich-text editor.</h1>\n' + rt);
script.write
('// This is a script editor.\n' + src);
ta.read
();
rte.read
();
script.read
();
}
var text = 'node-websockets\n...';
var rt = '<article class="markdown-body entry-content" itemprop="mainContentOfPage">...</article>';
var src = '/***/\n...';function beforeLaunch(top) {
実行結果例
top.Divide(top.Body(), {
'ta_block': '30%',
'rte_block': '30%',
'script_block': '40%'
});
var book = top.BOOK({});
var ta = book.InlineText('ta_block');
var rte = book.InlineRichtext('rte_block');
var script = book.InlineScript('script_block');
ta.write('This is a textarea.\n' + text);
rte.write('<h1>This is a rich-text editor.</h1>\n' + rt);
script.write('// This is a script editor.\n' + src);
ta.read();
rte.read();
script.read();
}
var text = 'node-websockets\nWeb Socket Server and Client API\n\nsupports only draft-ietf-hybi-thewebsocketprotocol-10.\nworks with Google Chrome Dev Channel (>14.0.835.2) when using a browser as a WebSocket client.\nInstall\nnpm install websockets\nUsage\nrequire websockets\n\nvar websockets = require("websockets");\n\nServer:\n\nServer is a wrapper of http/https server.\n\n// http based server\nvar server = websockets.createServer();\nserver.on(\'connect\', function(socket) {\n socket.on(\'message\', function(message) {\n socket.send(\'echo a message:\' + message);\n ......\n });\n}).listen(80);\n\n// https based server\nvar secure = websockets.createServer({\n key: ssl_key,\n cert: ssl_cert\n});\nsecure.on(\'connect\', function(socket) {\n ......\n}).listen(443);\n\n\nExtended Servers such as express are also available.\n\n// In case of \'express\'\nvar express = require(\'express\');\n\nvar svr = express.createServer();\nsvr.get(\'/\', function(req, res) {\n ......\n});\nsvr.configure(function() {\n ......\n});\n\nvar server = websockets.createServer({\n server: svr\n});\nserver.on(\'connect\', function(socket) {\n socket.on(\'message\', function(message) {\n socket.send(\'echo a message:\' + message);\n ......\n });\n}).listen(80);\n\nClient:\n\nClient has the interfaces like html5 WebSocket.\n\nvar socket = new websockets.WebSocket(\'wss://127.0.0.1\');\nsocket.on(\'open\', function() {\n socket.send(\'a message\');\n ......\n});\n\nAPIs\nwebsockets.Server\n\n\n\nEvent: \'connect\'\n\nfunction (socket) {}\n\nEmitted when client-server opening handshake has succeeded. socket is an instance of WebSocket.\n\n\n\nserver.broadcast(string)\n\nNot Implemented. Sends string to all clients connected with server.\n\n\n\nserver.broadcast(buffer)\n\nNot Implemented. Sends binary data(buffer) to all clients connected with server.\n\n\n\nwebsockets.WebSocket\n\n\n\nEvent: \'open\'\n\nfunction () {}\n\nEmitted when a client-server connection is successfully established.\n\n\n\nEvent: \'message\'\n\nfunction (data) {}\n\nEmitted when the socket has received a message. The type of data is either string(string data) or Buffer(binary data).\n\n\n\nEvent: \'error\'\n\nfunction (exception) {}\n\nEmitted on error. exception is an instance of Error.\n\n\n\nEvent: \'close\'\n\nfunction () {}\n\nEmitted when a client-server connection has closed.\n\n\n\nsocket.send(string)\n\nSends string to the other endpoint.\n\n\n\nsocket.send(buffer)\n\nSends binary data(buffer) to the other endpoint.\n\n\n\nsocket.close()\n\nSends a connection close request to the other endpoint.\n\n\n\nTODO\nimplementation of server broadcast';
var rt = '<article class="markdown-body entry-content" itemprop="mainContentOfPage"><h1><a name="node-websockets" class="anchor" href="#node-websockets"><span class="mini-icon mini-icon-link"></span></a>node-websockets</h1><h5><a name="web-socket-server-and-client-api" class="anchor" href="#web-socket-server-and-client-api"><span class="mini-icon mini-icon-link"></span></a>Web Socket Server and Client API</h5><ul><li>supports only <code>draft-ietf-hybi-thewebsocketprotocol-10</code>.</li><li>works with Google Chrome Dev Channel (>14.0.835.2) when using a browser as a WebSocket client.</li></ul><h2><a name="install" class="anchor" href="#install"><span class="mini-icon mini-icon-link"></span></a>Install</h2><pre><code>npm install websockets</code></pre><h2><a name="usage" class="anchor" href="#usage"><span class="mini-icon mini-icon-link"></span></a>Usage</h2><p>require <code>websockets</code></p><div class="highlight"><pre><span class="kd">var</span> <span class="nx">websockets</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s2">"websockets"</span><span class="p">);</span></pre></div><h3><a name="server" class="anchor" href="#server"><span class="mini-icon mini-icon-link"></span></a><em>Server:</em></h3><p>Server is a wrapper of <code>http/https</code> server.</p><div class="highlight"><pre><span class="c1">// http based server</span><span class="kd">var</span> <span class="nx">server</span> <span class="o">=</span> <span class="nx">websockets</span><span class="p">.</span><span class="nx">createServer</span><span class="p">();</span><span class="nx">server</span><span class="p">.</span><span class="nx">on</span><span class="p">(</span><span class="s1">\'connect\'</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">socket</span><span class="p">)</span> <span class="p">{</span> <span class="nx">socket</span><span class="p">.</span><span class="nx">on</span><span class="p">(</span><span class="s1">\'message\'</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">message</span><span class="p">)</span> <span class="p">{</span> <span class="nx">socket</span><span class="p">.</span><span class="nx">send</span><span class="p">(</span><span class="s1">\'echo a message:\'</span> <span class="o">+</span> <span class="nx">message</span><span class="p">);</span> <span class="p">......</span> <span class="p">});</span><span class="p">}).</span><span class="nx">listen</span><span class="p">(</span><span class="mi">80</span><span class="p">);</span><span class="c1">// https based server</span><span class="kd">var</span> <span class="nx">secure</span> <span class="o">=</span> <span class="nx">websockets</span><span class="p">.</span><span class="nx">createServer</span><span class="p">({</span> <span class="nx">key</span><span class="o">:</span> <span class="nx">ssl_key</span><span class="p">,</span> <span class="nx">cert</span><span class="o">:</span> <span class="nx">ssl_cert</span><span class="p">});</span><span class="nx">secure</span><span class="p">.</span><span class="nx">on</span><span class="p">(</span><span class="s1">\'connect\'</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">socket</span><span class="p">)</span> <span class="p">{</span> <span class="p">......</span><span class="p">}).</span><span class="nx">listen</span><span class="p">(</span><span class="mi">443</span><span class="p">);</span></pre></div><p>Extended Servers such as <a href="http://expressjs.com/">express</a> are also available.</p><div class="highlight"><pre><span class="c1">// In case of \'express\'</span><span class="kd">var</span> <span class="nx">express</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">\'express\'</span><span class="p">);</span><span class="kd">var</span> <span class="nx">svr</span> <span class="o">=</span> <span class="nx">express</span><span class="p">.</span><span class="nx">createServer</span><span class="p">();</span><span class="nx">svr</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">\'/\'</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">req</span><span class="p">,</span> <span class="nx">res</span><span class="p">)</span> <span class="p">{</span> <span class="p">......</span><span class="p">});</span><span class="nx">svr</span><span class="p">.</span><span class="nx">configure</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span> <span class="p">......</span><span class="p">});</span><span class="kd">var</span> <span class="nx">server</span> <span class="o">=</span> <span class="nx">websockets</span><span class="p">.</span><span class="nx">createServer</span><span class="p">({</span> <span class="nx">server</span><span class="o">:</span> <span class="nx">svr</span><span class="p">});</span><span class="nx">server</span><span class="p">.</span><span class="nx">on</span><span class="p">(</span><span class="s1">\'connect\'</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">socket</span><span class="p">)</span> <span class="p">{</span> <span class="nx">socket</span><span class="p">.</span><span class="nx">on</span><span class="p">(</span><span class="s1">\'message\'</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">message</span><span class="p">)</span> <span class="p">{</span> <span class="nx">socket</span><span class="p">.</span><span class="nx">send</span><span class="p">(</span><span class="s1">\'echo a message:\'</span> <span class="o">+</span> <span class="nx">message</span><span class="p">);</span> <span class="p">......</span> <span class="p">});</span><span class="p">}).</span><span class="nx">listen</span><span class="p">(</span><span class="mi">80</span><span class="p">);</span></pre></div><h3><a name="client" class="anchor" href="#client"><span class="mini-icon mini-icon-link"></span></a><em>Client:</em></h3><p>Client has the interfaces like <a href="http://www.w3.org/TR/2011/WD-websockets-20110419/">html5 WebSocket</a>.</p><div class="highlight"><pre><span class="kd">var</span> <span class="nx">socket</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">websockets</span><span class="p">.</span><span class="nx">WebSocket</span><span class="p">(</span><span class="s1">\'wss://127.0.0.1\'</span><span class="p">);</span><span class="nx">socket</span><span class="p">.</span><span class="nx">on</span><span class="p">(</span><span class="s1">\'open\'</span><span class="p">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span> <span class="nx">socket</span><span class="p">.</span><span class="nx">send</span><span class="p">(</span><span class="s1">\'a message\'</span><span class="p">);</span> <span class="p">......</span><span class="p">});</span></pre></div><h2><a name="apis" class="anchor" href="#apis"><span class="mini-icon mini-icon-link"></span></a>APIs</h2><h3><a name="websocketsserver" class="anchor" href="#websocketsserver"><span class="mini-icon mini-icon-link"></span></a>websockets.Server</h3><p><br></p><h4><a name="event-connect" class="anchor" href="#event-connect"><span class="mini-icon mini-icon-link"></span></a>Event: \'connect\'</h4><p><strong><code>function (socket) {}</code></strong></p><p>Emitted when client-server opening handshake has succeeded. <code>socket</code> is an instance of <code>WebSocket</code>.</p><p><br></p><h4><a name="serverbroadcaststring" class="anchor" href="#serverbroadcaststring"><span class="mini-icon mini-icon-link"></span></a>server.broadcast(string)</h4><p>Not Implemented.Sends <code>string</code> to all clients connected with <code>server</code>.</p><p><br></p><h4><a name="serverbroadcastbuffer" class="anchor" href="#serverbroadcastbuffer"><span class="mini-icon mini-icon-link"></span></a>server.broadcast(buffer)</h4><p>Not Implemented.Sends binary data(<code>buffer</code>) to all clients connected with <code>server</code>.</p><p><br></p><h3><a name="websocketswebsocket" class="anchor" href="#websocketswebsocket"><span class="mini-icon mini-icon-link"></span></a>websockets.WebSocket</h3><p><br></p><h4><a name="event-open" class="anchor" href="#event-open"><span class="mini-icon mini-icon-link"></span></a>Event: \'open\'</h4><p><strong><code>function () {}</code></strong></p><p>Emitted when a client-server connection is successfully established.</p><p><br></p><h4><a name="event-message" class="anchor" href="#event-message"><span class="mini-icon mini-icon-link"></span></a>Event: \'message\'</h4><p><strong><code>function (data) {}</code></strong></p><p>Emitted when the socket has received a message. The type of <code>data</code> is either <code>string</code>(string data) or <code>Buffer</code>(binary data).</p><p><br></p><h4><a name="event-error" class="anchor" href="#event-error"><span class="mini-icon mini-icon-link"></span></a>Event: \'error\'</h4><p><strong><code>function (exception) {}</code></strong></p><p>Emitted on error. <code>exception</code> is an instance of Error.</p><p><br></p><h4><a name="event-close" class="anchor" href="#event-close"><span class="mini-icon mini-icon-link"></span></a>Event: \'close\'</h4><p><strong><code>function () {}</code></strong></p><p>Emitted when a client-server connection has closed.</p><p><br></p><h4><a name="socketsendstring" class="anchor" href="#socketsendstring"><span class="mini-icon mini-icon-link"></span></a>socket.send(string)</h4><p>Sends <code>string</code> to the other endpoint.</p><p><br></p><h4><a name="socketsendbuffer" class="anchor" href="#socketsendbuffer"><span class="mini-icon mini-icon-link"></span></a>socket.send(buffer)</h4><p>Sends binary data(<code>buffer</code>) to the other endpoint.</p><p><br></p><h4><a name="socketclose" class="anchor" href="#socketclose"><span class="mini-icon mini-icon-link"></span></a>socket.close()</h4><p>Sends a connection close request to the other endpoint.</p><p><br></p><h1><a name="todo" class="anchor" href="#todo"><span class="mini-icon mini-icon-link"></span></a>TODO</h1><ul><li>implementation of server broadcast</li></ul></article>';
var src = '/***/\nvar util = require(\'util\'), events = require(\'events\'), crypto = require(\'crypto\');\nvar URL = require(\'url\'), http = require(\'http\'), https = require(\'https\');\n\nvar GUID = \'258EAFA5-E914-47DA-95CA-C5AB0DC85B11\';\nvar HANDSHAKE_RESPONSE = \'HTTP/1.1 101 Switching Protocols\\r\\nSec-WebSocket-Protocol: *\\r\\nUpgrade: websocket\\r\\nConnection: Upgrade\\r\\nSec-WebSocket-Accept: \';\nvar ERR_400 = \'HTTP/1.1 400 Bad Request\\r\\n\\r\\n400 Bad Request\';\nvar ERR_403 = \'HTTP/1.1 403 Forbidden\\r\\n\\r\\n403 Forbidden\';\nvar ERR_426 = \'HTTP/1.1 426 Upgrade Required\\r\\n\\r\\n426 Upgrade Required\';\n\nmodule.exports = exports = Draft10;\n\nfunction Draft10(arg0, arg1) {\n var self = this;\n events.EventEmitter.call(self);\n\n var isClient = \'string\' === typeof arg0;\n\n var Core = isClient ? Client: Server;\n self.core = new Core(self);\n\n var opts = self._options = (isClient ? arguments[1]: arguments[3]) || {};\n if(\'string\' === typeof opts)\n opts = self._options = {\n protocols: [opts]\n };\n else if(\'array\' === typeof opts)\n opts = self._options = {\n protocols: opts\n };\n\n var bufSize = opts[\'bufferSize\'];\n if(!bufSize || bufSize <= 0)\n opts[\'bufferSize\'] = BUFFER_SIZE;\n\n self.on(\'_data\', function(data, fin, opcode) {\n if(0 !== opcode)\n self.opcode = opcode, self.buffer = [];\n// Array.prototype.push.apply(self.buffer, data);\n self.buffer = self.buffer.concat(data);\n self.emit(\'data\', new Buffer(data), fin, self.opcode);\n if(fin) {\n var buf = new Buffer(self.buffer);\n var message = 1 === self.opcode ? buf.toString(): buf;\n self.emit(\'message\', message);\n }\n });\n}\nutil.inherits(Draft10, events.EventEmitter);\n\nfunction _option(key) {\n return this._options[key];\n}\n\nfunction Server(parent) {\n this.parent = parent;\n}\nfunction Client(parent) {\n this.parent = parent;\n}\n\n// ---------------------------------------------------\n// close\n// ---------------------------------------------------\nServer.prototype.close = function(reason) {\n close.call(this, reason, 0);\n};\nClient.prototype.close = function(reason) {\n close.call(this, reason, 1);\n};\nDraft10.prototype.close = function(reason) {\n this.core.close(reason);\n};\nfunction close(reason, maskbit) {\n var self = this, parent = self.parent;\n var message = ERR_CODE[reason] || (reason + \'\');\n _ctrl.call(self, OPCODE[\'close\'], maskbit, message);\n\n parent.close = function() {\n var socket = parent.socket;\n socket.writable && socket.end();\n socket.destroy();\n };\n}\n\n// ---------------------------------------------------\n// Control Frames\n// ---------------------------------------------------\nfunction _ctrl(opcode, maskbit, data) {\n var parent = this.parent, buf = new Buffer(data);\n if(125 < buf.length)\n buf = buf.slice(0, 124);\n\n var fin = 1;\n var ext = [0x00, 0x00, 0x00];\n\n parent.socket.write(frame(fin, ext, opcode, maskbit, buf));\n\n}\n\n// ---------------------------------------------------\n// write\n// ---------------------------------------------------\nServer.prototype.write = function(massage) {\n write.call(this, massage, 0);\n};\nClient.prototype.write = function(massage) {\n write.call(this, massage, 1);\n};\nDraft10.prototype.write = function(massage) {\n this.core.write(massage);\n};\nfunction write(message, maskbit) {\n var parent = this.parent, socket = parent.socket;\n\n var buf = new Buffer(message), len = buf.length;\n\n var i, data = [], size = parent._options[\'bufferSize\'];\n for(i = 0; i < len; i += size)\n data.push(buf.slice(i, Math.min(buf.length, i + size)));\n\n var fin = 0;\n var ext = [0, 0, 0];\n var opcode = OPCODE[typeof message] || OPCODE[\'binary\'];\n var mask = maskbit;\n\n i = 0, len = data.length;\n\n for(; i < len - 1; i++, opcode = 0)\n socket.write(frame(fin, ext, opcode, mask, data[i]));\n\n fin = 1;\n socket.write(frame(fin, ext, opcode, mask, data[i]));\n\n}\n\n// ---------------------------------------------------\n// pong\n// ---------------------------------------------------\nDraft10.prototype.pong = Draft10.prototype.write;\n\n// ---------------------------------------------------\n// parse\n// ---------------------------------------------------\nServer.prototype.parse = function(data) {\n parse.call(this, data, 1);\n};\nClient.prototype.parse = function(data) {\n parse.call(this, data, 0);\n};\nDraft10.prototype.parse = function(data) {\n this.core.parse(data);\n};\nfunction parse(data, maskbit) {\n var self = this, parent = self.parent, i = 0;\n\n var OP_FUNC = {\n _def: function(payload, fin, opcode) {\n parent.emit(\'_data\', payload, fin, opcode);\n },\n 0x00: function(payload, fin) {\n OP_FUNC[\'_def\'](payload, fin, 0);\n },\n 0x01: function string(payload, fin) {\n OP_FUNC[\'_def\'](payload, fin, 1);\n },\n 0x02: function binary(payload, fin) {\n OP_FUNC[\'_def\'](payload, fin, 2);\n },\n 0x08: function close() {\n parent.emit(\'_closing\', 1000);\n },\n 0x09: function ping(payload) {\n self.pong(payload);\n },\n 0x0A: function pong(payload) {\n // TODO\n }\n };\n\n if(\'undefined\' === typeof self.buffer)\n _parseHead();\n\n _parsePayload();\n\n function _parseHead() {\n\n var byte = data[i++];\n var fin = byte >>> 7;\n var ope = (byte & 0x0F);\n\n byte = data[i++];\n var mask = byte >>> 7;\n if(maskbit !== mask)\n return parent.emit(\'error\', 1002);\n var len = byte & 0x7F;\n\n if(127 === len)\n len = ((data[i++] << 24) + (data[i++] << 16) + (data[i++] << 8) + data[i++]) * Math\n .pow(2, 32) + (data[i++] << 24) + (data[i++] << 16) + (data[i++] << 8) + data[i++];\n else if(126 === len)\n len = (data[i++] << 8) + data[i++];\n\n var maskkey = maskbit ? [data[i++], data[i++], data[i++], data[i++]]: null;\n\n self.buffer = {\n fin: fin,\n ope: ope,\n length: len,\n mask: maskkey,\n payload: []\n };\n };\n\n function _parsePayload() {\n var buf = self.buffer, len = data.length;\n var payload = buf.payload, maskkey = buf.mask, ope = buf.ope, fin = buf.fin;\n var j = payload.length % 4;\n for(; buf.length && i < len; j++, buf.length--)\n payload.push(maskkey ? data[i++] ^ maskkey[j % 4]: data[i++]);\n\n if(\'function\' !== typeof OP_FUNC[ope])\n return parent.emit(\'error\', 1002);\n\n if(0 === buf.length) {\n OP_FUNC[ope](payload, !!fin);\n delete self.buffer;\n }\n\n // TODO test\n if(i < len)\n parse.call(self, data.slice(i), maskbit);\n\n }\n}\n\n// ---------------------------------------------------\n// hand shake\n// ---------------------------------------------------\nDraft10.prototype.handShake = function() {\n var core = this.core;\n core.handShake.apply(core, arguments);\n};\nServer.prototype.handShake = function(req, socket, upgradeHead) {\n var parent = this.parent, head = req[\'headers\'];\n parent.socket = socket;\n\n var i, keys = [\'host\', \'sec-websocket-key\'];\n for(i = keys.length; i--;)\n if(!(keys[i] in head))\n return socket.write(ERR_400);\n if(\'websocket\' !== head[\'upgrade\'])\n return socket.write(ERR_400);\n if(\'8\' !== head[\'sec-websocket-version\'])\n return socket.write(ERR_426);\n if(true !== _isAllowed())\n return socket.write(ERR_403);\n\n // TODO\n head[\'sec-websocket-protocol\'], head[\'cookie\'];\n\n socket.on(\'close\', function() {\n parent.emit(\'close\');\n });\n\n socket.on(\'end\', function() {\n parent.emit(\'close\');\n });\n\n socket.on(\'data\', function(data) {\n parent.parse(data);\n });\n\n var newkey = _hashAndEncode(head[\'sec-websocket-key\']);\n socket.write(HANDSHAKE_RESPONSE);\n socket.write(newkey + \'\\r\\n\\r\\n\');\n parent.emit(\'connect\', socket);\n\n function _isAllowed() {\n var validate = parent._options[\'validateOrigin\'];\n return \'function\' === typeof validate ? validate(head): true;\n }\n};\nClient.prototype.handShake = function(uri) {\n var parent = this.parent, url = URL.parse(uri);\n parent.URL = uri;\n\n var secure = parent.secure = \'wss:\' === url[\'protocol\'];\n\n var URI = url[\'protocol\'];\n URI += \'//\';\n URI += url[\'host\'];\n URI += url[\'pathname\'] || \'/\';\n URI += (url[\'search\'] || \'\').replace(/#/, \'%23\');\n\n var key = _createKey();\n\n var opts = {\n port: url[\'port\'] || (secure ? 443: 80),\n host: url[\'hostname\'],\n headers: {\n Connection: \'Upgrade\',\n Upgrade: \'websocket\',\n \'Sec-Websocket-Key\': key,\n \'Sec-Websocket-Origin\': \'node-websockets\',\n \'Sec-Websocket-Version\': 8\n }\n };\n\n if(secure) {\n opts[\'key\'] = parent._options[\'key\'];\n opts[\'cert\'] = parent._options[\'cert\'];\n opts[\'ca\'] = parent._options[\'ca\'];\n }\n\n var prtcl = secure ? https: http, agent;\n if(prtcl.getAgent) {\n agent = prtcl.getAgent(opts[\'host\'], opts[\'port\']);\n opts[\'agent\'] = agent;\n }\n var req = prtcl.request(opts);\n req.end();\n agent = agent || req;\n\n var newkey = _hashAndEncode(key);\n\n agent.on(\'upgrade\', function(res, socket, upgradeHead) {\n\n socket.on(\'close\', function(had_error) {\n parent.emit(\'close\', had_error);\n });\n\n socket.on(\'data\', function(data) {\n parent.parse(data);\n });\n\n // TODO\n var status = res[\'statusCode\'];\n if(101 !== status)\n return parent.emit(\'_closing\', status);\n\n var head = res[\'headers\'];\n if(\'websocket\' !== head[\'upgrade\'] || \'Upgrade\' !== head[\'connection\'])\n return parent.emit(\'error\', new Error(\'Invalid Response Header\'));\n\n if(head[\'sec-websocket-accept\'] !== newkey)\n return parent.emit(\'error\', new Error(\'Invalid Server Response\'));\n\n parent.socket = socket;\n\n parent.emit(\'connect\', socket);\n });\n req.on(\'error\', function(err) {\n parent.emit(\'error\', err);\n });\n\n function _createKey() {\n var i, arr = [];\n for(i = 16; i--;)\n arr.push(~~(Math.random() * 256));\n return (new Buffer(arr)).toString(\'base64\');\n }\n};\n\nvar OPCODE = {\n string: 0x01,\n binary: 0x02,\n close: 0x08,\n ping: 0x09,\n pong: 0x0A\n};\nvar ERR_CODE = {\n 1000: \'Normal Closure\',\n 1001: \'Going Away\',\n 1002: \'Protocol error\',\n 1003: \'Unsupported Data\',\n 1004: \'Frame Too Large\',\n 1005: \'No Status Rcvd\', // MUST NOT be set in Close control\n 1006: \'Abnormal Closure\', // MUST NOT be set in Close control\n 1007: \'Invalid UTF-8\'\n};\n\nvar BUFFER_SIZE = 2000000;\n\nfunction _hashAndEncode(key) {\n var newkey = (key + GUID).trim();\n var shasum = crypto.createHash(\'sha1\');\n shasum.update(newkey);\n return shasum.digest(\'base64\');\n}\n\nfunction frame(fin, ext, opcode, mask, payload) {\n var arr = [];\n var push = Array.prototype.push;\n push.apply(arr, _1st(fin, ext, opcode));\n push.apply(arr, _length(mask, payload));\n arr = arr.concat(_payload(mask, payload));\n\n return new Buffer(arr);\n}\n\nfunction _1st(fin, ext, opcode) {\n return [(fin << 7) | (ext[0] << 6) | (ext[1] << 5) | (ext[2] << 4) | opcode];\n}\n\nfunction _length(mask, payload) {\n var length = payload.length, len = length, extlen = [];\n if(length <= 125)\n ;\n else if(length <= 0xFFFF) {\n len = 126;\n extlen.push(length >>> 8);\n extlen.push(length & 0xFF);\n } else {\n len = 127;\n // var zerofill =\n // \'0000000000000000000000000000000000000000000000000000000000000000\';\n var zerofill = \'000000000000000000000000000000000000000000000000\';\n var bin = (zerofill + length.toString(2)).slice(-64);\n extlen.push(parseInt(bin.substr(0, 8), 2));\n extlen.push(parseInt(bin.substr(8, 8), 2));\n extlen.push(parseInt(bin.substr(16, 8), 2));\n extlen.push(parseInt(bin.substr(24, 8), 2));\n extlen.push(parseInt(bin.substr(32, 8), 2));\n extlen.push(parseInt(bin.substr(40, 8), 2));\n extlen.push(parseInt(bin.substr(48, 8), 2));\n extlen.push(parseInt(bin.substr(56, 8), 2));\n }\n extlen.unshift((mask << 7) | len);\n return extlen;\n}\n\nfunction _payload(maskbit, payload) {\n var i, mask, ret, length;\n if(maskbit) {\n mask = makeMask(), ret = mask.slice(-4), length = payload.length;\n for(i = 0; i < length; i++)\n ret.push(payload[i] ^ mask[i % 4]);\n } else\n ret = Array.prototype.slice.call(payload);\n\n return ret;\n\n function makeMask() {\n var i, ret = [];\n for(i = 4; i--;)\n ret.push(~~(Math.random() * 256));\n return ret;\n }\n}';
function beforeLogout(top) {
}
// ----------------------------------------------------------------
new ECDB({
"title":"ECBOOK.prototype.InlineText/ECBOOK.prototype.InlineRichtext/ECBOOK.prototype.InlineScript",
"db":"",
"version":"",
"structure":{},
"beforeLaunch":beforeLaunch,
"beforeLogout":beforeLogout,
"style":{}
});
Theme
synquery のECDB コンポーネント
で用意されたテーマを利用するためには、ECDB
を定義するRSDのstyle
属性のcolor
を指定します。
表示切替{
:
"style":{ "color": "orange" },
:
}new ECDB({
"title":"Colors",
"db":"",
"version":"",
"structure":{},
"style":{ "color": "orange" }
});
指定できるテーマは以下のとおりです。gray(デフォルト) red green blue antique olive purple pink develop mono orange violet darkred darkblue darkgreen black Form style
用意されたフォームの配色を利用するためには、ECBOOK
を定義するRSDのstyle
属性のcolor
を指定します。
表示切替{
:
"style":{ "color": "blue", .... }
:
}new ECDB({
"title":"Colors",
"db":"",
"version":"",
"structure":{
"book":{
"title":"Colors",
"table":"bb",
"structure":[
["field0","field0","string","",{},25],
["field1","field1","string","",{},25],
["field2","field2","string","",{},25],
["field3","field3","string","",{},25],
["field4","field4","string","",{},25],
["field5","field5","string","",{},25],
["field6","field6","string","",{},50],
],
"style":{ "color": "blue", "formWidth": 300, "openForm": true }
}
},
"style":{}
});
指定できる配色は以下のとおりです。gray(デフォルト) red green blue antique olive purple pink develop mono orange violet darkred darkblue darkgreen black Buttons color
フォーム内で定義したボタンの配色をカスタマイズしたい場合は、BOOK
を定義するRSDのbeforeShowForm
関数内で、jQueryのsynquery
拡張関数であるButtonColor
を使用します。
表示切替{
:
"structure":[
['before', 'before', 'button', '', {'label': 'Button Display'}, 25],
['after', 'after', 'button', '', {'label': 'Button Display'}, 25]
],
:
"beforeShowForm": function() {
var btn = this.Input('after');
btn.ButtonColor
('#A8A820');
},
:
}new ECDB({
実行結果例
"title":"Colors",
"db":"",
"version":"",
"structure":{
"book": {
"title": "sample",
"table": "bb",
"structure":[
['before', 'before', 'button', '', {'label': 'Button Display'}, 25],
['after', 'after', 'button', '', {'label': 'Button Display'}, 25]
],
"style":{"titleColor":"#600", "openForm": true},
"beforeShowForm": function() {
var btn = this.Input('after');
btn.ButtonColor('#A8A820');
}
}
},
"style":{}
});
Getting ECDB.BOOK instances
取得したいECBOOK
インスタンスの名前が既知の場合はECDB.BOOK
関数を用いて取得することができます。var book = ECDB.BOOK('book_name');
新規のECBOOK
インスタンスを生成する場合はECDB.prototype.BOOK
関数を使用します。引数にはRSDオブジェクトを渡します。var bookRsd = {
RSDオブジェクトに
'name': 'new_book',
'db': 'db_name',
'table': 'table_name',
:
};
var book = top.BOOK(bookRsd); // top変数はECDB
インスタンスを表します。name
プロパティを定義しておくことで、生成したECBOOK
インスタンスをECDB.BOOK
関数を使用して取得することができます。var book = ECDB.BOOK('new_book');
Showing a dialog form
ダイアログ形式のフォームを表示するためには、ECBOOK.prototype.ShowForm
関数を使用します。book.ShowForm();
Showing an inline form
インライン形式のフォームを表示するためには、ECBOOK.prototype.InlineForm
関数を使用します。book.InlineForm('block_name');
Showing a dialog table
ダイアログ形式のテーブルを表示するためには、ECBOOK.prototype.ShowTable
関数を使用します。book.ShowTable();
Showing an inline table
インライン形式のテーブルを表示するためには、ECBOOK.prototype.InlineTable
関数を使用します。book.InlineTable('block_name');
Getting data from database
データベースからデータを取得するためには、ECBOOK.prototype.Find
関数およびECBOOK.prototype.Get
関数を使用します。ECBOOK.prototype.Find
関数は検索条件を指定して、データを取得するためのキーの配列を取得できます。このキーの配列を引数としてECBOOK.prototype.Get
関数でデータを取得します。var selector = {}; // 検索条件
selector['something'] = 'anything';
book.Find(selector, function(keys) {
book.Get(keys, function(data) {
:
});
});Setting data to data
データベースのデータを更新するまたは、新規にデータを作成するためには、ECBOOK.prototype.Put
を使用します。book.Put(data, function() {
:
});
4.1 Handling of Synquery
synquery プラットフォーム上ではクラウドとの データIO に関する API を定義した $S 名前空間を用いて、極めて自由度の高い開発が可能です。このプラットフォームの原始的な空間に関しては Specifications を参照ください。
4.2. ECDB.Layouts
synquery の
ECDB コンポーネント
は、アプリケーションをより簡単に作成するための、ライブラリ群です。ヘッダー、フッターの自動付与が行われるほか、ログイン画面が固定されるなどが特徴的です。ここではECDB コンポーネント
の機能について、サンプルを交えて解説します。
ECDB コンポーネント
では画面のレイアウトを構築するために、分割 および レイヤー構成 の2つの方法が用意されています。
画面のレイアウトを構成する単位を
ブロック
と定義します。最上位のブロックはBody ( idは _BODY_ )
です。ブロックを分割したりレイヤー構成にしたりすることにより、複雑な画面レイアウトを実現することができます。4.3. ECDB.Colors
4.4. ECDB.BOOKs
ECBOOK
は synquery アプリケーションをより簡単に作成するための、静的な構成単位です。ECBOOK
インスタンスを利用して、画面上のフォームやテーブルの操作を行うことができるほか、データベースのデータを取得したりデータを更新することもできます。
4. How to develop your apps
synqueryプラットフォーム上での開発方法を解説します。