Skip to content

Commit a14dcfd

Browse files
committed
feat(settings): 新增远程单词映射功能
- 在CommonSettingsView中添加远程词库URL输入和操作按钮UI组件 - 实现远程URL测试连接和导入映射功能 - 在EasyDocConfig中新增remoteWordMapUrl配置项 - 修改getWordMapWithProject方法以支持远程词库覆盖本地映射
1 parent 478d3d6 commit a14dcfd

File tree

3 files changed

+139
-0
lines changed

3 files changed

+139
-0
lines changed

src/main/java/com/star/easydoc/config/EasyDocConfig.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import com.intellij.openapi.project.Project;
1313
import com.intellij.openapi.project.ProjectManager;
1414
import com.star.easydoc.common.Consts;
15+
import com.star.easydoc.service.RemoteWordMapService;
1516

1617
/**
1718
* 持久化配置文件
@@ -142,6 +143,9 @@ public class EasyDocConfig {
142143
/** 项目级别单词映射 */
143144
private SortedMap<String, TreeMap<String, String>> projectWordMap = new TreeMap<>();
144145

146+
/** 远程单词映射URL */
147+
private String remoteWordMapUrl = "https://raw.githubusercontent.com/pig-mesh/easy_javadoc/refs/heads/master/keywords.txt";
148+
145149
/**
146150
* 类模板配置
147151
*/
@@ -464,9 +468,13 @@ public SortedMap<String, String> getWordMap() {
464468
@JSONField(serialize = false, deserialize = false)
465469
public Map<String, String> getWordMapWithProject() {
466470
Map<String, String> map = Maps.newHashMap();
471+
472+
// 先添加本地全局单词映射
467473
if (wordMap != null) {
468474
map.putAll(wordMap);
469475
}
476+
477+
// 添加项目级别单词映射
470478
Project project = DataManager.getInstance()
471479
.getDataContextFromFocus()
472480
.getResultSync()
@@ -477,6 +485,15 @@ public Map<String, String> getWordMapWithProject() {
477485
map.putAll(projectMap);
478486
}
479487
}
488+
489+
// 最后添加远程单词映射(会覆盖本地和项目映射)
490+
if (remoteWordMapUrl != null && !remoteWordMapUrl.trim().isEmpty()) {
491+
Map<String, String> remoteWordMap = RemoteWordMapService.fetchRemoteWordMap(remoteWordMapUrl);
492+
if (!remoteWordMap.isEmpty()) {
493+
map.putAll(remoteWordMap);
494+
}
495+
}
496+
480497
return map;
481498
}
482499

@@ -747,4 +764,12 @@ public Integer getOpenaiTopK() {
747764
public void setOpenaiTopK(Integer openaiTopK) {
748765
this.openaiTopK = openaiTopK;
749766
}
767+
768+
public String getRemoteWordMapUrl() {
769+
return remoteWordMapUrl;
770+
}
771+
772+
public void setRemoteWordMapUrl(String remoteWordMapUrl) {
773+
this.remoteWordMapUrl = remoteWordMapUrl;
774+
}
750775
}

src/main/java/com/star/easydoc/view/settings/CommonSettingsConfigurable.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,9 @@ public boolean isModified() {
104104
if (!Objects.equals(config.getCustomUrl(), view.getCustomUrlTextField().getText())) {
105105
return true;
106106
}
107+
if (!Objects.equals(config.getRemoteWordMapUrl(), view.getRemoteWordMapUrlTextField().getText())) {
108+
return true;
109+
}
107110
return false;
108111
}
109112

