//#region extensions/weixin/src/messaging/markdown-filter.ts
/**
* Streaming markdown filter — character-level state machine that strips
* unsupported markdown syntax on-the-fly.
*/
var StreamingMarkdownFilter = class StreamingMarkdownFilter {
	buf = "";
	fence = false;
	sol = true;
	inl = null;
	feed(delta) {
		this.buf += delta;
		return this.pump(false);
	}
	flush() {
		return this.pump(true);
	}
	pump(eof) {
		let out = "";
		while (this.buf) {
			const sLen = this.buf.length;
			const sSol = this.sol;
			const sFence = this.fence;
			const sInl = this.inl;
			if (this.fence) out += this.pumpFence(eof);
			else if (this.inl) out += this.pumpInline(eof);
			else if (this.sol) out += this.pumpSOL(eof);
			else out += this.pumpBody(eof);
			if (this.buf.length === sLen && this.sol === sSol && this.fence === sFence && this.inl === sInl) break;
		}
		if (eof && this.inl) {
			out += ({
				image: "![",
				bold3: "***",
				italic: "*",
				ubold3: "___",
				uitalic: "_"
			}[this.inl.type] ?? "") + this.inl.acc;
			this.inl = null;
		}
		return out;
	}
	pumpFence(eof) {
		if (this.sol) {
			if (this.buf.length < 3 && !eof) return "";
			if (this.buf.startsWith("```")) {
				const nl = this.buf.indexOf("\n", 3);
				if (nl !== -1) {
					this.fence = false;
					const line = this.buf.slice(0, nl + 1);
					this.buf = this.buf.slice(nl + 1);
					this.sol = true;
					return line;
				}
				if (eof) {
					this.fence = false;
					const line = this.buf;
					this.buf = "";
					return line;
				}
				return "";
			}
			this.sol = false;
		}
		const nl = this.buf.indexOf("\n");
		if (nl !== -1) {
			const chunk = this.buf.slice(0, nl + 1);
			this.buf = this.buf.slice(nl + 1);
			this.sol = true;
			return chunk;
		}
		const chunk = this.buf;
		this.buf = "";
		return chunk;
	}
	pumpSOL(eof) {
		const b = this.buf;
		if (b[0] === "\n") {
			this.buf = b.slice(1);
			return "\n";
		}
		if (b[0] === "`") {
			if (b.length < 3 && !eof) return "";
			if (b.startsWith("```")) {
				const nl = b.indexOf("\n", 3);
				if (nl !== -1) {
					this.fence = true;
					const line = b.slice(0, nl + 1);
					this.buf = b.slice(nl + 1);
					this.sol = true;
					return line;
				}
				if (eof) {
					this.buf = "";
					return b;
				}
				return "";
			}
			this.sol = false;
			return "";
		}
		if (b[0] === ">") {
			this.sol = false;
			return "";
		}
		if (b[0] === "#") {
			let n = 0;
			while (n < b.length && b[n] === "#") n++;
			if (n === b.length && !eof) return "";
			if (n >= 5 && n <= 6 && n < b.length && b[n] === " ") {
				this.buf = b.slice(n + 1);
				this.sol = false;
				return "";
			}
			this.sol = false;
			return "";
		}
		if (b[0] === " " || b[0] === "	") {
			if (b.search(/[^ \t]/) === -1 && !eof) return "";
			this.sol = false;
			return "";
		}
		if (b[0] === "-" || b[0] === "*" || b[0] === "_") {
			const ch = b[0];
			let j = 0;
			while (j < b.length && (b[j] === ch || b[j] === " ")) j++;
			if (j === b.length && !eof) return "";
			if (j === b.length || b[j] === "\n") {
				let count = 0;
				for (let k = 0; k < j; k++) if (b[k] === ch) count++;
				if (count >= 3) {
					if (j < b.length) {
						this.buf = b.slice(j + 1);
						this.sol = true;
						return b.slice(0, j + 1);
					}
					this.buf = "";
					return b;
				}
			}
			this.sol = false;
			return "";
		}
		this.sol = false;
		return "";
	}
	pumpBody(eof) {
		let out = "";
		let i = 0;
		while (i < this.buf.length) {
			const c = this.buf[i];
			if (c === "\n") {
				out += this.buf.slice(0, i + 1);
				this.buf = this.buf.slice(i + 1);
				this.sol = true;
				return out;
			}
			if (c === "!" && i + 1 < this.buf.length && this.buf[i + 1] === "[") {
				out += this.buf.slice(0, i);
				this.buf = this.buf.slice(i + 2);
				this.inl = {
					type: "image",
					acc: ""
				};
				return out;
			}
			if (c === "~") {
				i++;
				continue;
			}
			if (c === "*") {
				if (i + 2 < this.buf.length && this.buf[i + 1] === "*" && this.buf[i + 2] === "*") {
					out += this.buf.slice(0, i);
					this.buf = this.buf.slice(i + 3);
					this.inl = {
						type: "bold3",
						acc: ""
					};
					return out;
				}
				if (i + 1 < this.buf.length && this.buf[i + 1] === "*") {
					i += 2;
					continue;
				}
				if (i + 1 < this.buf.length && this.buf[i + 1] !== " " && this.buf[i + 1] !== "\n") {
					out += this.buf.slice(0, i);
					this.buf = this.buf.slice(i + 1);
					this.inl = {
						type: "italic",
						acc: ""
					};
					return out;
				}
				i++;
				continue;
			}
			if (c === "_") {
				if (i + 2 < this.buf.length && this.buf[i + 1] === "_" && this.buf[i + 2] === "_") {
					out += this.buf.slice(0, i);
					this.buf = this.buf.slice(i + 3);
					this.inl = {
						type: "ubold3",
						acc: ""
					};
					return out;
				}
				if (i + 1 < this.buf.length && this.buf[i + 1] === "_") {
					i += 2;
					continue;
				}
				if (i + 1 < this.buf.length && this.buf[i + 1] !== " " && this.buf[i + 1] !== "\n") {
					out += this.buf.slice(0, i);
					this.buf = this.buf.slice(i + 1);
					this.inl = {
						type: "uitalic",
						acc: ""
					};
					return out;
				}
				i++;
				continue;
			}
			i++;
		}
		let hold = 0;
		if (!eof) {
			if (this.buf.endsWith("**")) hold = 2;
			else if (this.buf.endsWith("__")) hold = 2;
			else if (this.buf.endsWith("*")) hold = 1;
			else if (this.buf.endsWith("_")) hold = 1;
			else if (this.buf.endsWith("!")) hold = 1;
		}
		out += this.buf.slice(0, this.buf.length - hold);
		this.buf = hold > 0 ? this.buf.slice(-hold) : "";
		return out;
	}
	pumpInline(_eof) {
		if (!this.inl) return "";
		this.inl.acc += this.buf;
		this.buf = "";
		switch (this.inl.type) {
			case "bold3": {
				const idx = this.inl.acc.indexOf("***");
				if (idx !== -1) {
					const content = this.inl.acc.slice(0, idx);
					this.buf = this.inl.acc.slice(idx + 3);
					this.inl = null;
					if (StreamingMarkdownFilter.containsCJK(content)) return content;
					return `***${content}***`;
				}
				return "";
			}
			case "ubold3": {
				const idx = this.inl.acc.indexOf("___");
				if (idx !== -1) {
					const content = this.inl.acc.slice(0, idx);
					this.buf = this.inl.acc.slice(idx + 3);
					this.inl = null;
					if (StreamingMarkdownFilter.containsCJK(content)) return content;
					return `___${content}___`;
				}
				return "";
			}
			case "italic":
				for (let j = 0; j < this.inl.acc.length; j++) {
					if (this.inl.acc[j] === "\n") {
						const r = "*" + this.inl.acc.slice(0, j + 1);
						this.buf = this.inl.acc.slice(j + 1);
						this.inl = null;
						this.sol = true;
						return r;
					}
					if (this.inl.acc[j] === "*") {
						if (j + 1 < this.inl.acc.length && this.inl.acc[j + 1] === "*") {
							j++;
							continue;
						}
						const content = this.inl.acc.slice(0, j);
						this.buf = this.inl.acc.slice(j + 1);
						this.inl = null;
						if (StreamingMarkdownFilter.containsCJK(content)) return content;
						return `*${content}*`;
					}
				}
				return "";
			case "uitalic":
				for (let j = 0; j < this.inl.acc.length; j++) {
					if (this.inl.acc[j] === "\n") {
						const r = "_" + this.inl.acc.slice(0, j + 1);
						this.buf = this.inl.acc.slice(j + 1);
						this.inl = null;
						this.sol = true;
						return r;
					}
					if (this.inl.acc[j] === "_") {
						if (j + 1 < this.inl.acc.length && this.inl.acc[j + 1] === "_") {
							j++;
							continue;
						}
						const content = this.inl.acc.slice(0, j);
						this.buf = this.inl.acc.slice(j + 1);
						this.inl = null;
						if (StreamingMarkdownFilter.containsCJK(content)) return content;
						return `_${content}_`;
					}
				}
				return "";
			case "image": {
				const cb = this.inl.acc.indexOf("]");
				if (cb === -1) return "";
				if (cb + 1 >= this.inl.acc.length) return "";
				if (this.inl.acc[cb + 1] !== "(") {
					const r = "![" + this.inl.acc.slice(0, cb + 1);
					this.buf = this.inl.acc.slice(cb + 1);
					this.inl = null;
					return r;
				}
				const cp = this.inl.acc.indexOf(")", cb + 2);
				if (cp !== -1) {
					this.buf = this.inl.acc.slice(cp + 1);
					this.inl = null;
					return "";
				}
				return "";
			}
		}
		return "";
	}
	static containsCJK(text) {
		return /[\u2E80-\u9FFF\uAC00-\uD7AF\uF900-\uFAFF]/.test(text);
	}
};
//#endregion
export { StreamingMarkdownFilter };

//# sourceMappingURL=markdown-filter.js.map