Winse Blog

走走停停, 熙熙攘攘, 忙忙碌碌, 不知何畏.

Jekyll页面添加编辑按钮

近期把其他博客的日志导出成Markdown后导入到自己的blog。想在本地预览后,看到不好的地方就进行修改,想法是美好的,现实是残酷的!找文件太麻烦了,定位到了文件夹,还需要找文件。反正就是觉得很不爽!最终通过自定义URL协议的方式完美的解决

尝试ActiveXObject

IE下可以通过ActiveXObject调用本地的程序打开文件。尽管局限于IE,但是如果能实现的话将就下也OK的。 理所当然认为IE下是没有问题,就找chrome下能否执行ActiveXObject的兼容对象

在chrome下,没啥很好的替代实现。同时在IE11下,ActiveXObject调用shell对象报automation服务器不能创建对象,需要额外开启功能、降低IE的安全性等等,也很麻烦!!

1
2
3
4
function callShellApplication(){
  var objShell = new ActiveXObject("WScript.shell");
  objShell.run('"C:\Program Files (x86)\wkhtmltopdf\wkhtmltopdf.exe" "c:\PDFTestPage.html" "c:\TEST.pdf"');
}

尝试Flash

有想过使用flash解决,毕竟剪贴板复制功能的ZeroClipboard.swf是那么的完美^_^。但是swf不能执行exe程序,没办法只能再寻求其他办法。

自定义URL协议

最后看到了URL Protocol的实现方式,是的哦,Github-Windows、以及QQ等这些网页的工具不都是调用系统的程序吗?!

然后试着按照网页的教程,试着弄弄!又是一个新鲜事物,有挑战的事情做起来就更有激情!

添加注册表项reg-npp-windows.bat:(可以先导出github-windows的注册表项参考。这里使用用bat来实现,注册脚本中可以通过相对路径指向执行的程序)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
set NPP_APP=%~dp0npp-windows.bat
set NPP_ARG=%%1

set "NPP_CMD=\"%NPP_APP%\" \"%NPP_ARG%\""

reg add "HKEY_CLASSES_ROOT\npp-windows" /f
reg add "HKEY_CLASSES_ROOT\npp-windows" /ve /t REG_SZ /d "URL:npp-windows Protocol" /f
reg add "HKEY_CLASSES_ROOT\npp-windows" /v "URL Protocol" /t REG_SZ /d "" /f

reg add "HKEY_CLASSES_ROOT\npp-windows\DefaultIcon"  /f
reg add "HKEY_CLASSES_ROOT\npp-windows\DefaultIcon"  /ve /t REG_SZ /d "" /f

reg add "HKEY_CLASSES_ROOT\npp-windows\shell" /f
reg add "HKEY_CLASSES_ROOT\npp-windows\shell\open" /f
reg add "HKEY_CLASSES_ROOT\npp-windows\shell\open\command" /f
reg add "HKEY_CLASSES_ROOT\npp-windows\shell\open\command" /ve /t REG_SZ /d "%NPP_CMD%" /f

pause

点击URL真正调用的是npp-windows.bat命令(即上面的注册脚本的NPP_APP):

1
2
3
4
5
6
7
@echo off

set fileRelativePath=%1
set filepath="%~dp0..\..\..\%fileRelativePath:~17,-1%"

start D:\local\usr\npp\notepad++.exe %filepath%
exit

start命令新起一个子进程打开程序,这样可以启动后面的程序,同时关闭/退出掉黑窗口! 请求参数有整个url加上双引号,如"npp-windows://e/about.md"。数字17,-1获取真正的路径。由于根下的文件会被自动加反斜杠"npp-windows://about.md/",所以加上e/进行修复。

在网页使用链接,然后加上npp-windows的协议就可以打开文件进行修改编辑了。

<a class="shellExecuteLink" href="npp-windows://e/{{ page.path }}" title="本地编辑"><i class="icon-edit"> </i></a>

对BAT的命令相当的迷惑:

  • "D:\local\usr\npp\notepad++.exe" "%~dp0..\..\..\%fileRelativePath:~17,-1%" OK
  • start D:\local\usr\npp\notepad++.exe "%~dp0..\..\..\%fileRelativePath:~17,-1%" OK
  • start "D:\local\usr\npp\notepad++.exe" "%~dp0..\..\..\%fileRelativePath:~17,-1%" 弹出Windows无法打开此文件的框

闪黑窗口优化尝试

功能已经实现了,但是仍然有一个黑窗口一闪而过!

爱折腾的程序员啊!!

找啊找,发现vbs可以后台执行命令。直接在命令行是可以执行npp-windows.vbs的,同时那种不弹窗的效果也是自己想要的!!但把vbs作为url-protocol协议的执行程序时,点击页面链接却没一点反应!但是运行bat和exe程序是没有问题的。

其实windows下的bat和vbs程序都是可以转成exe的。 下载了ScriptCryptor Compiler破解版,把vbs转成exe后就可以被url-protocol调用了,且没有闪窗的现象了!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Dim CurrPath
CurrPath=WScript.Createobject("Scripting.FileSystemObject").GetFile(Wscript.ScriptFullName).ParentFolder.Path

Dim fileRelativePath
fileRelativePath=WScript.Arguments(0)

Dim filepath
filepath=Mid(fileRelativePath,17)

Dim Wsh
Set Wsh = WScript.CreateObject("WScript.Shell")

Wsh.Run "D:\local\usr\npp\notepad++.exe " + CurrPath + "\..\..\..\" + filepath,0,True

Set Wsh=NoThing
WScript.quit

同时上面的vbs程序有一个与bat同样的问题:在文件没有关闭的前,vbs程序是一直等待的!如果使用这种方式,编辑很多文件就会存在很多进程。

而直接在Wsh.Run后面加上start前缀就报系统找不到指定的文件的错误!整来整去最后还是调用bat文件,解决主进程一直等待的问题。

1
2
3
4
5
6
7
8
9
10
11
12
13
Dim CurrPath
CurrPath=WScript.Createobject("Scripting.FileSystemObject").GetFile(Wscript.ScriptFullName).ParentFolder.Path

Dim fileRelativePath
fileRelativePath=WScript.Arguments(0)

Dim Wsh
Set Wsh = WScript.CreateObject("WScript.Shell")

Wsh.Run CurrPath + "\npp-windows.bat """ + fileRelativePath + """",0,True

Set Wsh=NoThing
WScript.quit

然后修改添加注册表项的命令reg-npp-windows.bat,重新覆盖注册下就可以了。

1
set NPP_APP=%~dp0npp-windows.vbs.exe

尽管没有黑窗口了闪现,但是速度慢了很多!! 两种方式换着用呗,修改也简单: 改下程序的名字,重新注册下就行了。

其他

URL-protocol的用户选择设置会被chrome缓冲,可以通过C:\Users\Administrator\AppData\Local\Google\Chrome\User Data\Local State文件的protocol_handler节点来修改。

参考

–END

Comments