/*
* Copyright 2000-2015 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.intellij.plugins.markdown.highlighting;
import com.intellij.openapi.editor.colors.TextAttributesKey;
import com.intellij.openapi.fileTypes.SyntaxHighlighter;
import com.intellij.openapi.options.colors.AttributesDescriptor;
import com.intellij.openapi.options.colors.ColorDescriptor;
import com.intellij.openapi.options.colors.ColorSettingsPage;
import com.intellij.openapi.util.io.StreamUtil;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.CharsetToolkit;
import org.intellij.plugins.markdown.MarkdownBundle;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
public class MarkdownColorSettingsPage implements ColorSettingsPage {
private static final AttributesDescriptor[] ATTRIBUTE_DESCRIPTORS = AttributeDescriptorsHolder.INSTANCE.get();
@NotNull
public Map<String, TextAttributesKey> getAdditionalHighlightingTagToDescriptorMap() {
final Map<String, TextAttributesKey> result = new HashMap<>();
result.put("hh1", MarkdownHighlighterColors.HEADER_LEVEL_1_ATTR_KEY);
result.put("hh2", MarkdownHighlighterColors.HEADER_LEVEL_2_ATTR_KEY);
result.put("hh3", MarkdownHighlighterColors.HEADER_LEVEL_3_ATTR_KEY);
result.put("hh4", MarkdownHighlighterColors.HEADER_LEVEL_4_ATTR_KEY);
result.put("hh5", MarkdownHighlighterColors.HEADER_LEVEL_5_ATTR_KEY);
result.put("hh6", MarkdownHighlighterColors.HEADER_LEVEL_6_ATTR_KEY);
result.put("bold", MarkdownHighlighterColors.BOLD_ATTR_KEY);
result.put("boldm", MarkdownHighlighterColors.BOLD_MARKER_ATTR_KEY);
result.put("italic", MarkdownHighlighterColors.ITALIC_ATTR_KEY);
result.put("italicm", MarkdownHighlighterColors.ITALIC_MARKER_ATTR_KEY);
result.put("strike", MarkdownHighlighterColors.STRIKE_THROUGH_ATTR_KEY);
result.put("alink", MarkdownHighlighterColors.AUTO_LINK_ATTR_KEY);
result.put("link_def", MarkdownHighlighterColors.LINK_DEFINITION_ATTR_KEY);
result.put("link_text", MarkdownHighlighterColors.LINK_TEXT_ATTR_KEY);
result.put("link_label", MarkdownHighlighterColors.LINK_LABEL_ATTR_KEY);
result.put("link_dest", MarkdownHighlighterColors.LINK_DESTINATION_ATTR_KEY);
result.put("link_img", MarkdownHighlighterColors.IMAGE_ATTR_KEY);
result.put("link_title", MarkdownHighlighterColors.LINK_TITLE_ATTR_KEY);
result.put("code_span", MarkdownHighlighterColors.CODE_SPAN_ATTR_KEY);
result.put("code_block", MarkdownHighlighterColors.CODE_BLOCK_ATTR_KEY);
result.put("code_fence", MarkdownHighlighterColors.CODE_FENCE_ATTR_KEY);
result.put("quote", MarkdownHighlighterColors.BLOCK_QUOTE_ATTR_KEY);
result.put("ul", MarkdownHighlighterColors.UNORDERED_LIST_ATTR_KEY);
result.put("ol", MarkdownHighlighterColors.ORDERED_LIST_ATTR_KEY);
return result;
}
@NotNull
public AttributesDescriptor[] getAttributeDescriptors() {
return ATTRIBUTE_DESCRIPTORS;
}
@NotNull
public ColorDescriptor[] getColorDescriptors() {
return ColorDescriptor.EMPTY_ARRAY;
}
@NonNls
@NotNull
public String getDemoText() {
final InputStream stream = getClass().getResourceAsStream("SampleDocument.md");
try {
final String result = StreamUtil.readText(stream, CharsetToolkit.UTF8);
stream.close();
return StringUtil.convertLineSeparators(result);
}
catch (IOException ignored) {
}
return "*error loading text*";
}
@NotNull
public String getDisplayName() {
return MarkdownBundle.message("markdown.plugin.name");
}
@NotNull
public SyntaxHighlighter getHighlighter() {
return new MarkdownSyntaxHighlighter();
}
@Nullable
public Icon getIcon() {
return null;
}
private enum AttributeDescriptorsHolder {
INSTANCE;
private Map<String, TextAttributesKey> myMap = new HashMap<>();
AttributeDescriptorsHolder() {
put("markdown.editor.colors.text", MarkdownHighlighterColors.TEXT_ATTR_KEY);
put("markdown.editor.colors.bold", MarkdownHighlighterColors.BOLD_ATTR_KEY);
put("markdown.editor.colors.bold_marker", MarkdownHighlighterColors.BOLD_MARKER_ATTR_KEY);
put("markdown.editor.colors.italic", MarkdownHighlighterColors.ITALIC_ATTR_KEY);
put("markdown.editor.colors.italic_marker", MarkdownHighlighterColors.ITALIC_MARKER_ATTR_KEY);
put("markdown.editor.colors.strikethrough", MarkdownHighlighterColors.STRIKE_THROUGH_ATTR_KEY);
put("markdown.editor.colors.header_level_1", MarkdownHighlighterColors.HEADER_LEVEL_1_ATTR_KEY);
put("markdown.editor.colors.header_level_2", MarkdownHighlighterColors.HEADER_LEVEL_2_ATTR_KEY);
put("markdown.editor.colors.header_level_3", MarkdownHighlighterColors.HEADER_LEVEL_3_ATTR_KEY);
put("markdown.editor.colors.header_level_4", MarkdownHighlighterColors.HEADER_LEVEL_4_ATTR_KEY);
put("markdown.editor.colors.header_level_5", MarkdownHighlighterColors.HEADER_LEVEL_5_ATTR_KEY);
put("markdown.editor.colors.header_level_6", MarkdownHighlighterColors.HEADER_LEVEL_6_ATTR_KEY);
put("markdown.editor.colors.blockquote", MarkdownHighlighterColors.BLOCK_QUOTE_ATTR_KEY);
put("markdown.editor.colors.code_span", MarkdownHighlighterColors.CODE_SPAN_ATTR_KEY);
put("markdown.editor.colors.code_span_marker", MarkdownHighlighterColors.CODE_SPAN_MARKER_ATTR_KEY);
put("markdown.editor.colors.code_block", MarkdownHighlighterColors.CODE_BLOCK_ATTR_KEY);
put("markdown.editor.colors.code_fence", MarkdownHighlighterColors.CODE_FENCE_ATTR_KEY);
put("markdown.editor.colors.hrule", MarkdownHighlighterColors.HRULE_ATTR_KEY);
put("markdown.editor.colors.table_separator", MarkdownHighlighterColors.TABLE_SEPARATOR_ATTR_KEY);
put("markdown.editor.colors.blockquote_marker", MarkdownHighlighterColors.BLOCK_QUOTE_MARKER_ATTR_KEY);
put("markdown.editor.colors.list_marker", MarkdownHighlighterColors.LIST_MARKER_ATTR_KEY);
put("markdown.editor.colors.header_marker", MarkdownHighlighterColors.HEADER_MARKER_ATTR_KEY);
put("markdown.editor.colors.auto_link", MarkdownHighlighterColors.AUTO_LINK_ATTR_KEY);
put("markdown.editor.colors.explicit_link", MarkdownHighlighterColors.EXPLICIT_LINK_ATTR_KEY);
put("markdown.editor.colors.reference_link", MarkdownHighlighterColors.REFERENCE_LINK_ATTR_KEY);
put("markdown.editor.colors.image", MarkdownHighlighterColors.IMAGE_ATTR_KEY);
put("markdown.editor.colors.link_definition", MarkdownHighlighterColors.LINK_DEFINITION_ATTR_KEY);
put("markdown.editor.colors.link_text", MarkdownHighlighterColors.LINK_TEXT_ATTR_KEY);
put("markdown.editor.colors.link_label", MarkdownHighlighterColors.LINK_LABEL_ATTR_KEY);
put("markdown.editor.colors.link_destination", MarkdownHighlighterColors.LINK_DESTINATION_ATTR_KEY);
put("markdown.editor.colors.link_title", MarkdownHighlighterColors.LINK_TITLE_ATTR_KEY);
put("markdown.editor.colors.unordered_list", MarkdownHighlighterColors.UNORDERED_LIST_ATTR_KEY);
put("markdown.editor.colors.ordered_list", MarkdownHighlighterColors.ORDERED_LIST_ATTR_KEY);
put("markdown.editor.colors.list_item", MarkdownHighlighterColors.LIST_ITEM_ATTR_KEY);
put("markdown.editor.colors.html_block", MarkdownHighlighterColors.HTML_BLOCK_ATTR_KEY);
put("markdown.editor.colors.inline_html", MarkdownHighlighterColors.INLINE_HTML_ATTR_KEY);
}
@NotNull
public AttributesDescriptor[] get() {
final AttributesDescriptor[] result = new AttributesDescriptor[myMap.size()];
int i = 0;
for (Map.Entry<String, TextAttributesKey> entry : myMap.entrySet()) {
result[i++] = new AttributesDescriptor(MarkdownBundle.message(entry.getKey()), entry.getValue());
}
return result;
}
private void put(@NotNull String bundleKey, @NotNull TextAttributesKey attributes) {
if (myMap.put(bundleKey, attributes) != null) {
throw new IllegalArgumentException("Duplicated key: " + bundleKey);
}
}
}
}