idea插件之——在markdown复制粘贴图片
Markdown paste image
每次在idea的markdown中要粘貼圖片的時(shí)候,要么復(fù)制鏈接,要么需要將軟件手動(dòng)上傳到七牛云,本人根據(jù)了holgerbrandl/pasteimages這個(gè)本地的軟件修改了下源碼,變成了現(xiàn)在的作品,同時(shí),還能支持?jǐn)U展,但是這部分還沒(méi)完成,代碼存放位置,插件下載地址
此工具可運(yùn)行在Intellij、Python、PhpStorm等jetbrains的所有軟件中,使用效果如下:
插件開(kāi)發(fā)過(guò)程
1.搭建環(huán)境
2.實(shí)現(xiàn)Action接口
3.Setting的設(shè)置
4.拓展cdn
5.插件打包
整體介紹
主要是邏輯的關(guān)系,plugin.xml為配置文件、PasteImageHandler控制器,如果是ctrl+v這個(gè)動(dòng)作,則進(jìn)入PasteImageFromClipboard,然后開(kāi)始邏輯判斷
1.搭建環(huán)境
由于使用的是idea的旗艦版,軟件中自帶了idea的插件開(kāi)發(fā)包,new->project,選擇plugin
然后點(diǎn)擊下一步,再然后是finish。頁(yè)面結(jié)構(gòu)如下:
配置文件:
<idea-plugin><id>com.your.company.unique.plugin.id</id><!--插件的id,如果需要上次到idea倉(cāng)庫(kù)讓別人使用,不能跟其他的一致--><name>Plugin display name here</name><!--插件名字--><version>1.0</version><!--版本名字--><vendor email="support@yourcompany.com" url="http://www.yourcompany.com">YourCompany</vendor><!--插件的簡(jiǎn)要描述--><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"/><!--產(chǎn)品選擇--><!-- 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>--><!--拓展組件注冊(cè),本地開(kāi)發(fā)的時(shí)候不要沖突,特別先后次序問(wèn)題--><extensions defaultExtensionNs="com.intellij"><!-- Add your extensions here --></extensions><!--Action注冊(cè)--><actions><!-- Add your actions here --></actions></idea-plugin>2.實(shí)現(xiàn)接口
Hello World的講解看看這位作者的吧。
(1)首先,在img2md中定義一個(gè)PasteImageHandler類(lèi),并在xml中注冊(cè),該類(lèi)的意思是是每次在markdown文件中使用ctrl+v(粘貼)的時(shí)候,先調(diào)用下面這個(gè)函數(shù),如果符合條件,則進(jìn)入:PasteImageFromClipboard。
plugin.xml的配置文件如下:
<extensions defaultExtensionNs="com.intellij"><editorActionHandler action="EditorPaste" implementationClass="img2md.PasteImageHandler" order="first"/></extensions>(2)右鍵src,新建AnAction的一個(gè)繼承類(lèi):PasteImageFromClipboard,重寫(xiě)actionPerformed方法,該方法聲明要做什么。其中,定義了一個(gè)ImageInsertSettingPanel來(lái)對(duì)粘貼之后的彈出的選項(xiàng)。
隨后,plugin.xml中就多了一個(gè)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>彈出的選項(xiàng)窗如下,可以選擇文件名字,文件目錄,是否透明化,是否圓角,圖片大小,如果不想要此彈窗,我在設(shè)置中設(shè)置了一個(gè)功能按鈕,下面會(huì)講到。
3.Setting的設(shè)置
本來(lái)是只做七牛云的,如果是七牛云,中間的那個(gè)自定義框不需要管,只需要填好key和secret即可使用。
實(shí)現(xiàn)過(guò)程:
(1)右鍵,new>GUI FORM:
(2)在MySetting.form選好自己需要的按鈕,即可在MySetting.java中實(shí)現(xiàn)邏輯
(3)需要重寫(xiě)的方法
找出類(lèi)的實(shí)現(xiàn)關(guān)系:
idea sdk中配置了某些方法是可以不實(shí)現(xiàn)的,例如getHelpTopic、createComponent等,常用的方法一般如下:
public interface UnnamedConfigurable {@NullableJComponent createComponent();//打開(kāi)設(shè)置的時(shí)候頁(yè)面,如果需要偵聽(tīng)某些button,需要在這里配置,可無(wú)boolean isModified();//是否可以定義,一般為true,想寫(xiě)死的話就返回falsevoid apply() throws ConfigurationException;//設(shè)置填好后點(diǎn)擊apply或者ok,這里我們保存填寫(xiě)的東西default void reset() {//初始化,打開(kāi)設(shè)置的初始化信息}default void disposeUIResources() {//關(guān)閉之后的資源} }保存填寫(xiě)的信息,idea sdk給我們提供了一個(gè)api,PropertiesComponent.getInstance(),感覺(jué)略像緩存,有人說(shuō)保存在xml中,具體我也不太了解,有待深入。
(4)配置PasteImageFromClipboard的流程:
- 判斷上傳的圖片是否為空,如果為空,則彈出提示框
- 判斷當(dāng)前文件是不是markdown的文件,如果是,進(jìn)入編輯階段
- 判斷是否以簡(jiǎn)潔模式(即ctrl+v后不彈出選項(xiàng)框)
- 講""配置到markdown中
- 操作成功。
有興趣可以看看代碼
(5)七牛云的使用
使用七牛云的時(shí)候,需要將七牛云sdk以及其依賴(lài)的一個(gè)一個(gè)包都手動(dòng)導(dǎo)進(jìn)去,用不了maven。
然后寫(xiě)一個(gè)QiniuUtil,用來(lái)上傳文件:
public class QiniuUtil {//自己的七牛private static Logger log = LoggerFactory.getLogger(QiniuUtil.class);public static final Configuration cfg = new Configuration(Zone.zone0());//...其他參數(shù)參考類(lèi)注釋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) {//上傳文件,第一個(gè)是bucket,第二個(gè)是文件名,第三個(gè)是文件的路徑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());如果想實(shí)現(xiàn)使用其他的,比如騰訊云、阿里云、又拍云這些,添加方式可以像七牛云一樣,添加包,寫(xiě)個(gè)util即可,但是,當(dāng)今的做云的越來(lái)越多,不能一一實(shí)現(xiàn),我們可以提供一個(gè)模板,供開(kāi)發(fā)者使用,只要自己實(shí)現(xiàn)了代碼添加包即可。
4.拓展其他云
本來(lái)是只做七牛云的,但是想了一想,只做七牛云好像沒(méi)啥意思,想拓展騰訊云、阿里云、又拍云等等,顧提供了一個(gè)樣本類(lèi),供開(kāi)發(fā)者使用。
public class Main {public boolean sendpic(String filepath) {//提供文件路徑return true;//返回結(jié)果} }填寫(xiě)完代碼之后,還仍需一個(gè)添加包的列表,添加完包之后進(jìn)行調(diào)試,這里采用java的動(dòng)態(tài)部署,生成動(dòng)態(tài)類(lèi),規(guī)定主函數(shù)為Main,必須有個(gè)sendpic的方法,將圖片的路徑傳過(guò)去,自己實(shí)現(xiàn)上傳的代碼
testYourCodeButton.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {try {File file = new File(System.getProperty("user.dir"));//類(lèi)路徑(包文件上一層)URL url = file.toURI().toURL();ClassLoader loader = new URLClassLoader(new URL[]{url});//創(chuàng)建類(lèi)加載器Class<?> cls = loader.loadClass("Main");//加載指定類(lèi),注意一定要帶上類(lèi)的包名Object obj = cls.newInstance();//初始化一個(gè)實(shí)例Method method = cls.getMethod("sendpic", String.class);//方法名和對(duì)應(yīng)的參數(shù)類(lèi)型String imagepath = "1.png";//用來(lái)測(cè)試的圖片String success = method.invoke(obj, imagepath).toString();//調(diào)用得到的上邊的方法methodif (!success.equals("true")) {StringBuilder stringBuilder = new StringBuilder(Common.ERROR_CODE);customcode.setText(stringBuilder.append(customcode.getText()).toString());}} catch (Exception ee) {ee.printStackTrace();}} });調(diào)用此動(dòng)態(tài)類(lèi)的動(dòng)作在PasteImageFormClipboard中,
try {File file = new File(System.getProperty("user.dir"));//類(lèi)路徑(包文件上一層)URL url = file.toURI().toURL();ClassLoader loader = new URLClassLoader(new URL[]{url});//創(chuàng)建類(lèi)加載器System.out.println("loader");Class<?> cls = loader.loadClass("Main");//加載指定類(lèi),注意一定要帶上類(lèi)的包名Object obj = cls.newInstance();//初始化一個(gè)實(shí)例Method method = cls.getMethod("sendpic", String.class);//方法名和對(duì)應(yīng)的參數(shù)類(lèi)型method.invoke(obj, imagepath);//調(diào)用得到的上邊的方法method//TODO 如果失敗則彈出失敗框 } catch (Exception ee) {ee.printStackTrace(); }當(dāng)然,拓展使用其他cdn僅僅是我的設(shè)想。。。。由于996,實(shí)在沒(méi)時(shí)間去實(shí)現(xiàn)了,各位有興趣可以去star或者fork一下,鏈接點(diǎn)這
5.插件打包
寫(xiě)好代碼之后,需要打包讓自己或者別人使用,右鍵項(xiàng)目—>prepare plugin module xxx for deployment,然后在項(xiàng)目的目錄就可以看到一個(gè)zip包,然后,在setting的plugin中install plugin from disk即可。
昨天,發(fā)現(xiàn)這個(gè)項(xiàng)目已經(jīng)有人實(shí)現(xiàn)了,比我造了三天,還傳到了jetbrains的公共倉(cāng)庫(kù),感覺(jué)寫(xiě)的比我的好,大家可以使用一下
同時(shí),歡迎訪問(wèn)我的個(gè)人網(wǎng)站,要是能star一下我的網(wǎng)站的代碼就更好了網(wǎng)站代碼,感謝
轉(zhuǎn)載于:https://www.cnblogs.com/w1570631036/p/7532611.html
總結(jié)
以上是生活随笔為你收集整理的idea插件之——在markdown复制粘贴图片的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 嘿嘿~
- 下一篇: 技术入股创业注意事项