package com.xiuyukeji.plugin.translation; import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.actionSystem.PlatformDataKeys; import com.intellij.openapi.editor.CaretModel; import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.SelectionModel; import com.intellij.openapi.util.IconLoader; import com.intellij.openapi.util.TextRange; import com.xiuyukeji.plugin.translation.translator.impl.GoogleTranslator; import org.apache.http.util.TextUtils; /** * 谷歌翻译插件 * * @author Created by jz on 2017/10/24 14:44 */ public class GoogleTranslation extends AnAction { private long mLatestClickTime; private final GoogleTranslator mTranslator = new GoogleTranslator(); public GoogleTranslation() { super(IconLoader.getIcon("/icons/translate.png")); } @Override public void actionPerformed(AnActionEvent e) { if (!isFastClick()) { getTranslation(e); } } private void getTranslation(AnActionEvent event) { Editor editor = event.getData(PlatformDataKeys.EDITOR); if (editor == null) { return; } SelectionModel model = editor.getSelectionModel(); String selectedText = model.getSelectedText(); if (TextUtils.isEmpty(selectedText)) { selectedText = getCurrentWords(editor); if (TextUtils.isEmpty(selectedText)) { return; } } String queryText = strip(addBlanks(selectedText)); new Thread(new RequestRunnable(mTranslator, editor, queryText)).start(); } private String getCurrentWords(Editor editor) { Document document = editor.getDocument(); CaretModel caretModel = editor.getCaretModel(); int caretOffset = caretModel.getOffset(); int lineNum = document.getLineNumber(caretOffset); int lineStartOffset = document.getLineStartOffset(lineNum); int lineEndOffset = document.getLineEndOffset(lineNum); String lineContent = document.getText(new TextRange(lineStartOffset, lineEndOffset)); char[] chars = lineContent.toCharArray(); int start = 0, end = 0, cursor = caretOffset - lineStartOffset; if (!Character.isLetter(chars[cursor])) { return null; } for (int ptr = cursor; ptr >= 0; ptr--) { if (!Character.isLetter(chars[ptr])) { start = ptr + 1; break; } } int lastLetter = 0; for (int ptr = cursor; ptr < lineEndOffset - lineStartOffset; ptr++) { lastLetter = ptr; if (!Character.isLetter(chars[ptr])) { end = ptr; break; } } if (end == 0) { end = lastLetter + 1; } return new String(chars, start, end - start); } private String addBlanks(String str) { String temp = str.replaceAll("_", " "); if (temp.equals(temp.toUpperCase())) { return temp; } return temp.replaceAll("([A-Z]+)", " $0"); } private String strip(String str) { return str.replaceAll("/\\*+", "") .replaceAll("\\*+/", "") .replaceAll("\\*", "") .replaceAll("//+", "") .replaceAll("\r\n", " ") .replaceAll("\\s+", " "); } private boolean isFastClick() { long time = System.currentTimeMillis(); long timeD = time - mLatestClickTime; if (0 < timeD && timeD < (long) 1000) { return true; } mLatestClickTime = time; return false; } }