feat: sync mixly root files and common folder

This commit is contained in:
yczpf2019
2026-01-24 16:12:04 +08:00
parent 93e17c00ae
commit c8c5fcf726
2920 changed files with 186461 additions and 0 deletions

View File

@@ -0,0 +1,53 @@
importScripts('./libastyle.js');
importScripts('../../../../web-modules/workerpool.min.js');
const ASTYLE_CONFIG = `
# Braces / 基本风格
style=google # google 样式
# 缩进
indent=spaces=2 # 使用 2 空格
indent-switches # switch 里的 case 缩进
indent-cases # case 对齐
indent-after-parens # 括号之后新起一行也缩进
indent-preproc-block # 缩进宏块
indent-preproc-cond # 缩进条件宏
# Padding / 空格
pad-comma # 参数逗号后加空格
pad-oper # 运算符周围加空格
pad-header # 关键字后添加空格 (if ( … ))
# 对齐
align-pointer=name # 把指针符号 * 放在类型名边
align-reference=name # 引用符号 & 同上
# Formatting / 格式化行为
attach-return-type # 合并返回类型和函数名
attach-return-type-decl # 对声明也合并
add-braces # 强制加大括号
keep-one-line-blocks # 保留一行 {} 块
keep-one-line-statements # if/else 等保留一行语句
close-templates # 模板 <> 处理
break-after-logical # long expression 后换行
break-blocks # 块首尾换行
# 其他
delete-empty-lines # 删除空行
max-continuation-indent=4 # 设置表达式延续缩进最大值
`;
async function init() {
await self.cppFormatter.init();
}
async function format(code) {
const result = await self.cppFormatter.format(code, ASTYLE_CONFIG);
return result;
}
workerpool.worker({
init,
format
});

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,17 @@
importScripts('./ruff_fmt.js');
importScripts('../../../../web-modules/workerpool.min.js');
async function init() {
await self.pythonFormatter.init();
}
async function format(code) {
const result = await self.pythonFormatter.format(code);
return result;
}
workerpool.worker({
init,
format
});

View File

