• 使用applescript自动化trilium的数学公式环境(二)


    9.23 ver1

    没想到今天很有精神,在玩chatgpt的时候突然想到,为什么不让他帮我写一份代码呢?说干就干。但是,可能是因为我的英语不怎么样,chatgpt生成出来的整个东西实在是菜的抠脚。所以我觉得还是应该自己先想好一个大致的任务流程,然后让chatgpt一步一步把它实现出来。

    1. 从剪贴板获取需要数学公式化的文本
    2. 使用分隔符“$”将该文本分割为若干部分,存储为一个数组
    3. 对数组的元素循环:第偶数个就直接粘贴到trilium里面,第奇数个则用ver0的工作流程插入到公式环境里面。(这里有个小问题,就是可能文件一开始就是公式,但是我们事实上可以先给他前面插一个无意义字符,后面再删掉,保证公式一定是奇数个;总之这个细节我们先不管)

    我们分别实现各个部分:

    -- Part 1: get the text from clipboard
    set paragraphText to the clipboard
    tell application "Trilium Notes"
    	activate
    end tell
    
    
    -- Part 2: delimiter paragraphText to oldDelimiters
    set delimiter to "$"
    
    -- Set the text item delimiters to the delimiter
    set oldDelimiters to AppleScript's text item delimiters
    set AppleScript's text item delimiters to delimiter
    
    -- Split the paragraphText into pieces
    set shellPieces to text items of paragraphText
    
    -- Restore the original text item delimiters
    set AppleScript's text item delimiters to oldDelimiters
    
    
    -- Part 3 insert ino trilium
    -- Loop through the paragraph pieces
    set i to 0
    repeat with piece in shellPieces
    	-- even or odd
    	if i is equal to 1 then
    		tell application "System Events"
    			keystroke "m" using command down
    			delay 0.1
    			keystroke piece
    			delay 0.1
    			keystroke return
    			delay 0.1
    		end tell
    		set i to 0
    	else
    		tell application "System Events"
    			keystroke piece
    			delay 0.1
    		end tell
    		set i to 1
    	end if
    end repeat
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    问题处理
    keystroke反序bug

    实际使用的时候这个程序会出一些小bug,最明显的是,apple的keystroke似乎有点bug,第一个输入是反序的,比如keystroke “text”会输出“txet”,所以我们这里让keystroke一开始直接输入一个空格来避免这个情况。同时,每次keystroke之间应该delay一会,等待系统反应过来,即在输出之前增加一段:

    tell application "System Events"
    	keystroke " "
    	delay 0.1
    end tell
    
    • 1
    • 2
    • 3
    • 4
    安全性问题

    原本使用剪贴板是因为它无需输入,比较方便。但是在实际使用中发现会有一个问题就是我们的剪贴板里面可能不一定是我们想要的东西,所以最终还是决定改成输入模式:

    set paragraphText to text returned of (display dialog "Enter the text you want to input in trilium with automated math formula transformation:" default answer "")
    
    • 1
    提醒我们把输入法切换成英文

    还有一个问题是我们使用的是脚本,所以系统输入法会影响我们的输入。我们应该把输入法切换成英文,防止被它调用。

    之前提到的奇偶性问题

    最开始我们在字符串前面加一个空格,最后再把空格删掉即可。

    最终我们的代码是:

    -- Part 1: get the text from clipboard
    set orgnparagraphText to text returned of (display dialog "Enter the text you want to input in trilium with automated math formula transformation; remember to change the keyboard into English:" default answer "")
    set paragraphText to " " & orgnparagraphText
    tell application "Trilium Notes"
    	activate
    end tell
    
    
    -- Part 2: delimiter paragraphText to oldDelimiters
    set delimiter to "$"
    
    -- Set the text item delimiters to the delimiter
    set oldDelimiters to AppleScript's text item delimiters
    set AppleScript's text item delimiters to delimiter
    
    -- Split the paragraphText into pieces
    set shellPieces to text items of paragraphText
    
    -- Restore the original text item delimiters
    set AppleScript's text item delimiters to oldDelimiters
    
    
    -- Part 3 insert ino trilium
    -- Loop through the paragraph pieces
    set i to 0
    set j to 0
    -- 这里插入一段是因为apple的keystroke似乎有点bug,第一个输入是反序的,所以我们这里输入一个空格来避免这个情况。同时,每次keystroke之间应该delay一会,等待系统反应过来。
    tell application "System Events"
    	keystroke " "
    	delay 0.1
    end tell
    repeat with piece in shellPieces
    	-- even or odd
    	if length of piece is not equal to 0 then
    		if i is equal to 1 then
    			tell application "System Events"
    				keystroke "m" using command down
    				delay 0.1
    				keystroke piece
    				delay 0.1
    				keystroke return
    				delay 0.1
    			end tell
    			set i to 0
    			set j to 1
    		else
    			if j is equal to 0 then
    				tell application "System Events"
    					-- delete the added space
    					keystroke (ASCII character 8)
    					delay 0.1
    				end tell
    			end if
    			tell application "System Events"
    				keystroke piece
    				delay 0.1
    			end tell
    			set i to 1
    			set j to 1
    		end if
    	end if
    end repeat
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62

    我们同样在系统设置中为这个功能添加一个快捷键。由于我的命名是”trilium日志快速导入”,因此我们设置快捷键为ctrl+shift+l(log)

    现在最后遗留的一个问题就是,我们的字符是用自动输入输入的,假如遇到中文字符可就原形毕露了。所以后面我们需要解决的问题是把这玩意弄成支持中文输入的。

    来自9.23凌晨的灵感

    卧槽,我突然悟了,只要像原来一样,把要输入的东西弄到剪贴板里面,然后粘贴到程序里面就行了。

    询问chatgpt得知,只要用代码“set the clipboard to target string"就能实现这个功能!

    -- Part 1: get the text from clipboard
    set orgnparagraphText to text returned of (display dialog "Enter the text you want to input in trilium with automated math formula transformation; remember to change the keyboard into English:" default answer "")
    set paragraphText to " " & orgnparagraphText
    tell application "Trilium Notes"
    	activate
    end tell
    
    
    -- Part 2: delimiter paragraphText to oldDelimiters
    set delimiter to "$"
    
    -- Set the text item delimiters to the delimiter
    set oldDelimiters to AppleScript's text item delimiters
    set AppleScript's text item delimiters to delimiter
    
    -- Split the paragraphText into pieces
    set shellPieces to text items of paragraphText
    
    -- Restore the original text item delimiters
    set AppleScript's text item delimiters to oldDelimiters
    
    
    -- Part 3 insert ino trilium
    -- Loop through the paragraph pieces
    set i to 0
    set j to 0
    -- 这里插入一段是因为apple的keystroke似乎有点bug,第一个输入是反序的,所以我们这里输入一个空格来避免这个情况。同时,每次keystroke之间应该delay一会,等待系统反应过来。
    tell application "System Events"
    	keystroke " "
    	delay 0.1
    end tell
    repeat with piece in shellPieces
    	-- even or odd
    	if length of piece is not equal to 0 then
    		if i is equal to 1 then
    			tell application "System Events"
    				keystroke "m" using command down
    				delay 0.1
    				set the clipboard to piece
    				keystroke "v" using command down
    				delay 0.1
    				keystroke return
    				delay 0.1
    			end tell
    			set i to 0
    			set j to 1
    		else
    			if j is equal to 0 then
    				tell application "System Events"
    					-- delete the added space
    					keystroke (ASCII character 8)
    					delay 0.1
    				end tell
    			end if
    			tell application "System Events"
    				set the clipboard to piece
    				keystroke "v" using command down
    				delay 0.1
    			end tell
    			set i to 1
    			set j to 1
    		end if
    	end if
    end repeat
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64

    那么,这个工具的设计就大功告成了,完结撒花!

  • 相关阅读:
    数字签字那些事+ca数字证书
    【论文复现】——基于多尺度虚拟网格与坡度阈值的机载LiDAR 点云滤波方法
    嵌入式linux学习笔记---tar多核压缩
    分布式电源接入对配电网的影响matlab程序(IEEE9节点系统算例)
    【计算机视觉 | 图像分割】arxiv 计算机视觉关于图像分割的学术速递(9 月 6 日论文合集)
    【Java八股文总结】之异常
    封装自己的 jquery 框架
    spring-boot-maven-plugin插件 —— 打成普通jar
    【go】defer的使用
    Python中class内置方法__init__与__new__作用与区别探究
  • 原文地址:https://blog.csdn.net/ldc1513/article/details/133191079