本文使用「署名 4.0 国际 (CC BY 4.0)」许可协议,欢迎转载、或重新修改使用,但需要注明来源。 署名 4.0 国际 (CC BY 4.0)

本文作者: 苏洋

创建时间: 2020年01月19日
统计字数: 6643字
阅读时间: 14分钟阅读
本文链接: https://soulteary.com/2020/01/19/bugfix-for-ghost-editor-cjk-input.html


修理 Ghost 中文输入法的 BUG

去年的时候,我曾写过一篇文章 《 将 Ghost 迁移 Hugo 背后的事 》 里面描述了Ghost 当前对于非英文用户的主要问题。

其中最令人诟病的便是编辑器对于 CJK 三种语言输入法“吃字” BUG 的问题,这个问题影响 Ghost 从 2.x 到现在的 3.x 版本。产生问题的原因是,核心编辑器组件 0.11.1 - 0.12.x 版本中对于输入法事件没有进行逻辑覆盖,维护者和 Ghost 官方时至今日依旧没有做出任何变更,不管用户提了多少“IME BUG”的求助和 PR 。

最近有项目需要一个文档编辑器,于是考虑“修理修理”它,看看能不能用起来。

关于这个持续了两年的BUG

  • 2018 年的时候,有人提交了 PR https://github.com/bustle/mobiledoc-kit/pull/661 ,使用 event.isIME() 方法了问题修正,但是受到了非标准实现的质疑,后续这个问题便被挂了两年之久。
  • 2019 年末,又有人提交了新的 PR https://github.com/TryGhost/mobiledoc-kit/pull/11,使用 event.isComposing() 方法进行问题修正,但是不知道是单纯因为 CI 测试未通过,还是带有客户群歧视,这个 PR 也被搁置了。

前置准备

本文依赖一些软件或前置知识,如果不是很了解,可以参考以往的文章。

  • 需要 Docker、docker-compose
  • 可选 traefik

Traefik 的使用

Traefik 的具体使用,可以参考以往的文章,比如:使用服务发现改善开发体验、更完善的 Docker + Traefik 使用方案 等,更多内容,可以翻看历史内容的标签,这里不过多赘述。

本文只需要关注编排文件中的 labelsnetworks 字段配置就足够啦。对不同容器服务的 networks 字段,声明包含相同的内容,则可以让不同应用所处于的网络一致。

networks:- traefik

比如上面的声明,会让容器服务都处于名为 traefik 的网络环境中。

早期的修正方案

去年年初的时候,忍不了这个 BUG 的时候,我在官方主仓库一个 IME BUG 的 ISSUE 里,我提了一个解决方案,告诉大家把当时的 Ghost 项目的 package.json 中的 @tryghost/mobiledoc-kit 替换为 @bugfix/mobiledoc-kit ,然后重新构建资源就能解决问题,时至今日这条评论还能收到一些点赞。

https://github.com/TryGhost/Ghost/issues/9801#issuecomment-457904129

但是到去年下半年的时候,这个方案便由于官方设计变更而失效了,而且这样做也不利于后续跟进官方 bugfix 的版本,太笨重不够灵活。

当前的修正方案

要解决的问题主要是在客户端运行的脚本,治标又治本的方案是对于有问题的脚本进行 patch ,然后重新构建项目,让页面加载新的脚本资源即可。

但是官方编译项目设计的非常不环保不绿色,项目拆分设计不是十分合理,构建脚本 tricks和硬编码巨多,使用 grunt 搭配 git submoudle 非常不利于 debug。而且要全局安装一堆构建工具,还需要锁定 Node 运行版本在老版本,编译效率更是慢到令人发指(Mac Book Pro 2019 i9 2.4GHz 编译感觉时间巨慢长)…

为了避免后续浪费更多时间在折腾项目架构的问题上,这里考虑将定制软件的容器编译环境,交由性能更高的服务器进行编译,并抽取编译产物对每个版本的 Ghost 进行资源替换,来解决这个陈年 BUG。