@@ -0,0 +1,572 @@
let wasm;
function addHeapObject(obj) {
if (heap_next === heap.length) heap.push(heap.length + 1);
const idx = heap_next;
heap_next = heap[idx];
heap[idx] = obj;
return idx;
}
function debugString(val) {
// primitive types
const type = typeof val;
if (type == 'number' || type == 'boolean' || val == null) {
return `${val}`;
}
if (type == 'string') {
return `"${val}"`;
}
if (type == 'symbol') {
const description = val.description;
if (description == null) {
return 'Symbol';
} else {
return `Symbol(${description})`;
}
}
if (type == 'function') {
const name = val.name;
if (typeof name == 'string' && name.length > 0) {
return `Function(${name})`;
} else {
return 'Function';
}
}
// objects
if (Array.isArray(val)) {
const length = val.length;
let debug = '[';
if (length > 0) {
debug += debugString(val[0]);
}
for(let i = 1; i < length; i++) {
debug += ', ' + debugString(val[i]);
}
debug += ']';
return debug;
}
// Test for built-in
const builtInMatches = /\[object ([^\]]+)\]/.exec(toString.call(val));
let className;
if (builtInMatches && builtInMatches.length > 1) {
className = builtInMatches[1];
} else {
// Failed to match the standard '[object ClassName]'
return toString.call(val);
}
if (className == 'Object') {
// we're a user defined class or Object
// JSON.stringify avoids problems with cycles, and is generally much
// easier than looping through ownProperties of `val`.
try {
return 'Object(' + JSON.stringify(val) + ')';
} catch (_) {
return 'Object';
}
}
// errors
if (val instanceof Error) {
return `${val.name}: ${val.message}\n${val.stack}`;
}
// TODO we could test for more things here, like `Set`s and `Map`s.
return className;
}
function dropObject(idx) {
if (idx < 132) return;
heap[idx] = heap_next;
heap_next = idx;
}
function getArrayU8FromWasm0(ptr, len) {
ptr = ptr >>> 0;
return getUint8ArrayMemory0().subarray(ptr / 1, ptr / 1 + len);
}
let cachedDataViewMemory0 = null;
function getDataViewMemory0() {
if (cachedDataViewMemory0 === null || cachedDataViewMemory0.buffer.detached === true || (cachedDataViewMemory0.buffer.detached === undefined && cachedDataViewMemory0.buffer !== wasm.memory.buffer)) {
cachedDataViewMemory0 = new DataView(wasm.memory.buffer);
}
return cachedDataViewMemory0;
}
function getStringFromWasm0(ptr, len) {
ptr = ptr >>> 0;
return decodeText(ptr, len);
}
let cachedUint8ArrayMemory0 = null;
function getUint8ArrayMemory0() {
if (cachedUint8ArrayMemory0 === null || cachedUint8ArrayMemory0.byteLength === 0) {
cachedUint8ArrayMemory0 = new Uint8Array(wasm.memory.buffer);
}
return cachedUint8ArrayMemory0;
}
function getObject(idx) { return heap[idx]; }
function handleError(f, args) {
try {
return f.apply(this, args);
} catch (e) {
wasm.__wbindgen_export3(addHeapObject(e));
}
}
let heap = new Array(128).fill(undefined);
heap.push(undefined, null, true, false);
let heap_next = heap.length;
function isLikeNone(x) {
return x === undefined || x === null;
}
function passStringToWasm0(arg, malloc, realloc) {
if (realloc === undefined) {
const buf = cachedTextEncoder.encode(arg);
const ptr = malloc(buf.length, 1) >>> 0;
getUint8ArrayMemory0().subarray(ptr, ptr + buf.length).set(buf);
WASM_VECTOR_LEN = buf.length;
return ptr;
}
let len = arg.length;
let ptr = malloc(len, 1) >>> 0;
const mem = getUint8ArrayMemory0();
let offset = 0;
for (; offset < len; offset++) {
const code = arg.charCodeAt(offset);
if (code > 0x7F) break;
mem[ptr + offset] = code;
}
if (offset !== len) {
if (offset !== 0) {
arg = arg.slice(offset);
}
ptr = realloc(ptr, len, len = offset + arg.length * 3, 1) >>> 0;
const view = getUint8ArrayMemory0().subarray(ptr + offset, ptr + len);
const ret = cachedTextEncoder.encodeInto(arg, view);
offset += ret.written;
ptr = realloc(ptr, len, offset, 1) >>> 0;
}
WASM_VECTOR_LEN = offset;
return ptr;
}
function takeObject(idx) {
const ret = getObject(idx);
dropObject(idx);
return ret;
}
let cachedTextDecoder = new TextDecoder('utf-8', { ignoreBOM: true, fatal: true });
cachedTextDecoder.decode();
const MAX_SAFARI_DECODE_BYTES = 2146435072;
let numBytesDecoded = 0;
function decodeText(ptr, len) {
numBytesDecoded += len;
if (numBytesDecoded >= MAX_SAFARI_DECODE_BYTES) {
cachedTextDecoder = new TextDecoder('utf-8', { ignoreBOM: true, fatal: true });
cachedTextDecoder.decode();
numBytesDecoded = len;
}
return cachedTextDecoder.decode(getUint8ArrayMemory0().subarray(ptr, ptr + len));
}
const cachedTextEncoder = new TextEncoder();
if (!('encodeInto' in cachedTextEncoder)) {
cachedTextEncoder.encodeInto = function (arg, view) {
const buf = cachedTextEncoder.encode(arg);
view.set(buf);
return {
read: arg.length,
written: buf.length
};
}
}
let WASM_VECTOR_LEN = 0;
/**
* Format the entire Python source code string.
* @param {string} input
* @param {string | null} [path]
* @param {Config | null} [config]
* @returns {string}
*/
function format_code(input, path, config) {
let deferred4_0;
let deferred4_1;
try {
const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);
const ptr0 = passStringToWasm0(input, wasm.__wbindgen_export, wasm.__wbindgen_export2);
const len0 = WASM_VECTOR_LEN;
var ptr1 = isLikeNone(path) ? 0 : passStringToWasm0(path, wasm.__wbindgen_export, wasm.__wbindgen_export2);
var len1 = WASM_VECTOR_LEN;
wasm.format(retptr, ptr0, len0, ptr1, len1, isLikeNone(config) ? 0 : addHeapObject(config));
var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);
var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);
var r2 = getDataViewMemory0().getInt32(retptr + 4 * 2, true);
var r3 = getDataViewMemory0().getInt32(retptr + 4 * 3, true);
var ptr3 = r0;
var len3 = r1;
if (r3) {
ptr3 = 0; len3 = 0;
throw takeObject(r2);
}
deferred4_0 = ptr3;
deferred4_1 = len3;
return getStringFromWasm0(ptr3, len3);
} finally {
wasm.__wbindgen_add_to_stack_pointer(16);
wasm.__wbindgen_export4(deferred4_0, deferred4_1, 1);
}
}
/**
* Format a specific range of the Python source code string.
* @param {string} input
* @param {TextRange} range
* @param {string | null} [path]
* @param {Config | null} [config]
* @returns {PrintedRange}
*/
function format_range(input, range, path, config) {
try {
const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);
const ptr0 = passStringToWasm0(input, wasm.__wbindgen_export, wasm.__wbindgen_export2);
const len0 = WASM_VECTOR_LEN;
var ptr1 = isLikeNone(path) ? 0 : passStringToWasm0(path, wasm.__wbindgen_export, wasm.__wbindgen_export2);
var len1 = WASM_VECTOR_LEN;
wasm.format_range(retptr, ptr0, len0, addHeapObject(range), ptr1, len1, isLikeNone(config) ? 0 : addHeapObject(config));
var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);
var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);
var r2 = getDataViewMemory0().getInt32(retptr + 4 * 2, true);
if (r2) {
throw takeObject(r1);
}
return takeObject(r0);
} finally {
wasm.__wbindgen_add_to_stack_pointer(16);
}
}
const EXPECTED_RESPONSE_TYPES = new Set(['basic', 'cors', 'default']);
async function __wbg_load(module, imports) {
if (typeof Response === 'function' && module instanceof Response) {
if (typeof WebAssembly.instantiateStreaming === 'function') {
try {
return await WebAssembly.instantiateStreaming(module, imports);
} catch (e) {
const validResponse = module.ok && EXPECTED_RESPONSE_TYPES.has(module.type);
if (validResponse && module.headers.get('Content-Type') !== 'application/wasm') {
console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve Wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n", e);
} else {
throw e;
}
}
}
const bytes = await module.arrayBuffer();
return await WebAssembly.instantiate(bytes, imports);
} else {
const instance = await WebAssembly.instantiate(module, imports);
if (instance instanceof WebAssembly.Instance) {
return { instance, module };
} else {
return instance;
}
}
}
function __wbg_get_imports() {
const imports = {};
imports.wbg = {};
imports.wbg.__wbg_Error_52673b7de5a0ca89 = function(arg0, arg1) {
const ret = Error(getStringFromWasm0(arg0, arg1));
return addHeapObject(ret);
};
imports.wbg.__wbg_Number_2d1dcfcf4ec51736 = function(arg0) {
const ret = Number(getObject(arg0));
return ret;
};
imports.wbg.__wbg_String_8f0eb39a4a4c2f66 = function(arg0, arg1) {
const ret = String(getObject(arg1));
const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_export, wasm.__wbindgen_export2);
const len1 = WASM_VECTOR_LEN;
getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true);
getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true);
};
imports.wbg.__wbg___wbindgen_bigint_get_as_i64_6e32f5e6aff02e1d = function(arg0, arg1) {
const v = getObject(arg1);
const ret = typeof(v) === 'bigint' ? v : undefined;
getDataViewMemory0().setBigInt64(arg0 + 8 * 1, isLikeNone(ret) ? BigInt(0) : ret, true);
getDataViewMemory0().setInt32(arg0 + 4 * 0, !isLikeNone(ret), true);
};
imports.wbg.__wbg___wbindgen_boolean_get_dea25b33882b895b = function(arg0) {
const v = getObject(arg0);
const ret = typeof(v) === 'boolean' ? v : undefined;
return isLikeNone(ret) ? 0xFFFFFF : ret ? 1 : 0;
};
imports.wbg.__wbg___wbindgen_debug_string_adfb662ae34724b6 = function(arg0, arg1) {
const ret = debugString(getObject(arg1));
const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_export, wasm.__wbindgen_export2);
const len1 = WASM_VECTOR_LEN;
getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true);
getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true);
};
imports.wbg.__wbg___wbindgen_in_0d3e1e8f0c669317 = function(arg0, arg1) {
const ret = getObject(arg0) in getObject(arg1);
return ret;
};
imports.wbg.__wbg___wbindgen_is_bigint_0e1a2e3f55cfae27 = function(arg0) {
const ret = typeof(getObject(arg0)) === 'bigint';
return ret;
};
imports.wbg.__wbg___wbindgen_is_function_8d400b8b1af978cd = function(arg0) {
const ret = typeof(getObject(arg0)) === 'function';
return ret;
};
imports.wbg.__wbg___wbindgen_is_object_ce774f3490692386 = function(arg0) {
const val = getObject(arg0);
const ret = typeof(val) === 'object' && val !== null;
return ret;
};
imports.wbg.__wbg___wbindgen_is_undefined_f6b95eab589e0269 = function(arg0) {
const ret = getObject(arg0) === undefined;
return ret;
};
imports.wbg.__wbg___wbindgen_jsval_eq_b6101cc9cef1fe36 = function(arg0, arg1) {
const ret = getObject(arg0) === getObject(arg1);
return ret;
};
imports.wbg.__wbg___wbindgen_jsval_loose_eq_766057600fdd1b0d = function(arg0, arg1) {
const ret = getObject(arg0) == getObject(arg1);
return ret;
};
imports.wbg.__wbg___wbindgen_number_get_9619185a74197f95 = function(arg0, arg1) {
const obj = getObject(arg1);
const ret = typeof(obj) === 'number' ? obj : undefined;
getDataViewMemory0().setFloat64(arg0 + 8 * 1, isLikeNone(ret) ? 0 : ret, true);
getDataViewMemory0().setInt32(arg0 + 4 * 0, !isLikeNone(ret), true);
};
imports.wbg.__wbg___wbindgen_string_get_a2a31e16edf96e42 = function(arg0, arg1) {
const obj = getObject(arg1);
const ret = typeof(obj) === 'string' ? obj : undefined;
var ptr1 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_export, wasm.__wbindgen_export2);
var len1 = WASM_VECTOR_LEN;
getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true);
getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true);
};
imports.wbg.__wbg___wbindgen_throw_dd24417ed36fc46e = function(arg0, arg1) {
throw new Error(getStringFromWasm0(arg0, arg1));
};
imports.wbg.__wbg_call_abb4ff46ce38be40 = function() { return handleError(function (arg0, arg1) {
const ret = getObject(arg0).call(getObject(arg1));
return addHeapObject(ret);
}, arguments) };
imports.wbg.__wbg_done_62ea16af4ce34b24 = function(arg0) {
const ret = getObject(arg0).done;
return ret;
};
imports.wbg.__wbg_entries_83c79938054e065f = function(arg0) {
const ret = Object.entries(getObject(arg0));
return addHeapObject(ret);
};
imports.wbg.__wbg_get_6b7bd52aca3f9671 = function(arg0, arg1) {
const ret = getObject(arg0)[arg1 >>> 0];
return addHeapObject(ret);
};
imports.wbg.__wbg_get_af9dab7e9603ea93 = function() { return handleError(function (arg0, arg1) {
const ret = Reflect.get(getObject(arg0), getObject(arg1));
return addHeapObject(ret);
}, arguments) };
imports.wbg.__wbg_get_with_ref_key_1dc361bd10053bfe = function(arg0, arg1) {
const ret = getObject(arg0)[getObject(arg1)];
return addHeapObject(ret);
};
imports.wbg.__wbg_instanceof_ArrayBuffer_f3320d2419cd0355 = function(arg0) {
let result;
try {
result = getObject(arg0) instanceof ArrayBuffer;
} catch (_) {
result = false;
}
const ret = result;
return ret;
};
imports.wbg.__wbg_instanceof_Map_084be8da74364158 = function(arg0) {
let result;
try {
result = getObject(arg0) instanceof Map;
} catch (_) {
result = false;
}
const ret = result;
return ret;
};
imports.wbg.__wbg_instanceof_Uint8Array_da54ccc9d3e09434 = function(arg0) {
let result;
try {
result = getObject(arg0) instanceof Uint8Array;
} catch (_) {
result = false;
}
const ret = result;
return ret;
};
imports.wbg.__wbg_isArray_51fd9e6422c0a395 = function(arg0) {
const ret = Array.isArray(getObject(arg0));
return ret;
};
imports.wbg.__wbg_isSafeInteger_ae7d3f054d55fa16 = function(arg0) {
const ret = Number.isSafeInteger(getObject(arg0));
return ret;
};
imports.wbg.__wbg_iterator_27b7c8b35ab3e86b = function() {
const ret = Symbol.iterator;
return addHeapObject(ret);
};
imports.wbg.__wbg_length_22ac23eaec9d8053 = function(arg0) {
const ret = getObject(arg0).length;
return ret;
};
imports.wbg.__wbg_length_d45040a40c570362 = function(arg0) {
const ret = getObject(arg0).length;
return ret;
};
imports.wbg.__wbg_new_1ba21ce319a06297 = function() {
const ret = new Object();
return addHeapObject(ret);
};
imports.wbg.__wbg_new_6421f6084cc5bc5a = function(arg0) {
const ret = new Uint8Array(getObject(arg0));
return addHeapObject(ret);
};
imports.wbg.__wbg_next_138a17bbf04e926c = function(arg0) {
const ret = getObject(arg0).next;
return addHeapObject(ret);
};
imports.wbg.__wbg_next_3cfe5c0fe2a4cc53 = function() { return handleError(function (arg0) {
const ret = getObject(arg0).next();
return addHeapObject(ret);
}, arguments) };
imports.wbg.__wbg_prototypesetcall_dfe9b766cdc1f1fd = function(arg0, arg1, arg2) {
Uint8Array.prototype.set.call(getArrayU8FromWasm0(arg0, arg1), getObject(arg2));
};
imports.wbg.__wbg_set_3f1d0b984ed272ed = function(arg0, arg1, arg2) {
getObject(arg0)[takeObject(arg1)] = takeObject(arg2);
};
imports.wbg.__wbg_value_57b7b035e117f7ee = function(arg0) {
const ret = getObject(arg0).value;
return addHeapObject(ret);
};
imports.wbg.__wbindgen_cast_2241b6af4c4b2941 = function(arg0, arg1) {
// Cast intrinsic for `Ref(String) -> Externref`.
const ret = getStringFromWasm0(arg0, arg1);
return addHeapObject(ret);
};
imports.wbg.__wbindgen_cast_4625c577ab2ec9ee = function(arg0) {
// Cast intrinsic for `U64 -> Externref`.
const ret = BigInt.asUintN(64, arg0);
return addHeapObject(ret);
};
imports.wbg.__wbindgen_cast_9ae0607507abb057 = function(arg0) {
// Cast intrinsic for `I64 -> Externref`.
const ret = arg0;
return addHeapObject(ret);
};
imports.wbg.__wbindgen_cast_d6cd19b81560fd6e = function(arg0) {
// Cast intrinsic for `F64 -> Externref`.
const ret = arg0;
return addHeapObject(ret);
};
imports.wbg.__wbindgen_object_clone_ref = function(arg0) {
const ret = getObject(arg0);
return addHeapObject(ret);
};
imports.wbg.__wbindgen_object_drop_ref = function(arg0) {
takeObject(arg0);
};
return imports;
}
function __wbg_finalize_init(instance, module) {
wasm = instance.exports;
__wbg_init.__wbindgen_wasm_module = module;
cachedDataViewMemory0 = null;
cachedUint8ArrayMemory0 = null;
return wasm;
}
function initSync(module) {
if (wasm !== undefined) return wasm;
if (typeof module !== 'undefined') {
if (Object.getPrototypeOf(module) === Object.prototype) {
({module} = module)
} else {
console.warn('using deprecated parameters for `initSync()`; pass a single object instead')
}
}
const imports = __wbg_get_imports();
if (!(module instanceof WebAssembly.Module)) {
module = new WebAssembly.Module(module);
}
const instance = new WebAssembly.Instance(module, imports);
return __wbg_finalize_init(instance, module);
}
async function __wbg_init(module_or_path) {
if (wasm !== undefined) return wasm;
if (typeof module_or_path !== 'undefined') {
if (Object.getPrototypeOf(module_or_path) === Object.prototype) {
({module_or_path} = module_or_path)
} else {
console.warn('using deprecated parameters for the initialization function; pass a single object instead')
}
}
if (typeof module_or_path === 'undefined') {
module_or_path = new URL('ruff_fmt_bg.wasm', self.location.origin + self.location.pathname);
}
const imports = __wbg_get_imports();
if (typeof module_or_path === 'string' || (typeof Request === 'function' && module_or_path instanceof Request) || (typeof URL === 'function' && module_or_path instanceof URL)) {
module_or_path = fetch(module_or_path);
}
const { instance, module } = await __wbg_load(await module_or_path, imports);
return __wbg_finalize_init(instance, module);
}
// export { initSync };
// export default __wbg_init;
self.pythonFormatter = {};
self.pythonFormatter.format = format_code;
self.pythonFormatter.formatRange = format_range;
self.pythonFormatter.init = __wbg_init;

