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.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>

2.实现接口

Hello World的讲解看看这位作者的吧。

(1)首先,在img2md中定义一个PasteImageHandler类,并在xml中注册,该类的意思是是每次在markdown文件中使用ctrl+v(粘贴)的时候,先调用下面这个函数,如果符合条件,则进入:PasteImageFromClipboard。

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的配置文件如下:

    <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 {
@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的流程:

  • 判断上传的图片是否为空,如果为空,则弹出提示框
  • 判断当前文件是不是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) {//获取七牛的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即可,但是,当今的做云的越来越多,不能一一实现,我们可以提供一个模板,供开发者使用,只要自己实现了代码添加包即可。

4.拓展其他云

本来是只做七牛云的,但是想了一想,只做七牛云好像没啥意思,想拓展腾讯云、阿里云、又拍云等等,顾提供了一个样本类,供开发者使用。

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一下,链接点这

5.插件打包

写好代码之后,需要打包让自己或者别人使用,右键项目—>prepare plugin module xxx for deployment,然后在项目的目录就可以看到一个zip包,然后,在setting的plugin中install plugin from disk即可。

昨天,发现这个项目已经有人实现了,比我造了三天,还传到了jetbrains的公共仓库,感觉写的比我的好,大家可以使用一下

同时,欢迎访问我的[个人网站](http://www.wenzhihuai.com),要是能star一下我的网站的代码就更好了[网站代码](https://github.com/Zephery/newblog),感谢

idea插件之——在markdown复制粘贴图片的更多相关文章

  1. CSDN中的MARKDOWN编辑器如何快速复制粘贴图片?

    前言 我们在使用csdn的markdown编辑器复制其它网站图片,按住ctrl+C复制选择图片,然后按ctrl+V粘贴图片到md编辑器无任何反应!markdown编辑器每次都没法复制粘贴截图! 下面小 ...

  2. 百度ueditor 拖文件或world 里面复制粘贴图片到编辑中 上传到第三方问题

    我这边从world 里面复制粘贴图片到编辑器中,它自动给我上传了,但是我是用的第三方的要设置一个token值,我找了很久,也没有找到应该在哪里设置这个上传的参数,如果是点击图片上传,我知道在dialo ...

  3. Android Studio 复制粘贴图片到drawable文件夹没有效果 - 解决方法

    我想放一些图片到drawable文件夹里面,但是简单的复制文件,粘贴文件,或者拖拽文件,都不起作用.不知道为什么,之前是可以的,突然就不行了. 解决方案 在drawable文件夹的目录上右键,选择Re ...

  4. ckeditor富文本编辑器的使用和图片上传,复制粘贴图片上传

    自动导入Word图片,或者粘贴Word内容时自动上传所有的图片,并且最终保留Word样式,这应该是Web编辑器里面最基本的一个需求功能了.一般情况下我们将Word内容粘贴到Web编辑器(富文本编辑器) ...

  5. 10.20_web编辑器复制粘贴图片

    (1) http://q.cnblogs.com/q/19865/ (2) http://www.oschina.net/search?scope=project&q=FreeTextBox

  6. eWebEditor复制粘贴图片时过滤域名

    1.找到form.js 路径:plugins/frame/scripts/form.js 这个方法: 2.替换这个方法 /** * 处理参数 */ Form.prototype.processReqP ...

  7. 重新想象 Windows 8 Store Apps (40) - 剪切板: 复制/粘贴文本, html, 图片, 文件

    [源码下载] 重新想象 Windows 8 Store Apps (40) - 剪切板: 复制/粘贴文本, html, 图片, 文件 作者:webabcd 介绍重新想象 Windows 8 Store ...

  8. Ckeditor 4 复制粘贴截图并转化base64格式保存至数据库

    虽然Ckeditor 中自带的有上传图片和文件的功能,但是有时候我们并不需要把图片保存至服务器的文件夹中. 反而是截图复制粘贴,把图片转化为base64格式保存在数据库中即可满足要求. 1.首先下载安 ...

  9. 原生js复制粘贴上传图片前后台代码,兼容firebox,chrome, ie11,亲测有效

    需求:粘贴上传图片,截图工具,右键粘贴,或者ctrl+v粘贴 方法1:可直接套用富文本框的图片上传功能,完成复制粘贴 缺点:麻烦,样式难控制 方法2:用原生js完成,以下案例基于此,样式请自己动手调整 ...

随机推荐

  1. NYOJ--488--dfs--素数环

    /* Name: NYOJ--488--素数环 Author: shen_渊 Date: 15/04/17 15:30 Description: DFS,素数打个表,37以内就够用了 */ #incl ...

  2. NYOJ--284--广搜+优先队列--坦克大战

    /* Name: NYOJ--284--坦克大战 Author: shen_渊 Date: 14/04/17 19:08 Description: 广度优先搜索+优先队列 注意清空地图 对输入地图进行 ...

  3. Head First 设计模式 第3章 装饰者模式

    第3章 装饰者模式 1.定义/说明 动态.透明的将职责附加到对象上(或从对象上撤销),而不影响其他对象.若要扩展功能,装饰者模式提供了比继承更富有弹性的替代方案. 2.介绍 首先让我们先来介绍一下场景 ...

  4. akoj-1280另类阶乘问题

    另类阶乘问题 Time Limit:3000MS  Memory Limit:65536K Total Submit:22 Accepted:20 Description 大家都知道阶乘这个概念,举个 ...

  5. linux下安装log4cplus

    wget http://sourceforge.net/projects/log4cplus/files/log4cplus-stable/1.1.2/log4cplus-x.x.x.tar.gz t ...

  6. Luogu P3367 【模板】并查集

    题目描述 如题,现在有一个并查集,你需要完成合并和查询操作. 输入输出格式 输入格式: 第一行包含两个整数N.M,表示共有N个元素和M个操作. 接下来M行,每行包含三个整数Zi.Xi.Yi 当Zi=1 ...

  7. C语言内存申请与使用

    1. 使用malloc申请一块空间,模拟KV存储的一个节点存储数据信息. #include<stdio.h> #include <unistd.h> #include < ...

  8. C++11 中值得关注的几大变化(网摘)

    C++11 中值得关注的几大变化(详解) 原文出处:[陈皓 coolshell] 源文章来自前C++标准委员会的 Danny Kalev 的 The Biggest Changes in C++11 ...

  9. Three.js使用局部纹理更新

    THREE.js开发的应用运行在iphone5下发现有些时候会崩溃,跟了几天发现是因为Sprite太多频繁更新纹理占用显存导致的.通常解决纹理频繁更新问题就要用到one draw all方法,放到纹理 ...

  10. expungeStaleEntries函数解析

    1 /** * Reference queue for cleared WeakEntries */ // 所有Entry在构造时都传入该queue private final ReferenceQu ...