moved web/app/dojo back to web/dojo as a module

https://github.com/urbit/sole@080b8b6
This commit is contained in:
Anton Dyudin 2016-02-02 17:54:46 -08:00
parent 80d5288cd2
commit cfff86d1db
4 changed files with 290 additions and 262 deletions

View File

@ -1,37 +0,0 @@
:: Console front-end
::
:::: /hook/hymn/dojo/web
::
/? 310
|%
++ cdnj |=(a=tape ;script(src "//cdnjs.cloudflare.com/ajax/libs/{a}");)
--
::
::::
::
^- manx
;html
;head
;title: Sole
;* %- turn :_ cdnj ^- wall
:~ "jquery/2.1.1/jquery.min.js"
"mousetrap/1.4.6/mousetrap.js"
"react/0.11.0/react.js"
==
;script@"/~~/~/at/lib/js/urb.js";
;script: urb.appl = 'dojo'
;style:'''
#term {
width: 100%;
}
#term * {
margin: 0px;
}
'''
==
;body
;div#err;
;div#term:""
;script@"/lib/js/sole.js";
==
==

34
web/dojo.hoon Normal file
View File

@ -0,0 +1,34 @@
:: Console front-end
::
:::: /hook/hymn/dojo/web
::
/? 310
|%
++ cdnj |=(a=tape ;script(src "//cdnjs.cloudflare.com/ajax/libs/{a}");)
--
::
::::
::
^- manx
;module
=nav_title "Sole"
=nav_subnav "div"
;* %- turn :_ cdnj ^- wall
:~ :: "jquery/2.1.1/jquery.min.js"
"mousetrap/1.4.6/mousetrap.js"
:: "react/0.11.0/react.js"
==
::;script@"/~~/~/at/lib/js/urb.js";
;style:'''
#term {
width: 100%;
}
#term * {
margin: 0px;
}
'''
;div#err;
;div#term:""
;script@"/lib/js/sole.js";
;sole(appl "dojo");
==

View File