我把这个方案上传到了 GitHub:https://github.com/soulteary/youling,方便你进行进一步定制改造,如果有必要的话,可以持续跟进几个版本的官方更新。

下面来聊聊方案的详细内容。

定制构建镜像生成“补丁”

官方编辑器补丁文件,我上传到了 GitHub,可以自取。构建环境踩坑过程不表,下面是构建容器的 Dockerfile:

FROM node:12-alpine
LABEL maintainer="soulteary@gmail.com"ENV LANG en_US.UTF-8
ENV LANGUAGE en_US.UTF-8
ENV LC_ALL=en_US.UTF-8RUN echo '' > /etc/apk/repositories && \echo "https://mirror.tuna.tsinghua.edu.cn/alpine/v3.10/main"         >> /etc/apk/repositories && \echo "https://mirror.tuna.tsinghua.edu.cn/alpine/v3.10/community"    >> /etc/apk/repositories && \echo "Asia/Shanghai" > /etc/timezoneRUN apk update && apk add git && \yarn global add knex-migrator grunt-cli ember-cli bowerCOPY patches/mobiledoc-kit/event-manager.js /patches/mobiledoc-kit/event-manager.jsRUN git clone https://github.com/TryGhost/mobiledoc-kit.git /mobiledoc-kit && \cd /mobiledoc-kit && \git checkout 3b0f375d32f7183a4eee9cce5373ebabeb249165 && \cp /patches/mobiledoc-kit/event-manager.js /mobiledoc-kit/src/js/editor/event-manager.js && \yarn && \cp -r /mobiledoc-kit/dist /patches/mobiledoc-kit/dist && \rm -rf /mobiledoc-kitRUN git clone --recurse-submodules https://github.com/TryGhost/Ghost.git /Ghost && \cd /Ghost && \git checkout 3.3.0 && \yarn setupRUN rm -rf /Ghost/core/client/node_modules/\@tryghost/mobiledoc-kit/dist && \cp -r /patches/mobiledoc-kit/dist /Ghost/core/client/node_modules/\@tryghost/mobiledoc-kit/WORKDIR /GhostRUN grunt prodEXPOSE 2368CMD ["npm", "start"]

执行 docker build -t soulteary/ghost:3.3.0 ,如果是本地构建,泡杯茶休息会,大概十分钟左右镜像就好了。当然,你也可以执行 docker pull soulteary/ghost:3.3.0 直接获取已经构建好的镜像。

接着,创建一个 docker-compose.assets.yml 用于提取构建镜像中的静态资源。

version: '3'
services:build-ghost-assets:image: soulteary/ghost:3.3.0container_name: ghost-assetsvolumes:- ./patches/ghost-assets/loop.js:/Ghost/index.js

由于拷贝资源的镜像必须在拷贝的时候存活,而 Ghost 启动必须配置数据库,不然就报错退出,所以这里创建一个 HTTP Server 来解决问题。

const http = require("http");const server = http.createServer(function(req, res) {res.writeHead(200);res.end("Hold on for sync assets");
});server.listen(2368);

将下面的命令保存为 sync-assets.sh,执行之后,项目目录中就会出现 3.3.0 版本 Ghost 的编辑器静态资源补丁了。

#!/usr/bin/env bashdocker-compose -f docker-compose.assets.yml down && docker-compose -f docker-compose.assets.yml up -drm -rf docker-assets && mkdir -p docker-assetsdocker cp ghost-assets:/Ghost/core/built ./docker-assets/built
docker cp ghost-assets:/Ghost/core/server/web/admin/views ./docker-assets/admin-viewsdocker-compose -f docker-compose.assets.yml down

验证方案效果

想要验证补丁效果,可以本地启动一套 Ghost,首先创建一个 docker-compose.db.yml 启动本地数据库。

version: '2'
services:db:image: mysql:5.7container_name: ghost-dbnetworks:- traefikrestart: alwaysenvironment:MYSQL_ROOT_PASSWORD: ghostvolumes:- ./localdb:/var/lib/mysqlnetworks:traefik:external: true

