Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Avoid replace text node with same value #39

Closed
yaoziyuan opened this issue Jun 26, 2021 · 7 comments
Closed

Avoid replace text node with same value #39

yaoziyuan opened this issue Jun 26, 2021 · 7 comments
Assignees
Labels
enhancement New feature or request

Comments

@yaoziyuan
Copy link

的简体是“著名, 乾隆”,不是“着名, 干隆”,目前问题还在。

而且,与 PIE(Phonetically Intuitive English)联用时,这两个例子会反复切换于“著名/着名”和“乾隆/干隆”之间。提示:解决办法是,如果同文堂要对一个 text node 赋予的 new string 跟 old string 相同,则不应该赋予 new string,以免触发新一轮的 WebObserver 事件。

@yaoziyuan
Copy link
Author

这里面还有一个原因,是同文堂从繁转简时,会自动把“著名”转换成“着名”,把“着名”转换成“著名”(“乾隆/干隆”一例也是如此)。

我觉得,目前暂时,可以在 PIE 运行时,将同文堂的 Dynamic Convert 禁用,避免两个 extensions 打架。

@yaoziyuan
Copy link
Author

我推算了一下,两个 extensions 的动态转换可以共存,只要同文堂纠正以下两个问题:
(1) 向一个 text node 更新时,如果 new string == old string,那么就不要更新,以免触发另一个 extension 的新转换;
(2) 同文堂把繁体转换成简体时,“著名”和“乾隆”保持不变(这就是它们在简体中的形式),而不要反复把“著名”转换成“着名”、把“着名”转换成“著名”(“乾隆/干隆”一例也是如此),因为这可能导致跟 PIE 联用时这种反复转换永不休止。

@yaoziyuan
Copy link
Author

总的来说,两个或多个 extensions 同时动态转换都没问题,只要所有的转换最终停止在一个固定的 string。比如,如果 Extension A 是把网页上所有的大写英文字母转换成小写,而 Extension B 是把网页上所有的繁体中文转换成简体,那么两个 extensions 一开始时会互相触发对方的转换,但最终会休止在一个固定的网页状态(即网页上所有英文字母都是小写、所有汉字都是简体,在这种状态时任何一个 extension 都不会产生真正意义上的更新(也就是 new string != old string),于是动态更新就会终止)。

@yaoziyuan
Copy link
Author

还有一个更难的情况,比如 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 不必要的转换。

@t7yang t7yang added the bug Something isn't working label Jun 26, 2021
@t7yang t7yang self-assigned this Jun 26, 2021
@t7yang t7yang added enhancement New feature or request and removed bug Something isn't working labels Jun 26, 2021
@t7yang
Copy link
Contributor

t7yang commented Jun 26, 2021

的简体是“著名, 乾隆”,不是“着名, 干隆”,目前问题还在

請去看辭庫專案。

如果同文堂要对一个 text node 赋予的 new string 跟 old string 相同,则不应该赋予 new string,以免触发新一轮的 WebObserver 事件。

可以當作最佳化的建議加以改善。

PIE(Phonetically Intuitive English)

這東西我沒在用也不知道,不夠目前套件不會去轉換沒有中文的字串,所以你的有些假設是錯誤的。
所以如果 PIE 只會轉換英文的字串,那理論上會衝突的可能情境應該不高。

@yaoziyuan
Copy link
Author

的简体是“着名, 干隆”,不是“著名, 乾隆”,目前问题还在

请去看辞库专案。

如果同文堂要对一个 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。

t7yang added a commit that referenced this issue Aug 21, 2022
@t7yang t7yang changed the title 著名, 乾隆 Avoid replace text node with same value Aug 21, 2022
@t7yang
Copy link
Contributor

t7yang commented Aug 27, 2022

image

t7yang added a commit that referenced this issue Aug 27, 2022
… original

close Avoid replace text node with same value #39
@t7yang t7yang closed this as completed Aug 27, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

No branches or pull requests

2 participants