View File

@@ -0,0 +1,188 @@
class SerialWorker {
#receiveBuffer_ = [];
#bufferLength_ = 0;
#encoder_ = new TextEncoder();
#decoder_ = new TextDecoder('utf-8');
#baud_ = 115200;
#dtr_ = false;
#rts_ = false;
#isOpened_ = false;
#port_ = '';
constructor(port) {
this.#port_ = port;
this.resetBuffer();
}
decodeBuffer(buffer) {
let output = '';
for (let i in buffer) {
output += this.decodeByte();
}
return output;
}
/* UTF-8编码方式
* ------------------------------------------------------------
* |1字节 0xxxxxxx |
* |2字节 110xxxxx 10xxxxxx |
* |3字节 1110xxxx 10xxxxxx 10xxxxxx |
* |4字节 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx |
* |5字节 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx |
* |6字节 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx|
* ------------------------------------------------------------
**/
decodeByte(byte) {
let output = '';
if ((byte & 0x80) === 0x00) {
// 1字节
this.#receiveBuffer_ = [];
this.#bufferLength_ = 0;
output += String.fromCharCode(byte);
} else if ((byte & 0xc0) === 0x80) {
/*
* 2字节以上的中间字节10xxxxxx
* 如果没有起始头,则丢弃这个字节
* 如果不是2字节及以上的起始头则丢弃这个字节
**/
if (!this.#receiveBuffer_.length || this.#bufferLength_ < 2) {
return output;
}
this.#receiveBuffer_.push(byte);
if (this.#bufferLength_ === this.#receiveBuffer_.length) {
output += this.#decoder_.decode(new Uint8Array(this.#receiveBuffer_));
this.#receiveBuffer_ = [];
}
} else {
// 2字节以上的起始头
if (this.#receiveBuffer_) {
this.#receiveBuffer_ = [];
}
this.#bufferLength_ = this.#getBufferLength_(byte);
this.#receiveBuffer_.push(byte);
}
return output;
}
#getBufferLength_(data) {
let len = 2;
if ((data & 0xFC) === 0xFC) {
len = 6;
} else if ((data & 0xF8) === 0xF8) {
len = 5;
} else if ((data & 0xF0) === 0xF0) {
len = 4;
} else if ((data & 0xE0) === 0xE0) {
len = 3;
} else if ((data & 0xC0) === 0xC0) {
len = 2;
}
return len;
}
resetBuffer() {
this.#receiveBuffer_ = [];
this.#bufferLength_ = 0;
}
open() {}
close() {}
toggle() {
if (this.isOpened()) {
this.close();
} else {
this.open();
}
}
setBaudRate(baud) {
this.#baud_ = baud;
}
setDTR(dtr) {
this.#dtr_ = dtr;
}
setRTS(rts) {
this.#rts_ = rts;
}
setDTRAndRTS(dtr, rts) {
this.#dtr_ = dtr;
this.#rts_ = rts;
}
getPortName() {
return this.#port_;
}
getBaudRate() {
return this.#baud_;
}
getDTR() {
return this.#dtr_;
}
getRTS() {
return this.#rts_;
}
sendString(str) {}
sendBuffer(buffer) {}
onBuffer(buffer) {
const data = this.decodeBuffer(buffer);
if (!data) {
return;
}
self.postMessage({
port: this.getPortName(),
event: 'onBuffer',
message: data
});
}
onOpen() {
this.#isOpened_ = true;
self.postMessage({
port: this.getPortName(),
event: 'onOpen'
});
}
onClose(code) {
this.#isOpened_ = false;
self.postMessage({
port: this.getPortName(),
event: 'onClose',
message: code
});
}
onError(error) {
self.postMessage({
port: this.getPortName(),
event: 'onError',
message: error
});
}
isOpened() {
return this.#isOpened_;
}
config(info) {
if (typeof info !== Object) {
return;
}
this.#baud_ = info.baud;
this.setBaudRate(this.#baud_);
this.#dtr_ = info.dtr;
this.setDTR(this.#dtr_);
this.#rts_ = info.rts;
this.setDTR(this.#rts_);
}
}

View File

@@ -0,0 +1,141 @@
importScripts('./tree-sitter.js');
importScripts('../../../../web-modules/workerpool.min.js');
const terms = [
'type',
'scope',
'function',
'variable',
'number',
'string',
'comment',
'constant',
'directive',
'control',
'operator',
'modifier',
'punctuation'
];
let parser;
let tree = null;
let language = null;
class Language {
constructor(grammarJson) {
this.simpleTerms = {};
this.complexTerms = [];
this.complexScopes = {};
for (const t in grammarJson.simpleTerms)
this.simpleTerms[t] = grammarJson.simpleTerms[t];
for (const t in grammarJson.complexTerms)
this.complexTerms[t] = grammarJson.complexTerms[t];
for (const t in grammarJson.complexScopes)
this.complexScopes[t] = grammarJson.complexScopes[t];
this.complexDepth = 0;
this.complexOrder = false;
for (const s in this.complexScopes) {
const depth = s.split('>').length;
if (depth > this.complexDepth)
this.complexDepth = depth;
if (s.indexOf('[') >= 0)
this.complexOrder = true;
}
this.complexDepth--;
}
}
async function init(languageWasmPath, grammarJson) {
await TreeSitter.init();
parser = new TreeSitter();
const lang = await TreeSitter.Language.load(languageWasmPath);
console.log(lang.version)
parser.setLanguage(lang);
language = new Language(grammarJson);
tree = null;
}
function buildDecorations(tree) {
const result = [];
const stack = [];
let node = tree.rootNode.firstChild;
while (stack.length > 0 || node) {
if (node) {
stack.push(node);
node = node.firstChild;
}
else {
node = stack.pop();
let type = node.type;
if (!node.isNamed())
type = '"' + type + '"';
let term = null;
if (!language.complexTerms.includes(type)) {
term = language.simpleTerms[type];
}
else {
let desc = type;
let scopes = [desc];
let parent = node.parent;
for (let i = 0; i < language.complexDepth && parent; i++) {
let parentType = parent.type;
if (!parent.isNamed())
parentType = '"' + parentType + '"';
desc = parentType + ' > ' + desc;
scopes.push(desc);
parent = parent.parent;
}
if (language.complexOrder) {
let index = 0;
let sibling = node.previousSibling;
while (sibling) {
if (sibling.type === node.type)
index++;
sibling = sibling.previousSibling;
}
let rindex = -1;
sibling = node.nextSibling;
while (sibling) {
if (sibling.type === node.type)
rindex--;
sibling = sibling.nextSibling;
}
const orderScopes = [];
for (let i = 0; i < scopes.length; i++)
orderScopes.push(scopes[i], scopes[i] + '[' + index + ']', scopes[i] + '[' + rindex + ']');
scopes = orderScopes;
}
for (const d of scopes)
if (d in language.complexScopes)
term = language.complexScopes[d];
}
if (terms.includes(term)) {
if (!result[term]) {
result[term] = [];
}
result[term].push({
startLineNumber: node.startPosition.row + 1,
startColumn: node.startPosition.column + 1,
endLineNumber: node.endPosition.row + 1,
endColumn: node.endPosition.column + 1
});
}
node = node.nextSibling;
}
}
return result;
}
function update(text) {
const tree = parser.parse(text);
return buildDecorations(tree);
}
workerpool.worker({
init,
update
});

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,66 @@
const chokidar = require('chokidar');
let watchedPath = {};
const watch = function(inPath) {
if (watchedPath[watchedPath]) {
return;
}
watchedPath[inPath] = chokidar.watch(inPath, {
persistent: true,
depth: 0,
ignoreInitial: true
});
watchedPath[inPath].on('add', (actionPath, stats) => {
self.postMessage({
watcher: inPath,
event: 'add',
path: actionPath,
stats
});
});
watchedPath[inPath].on('addDir', (actionPath, stats) => {
self.postMessage({
watcher: inPath,
event: 'addDir',
path: actionPath,
stats
});
});
watchedPath[inPath].on('unlink', (actionPath, stats) => {
self.postMessage({
watcher: inPath,
event: 'unlink',
path: actionPath,
stats
});
});
watchedPath[inPath].on('unlinkDir', (actionPath, stats) => {
self.postMessage({
watcher: inPath,
event: 'unlinkDir',
path: actionPath,
stats
});
});
}
const unwatch = function(inPath) {
if (!watchedPath[inPath]) {
return;
}
watchedPath[inPath].close();
delete watchedPath[inPath];
}
self.addEventListener('message', function(event) {
if (event.data.func === 'watch') {
watch(...event.data.args);
} else if (event.data.func === 'unwatch') {
unwatch(...event.data.args);
}
});

View File

@@ -0,0 +1,91 @@
importScripts('../common/serial-worker.js');
const child_process = require('node:child_process');
const serialport = require('serialport');
const {
SerialPort,
ReadlineParser,
ByteLengthParser
} = serialport;
const portsOperator = {};
class NodeSerialWorker extends SerialWorker {
#serialport_ = null;
#parserBytes_ = null;
constructor(port) {
super(port);
}
#addEventsListener_() {
this.#parserBytes_.on('data', (buffer) => {
this.onBuffer(buffer);
});
this.#serialport_.on('error', (error) => {
this.onError(error);
this.onClose(1);
});
this.#serialport_.on('open', () => {
this.onOpen();
});
this.#serialport_.on('close', () => {
this.onClose(1);
});
}
open() {
super.open();
this.#serialport_ = new SerialPort({
path: this.getPortName(),
baudRate: this.getBaudRate() - 0, // 波特率
dataBits: 8, // 数据位
parity: 'none', // 奇偶校验
stopBits: 1, // 停止位
flowControl: false,
autoOpen: false // 不自动打开
}, false);
this.#parserBytes_ = this.#serialport_.pipe(new ByteLengthParser({ length: 1 }));
this.#serialport_.open((error) => {
if (error) {
this.onError(error);
// this.onClose(1);
}
});
this.#addEventsListener_();
}
close() {
super.close();
if (this.isOpened()) {
try {
this.#serialport_.close();
} catch (error) {
console.log(error);
}
}
}
onBuffer(buffer) {
super.onBuffer(buffer);
}
}
const create = (port) => {
if (!portsOperator[port]) {
portsOperator[port] = new NodeSerialWorker(port);
}
portsOperator[port].open();
}
self.addEventListener('message', function(event) {
console.log(event.data);
const { port, type } = event.data;
if (type === 'open') {
create(port);
} else if (type === 'close') {
portsOperator[port] && portsOperator[port].close();
}
});