等待日志中出现 ready for connections.表示数据库就绪了:

ghost-db | 2020-01-18T17:24:04.154079Z 0 [Note] Event Scheduler: Loaded 0 events
ghost-db | 2020-01-18T17:24:04.154348Z 0 [Note] mysqld: ready for connections.
ghost-db | Version: '5.7.28'  socket: '/var/run/mysqld/mysqld.sock'  port: 3306  MySQL Community Server (GPL)

接着创建 docker-compose.yml 并输入下面的内容:

version: "3.6"services:www-ghost-local:image: ghost:3.3.0expose:- 2368environment:url: https://soulteary.iodatabase__client: mysqldatabase__connection__host: ghost-dbdatabase__connection__user: rootdatabase__connection__password: ghostdatabase__connection__database: ghostNODE_ENV: productionvolumes:- ./docker-assets/built:/var/lib/ghost/versions/3.3.0/core/built:ro- ./docker-assets/admin-views:/var/lib/ghost/current/core/server/web/admin/views:ro- ./config.production.json:/var/lib/ghost/config.production.json:ro- ./content/adapters:/var/lib/ghost/versions/3.3.0/content/adapters- ./content/apps:/var/lib/ghost/versions/3.3.0/content/apps- ./content/images:/var/lib/ghost/versions/3.3.0/content/images- ./content/logs:/var/lib/ghost/content/logs- ./content/settings:/var/lib/ghost/versions/3.3.0/content/settingsextra_hosts:- "soulteary.io:127.0.0.1"networks:- traefiklabels:- "traefik.enable=true"- "traefik.port=2368"- "traefik.frontend.rule=Host:soulteary.io"- "traefik.frontend.entryPoints=https,http"networks:traefik:external: true

使用 docker-compose up 启动应用,等待应用启动就绪:

www-ghost-local_1  | [2020-01-18 17:25:10] INFO Ghost is running in production...
www-ghost-local_1  | [2020-01-18 17:25:10] INFO Your site is now available on https://soulteary.io/
www-ghost-local_1  | [2020-01-18 17:25:10] INFO Ctrl+C to shut down
www-ghost-local_1  | [2020-01-18 17:25:10] INFO Ghost boot 9.472s

访问 http://soulteary.io/ghost 进行项目的初始化,设置管理员账号后,随手创建一篇文章就能进行测试啦。

最后

做开源软件不易,但是如果目的不只是简单做做营销PR,拉一些流量。而是想造福、方便更多人,让社区生态更好,那么就应该摆出开放包容的姿态,适当谦虚接受社区批评和建议,何况大家都帮你写好了代码,只要点一下 Merge 按钮就好了。

–EOF


我现在有一个小小的折腾群,里面聚集了一些喜欢折腾的小伙伴。

在不发广告的情况下,我们在里面会一起聊聊软件、HomeLab、编程上的一些问题,也会在群里不定期的分享一些技术沙龙的资料。

喜欢折腾的小伙伴欢迎扫码添加好友。(请注明来源和目的,否则不会通过审核)

关于折腾群入群的那些事

