Skip to content

Commit

Permalink
Highlighting from colors scheme
Browse files Browse the repository at this point in the history
  • Loading branch information
YiiGuxing committed Sep 26, 2018
1 parent 9b8b6e0 commit 8618b36
Show file tree
Hide file tree
Showing 4 changed files with 40 additions and 82 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,13 @@ import com.intellij.codeInsight.daemon.impl.HighlightInfo
import com.intellij.codeInsight.daemon.impl.HighlightInfoType
import com.intellij.lang.annotation.HighlightSeverity
import com.intellij.openapi.editor.DefaultLanguageHighlighterColors
import com.intellij.openapi.editor.colors.EditorColorsManager
import com.intellij.openapi.editor.colors.TextAttributesKey
import com.intellij.openapi.editor.colors.TextAttributesScheme
import com.intellij.openapi.editor.markup.TextAttributes
import com.intellij.psi.PsiElement
import com.intellij.ui.JBColor
import org.jetbrains.annotations.TestOnly
import java.awt.Color
import java.awt.Font

object RainbowHighlighter {

Expand All @@ -24,10 +25,10 @@ object RainbowHighlighter {
private const val KEY_SQUIGGLY_BRACKETS = "SQUIGGLY_BRACKETS_RAINBOW_COLOR"
private const val KEY_ANGLE_BRACKETS = "ANGLE_BRACKETS_RAINBOW_COLOR"

val roundBrackets: CharArray = charArrayOf('(', ')')
val squareBrackets: CharArray = charArrayOf('[', ']')
val squigglyBrackets: CharArray = charArrayOf('{', '}')
val angleBrackets: CharArray = charArrayOf('<', '>')
val roundBrackets: CharArray = charArrayOf('(', ')') @TestOnly get
val squareBrackets: CharArray = charArrayOf('[', ']') @TestOnly get
val squigglyBrackets: CharArray = charArrayOf('{', '}') @TestOnly get
val angleBrackets: CharArray = charArrayOf('<', '>') @TestOnly get

private val roundBracketsRainbowColorKeys: List<TextAttributesKey> =
createRainbowAttributesKeys(KEY_ROUND_BRACKETS, 5)
Expand All @@ -40,16 +41,9 @@ object RainbowHighlighter {

private val settings = RainbowSettings.instance

val roundBracketsColors: Array<Color> = jBColor(settings.lightRoundBracketsColors, settings.darkRoundBracketsColors)
val squareBracketsColors: Array<Color> = jBColor(settings.lightSquareBracketsColors, settings.darkSquareBracketsColors)
val squigglyBracketsColors: Array<Color> = jBColor(settings.lightSquigglyBracketsColors, settings.darkSquigglyBracketsColors)
val angleBracketsColor: Array<Color> = jBColor(settings.lightAngleBracketsColor, settings.darkAngleBracketsColor)

private val rainbowElement: HighlightInfoType = HighlightInfoType
.HighlightInfoTypeImpl(HighlightSeverity.INFORMATION, DefaultLanguageHighlighterColors.CONSTANT)

fun Array<Color>.getColor(level: Int) = this[level % size]

private val PsiElement.isRoundBracket get() = roundBrackets.any { textContains(it) }
private val PsiElement.isSquareBracket get() = squareBrackets.any { textContains(it) }
private val PsiElement.isSquigglyBracket get() = squigglyBrackets.any { textContains(it) }
Expand Down Expand Up @@ -92,32 +86,42 @@ object RainbowHighlighter {
}
}

private fun createTextAttributes(element: PsiElement, level: Int): TextAttributes? {
private fun List<TextAttributesKey>.getAttributesKey(level: Int) = this[level % size]

private fun getTextAttributes(colorsScheme: TextAttributesScheme, rainbowName: String, level: Int): TextAttributes {
val key = getRainbowAttributesKeys(rainbowName).getAttributesKey(level)
return colorsScheme.getAttributes(key)
}

@TestOnly
fun getRainbowColor(rainbowName: String, level: Int): Color? {
return getTextAttributes(EditorColorsManager.getInstance().globalScheme, rainbowName, level).foregroundColor
}

private fun getTextAttributes(colorsScheme: TextAttributesScheme?, element: PsiElement, level: Int): TextAttributes? {
if (!settings.isRainbowEnabled) {
return null
}

val color = when {
element.isRoundBracket -> if (settings.isEnableRainbowRoundBrackets) roundBracketsColors else return null
element.isSquareBracket -> if (settings.isEnableRainbowSquareBrackets) squareBracketsColors else return null
element.isSquigglyBracket -> if (settings.isEnableRainbowSquigglyBrackets) squigglyBracketsColors else return null
element.isAngleBracket -> if (settings.isEnableRainbowAngleBrackets) angleBracketsColor else return null
else -> roundBracketsColors
}.getColor(level)
val scheme = colorsScheme ?: EditorColorsManager.getInstance().globalScheme
val rainbowName = when {
element.isRoundBracket -> if (settings.isEnableRainbowRoundBrackets) NAME_ROUND_BRACKETS else null
element.isSquareBracket -> if (settings.isEnableRainbowSquareBrackets) NAME_SQUARE_BRACKETS else null
element.isSquigglyBracket -> if (settings.isEnableRainbowSquigglyBrackets) NAME_SQUIGGLY_BRACKETS else null
element.isAngleBracket -> if (settings.isEnableRainbowAngleBrackets) NAME_ANGLE_BRACKETS else null
else -> NAME_ROUND_BRACKETS
} ?: return null

return TextAttributes(color, null, null, null, Font.PLAIN)
return getTextAttributes(scheme, rainbowName, level)
}

fun getHighlightInfo(element: PsiElement, level: Int)
: HighlightInfo? = createTextAttributes(element, level)
?.let {
fun getHighlightInfo(colorsScheme: TextAttributesScheme?, element: PsiElement, level: Int)
: HighlightInfo? = getTextAttributes(colorsScheme, element, level)
?.let { attr ->
HighlightInfo
.newHighlightInfo(rainbowElement)
.textAttributes(it)
.textAttributes(attr)
.range(element)
.create()
}

private fun jBColor(light: Array<String>, dark: Array<String>): Array<Color> =
light.zip(dark).map { JBColor(Integer.decode(it.first), Integer.decode(it.second)) }.toTypedArray()
}
Original file line number Diff line number Diff line change
Expand Up @@ -25,48 +25,6 @@ class RainbowSettings : PersistentStateComponent<RainbowSettings> {
var isRainbowifyKotlinLabel = true
var isOverrideMatchedBraceAttributes = true

var lightRoundBracketsColors = arrayOf(
"0xE66A01",
"0x1B5E20",
"0x006BE7",
"0x283593",
"0x004D40"
)

var darkRoundBracketsColors = arrayOf(
"0xE6B422",
"0x2196F3",
"0x43A047",
"0x3F51B5",
"0x00897B"
)

var lightSquareBracketsColors = arrayOf(
"0x0B9087",
"0x827717",
"0x6444E6"
)

var darkSquareBracketsColors = arrayOf(
"0x33CCFF",
"0xD4E157",
"0x8080FF"
)

var lightSquigglyBracketsColors = arrayOf(
"0x0057D2",
"0x558B2F",
"0xFF6D27"
)

var darkSquigglyBracketsColors = arrayOf(
"0x1976D2",
"0x8BC34A",
"0xFF9863"
)

var lightAngleBracketsColor = lightRoundBracketsColors
var darkAngleBracketsColor = darkRoundBracketsColors

@Nullable
override fun getState() = this
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,9 +55,10 @@ abstract class RainbowHighlightVisitor : HighlightVisitor {
level: Int,
startElement: PsiElement?,
endElement: PsiElement?) {
getHighlightInfo(this, level)
val holder = highlightInfoHolder ?: return
getHighlightInfo(holder.colorsScheme, this, level)
?.also {
highlightInfoHolder?.add(it)
holder.add(it)

if (startElement != null || endElement != null) {
val color = it.forcedTextAttributes.foregroundColor
Expand Down
Original file line number Diff line number Diff line change
@@ -1,23 +1,18 @@
package com.github.izhangzhihao.rainbow.brackets

import com.github.izhangzhihao.rainbow.brackets.RainbowHighlighter.angleBrackets
import com.github.izhangzhihao.rainbow.brackets.RainbowHighlighter.angleBracketsColor
import com.github.izhangzhihao.rainbow.brackets.RainbowHighlighter.roundBracketsColors
import com.github.izhangzhihao.rainbow.brackets.RainbowHighlighter.squareBracketsColors
import com.github.izhangzhihao.rainbow.brackets.RainbowHighlighter.squigglyBracketsColors
import com.github.izhangzhihao.rainbow.brackets.RainbowHighlighter.roundBrackets
import com.github.izhangzhihao.rainbow.brackets.RainbowHighlighter.squareBrackets
import com.github.izhangzhihao.rainbow.brackets.RainbowHighlighter.squigglyBrackets
import com.github.izhangzhihao.rainbow.brackets.RainbowHighlighter.getColor

val brackets = roundBrackets + squareBrackets + squigglyBrackets + angleBrackets

fun CharSequence.toChar() = elementAt(0)

fun roundLevel(level: Int) = roundBracketsColors.getColor(level)
fun roundLevel(level: Int) = RainbowHighlighter.getRainbowColor(RainbowHighlighter.NAME_ROUND_BRACKETS, level)

fun squigglyLevel(level: Int) = squigglyBracketsColors.getColor(level)
fun squigglyLevel(level: Int) = RainbowHighlighter.getRainbowColor(RainbowHighlighter.NAME_SQUIGGLY_BRACKETS, level)

fun angleLevel(level: Int) = angleBracketsColor.getColor(level)
fun angleLevel(level: Int) = RainbowHighlighter.getRainbowColor(RainbowHighlighter.NAME_ANGLE_BRACKETS, level)

fun squareLevel(level: Int) = squareBracketsColors.getColor(level)
fun squareLevel(level: Int) = RainbowHighlighter.getRainbowColor(RainbowHighlighter.NAME_SQUARE_BRACKETS, level)

0 comments on commit 8618b36

Please sign in to comment.