View File

@@ -0,0 +1,132 @@
importScripts('../../../web-modules/workerpool.min.js');
importScripts('../../../web-modules/browserfs.min.js');
let fs = BrowserFS.fs;
const createPromise = function(func, ...args) {
return new Promise((resolve, reject) => {
func(...args, function() {
resolve([...arguments]);
});
});
}
const addFileSystemHandler = function(filesystem) {
return new Promise((resolve, reject) => {
BrowserFS.configure({
fs: "FileSystemAccess",
options: { handle: filesystem }
}, function (error) {
if (error) {
reject(error);
return;
}
fs = BrowserFS.fs;
resolve();
});
});
}
const rename = function(oldPath, newPath) {
return createPromise(fs.rename, oldPath, newPath);
}
const stat = function(p) {
return createPromise(fs.stat, p);
}
const open = function(p, flag, mode) {
return createPromise(fs.open, p, flag, mode);
}
const unlink = function(p) {
return createPromise(fs.unlink, p);
}
const rmdir = function(p) {
return createPromise(fs.rmdir, p);
}
const mkdir = function(p, mode) {
return createPromise(fs.mkdir, p, mode);
}
const readdir = function(p) {
return createPromise(fs.readdir, p);
}
const exists = function(p) {
return createPromise(fs.exists, p);
}
const realpath = function(p) {
return createPromise(fs.realpath, p);
}
const truncate = function(p, len) {
return createPromise(fs.truncate, p, len);
}
const readFile = function(fname, encoding, flag) {
return createPromise(fs.readFile, fname, encoding);
}
const writeFile = function(fname, data, encoding) {
return createPromise(fs.writeFile, fname, data, encoding);
}
const appendFile = function(fname, data, encoding) {
return createPromise(fs.appendFile, fname, data, encoding);
}
const chmod = function(p, mode) {
return createPromise(fs.chmod, p, mode);
}
const chown = function(p, new_uid, new_gid) {
return createPromise(fs.chown, p, new_uid, new_gid);
}
const utimes = function(p, atime, mtime) {
return createPromise(fs.utimes, p, atime, mtime);
}
const link = function(srcpath, dstpath) {
return createPromise(fs.link, srcpath, dstpath);
}
const symlink = function(srcpath, dstpath, type) {
return createPromise(fs.symlink, srcpath, dstpath, type);
}
const readlink = function(p) {
return createPromise(fs.readlink, p);
}
const syncClose = function(method, fd) {
return fs.syncClose(method, fd);
}
workerpool.worker({
addFileSystemHandler,
rename,
stat,
open,
unlink,
rmdir,
mkdir,
readdir,
exists,
realpath,
truncate,
readFile,
writeFile,
appendFile,
chmod,
chown,
utimes,
link,
symlink,
readlink,
syncClose
});

