在开发 Steward 的过程中,设计过一些有用的 actions,比如阅读模式、英语语法高亮,在后续迭代时发现 Steward 本身不适合也难以承载这类功能,因此 iHelpers 应运而生。
在 Chrome 应用商店搜索 iHelpers 安装,代码开源在 github.com/solobat/iHe…
iHelpers 能做什么?
简单的
- 如上图中显示的阅读模式
- 给 Twitter / Reddit 添加翻译按钮
- 同网站只保留一个标签页
- 同网站视频或直播只令当前标签页播放
- 配置快捷键可以:快速上一页、下一页,视频进退快慢与音量高低,文章、小说按段落滚动
- 夜间模式
- 自动签到
复杂的
- 豆瓣上复制电影名,自动打开某个影视资源网站并搜索
- 在某资源网站复制下载链接,直接打开云盘并创建下载任务
如何使用
动作
就是 iHelpers 内置的一些功能,通过右键菜单或快捷键可以执行
记录
大部分动作执行后都会产出一条记录(record),可以在 popup 的 Records 面板查看到。 对记录可以执行回放以及转为自动化的操作
自动化
如果你想让某个动作在某些网站的页面自动执行,就需要用到自动化(Automation)。
自动化(Automation)可以单独添加,也可以从 Records 里转成。
它有两个参数,即指令(Instructions)与模式(Pattern) : 指令(Instructions):用来描述动作与它的参数。以下图为例,readMode 是动作名,@.article-area 表示动作将应用于 .article-area 这个 css selector 代表的页面元素。
模式(Pattern):表明动作将在哪些页面会自动执行,如 https://juejin.im/post/* 就对应着掘金的所有 post 页面。
脚本 IScript
随着一些复杂功能的加入,配置起来就有点麻烦了,在 ChatGPT 的帮助下,搞了个脚本语言,叫 IScript,基本能覆盖扩展的所有功能。
对比
配置式
脚本式
语法
以下为 IScript 的语法,还有不少问题,见笑了~
Script ::= *empty*
::= Automations
Automations ::= Automation
::= Automations
Automation ::= automation AutomationHead AutomationBody end
AutomationHead ::= for URLRegString on Stage
Stage ::= '"immediate"'
::= '"load"'
::= '"delay"'
URLRegString ::= string
AutomationBody ::= Statements
Statements ::= Statement
::= Statements
Statement ::= AssignStatement
::= NativeStatement
::= ApplyStatement
::= RequireStatement
AssignStatement ::= AssignExp = ValuableExp
ValuableExp ::= ValueExp
::= Identifier
::= ListenExp
::= GetValueExp
::= BuiltinFunctionCall
ValueExp ::= number
::= string
::= bool
ListenExp ::= listen EventNameExp on EventScopeExp
EventNameExp ::= string
EventScopeExp ::= '"global"'
::= CssSelectorExp
NativeStatement ::= OpenStatement
::= ActiveStatement
::= WaitStatement
::= CloseStatement
::= EmitStatement
::= ListenStatement
OpenStatement ::= OpenExp
OpenExp ::= open URLString as URLRegString
URLString ::= string
ActiveStatement ::= ActiveExp
ActiveExp ::= active
WaitStatement ::= WaitExp
WaitExp ::= wait number
CloseStatement ::= close
EmitStatement ::= emit EventNameExp with ArgPairs
ListenStatement ::= ListenExp
ApplyStatement ::= apply ActionNameExp with ArgPairs on CssSelectorExp
ActionNameExp ::= string
ArgPairs ::= (ArgsExp)
ArgsExp ::= empty
::= ArgExp
::= ArgExp, ArgsExp
ArgExp ::= Identifier
::= Identifier = ValueExp
::= Identifier = Identifier
CssSelectorExp ::= string
RequireStatement ::= require Expression [, ErrorMessage]
ErrorMessage ::= string
Expression ::= ValuableExp ComparisonOperator ValuableExp
ComparisonOperator ::= '>=' | '>' | '<=' | '<' | '=='
BuiltinFunctionCall ::= FunctionName ( CssSelectorExp )
FunctionName ::= 'len' | 'exist'