每次在idea的markdown中要粘贴图片的时候,要么复制连接,要么须要将软件手动上传到七牛云,本人根据了holgerbrandl/pasteimages这个本地的软件修改了下源码,变成了如今的做品,同时,还能支持扩展,可是这部分还没完成,代码存放位置,插件下载地址
此工具可运行在Intellij、Python、PhpStorm等jetbrains的全部软件中,使用效果以下:
html
1.搭建环境
2.实现Action接口
3.Setting的设置
4.拓展cdn
5.插件打包java
主要是逻辑的关系,plugin.xml为配置文件、PasteImageHandler控制器,若是是ctrl+v这个动做,则进入PasteImageFromClipboard,而后开始逻辑判断
git
因为使用的是idea的旗舰版,软件中自带了idea的插件开发包,new->project,选择plugin
github
而后点击下一步,再而后是finish。页面结构以下:
api
配置文件:缓存
<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.html on 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>
Hello World的讲解看看这位做者的吧。
(1)首先,在img2md中定义一个PasteImageHandler类,并在xml中注册,该类的意思是是每次在markdown文件中使用ctrl+v(粘贴)的时候,先调用下面这个函数,若是符合条件,则进入:PasteImageFromClipboard。markdown
if ("Markdown".equals(fileType.getName())) { Image imageFromClipboard = ImageUtils.getImageFromClipboard(); if (imageFromClipboard != null) { assert caret == null : "Invocation of 'paste' operation for specific caret is not supported"; PasteImageFromClipboard action = new PasteImageFromClipboard(); AnActionEvent event = createAnEvent(action, dataContext); action.actionPerformed(event); return; } }
plugin.xml的配置文件以下:app
<extensions defaultExtensionNs="com.intellij"> <editorActionHandler action="EditorPaste" implementationClass="img2md.PasteImageHandler" order="first"/> </extensions>
(2)右键src,新建AnAction的一个继承类:PasteImageFromClipboard,重写actionPerformed方法,该方法声明要作什么。其中,定义了一个ImageInsertSettingPanel来对粘贴以后的弹出的选项。
maven
随后,plugin.xml中就多了一个action:ide
<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>
弹出的选项窗以下,能够选择文件名字,文件目录,是否透明化,是否圆角,图片大小,若是不想要此弹窗,我在设置中设置了一个功能按钮,下面会讲到。
原本是只作七牛云的,若是是七牛云,中间的那个自定义框不须要管,只须要填好key和secret便可使用。
实现过程:
(1)右键,new>GUI FORM:
(2)在MySetting.form选好本身须要的按钮,便可在MySetting.java中实现逻辑
(3)须要重写的方法
找出类的实现关系:
idea sdk中配置了某些方法是能够不实现的,例如getHelpTopic、createComponent等,经常使用的方法通常以下:
public interface UnnamedConfigurable { @Nullable JComponent createComponent();//打开设置的时候页面,若是须要侦听某些button,须要在这里配置,可无 boolean isModified();//是否能够定义,通常为true,想写死的话就返回false void apply() throws ConfigurationException;//设置填好后点击apply或者ok,这里咱们保存填写的东西 default void reset() {//初始化,打开设置的初始化信息 } default void disposeUIResources() {//关闭以后的资源 } }
保存填写的信息,idea sdk给咱们提供了一个api,PropertiesComponent.getInstance(),感受略像缓存,有人说保存在xml中,具体我也不太了解,有待深刻。
(4)配置PasteImageFromClipboard的流程:
(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) {//获取七牛的token System.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便可,可是,当今的作云的愈来愈多,不能一一实现,咱们能够提供一个模板,供开发者使用,只要本身实现了代码添加包便可。
原本是只作七牛云的,可是想了一想,只作七牛云好像没啥意思,想拓展腾讯云、阿里云、又拍云等等,顾提供了一个样本类,供开发者使用。
public class Main { public boolean sendpic(String filepath) {//提供文件路径 return true;//返回结果 } }
填写完代码以后,还仍需一个添加包的列表,添加完包以后进行调试,这里采用java的动态部署,生成动态类,规定主函数为Main,必须有个sendpic的方法,将图片的路径传过去,本身实现上传的代码
testYourCodeButton.addActionListener(new ActionListener() { @Override public 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();//调用获得的上边的方法method if (!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一下,连接点这
写好代码以后,须要打包让本身或者别人使用,右键项目—>prepare plugin module xxx for deployment,而后在项目的目录就能够看到一个zip包,而后,在setting的plugin中install plugin from disk便可。
昨天,发现这个项目已经有人实现了,比我造了三天,还传到了jetbrains的公共仓库,感受写的比个人好,你们可使用一下