View File

@@ -0,0 +1,123 @@
// importScripts('../../web-modules/workerpool.min.js');
const workerpool = require('../../web-modules/workerpool.min.js');
const encoder = new TextEncoder();
const decoder = new TextDecoder('utf-8');
class SerialWorker {
constructor(serial) {
this.serial = serial;
this.receiveBuffer = [];
this.receiveStr = '';
this.bufferLength = 0;
const test = setInterval(() => {
const message = generateRandomString(5);
this.onData(encoder.encode(message));
}, 1000);
setTimeout(() => {
clearInterval(test);
}, 120 * 1000);
}
onOpen() {
}
onData(data) {
/* UTF-8编码方式
* ------------------------------------------------------------
* |1字节 0xxxxxxx |
* |2字节 110xxxxx 10xxxxxx |
* |3字节 1110xxxx 10xxxxxx 10xxxxxx |
* |4字节 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx |
* |5字节 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx |
* |6字节 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx|
* ------------------------------------------------------------
*/
for (let i in data) {
if ((data[i] & 0x80) === 0x00) {
// 1字节
this.receiveBuffer = [];
this.bufferLength = 0;
this.receiveStr += String.fromCharCode(data[i]);
} else if ((data[i] & 0xc0) === 0x80) {
// 2字节以上的中间字节10xxxxxx
// 如果没有起始头,则丢弃这个字节
if (!this.receiveBuffer.length) {
return;
}
// 如果不是2字节及以上的起始头则丢弃这个字节
if (this.bufferLength < 2) {
return;
}
this.receiveBuffer.push(data[i]);
if (this.bufferLength === this.receiveBuffer.length) {
this.receiveStr += decoder.decode(new Uint8Array(this.receiveBuffer));
this.receiveBuffer = [];
}
} else {
// 2字节以上的起始头
if (this.receiveBuffer) {
this.receiveBuffer = [];
}
this.bufferLength = this.#getBufferLength(data[i]);
this.receiveBuffer.push(data[i]);
}
}
}
onError() {
}
onClose() {
}
#getBufferLength(data) {
let len = 2;
if ((data & 0xFC) === 0xFC) {
len = 6;
} else if ((data & 0xF8) === 0xF8) {
len = 5;
} else if ((data & 0xF0) === 0xF0) {
len = 4;
} else if ((data & 0xE0) === 0xE0) {
len = 3;
} else if ((data & 0xC0) === 0xC0) {
len = 2;
}
return len;
}
}
const createSerialWork = function(serial) {
return new Promise((resolve, reject) => {
console.log(serial)
const serialWork = new SerialWorker(serial);
const test = setInterval(() => {
const data = serialWork.receiveStr;
serialWork.receiveStr = '';
workerpool.workerEmit({
status: 'data',
data: data
});
}, 5000);
setTimeout(() => {
workerpool.workerEmit({
status: 'close'
});
resolve();
}, 120 * 1000);
});
}
function generateRandomString() {
return '1234';
}
workerpool.worker({
createSerialWork,
generateRandomString
});