idea插件之——在markdown复制粘贴图片
Markdown paste image
每次在idea的markdown中要粘貼圖片的時候,要么復制鏈接,要么需要將軟件手動上傳到七牛云,本人根據了holgerbrandl/pasteimages這個本地的軟件修改了下源碼,變成了現在的作品,同時,還能支持擴展,但是這部分還沒完成,代碼存放位置,插件下載地址
此工具可運行在Intellij、Python、PhpStorm等jetbrains的所有軟件中,使用效果如下:
插件開發過程
1.搭建環境
2.實現Action接口
3.Setting的設置
4.拓展cdn
5.插件打包
整體介紹
主要是邏輯的關系,plugin.xml為配置文件、PasteImageHandler控制器,如果是ctrl+v這個動作,則進入PasteImageFromClipboard,然后開始邏輯判斷
1.搭建環境
由于使用的是idea的旗艦版,軟件中自帶了idea的插件開發包,new->project,選擇plugin
然后點擊下一步,再然后是finish。頁面結構如下:
配置文件:
<idea-plugin><id>com.your.company.unique.plugin.id</id><!--插件的id,如果需要上次到idea倉庫讓別人使用,不能跟其他的一致--><name>Plugin display name here</name><!--插件名字--><version>1.0</version><!--版本名字--><vendor email="support@yourcompany.com" url="http://www.yourcompany.com">YourCompany</vendor><!--插件的簡要描述--><description><![CDATA[Enter short description for your plugin here.<br><em>most HTML tags may be used</em>]]></description><!--版本變化信息--><change-notes><![CDATA[Add change notes here.<br><em>most HTML tags may be used</em>]]></change-notes><!--idea版本--><!-- please see http://www.jetbrains.org/intellij/sdk/docs/basics/getting_started/build_number_ranges.html for description --><idea-version since-build="145.0"/><!--產品選擇--><!-- please see http://www.jetbrains.org/intellij/sdk/docs/basics/getting_started/plugin_compatibility.htmlon how to target different products --><!-- uncomment to enable plugin in all products<depends>com.intellij.modules.lang</depends>--><!--拓展組件注冊,本地開發的時候不要沖突,特別先后次序問題--><extensions defaultExtensionNs="com.intellij"><!-- Add your extensions here --></extensions><!--Action注冊--><actions><!-- Add your actions here --></actions></idea-plugin>2.實現接口
Hello World的講解看看這位作者的吧。
(1)首先,在img2md中定義一個PasteImageHandler類,并在xml中注冊,該類的意思是是每次在markdown文件中使用ctrl+v(粘貼)的時候,先調用下面這個函數,如果符合條件,則進入:PasteImageFromClipboard。
plugin.xml的配置文件如下:
<extensions defaultExtensionNs="com.intellij"><editorActionHandler action="EditorPaste" implementationClass="img2md.PasteImageHandler" order="first"/></extensions>(2)右鍵src,新建AnAction的一個繼承類:PasteImageFromClipboard,重寫actionPerformed方法,該方法聲明要做什么。其中,定義了一個ImageInsertSettingPanel來對粘貼之后的彈出的選項。
隨后,plugin.xml中就多了一個action:
<actions><action id="PastePic" class="img2md.PasteImageFromClipboard" text="PastePic"description="Paste an image from clipboard at the current cursor position"><add-to-group group-id="EditMenu" anchor="last"/><keyboard-shortcut keymap="$default" first-keystroke="shift meta V"/></action> </actions>彈出的選項窗如下,可以選擇文件名字,文件目錄,是否透明化,是否圓角,圖片大小,如果不想要此彈窗,我在設置中設置了一個功能按鈕,下面會講到。
3.Setting的設置
本來是只做七牛云的,如果是七牛云,中間的那個自定義框不需要管,只需要填好key和secret即可使用。
實現過程:
(1)右鍵,new>GUI FORM:
(2)在MySetting.form選好自己需要的按鈕,即可在MySetting.java中實現邏輯
(3)需要重寫的方法
找出類的實現關系:
idea sdk中配置了某些方法是可以不實現的,例如getHelpTopic、createComponent等,常用的方法一般如下:
public interface UnnamedConfigurable {@NullableJComponent createComponent();//打開設置的時候頁面,如果需要偵聽某些button,需要在這里配置,可無boolean isModified();//是否可以定義,一般為true,想寫死的話就返回falsevoid apply() throws ConfigurationException;//設置填好后點擊apply或者ok,這里我們保存填寫的東西default void reset() {//初始化,打開設置的初始化信息}default void disposeUIResources() {//關閉之后的資源} }保存填寫的信息,idea sdk給我們提供了一個api,PropertiesComponent.getInstance(),感覺略像緩存,有人說保存在xml中,具體我也不太了解,有待深入。
(4)配置PasteImageFromClipboard的流程:
- 判斷上傳的圖片是否為空,如果為空,則彈出提示框
- 判斷當前文件是不是markdown的文件,如果是,進入編輯階段
- 判斷是否以簡潔模式(即ctrl+v后不彈出選項框)
- 講""配置到markdown中
- 操作成功。
有興趣可以看看代碼
(5)七牛云的使用
使用七牛云的時候,需要將七牛云sdk以及其依賴的一個一個包都手動導進去,用不了maven。
然后寫一個QiniuUtil,用來上傳文件:
public class QiniuUtil {//自己的七牛private static Logger log = LoggerFactory.getLogger(QiniuUtil.class);public static final Configuration cfg = new Configuration(Zone.zone0());//...其他參數參考類注釋public static final UploadManager uploadManager = new UploadManager(cfg);public static String getToken(String bucket) {//獲取七牛的tokenSystem.out.println("qiniuyun");String access_key = PropertiesComponent.getInstance().getValue("ACCESS_KEY");String secret_key = PropertiesComponent.getInstance().getValue("SECRET_KEY");if (access_key != null && secret_key != null) {Auth auth = Auth.create(access_key, secret_key);String token = auth.uploadToken(bucket);return token;} else {return null;}}public static void putFile(String bucket, String key, String filePath) {//上傳文件,第一個是bucket,第二個是文件名,第三個是文件的路徑try {Response res = uploadManager.put(filePath, key, getToken(bucket));if (!res.isOK()) {log.error("Upload to qiniu failed;File path: " + filePath + ";Error: " + res.error);}} catch (QiniuException e) {e.printStackTrace();Response r = e.response;log.error(r.toString());try {log.error(r.bodyString());} catch (QiniuException e1) {log.error(e1.getMessage());}}} }之后,在PasteImageFromClipboard中添加保存的代碼即可。
QiniuUtil.putFile("images", "images/" + imagepath, imageFile.getPath());如果想實現使用其他的,比如騰訊云、阿里云、又拍云這些,添加方式可以像七牛云一樣,添加包,寫個util即可,但是,當今的做云的越來越多,不能一一實現,我們可以提供一個模板,供開發者使用,只要自己實現了代碼添加包即可。
4.拓展其他云
本來是只做七牛云的,但是想了一想,只做七牛云好像沒啥意思,想拓展騰訊云、阿里云、又拍云等等,顧提供了一個樣本類,供開發者使用。
public class Main {public boolean sendpic(String filepath) {//提供文件路徑return true;//返回結果} }填寫完代碼之后,還仍需一個添加包的列表,添加完包之后進行調試,這里采用java的動態部署,生成動態類,規定主函數為Main,必須有個sendpic的方法,將圖片的路徑傳過去,自己實現上傳的代碼
testYourCodeButton.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {try {File file = new File(System.getProperty("user.dir"));//類路徑(包文件上一層)URL url = file.toURI().toURL();ClassLoader loader = new URLClassLoader(new URL[]{url});//創建類加載器Class<?> cls = loader.loadClass("Main");//加載指定類,注意一定要帶上類的包名Object obj = cls.newInstance();//初始化一個實例Method method = cls.getMethod("sendpic", String.class);//方法名和對應的參數類型String imagepath = "1.png";//用來測試的圖片String success = method.invoke(obj, imagepath).toString();//調用得到的上邊的方法methodif (!success.equals("true")) {StringBuilder stringBuilder = new StringBuilder(Common.ERROR_CODE);customcode.setText(stringBuilder.append(customcode.getText()).toString());}} catch (Exception ee) {ee.printStackTrace();}} });調用此動態類的動作在PasteImageFormClipboard中,
try {File file = new File(System.getProperty("user.dir"));//類路徑(包文件上一層)URL url = file.toURI().toURL();ClassLoader loader = new URLClassLoader(new URL[]{url});//創建類加載器System.out.println("loader");Class<?> cls = loader.loadClass("Main");//加載指定類,注意一定要帶上類的包名Object obj = cls.newInstance();//初始化一個實例Method method = cls.getMethod("sendpic", String.class);//方法名和對應的參數類型method.invoke(obj, imagepath);//調用得到的上邊的方法method//TODO 如果失敗則彈出失敗框 } catch (Exception ee) {ee.printStackTrace(); }當然,拓展使用其他cdn僅僅是我的設想。。。。由于996,實在沒時間去實現了,各位有興趣可以去star或者fork一下,鏈接點這
5.插件打包
寫好代碼之后,需要打包讓自己或者別人使用,右鍵項目—>prepare plugin module xxx for deployment,然后在項目的目錄就可以看到一個zip包,然后,在setting的plugin中install plugin from disk即可。
昨天,發現這個項目已經有人實現了,比我造了三天,還傳到了jetbrains的公共倉庫,感覺寫的比我的好,大家可以使用一下
同時,歡迎訪問我的個人網站,要是能star一下我的網站的代碼就更好了網站代碼,感謝
轉載于:https://www.cnblogs.com/w1570631036/p/7532611.html
總結
以上是生活随笔為你收集整理的idea插件之——在markdown复制粘贴图片的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 嘿嘿~
- 下一篇: 技术入股创业注意事项