@ -1,35 +1,48 @@
(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){ (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
var DOM, Matr, Prompt, Share, div, pre, recl, ref, ref1, rend, span, str, var Matr, Prompt, Share, TreeActions, buffer, div, pre, recl, ref, ref1, rele, span, str, u,
slice = [].slice, slice = [].slice,
indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }; indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };
ref = [React.DOM, React.createClass, React.renderComponent], DOM = ref[0], recl = ref[1], rend = ref[2]; ref = [React.createClass, React.createElement], recl = ref[0], rele = ref[1];
ref1 = [DOM.div, DOM.pre, DOM.span], div = ref1[0], pre = ref1[1], span = ref1[2]; ref1 = React.DOM, div = ref1.div, u = ref1.u, pre = ref1.pre, span = ref1.span;
TreeActions = window.tree.actions;
str = JSON.stringify; str = JSON.stringify;
Share = require("./share.coffee"); Share = require("./share.coffee");
buffer = {
"": new Share("")
};
Prompt = recl({ Prompt = recl({
displayName: "Prompt",
render: function() { render: function() {
var buf, cur, pro, ref2, ref3; var buf, cur, pro, ref2, ref3;
ref3 = [(ref2 = this.props.prompt[this.props.appl]) != null ? ref2 : "X", this.props.cursor, this.props.input + " "], pro = ref3[0], cur = ref3[1], buf = ref3[2]; pro = (ref2 = this.props.prompt[this.props.appl]) != null ? ref2 : "X";
cur = this.props.cursor;
buf = this.props.input + " ";
return pre({}, this.props.appl + pro, span({ return pre({}, this.props.appl + pro, span({
style: { style: {
background: 'lightgray' background: 'lightgray'
} }
}, buf.slice(0, cur), "\u0332", buf.slice(cur))); }, buf.slice(0, cur), u({}, (ref3 = buf[cur]) != null ? ref3 : " "), buf.slice(cur + 1)));
} }
}); });
Matr = recl({ Matr = recl({
displayName: "Matr",
render: function() { render: function() {
var lines; var lines;
lines = this.props.rows.map(function(lin) { lines = this.props.rows.map(function(lin, key) {
return pre({}, lin, " "); return pre({
key: key
}, lin, " ");
}); });
lines.push(Prompt({ lines.push(rele(Prompt, {
key: "prompt",
appl: this.props.appl, appl: this.props.appl,
prompt: this.props.prompt, prompt: this.props.prompt,
input: this.props.input, input: this.props.input,
@ -39,93 +52,89 @@ Matr = recl({
} }
}); });
$(function() { TreeActions.registerComponent("sole", recl({
var bell, buffer, choose, cycle, deltim, doEdit, eatKyev, flash, join, matr, met, part, peer, pressed, print, sendAction, subs, sync, sysStatus, updPrompt, update, yank; displayName: "Sole",
met = $('<pre>').text('m').css({ getInitialState: function() {
display: 'none' return {
}).appendTo(term).width();
subs = "";
flash = function($el, background) {
$el.css({
background: background
});
if (background) {
return setTimeout((function() {
return flash($el, '');
}), 50);
}
};
bell = function() {
return flash($('body'), 'black');
};
matr = rend(Matr({
rows: [], rows: [],
appl: "", appl: this.props.appl,
prompt: { prompt: {
"": "# " "": "# "
}, },
input: "", input: "",
cursor: 0, cursor: 0,
history: [], history: [],
offset: 0 offset: 0,
}), term); error: ""
window.matr = matr;
update = function(a) {
return matr.setProps(a);
}; };
buffer = { },
"": new Share("") render: function() {
return div({}, div({
id: "err"
}, this.state.error), rele(Matr, this.state));
},
flash: function($el, background) {
$el.css({
background: background
});
if (background) {
return setTimeout(((function(_this) {
return function() {
return _this.flash($el, '');
}; };
window.buffer = buffer; })(this)), 50);
choose = function(appl) { }
urb.appl = appl; },
bell: function() {
return this.flash($('body'), 'black');
},
choose: function(appl) {
if (buffer[appl] == null) { if (buffer[appl] == null) {
buffer[appl] = new Share(""); buffer[appl] = new Share("");
} }
updPrompt('', null); this.updPrompt('', null);
return update({ return this.setState({
appl: appl, appl: appl,
cursor: 0, cursor: 0,
input: buffer[appl].buf input: buffer[appl].buf
}); });
}; },
print = function(txt) { print: function(txt) {
return update({ return this.setState({
rows: slice.call(matr.props.rows).concat([txt]) rows: slice.call(this.state.rows).concat([txt])
}); });
}; },
sync = function(ted, app) { sync: function(ted, app) {
var b; var b;
if (app == null) { if (app == null) {
app = matr.props.appl; app = this.state.appl;
}
if (app !== matr.props.appl) {
return;
} }
if (app === this.state.appl) {
b = buffer[app]; b = buffer[app];
return update({ return this.setState({
input: b.buf, input: b.buf,
cursor: b.transpose(ted, matr.props.cursor) cursor: b.transpose(ted, this.state.cursor)
}); });
}; }
updPrompt = function(app, pro) { },
updPrompt: function(app, pro) {
var prompt; var prompt;
prompt = $.extend({}, matr.props.prompt); prompt = $.extend({}, this.state.prompt);
if (pro != null) { if (pro != null) {
prompt[app] = pro; prompt[app] = pro;
} else { } else {
delete prompt[app]; delete prompt[app];
} }
return update({ return this.setState({
prompt: prompt prompt: prompt
}); });
}; },
sysStatus = function() { sysStatus: function() {
var app, k, pro, ref2, v; var app, k, pro, ref2, v;
return updPrompt('', ((ref2 = [ return this.updPrompt('', ((ref2 = [
matr.props.appl, (function() { this.state.appl, (function() {
var ref2, results; var ref2, results;
ref2 = matr.props.prompt; ref2 = this.state.prompt;
results = []; results = [];
for (k in ref2) { for (k in ref2) {
v = ref2[k]; v = ref2[k];
@ -134,47 +143,49 @@ $(function() {
} }
} }
return results; return results;
})() }).call(this)
], app = ref2[0], pro = ref2[1], ref2), app === '' ? (pro.join(', ')) + '# ' : null)); ], app = ref2[0], pro = ref2[1], ref2), app === '' ? (pro.join(', ')) + '# ' : null));
}; },
peer = function(ruh, app) { peer: function(ruh, app) {
var mapr, v; var mapr, v;
if (app == null) { if (app == null) {
app = urb.appl; app = this.state.appl;
} }
if (ruh.map) { if (ruh.map) {
return ruh.map(function(rul) { return ruh.map((function(_this) {
return peer(rul, app); return function(rul) {
}); return _this.peer(rul, app);
};
})(this));
} }
mapr = matr.props; mapr = this.state;
switch (Object.keys(ruh)[0]) { switch (Object.keys(ruh)[0]) {
case 'txt': case 'txt':
return print(ruh.txt); return this.print(ruh.txt);
case 'tan': case 'tan':
return ruh.tan.split("\n").map(print); return ruh.tan.split("\n").map(this.print);
case 'pro': case 'pro':
return updPrompt(app, ruh.pro.cad); return this.updPrompt(app, ruh.pro.cad);
case 'hop': case 'hop':
update({ this.setState({
cursor: ruh.hop cursor: ruh.hop
}); });
return bell(); return this.bell();
case 'blk': case 'blk':
return console.log("Stub " + (str(ruh))); return console.log("Stub " + (str(ruh)));
case 'det': case 'det':
buffer[app].receive(ruh.det); buffer[app].receive(ruh.det);
return sync(ruh.det.ted, app); return this.sync(ruh.det.ted, app);
case 'act': case 'act':
switch (ruh.act) { switch (ruh.act) {
case 'clr': case 'clr':
return update({ return this.setState({
rows: [] rows: []
}); });
case 'bel': case 'bel':
return bell(); return this.bell();
case 'nex': case 'nex':
return update({ return this.setState({
input: "", input: "",
cursor: 0, cursor: 0,
history: !mapr.input ? mapr.history : [mapr.input].concat(slice.call(mapr.history)), history: !mapr.input ? mapr.history : [mapr.input].concat(slice.call(mapr.history)),
@ -186,111 +197,122 @@ $(function() {
v = Object.keys(ruh); v = Object.keys(ruh);
return console.log(v, ruh[v[0]]); return console.log(v, ruh[v[0]]);
} }
}; },
join = function(app) { join: function(app) {
if (matr.props.prompt[app] != null) { if (this.state.prompt[app] != null) {
return print('# already-joined: ' + app); return this.print('# already-joined: ' + app);
} }
choose(app); this.choose(app);
return urb.bind("/sole", { return urb.bind("/sole", {
appl: this.state.appl,
wire: "/" wire: "/"
}, function(err, d) { }, (function(_this) {
return function(err, d) {
if (err) { if (err) {
return console.log(err); return console.log(err);
} else if (d.data) { } else if (d.data) {
return peer(d.data, app); return _this.peer(d.data, app);
} }
});
}; };
cycle = function() { })(this));
},
cycle: function() {
var apps, ref2; var apps, ref2;
apps = Object.keys(matr.props.prompt); apps = Object.keys(this.state.prompt);
if (apps.length < 2) { if (apps.length < 2) {
return; return;
} }
return choose((ref2 = apps[1 + apps.indexOf(urb.appl)]) != null ? ref2 : apps[0]); return this.choose((ref2 = apps[1 + apps.indexOf(this.state.appl)]) != null ? ref2 : apps[0]);
}; },
part = function(appl) { part: function(appl) {
var mapr; var mapr;
mapr = matr.props; mapr = this.state;
if (mapr.prompt[appl] == null) { if (mapr.prompt[appl] == null) {
return print('# not-joined: ' + appl); return this.print('# not-joined: ' + appl);
} }
urb.drop("/sole", { urb.drop("/sole", {
appl: appl, appl: appl,
wire: "/" wire: "/"
}); });
if (appl === mapr.appl) { if (appl === mapr.appl) {
cycle(); this.cycle();
} }
updPrompt(appl, null); this.updPrompt(appl, null);
return sysStatus(); return this.sysStatus();
}; },
join(urb.appl); componentWillUnmount: function() {
window.join = join; return this.mousetrapStop();
window.part = part; },
pressed = []; componentDidMount: function() {
deltim = null; this.mousetrapInit();
urb.send.mark = 'sole-action'; return this.join(this.state.appl);
sendAction = function(data) { },
var app; sendAction: function(data) {
if (matr.props.appl) { var app, appl;
return urb.send(data, function(e, res) { appl = this.state.appl;
if (appl) {
return urb.send(data, {
appl: appl,
mark: 'sole-action'
}, (function(_this) {
return function(e, res) {
if (res.status !== 200) { if (res.status !== 200) {
return $('#err')[0].innerText = res.data.mess; return _this.setState({
} error: res.data.mess
}); });
}
};
})(this));
} else if (data === 'ret') { } else if (data === 'ret') {
app = /^[a-z-]+$/.exec(buffer[""].buf.slice(1)); app = /^[a-z-]+$/.exec(buffer[""].buf.slice(1));
if (!((app != null) && (app[0] != null))) { if (!((app != null) && (app[0] != null))) {
return bell(); return this.bell();
} else { } else {
switch (buffer[""].buf[0]) { switch (buffer[""].buf[0]) {
case '+': case '+':
doEdit({ this.doEdit({
set: "" set: ""
}); });
return join(app[0]); return this.join(app[0]);
case '-': case '-':
doEdit({ this.doEdit({
set: "" set: ""
}); });
return part(app[0]); return this.part(app[0]);
default: default:
return bell(); return this.bell();
} }
} }
} }
}; },
doEdit = function(ted) { doEdit: function(ted) {
var det; var det;
det = buffer[matr.props.appl].transmit(ted); det = buffer[this.state.appl].transmit(ted);
sync(ted); this.sync(ted);
return sendAction({ return this.sendAction({
det: det det: det
}); });
}; },
yank = ''; eatKyev: function(mod, key) {
eatKyev = function(mod, key) {
var _, appl, cha, cursor, history, input, mapr, n, offset, prev, ref2, ref3, rest; var _, appl, cha, cursor, history, input, mapr, n, offset, prev, ref2, ref3, rest;
mapr = matr.props; mapr = this.state;
switch (mod.sort().join('-')) { switch (mod.sort().join('-')) {
case '': case '':
case 'shift': case 'shift':
if (key.str) { if (key.str) {
doEdit({ this.doEdit({
ins: { ins: {
cha: key.str, cha: key.str,
at: mapr.cursor at: mapr.cursor
} }
}); });
update({ this.setState({
cursor: mapr.cursor + 1 cursor: mapr.cursor + 1
}); });
} }
switch (key.act) { switch (key.act) {
case 'entr': case 'entr':
return sendAction('ret'); return this.sendAction('ret');
case 'up': case 'up':
history = mapr.history.slice(); history = mapr.history.slice();
offset = mapr.offset; offset = mapr.offset;
@ -299,10 +321,10 @@ $(function() {
} }
ref2 = [history[offset], mapr.input], input = ref2[0], history[offset] = ref2[1]; ref2 = [history[offset], mapr.input], input = ref2[0], history[offset] = ref2[1];
offset++; offset++;
doEdit({ this.doEdit({
set: input set: input
}); });
return update({ return this.setState({
offset: offset, offset: offset,
history: history, history: history,
cursor: input.length cursor: input.length
@ -315,31 +337,31 @@ $(function() {
return; return;
} }
ref3 = [history[offset], mapr.input], input = ref3[0], history[offset] = ref3[1]; ref3 = [history[offset], mapr.input], input = ref3[0], history[offset] = ref3[1];
doEdit({ this.doEdit({
set: input set: input
}); });
return update({ return this.setState({
offset: offset, offset: offset,
history: history, history: history,
cursor: input.length cursor: input.length
}); });
case 'left': case 'left':
if (mapr.cursor > 0) { if (mapr.cursor > 0) {
return update({ return this.setState({
cursor: mapr.cursor - 1 cursor: mapr.cursor - 1
}); });
} }
break; break;
case 'right': case 'right':
if (mapr.cursor < mapr.input.length) { if (mapr.cursor < mapr.input.length) {
return update({ return this.setState({
cursor: mapr.cursor + 1 cursor: mapr.cursor + 1
}); });
} }
break; break;
case 'baxp': case 'baxp':
if (mapr.cursor > 0) { if (mapr.cursor > 0) {
return doEdit({ return this.doEdit({
del: mapr.cursor - 1 del: mapr.cursor - 1
}); });
} }
@ -349,61 +371,61 @@ $(function() {
switch (key.str || key.act) { switch (key.str || key.act) {
case 'a': case 'a':
case 'left': case 'left':
return update({ return this.setState({
cursor: 0 cursor: 0
}); });
case 'e': case 'e':
case 'right': case 'right':
return update({ return this.setState({
cursor: mapr.input.length cursor: mapr.input.length
}); });
case 'l': case 'l':
return update({ return this.setState({
rows: [] rows: []
}); });
case 'entr': case 'entr':
return bell(); return this.bell();
case 'w': case 'w':
return eatKyev(['alt'], { return this.eatKyev(['alt'], {
act: 'baxp' act: 'baxp'
}); });
case 'p': case 'p':
return eatKyev([], { return this.eatKyev([], {
act: 'up' act: 'up'
}); });
case 'n': case 'n':
return eatKyev([], { return this.eatKyev([], {
act: 'down' act: 'down'
}); });
case 'b': case 'b':
return eatKyev([], { return this.eatKyev([], {
act: 'left' act: 'left'
}); });
case 'f': case 'f':
return eatKyev([], { return this.eatKyev([], {
act: 'right' act: 'right'
}); });
case 'g': case 'g':
return bell(); return this.bell();
case 'x': case 'x':
return cycle(); return this.cycle();
case 'v': case 'v':
appl = mapr.appl !== '' ? '' : urb.appl; appl = mapr.appl !== '' ? '' : this.state.appl;
update({ this.setState({
appl: appl, appl: appl,
cursor: 0, cursor: 0,
input: buffer[appl].buf input: buffer[appl].buf
}); });
return sysStatus(); return this.sysStatus();
case 't': case 't':
if (mapr.cursor === 0 || mapr.input.length < 2) { if (mapr.cursor === 0 || mapr.input.length < 2) {
return bell(); return this.bell();
} }
cursor = mapr.cursor; cursor = mapr.cursor;
if (cursor < mapr.input.length) { if (cursor < mapr.input.length) {
cursor++; cursor++;
} }
doEdit([ this.doEdit([
{ {
del: cursor - 1 del: cursor - 1
}, { }, {
@ -413,12 +435,12 @@ $(function() {
} }
} }
]); ]);
return update({ return this.setState({
cursor: cursor cursor: cursor
}); });
case 'u': case 'u':
yank = mapr.input.slice(0, mapr.cursor); this.yank = mapr.input.slice(0, mapr.cursor);
return doEdit((function() { return this.doEdit((function() {
var i, ref4, results; var i, ref4, results;
results = []; results = [];
for (n = i = 1, ref4 = mapr.cursor; 1 <= ref4 ? i <= ref4 : i >= ref4; n = 1 <= ref4 ? ++i : --i) { for (n = i = 1, ref4 = mapr.cursor; 1 <= ref4 ? i <= ref4 : i >= ref4; n = 1 <= ref4 ? ++i : --i) {
@ -429,8 +451,8 @@ $(function() {
return results; return results;
})()); })());
case 'k': case 'k':
yank = mapr.input.slice(mapr.cursor); this.yank = mapr.input.slice(mapr.cursor);
return doEdit((function() { return this.doEdit((function() {
var i, ref4, ref5, results; var i, ref4, ref5, results;
results = []; results = [];
for (_ = i = ref4 = mapr.cursor, ref5 = mapr.input.length; ref4 <= ref5 ? i < ref5 : i > ref5; _ = ref4 <= ref5 ? ++i : --i) { for (_ = i = ref4 = mapr.cursor, ref5 = mapr.input.length; ref4 <= ref5 ? i < ref5 : i > ref5; _ = ref4 <= ref5 ? ++i : --i) {
@ -441,11 +463,12 @@ $(function() {
return results; return results;
})()); })());
case 'y': case 'y':
return doEdit((function() { return this.doEdit((function() {
var i, len, results; var i, len, ref4, ref5, results;
ref5 = (ref4 = this.yank) != null ? ref4 : '';
results = []; results = [];
for (n = i = 0, len = yank.length; i < len; n = ++i) { for (n = i = 0, len = ref5.length; i < len; n = ++i) {
cha = yank[n]; cha = ref5[n];
results.push({ results.push({
ins: { ins: {
cha: cha, cha: cha,
@ -454,7 +477,7 @@ $(function() {
}); });
} }
return results; return results;
})()); }).call(this));
default: default:
return console.log(mod, str(key)); return console.log(mod, str(key));
} }
@ -465,7 +488,7 @@ $(function() {
case 'right': case 'right':
rest = mapr.input.slice(mapr.cursor); rest = mapr.input.slice(mapr.cursor);
rest = rest.match(/\W*\w*/)[0]; rest = rest.match(/\W*\w*/)[0];
return update({ return this.setState({
cursor: mapr.cursor + rest.length cursor: mapr.cursor + rest.length
}); });
case 'b': case 'b':
@ -473,15 +496,15 @@ $(function() {
prev = mapr.input.slice(0, mapr.cursor); prev = mapr.input.slice(0, mapr.cursor);
prev = prev.split('').reverse().join(''); prev = prev.split('').reverse().join('');
prev = prev.match(/\W*\w*/)[0]; prev = prev.match(/\W*\w*/)[0];
return update({ return this.setState({
cursor: mapr.cursor - prev.length cursor: mapr.cursor - prev.length
}); });
case 'baxp': case 'baxp':
prev = mapr.input.slice(0, mapr.cursor); prev = mapr.input.slice(0, mapr.cursor);
prev = prev.split('').reverse().join(''); prev = prev.split('').reverse().join('');
prev = prev.match(/\W*\w*/)[0]; prev = prev.match(/\W*\w*/)[0];
yank = prev; this.yank = prev;
return doEdit((function() { return this.doEdit((function() {
var i, len, results; var i, len, results;
results = []; results = [];
for (n = i = 0, len = prev.length; i < len; n = ++i) { for (n = i = 0, len = prev.length; i < len; n = ++i) {
@ -497,8 +520,14 @@ $(function() {
default: default:
return console.log(mod, str(key)); return console.log(mod, str(key));
} }
}; },
return Mousetrap.handleKey = function(char, mod, e) { mousetrapStop: function() {
return Mousetrap.handleKey = this._defaultHandleKey;
},
mousetrapInit: function() {
this._defaultHandleKey = Mousetrap.handleKey;
return Mousetrap.handleKey = (function(_this) {
return function(char, mod, e) {
var chac, key, norm, ref2; var chac, key, norm, ref2;
norm = { norm = {
capslock: 'caps', capslock: 'caps',
@ -541,9 +570,11 @@ $(function() {
return; return;
} }
e.preventDefault(); e.preventDefault();
return eatKyev(mod, key); return _this.eatKyev(mod, key);
}; };
}); })(this);
}
}));
},{"./share.coffee":2}],2:[function(require,module,exports){ },{"./share.coffee":2}],2:[function(require,module,exports){

View File

@ -1,4 +1,4 @@
;module(nav_title "Talk", nav_dpad "", nav_sibs "", nav_subnav "talk-station") ;module(nav_title "Talk", nav_no-dpad "", nav_no-sibs "", nav_subnav "talk-station")
;script@"/~~/~/at/lib/urb.js"; ;script@"/~~/~/at/lib/urb.js";
;script@"/talk/main.js"; ;script@"/talk/main.js";
;link/"/talk/main.css"(rel "stylesheet"); ;link/"/talk/main.css"(rel "stylesheet");