sealed class Either<A, B> {
data class Left<A>(val value: A): Either<A, Nothing>()
data class Right<B>(val value: B): Either<Nothing, B>()
val left: A? get() = (this as? Left<A>)?.value
val right: B? get() = (this as? Right<B>)?.value
fun mustLeft() = left ?: throw AssertionError("$this not left")
fun mustRight() = right ?: throw AssertionError("$this not right")
fun <R> fold(trans_left: (A) -> R, trans_right: (B) -> R): R = when (this) {
is Left -> trans_left(this.value)
is Right -> trans_right(this.value)
}
}https://mohu.pincong.rocks/question/
🤔 最近膜乎的链接都过期了,有简单的等价链接,我找不到合理的 URL replace Firefox 插件,自己写一个去。
🤔我简直是变态…… 为什么要写 format()……
🤔 最近膜乎的链接都过期了,有简单的等价链接,我找不到合理的 URL replace Firefox 插件,自己写一个去。
function onLink(url) {
for (let [pat, dst] of settings.replaceMap) {
let match = pat.exec(url);
if (match != null) { redirect(format(dst, i => match[i])); }
}
}
function drop(n, str) { return str.substring(n, str.length); }
function format(str, replace, prefix = '\\', take = view => /(\d+)/y.exec(view)[1], transform = Number.parseInt) {
let view = str;
let replaced = [];
while (view.length > 0) {
if (view.startsWith(prefix)) {
let took = take(view);
view = drop(took.length, view);
replaced.push( replace(transform(took)) );
} else {
let prefixIdx = view.indexOf(prefix);
if (prefixIdx == (-1)) prefixIdx = view.length;
replaced.push( view.substring(0, prefixIdx) );
view = drop(prefixIdx, view);
}
}
return replaced.join("");
} 🤔我简直是变态…… 为什么要写 format()……
function drop(n, str) { return str.substring(n, str.length); }
function format(str, replace, prefix = '\\' , take = view => /(\d+)/.exec(view)[0], transform = Number.parseInt) {
let view = str;
let result = [];
while (view.length != 0) {
let prefixIdx = view.indexOf(prefix); if (prefixIdx == (-1)) break;
result.push( view.substring(0, prefixIdx) );
view = drop(prefixIdx+prefix.length, view);
let took = take(view);
if (took == null) throw SyntaxError(`Unexpected ${view} after ${prefix}`);
result.push( replace(transform(took)) );
view = drop(took.length, view);
}
result.push(view);
return result.join("");
}🤔 刚才在想,如果要定义 DOM 树的模式并同时允许正向组织和反向提取,一组动词叫什么,试了 unrender, extract, dump, match 等都觉得不合适,后来发现 render/scrape 是最合适的
请查阅源代码提交政策。 您使用了下列任何一种工具吗?
Code generators or minifiers
将多个文件合并为一的工具,例如 webpack
Web 模板引擎,对于 HTML 和 CSS
任何对代码或文件二次处理,并生成附加组件中的代码或文件的其他工具
🤔
Code generators or minifiers
将多个文件合并为一的工具,例如 webpack
Web 模板引擎,对于 HTML 和 CSS
任何对代码或文件二次处理,并生成附加组件中的代码或文件的其他工具
🤔
function switcher(e) {
const url = new URL(e.url);
return { redirectUrl: url.href };
}
function update_switching() {
if(browser.webRequest.onBeforeRequest.hasListener(switcher))
browser.webRequest.onBeforeRequest.removeListener(switcher);
if (patterned.length == 0) return;
browser.webRequest.onBeforeRequest.addListener(switcher, {urls: patterned}, ["blocking"]);
} 🤔从隔壁一个扩展抄过来的东西
duangsuse::Echo
#DontKnow 🤔早上我起床前问了下duangsuse (自言自语) 代码风格上,为什么要把 ES6 generator 的 * 直接贴在 function 的后面呢 回答说,因为这样语义更明确, generator function 就是 function*。 那 C++ 里为什么要写 Ui::MainWindow* ui; 呢? “语义更明确,指针当然要贴着类型” 等等…… int *a, *b; 呢 “🤪看来以后得区别对待 C 和 ES6 的星号了”
* 号可能是生成器语句操作符的名字的一部分。
—
duangsuse 批注:ES6 里应该有
—
duangsuse 批注:ES6 里应该有
yield* 的,不过我还是会把星号放前面
duangsuse::Echo
https://www.mohu.club/question/2605 其实我就是为了让这个 URL 能自动重定向……
https://github.com/duangsuse-valid-projects/WebExt-URLReplace/commit/6fc30563975b4a1116a7a084575a4b9e86f8db4d
支持了
默认情况下为了减少开销以及(象征性)尊重用户的隐私,利用了
在设置里添加一项 source 为
支持了
<all_urls> pattern 的使用(不过由于 browser.storage API 相当难用以及我自己很在意是 ES6 还是 ES7 compat 的问题,实现代码很烂)默认情况下为了减少开销以及(象征性)尊重用户的隐私,利用了
onBeforeRequest 的 RequestFilter 功能。在设置里添加一项 source 为
<use_all_urls> 并且 destination 不为空("true")的项目后,就会转而开启面向所有域名的替换,比如可以把 (.*).com -> \1.orgGitHub
Add <use_all_urls>, improve code reuse · duangsuse-valid-projects/WebExt-URLReplace@6fc3056
Replace URL by regex pattern mapping. Contribute to duangsuse-valid-projects/WebExt-URLReplace development by creating an account on GitHub.