@@ -128,6 +131,7 @@ public void apply() throws ConfigurationException {
128131
config.setOpenaiTemperature(view.getOpenaiTemperatureTextField().getText() != null ? Double.parseDouble(view.getOpenaiTemperatureTextField().getText()) : null);
129132
config.setOpenaiTopK(view.getOpenaiTopKTextField().getText() != null ? Integer.parseInt(view.getOpenaiTopKTextField().getText()) : null);
130133
config.setCustomUrl(StringUtils.strip(view.getCustomUrlTextField().getText()));
134+
config.setRemoteWordMapUrl(view.getRemoteWordMapUrlTextField().getText());
131135
if (config.getWordMap() == null) {
132136
config.setWordMap(new TreeMap<>());
133137
}

src/main/java/com/star/easydoc/view/settings/CommonSettingsView.java

Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
import com.star.easydoc.common.util.HttpUtil;
3737
import org.apache.commons.io.FileUtils;
3838
import org.apache.commons.lang3.StringUtils;
39+
import com.star.easydoc.service.RemoteWordMapService;
3940

4041
/**
4142
* @author wangchao
@@ -106,6 +107,12 @@ public class CommonSettingsView {
106107
private JBList<String> projectList;
107108
private JBList<Entry<String, String>> projectTypeMapList;
108109

110+
// 远程单词映射URL相关的UI组件
111+
private JLabel remoteWordMapUrlLabel;
112+
private JTextField remoteWordMapUrlTextField;
113+
private JButton remoteWordMapTestButton;
114+
private JButton remoteWordMapImportButton;
115+
109116
private static final String CUSTOM_HELP_URL
110117
= "https://github.com/starcwang/easy_javadoc/blob/master/doc/%E8%87%AA%E5%AE%9A%E4%B9%89%E6%8E%A5%E5%8F%A3%E8%AF%B4%E6%98%8E.md";
111118

@@ -223,6 +230,10 @@ public CommonSettingsView() {
223230
openaiTestButton.addActionListener(event -> testOpenAiConnection());
224231

225232
projectList.addListSelectionListener(e -> refreshProjectWordMap());
233+
234+
// 远程单词映射URL相关的事件监听器
235+
remoteWordMapTestButton.addActionListener(event -> testRemoteWordMapUrl());
236+
remoteWordMapImportButton.addActionListener(event -> importRemoteWordMap());
226237
}
227238

228239
private void setVisible(Object selectedItem) {
@@ -659,6 +670,29 @@ public void customize(JList list, Entry<String, String> value, int index, boolea
659670
});
660671
wordMapPanel = toolbarDecorator.createPanel();
661672

673+
// 创建远程单词映射URL相关的UI组件
674+
remoteWordMapUrlLabel = new JLabel("远程词库:");
675+
remoteWordMapUrlTextField = new JTextField();
676+
remoteWordMapTestButton = new JButton("测试连接");
677+
remoteWordMapImportButton = new JButton("导入映射");
678+
679+
// 将远程URL组件添加到wordMapPanel
680+
JPanel remoteUrlPanel = new JPanel(new BorderLayout());
681+
JPanel urlInputPanel = new JPanel(new BorderLayout());
682+
JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
683+
684+
urlInputPanel.add(remoteWordMapUrlLabel, BorderLayout.WEST);
685+
urlInputPanel.add(remoteWordMapUrlTextField, BorderLayout.CENTER);
686+
buttonPanel.add(remoteWordMapTestButton);
687+
buttonPanel.add(remoteWordMapImportButton);
688+
urlInputPanel.add(buttonPanel, BorderLayout.EAST);
689+
690+
remoteUrlPanel.add(urlInputPanel, BorderLayout.NORTH);
691+
remoteUrlPanel.add(wordMapPanel, BorderLayout.CENTER);
692+
693+
// 用包含远程URL组件的面板替换原来的wordMapPanel
694+
wordMapPanel = remoteUrlPanel;
695+
662696
projectTypeMapList = new JBList<>(new CollectionListModel<>(Lists.newArrayList()));
663697
projectTypeMapList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
664698
projectTypeMapList.setCellRenderer(new ListCellRendererWrapper<Entry<String, String>>() {
@@ -731,6 +765,7 @@ public void refresh() {
731765
setOpenaiTemperatureTextField(config.getOpenaiTemperature() != null ? config.getOpenaiTemperature().toString() : "");
732766
setOpenaiTopKTextField(config.getOpenaiTopK() != null ? config.getOpenaiTopK().toString() : "");
733767
setCustomUrlTextField(config.getCustomUrl());
768+
setRemoteWordMapUrlTextField(config.getRemoteWordMapUrl());
734769
refreshWordMap();
735770
projectList.clearSelection();
736771
refreshProjectWordMap();
@@ -933,6 +968,81 @@ public void setOpenaiTopKTextField(String openaiTopK) {
933968
this.openaiTopKTextField.setText(openaiTopK);
934969
}
935970

971+
public JTextField getRemoteWordMapUrlTextField() {
972+
return remoteWordMapUrlTextField;
973+
}
974+
975+
public void setRemoteWordMapUrlTextField(String remoteWordMapUrl) {
976+
this.remoteWordMapUrlTextField.setText(remoteWordMapUrl);
977+
}
978+
979+
/**
980+
* 测试远程单词映射URL是否可访问
981+
*/
982+
private void testRemoteWordMapUrl() {
983+
String url = remoteWordMapUrlTextField.getText();
984+
if (url == null || url.trim().isEmpty()) {
985+
showTestResult("远程URL测试", "请先输入远程单词映射URL", false);
986+
return;
987+
}
988+
989+
try {
990+
boolean isValid = RemoteWordMapService.validateRemoteUrl(url);
991+
if (isValid) {
992+
showTestResult("远程URL测试", "远程URL连接成功!", true);
993+
} else {
994+
showTestResult("远程URL测试", "远程URL连接失败,请检查URL是否正确", false);
995+
}
996+
} catch (Exception e) {
997+
showTestResult("远程URL测试", "测试失败:" + e.getMessage(), false);
998+
}
999+
}
1000+
1001+
/**
1002+
* 从远程URL导入单词映射
1003+
*/
1004+
private void importRemoteWordMap() {
1005+
String url = remoteWordMapUrlTextField.getText();
1006+
if (url == null || url.trim().isEmpty()) {
1007+
showTestResult("远程导入", "请先输入远程单词映射URL", false);
1008+
return;
1009+
}
1010+
1011+
try {
1012+
Map<String, String> remoteWordMap = RemoteWordMapService.fetchRemoteWordMap(url);
1013+
if (remoteWordMap.isEmpty()) {
1014+
showTestResult("远程导入", "未获取到任何单词映射", false);
1015+
return;
1016+
}
1017+
1018+
// 将远程映射合并到本地全局映射中
1019+
SortedMap<String, String> localWordMap = config.getWordMap();
1020+
if (localWordMap == null) {
1021+
localWordMap = Maps.newTreeMap();
1022+
}
1023+
1024+
int overwriteCount = 0;
1025+
for (Map.Entry<String, String> entry : remoteWordMap.entrySet()) {
1026+
if (localWordMap.containsKey(entry.getKey())) {
1027+
overwriteCount++;
1028+
}
1029+
localWordMap.put(entry.getKey(), entry.getValue());
1030+
}
1031+
1032+
config.setWordMap(localWordMap);
1033+
refreshWordMap();
1034+
1035+
String message = String.format("成功导入 %d 个单词映射", remoteWordMap.size());
1036+
if (overwriteCount > 0) {
1037+
message += String.format(",覆盖了 %d 个已存在的映射", overwriteCount);
1038+
}
1039+
showTestResult("远程导入", message, true);
1040+
1041+
} catch (Exception e) {
1042+
showTestResult("远程导入", "导入失败:" + e.getMessage(), false);
1043+
}
1044+
}
1045+
9361046
private void testOpenAiConnection() {
9371047
try {
9381048
// 获取当前配置

0 commit comments

Comments
 (0)