修理 Ghost 中文输入法的 BUG相关推荐

  1. 解决 input 输入框在中文输入法下的 bug

    最近本山人在项目的开发过程中遇到这么一个问题: 在列表中嵌入antd的Input输入框,切换到微软输入法输入时,就不能成功输入中文字符,然而搜狗输入法又是正常的. 研究一番,发现是input的valu ...

  2. win10系统bug:默认中文输入法在系统更新后突然变成了微软拼音

    问题描述 我本来默认输入法为搜狗输入法,而且当时已经将微软拼音从启用的输入法中删除了,可是一次win10大版本更新后突然变成了微软拼音为默认的中文输入法,这怎么能忍. 点击win10桌面右下角的通知中 ...

  3. 解决React中input输入框在中文输入法下的bug

    解决React 中input 输入框在中文输入法下的bug 需求:封装Input 组件,输入拼音过程中不触发onChange,拼音输入结束后触发onChange 原理:input 标签上面有两个事件, ...

  4. 【转】unbuntu 12.10/13.04 安装ibus中文输入法 及解决无法显示首选项bug

    转自:http://www.linuxidc.com/Linux/2013-01/78480.htm 首先需要在Ubuntu 12.10 上安装一个IBus (Intelligent Input Bu ...

  5. Fedora9安装中文输入法

    新安装的Fedora9直接安装中文输入法后会存在bug,Im-thod不能开启,所以在安装中文输入法时要先修复此bug 方法步骤:(联网的前提下) 1:打开终端 输入:yum update scim ...

  6. linux乌班图中文输入法,Ubuntu Linux怎么安装中文输入法

    Ubuntu上的输入法主要有小小输入平台(支持拼音/二笔/五笔等),Fcitx,Ibus,Scim等.其中Scim和Ibus是输入法框架.在Ubuntu的中文系统中自带了中文输入法,通过Ctrl+Sp ...

  7. 2019-06-04 Sublime Text 中文输入法的问题

    中文输入法的问题 从Sublime Text的初版(1.0)到现在(3.0 3065),中文输入法(包括日文输入法)都有一个问题:输入框不跟随. 目前官方还没有修复这个bug,解决方法是安装IMESu ...

  8. win7中计算机被改为了句号,WIN7中中文输入法快捷键无法修改的解决方法.doc

    WIN7中,中文输入法快捷键无法修改的解决方法 禁止中文输入法全角/半角切换的快捷键的方法 控制面板 è 区域和语言 è 键盘和语言 è 更改按键 è 高级按键设置 è -- 但由于win7系统存在B ...

  9. Ubuntu 20.04 系统自带中文输入法在PyCharm只能输入3个字母的问题

    这个bug真的是ubuntu20.04的神坑,每次最多只能打出3个字母,我看网上好多人都说下载安装搜狗输入法就好了. 但是,万万没想到删除了Ibus.安装了各种依赖.下载了搜狗输入法之后,结果因为它的 ...

最新文章

  1. css 浮动在最上层_CSS编码规范
  2. poj3714 最近点对
  3. AI造福设计师:搭配色板这种苦差事交给GAN就好啦(教程)
  4. (22)Xilinx FPGA PCIE中断接口(学无止境)
  5. pyspark对Mysql数据库进行读写
  6. 苹果 CEO 库克“喜当爹”,被女子索赔31.6亿分手费!
  7. 算法精解:C语言描述(递归)
  8. proteus仿真 引脚显示电平变化但不能显示波形
  9. mmdetection(2): DeformableConvNets(DCN)
  10. 转行计算机,如何成功进入大厂?
  11. Linux:chmod -R 777 * 是什么意思?
  12. FreeBSD常用命令110条
  13. vs qt中增加png图标
  14. linux常用基础命令整理
  15. WPS文字2012利用自带功能一键将Word转成PDF格式
  16. vue文件行内样式style提示插件
  17. 国之殤! 哀悼汶川大地震! 表达我的哀思!
  18. 2022年台湾省矢量数据(点线面)及数字高程数据下载
  19. 扫地机器人隔板_定制墙上一字隔板客厅书货架置物架好不好?实话说如何啊 | 智能扫地机器人评测...
  20. 【附源码】计算机毕业设计java智能居家养老服务平台设计与实现

热门文章

  1. 完美世界实习面试总结
  2. Python容器数据类型(字符串)
  3. [offer已拿]字节跳动游戏研发面经
  4. 旺店通·企业奇门和金蝶云星空接口打通对接实战
  5. 有什么好用的数据恢复工具推荐
  6. webOffice 常用的一些API以及其他操作
  7. pgsql按varchar字段排序
  8. 云上安全办公,就用华为云桌面
  9. 思科|锐捷|迈普|华为|华三等常见厂商交换机端口镜像配置命令详细说明
  10. vue 开发数据可视化地图