Skip to content

Commit beddcd0

Browse files
committed
extend the functionality of writeas option (#156)
1 parent ef4f01a commit beddcd0

File tree

3 files changed

+61
-34
lines changed

3 files changed

+61
-34
lines changed

src/chrome/frontend/agent.js

+36-5
Original file line numberDiff line numberDiff line change
@@ -1304,6 +1304,13 @@ function keylog () {
13041304
t.scrollTop = t.scrollHeight - t.clientHeight;
13051305
}
13061306

1307+
function getGlobRegex (s) {
1308+
return new RegExp('^' + s
1309+
.replace(/[\\^$+.()|{}]/g, function ($0) {return '\\' + $0})
1310+
.replace(/\?/g, '.')
1311+
.replace(/\*/g, '.+?'), 'i');
1312+
}
1313+
13071314
function parseBlacklist (blacklist) {
13081315
var result = {
13091316
fullBlocked: false,
@@ -1333,10 +1340,7 @@ function parseBlacklist (blacklist) {
13331340
line = [line, ''];
13341341
}
13351342
try {
1336-
var url = new RegExp('^' + line[0]
1337-
.replace(/[\\^$+.()|{}]/g, function ($0) {return '\\' + $0})
1338-
.replace(/\?/g, '.')
1339-
.replace(/\*/g, '.+?'), 'i');
1343+
var url = getGlobRegex(line[0]);
13401344

13411345
if (url.test(window.location.href)) {
13421346
if (line[1] == '') {
@@ -1704,7 +1708,34 @@ var writeContentToElement = (function () {
17041708
}
17051709

17061710
else if (element.isContentEditable) {
1707-
switch (opts.writeAs) {
1711+
var writeAs = opts.writeAs;
1712+
try {
1713+
var data = JSON.parse(writeAs);
1714+
for (var pattern in data) {
1715+
if (!getGlobRegex(pattern).test(window.location.href)) continue;
1716+
1717+
// simple string
1718+
if (typeof data[pattern] == 'string') {
1719+
writeAs = data[pattern];
1720+
}
1721+
1722+
// array...
1723+
else if (data[pattern] instanceof Array) {
1724+
data[pattern].some(function (pair) {
1725+
if (!('selector' in pair)) return;
1726+
if (document.querySelector(pair.selector)) {
1727+
writeAs = pair.writeas;
1728+
return true;
1729+
}
1730+
});
1731+
}
1732+
break;
1733+
}
1734+
}
1735+
catch (e) {
1736+
}
1737+
1738+
switch (writeAs) {
17081739
case 'div':
17091740
return overwrite(element, content, toDiv);
17101741

src/chrome/frontend/wasavi.js

+10-2
Original file line numberDiff line numberDiff line change
@@ -448,7 +448,7 @@ function ExCommandExecutor (app) {
448448
return true;
449449
}
450450
function paragraph12 () {
451-
if (/^(?:map|unmap|abbreviate|unabbreviate)$/.test(commandName)) {
451+
if (/^(?:set|map|unmap|abbreviate|unabbreviate)$/.test(commandName)) {
452452
// do not include double quote for compatibility with vim.
453453
skipto(/[\n|]/g, {escapeChars:'\u0016'});
454454
}
@@ -471,6 +471,8 @@ function ExCommandExecutor (app) {
471471
*
472472
*/
473473

474+
source = source.replace(/\\\n/g, '');
475+
474476
if (/[\\\u0016]$/.test(source)) {
475477
source = source.substring(0, source.length - 1);
476478
}
@@ -5288,7 +5290,13 @@ var config = new Wasavi.Configurator(appProxy,
52885290
targetElement.writeAs = v;
52895291
break;
52905292
default:
5291-
v = targetElement.writeAs;
5293+
var asjson = parseJson(v);
5294+
if (asjson) {
5295+
targetElement.writeAs = v;
5296+
}
5297+
else {
5298+
v = targetElement.writeAs;
5299+
}
52925300
break;
52935301
}
52945302
return v;

src/chrome/scripts/options-core.js

+15-27
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,17 @@ function $ (arg) {
3434
* ----------------
3535
*/
3636

37-
function setMarkup (node, text) {
37+
function markup (node, text) {
38+
var debug = /\* /.test(text);
39+
40+
text = text.replace(/(?:\*\s+(?:\*\S|[^*])+(?:\n|$))+/g, function ($0) {
41+
return '[ul]' +
42+
$0.replace(/\*\s+((?:\*\S|[^*])+(?:\n|$))/g, '[li]$1[/li]') +
43+
'[/ul]';
44+
});
45+
3846
text = text.replace(/\n/g, '[br]');
47+
text = text.replace(/\[br\](\[\/\w+\])/g, '$1');
3948

4049
var pattern = /((?:\\.|[^\[])+)|(\[\/?(\w+)[^\]]*\])/g;
4150
var stack = [{name:'#root', node: node}];
@@ -59,11 +68,10 @@ function setMarkup (node, text) {
5968
break;
6069

6170
case 'i':
62-
newNode = document.createElement('i');
63-
break;
64-
6571
case 'b':
66-
newNode = document.createElement('b');
72+
case 'ul':
73+
case 'li':
74+
newNode = document.createElement(re[3]);
6775
break;
6876

6977
case 'br':
@@ -184,27 +192,6 @@ function initPage (req) {
184192
* replace all message ids to translated one
185193
*/
186194

187-
function defaultConverter (node, message) {
188-
node.nodeValue = '';
189-
setMarkup(node.parentNode, message);
190-
}
191-
function extractList (node, message) {
192-
node = node.parentNode;
193-
node.textContent = '';
194-
var ul = node.appendChild(document.createElement('ul'));
195-
message
196-
.replace(/^\s*\*\s*/, '')
197-
.split(/\n\*\s*/)
198-
.forEach(function (line) {
199-
var li = ul.appendChild(document.createElement('li'));
200-
setMarkup(li, line);
201-
});
202-
}
203-
204-
var converter = {
205-
option_target_elements_desc: extractList,
206-
option_qa_blacklist_tips: extractList
207-
};
208195
var iter = document.createNodeIterator(
209196
document, window.NodeFilter.SHOW_TEXT, null, false);
210197

@@ -231,7 +218,8 @@ function initPage (req) {
231218
message = extension.getMessage(id) || id;
232219
}
233220

234-
(converter[id] || defaultConverter)(node, message);
221+
node.nodeValue = '';
222+
markup(node.parentNode, message);
235223
});
236224

237225
/*

0 commit comments

Comments
 (0)