Closed yaoziyuan closed 2 years ago
这里面还有一个原因,是同文堂从繁转简时,会自动把“著名”转换成“着名”,把“着名”转换成“著名”(“乾隆/干隆”一例也是如此)。
我觉得,目前暂时,可以在 PIE 运行时,将同文堂的 Dynamic Convert 禁用,避免两个 extensions 打架。
我推算了一下,两个 extensions 的动态转换可以共存,只要同文堂纠正以下两个问题: (1) 向一个 text node 更新时,如果 new string == old string,那么就不要更新,以免触发另一个 extension 的新转换; (2) 同文堂把繁体转换成简体时,“著名”和“乾隆”保持不变(这就是它们在简体中的形式),而不要反复把“著名”转换成“着名”、把“着名”转换成“著名”(“乾隆/干隆”一例也是如此),因为这可能导致跟 PIE 联用时这种反复转换永不休止。
总的来说,两个或多个 extensions 同时动态转换都没问题,只要所有的转换最终停止在一个固定的 string。比如,如果 Extension A 是把网页上所有的大写英文字母转换成小写,而 Extension B 是把网页上所有的繁体中文转换成简体,那么两个 extensions 一开始时会互相触发对方的转换,但最终会休止在一个固定的网页状态(即网页上所有英文字母都是小写、所有汉字都是简体,在这种状态时任何一个 extension 都不会产生真正意义上的更新(也就是 new string != old string),于是动态更新就会终止)。
还有一个更难的情况,比如 Facebook 上一个状态更新的时间先显示为 4 min ago 然后马上变成 5 min ago,那么就可能造成两个 extensions 不断把网页上的文字在 4 min ago 和 5 min ago 之间切换(类似于所谓 racing condition)。不过解决方法我也想到了,就是一个 extension 得到某个 text node 有更新的通知时,先把那个 text node 当时的文本记录下来(比如叫 originalText),而 extension 算出 originalText 应该转换成什么文本(比如叫 newText)时,应该先查一下那个 text node 的文本是否还等于 originalText,只有是的时候才把那个 text node 的文本更新为 newText,这样可以避免很多打架问题。还有就是前面说的,如果 newText==originalText,那就不要更新了,以避免引起另一个 extension 不必要的转换。
的简体是“著名, 乾隆”,不是“着名, 干隆”,目前问题还在
請去看辭庫專案。
如果同文堂要对一个 text node 赋予的 new string 跟 old string 相同,则不应该赋予 new string,以免触发新一轮的 WebObserver 事件。
可以當作最佳化的建議加以改善。
PIE(Phonetically Intuitive English)
這東西我沒在用也不知道,不夠目前套件不會去轉換沒有中文的字串,所以你的有些假設是錯誤的。 所以如果 PIE 只會轉換英文的字串,那理論上會衝突的可能情境應該不高。
的简体是“着名, 干隆”,不是“著名, 乾隆”,目前问题还在
请去看辞库专案。
如果同文堂要对一个 text node 赋予的 new string 跟 old string 相同,则不应该赋予 new string,以免触发新一轮的 WebObserver 事件。
可以当作最佳化的建议加以改善。
PIE(Phonetically Intuitive English)
这东西我没在用也不知道,不够目前套件不会去转换没有中文的字串,所以你的有些假设是错误的。 所以如果 PIE 只会转换英文的字串,那理论上会冲突的可能情境应该不高。
有一些东西是各个 extension 独有的优化,比如你说的同文堂不会去转换没有中文的字串,而 PIE 也不会去转换已经含有 diacritics 的字串,理论上 PIE 还可以不去转换没有英文字母的字串。这些优化大家各自去做就好。
也有一些东西我发现是所有动态转换 extensions 都应该执行的规则,这样可以完美地避免撞车(比如反复转换个不停): (1) 当 webObserver 说一个 text node 有更新时,extension 记下该 node 的 text 为 originalText。如果初步判断值得转换(比如对同文堂来说就是该字串至少有一个中文字符),就发给 background page 去做转换。 (2) background page 转换以后发回来的字串为 convertedText。如果 convertedText == originalText,那么就不必把 convertedText 赋给 text node,以免触发其它 extensions 的不必要的 webObserver 事件。然后,如果 text node 现在的值 != originalText,那么也不应该把 convertedText 赋给 text node,因为此时 text node 已经被网页自己更新或者被其它 extensions 更新,convertedText 已经是无效、过期的转换了,而且自然会有新的 webObserver 事件来提醒本 extension 去重新更新该 text node。
的简体是“著名, 乾隆”,不是“着名, 干隆”,目前问题还在。
而且,与 PIE(Phonetically Intuitive English)联用时,这两个例子会反复切换于“著名/着名”和“乾隆/干隆”之间。提示:解决办法是,如果同文堂要对一个 text node 赋予的 new string 跟 old string 相同,则不应该赋予 new string,以免触发新一轮的 WebObserver 事件。