Skip to content

Commit 65e70ad

Browse files
committed
add documentation builder (comments folder)
1 parent f7beac9 commit 65e70ad

4 files changed

Lines changed: 119 additions & 5 deletions

File tree

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
package com.github.xepozz.gitattributes.ide.documentation
2+
3+
import com.github.xepozz.crontab.ide.documentation.AttributesDocumentationUtils
4+
import com.github.xepozz.gitattributes.language.AttributesFile
5+
import com.github.xepozz.gitattributes.language.psi.AttributesDefinition
6+
import com.github.xepozz.gitattributes.language.psi.AttributesPattern
7+
import com.intellij.extapi.psi.ASTDelegatePsiElement
8+
import com.intellij.lang.ASTNode
9+
import com.intellij.lang.documentation.DocumentationMarkup
10+
import com.intellij.lang.documentation.DocumentationProvider
11+
import com.intellij.lang.documentation.QuickDocHighlightingHelper
12+
import com.intellij.markdown.utils.doc.DocMarkdownToHtmlConverter
13+
import com.intellij.openapi.editor.Editor
14+
import com.intellij.openapi.project.Project
15+
import com.intellij.openapi.util.TextRange
16+
import com.intellij.psi.PsiComment
17+
import com.intellij.psi.PsiDocCommentBase
18+
import com.intellij.psi.PsiElement
19+
import com.intellij.psi.PsiFile
20+
import com.intellij.psi.presentation.java.SymbolPresentationUtil
21+
import com.intellij.psi.util.PsiTreeUtil
22+
import java.util.function.Consumer
23+
24+
class AttributesDocumentationProvider : DocumentationProvider {
25+
override fun getUrlFor(element: PsiElement?, originalElement: PsiElement?): List<String>? {
26+
// if (element !is AttributesSchedule) return null
27+
// return listOf(AttributesGuruUtils.generateCrontabGuruUrl(element))
28+
return null
29+
}
30+
31+
override fun getCustomDocumentationElement(
32+
editor: Editor,
33+
file: PsiFile,
34+
contextElement: PsiElement?,
35+
targetOffset: Int
36+
): PsiElement? {
37+
if (file !is AttributesFile) return null
38+
39+
return PsiTreeUtil.findFirstParent(contextElement) { it is AttributesDefinition }
40+
}
41+
42+
/**
43+
* Extracts the key, value, file and documentation comment of a Simple key/value entry and returns
44+
* a formatted representation of the information.
45+
*/
46+
override fun generateDoc(element: PsiElement?, originalElement: PsiElement?): String? = null
47+
48+
override fun getQuickNavigateInfo(element: PsiElement?, originalElement: PsiElement?): String? = null
49+
50+
override fun generateRenderedDoc(comment: PsiDocCommentBase) = markdownToHtml(comment.text, comment.project)
51+
52+
fun markdownToHtml(string: String, project: Project) = string
53+
.split("\n")
54+
.joinToString("\n") { it.replaceFirst(Regex("#+\\s+"), "") }
55+
.let { DocMarkdownToHtmlConverter.convert(project, it) }
56+
57+
override fun findDocComment(file: PsiFile, range: TextRange): PsiDocCommentBase? {
58+
val element = file.findElementAt(range.startOffset) as? PsiComment ?: return null
59+
60+
return object : PsiCommentDelegate(element), PsiDocCommentBase {
61+
override fun getOwner() = element
62+
}
63+
}
64+
65+
override fun collectDocComments(file: PsiFile, sink: Consumer<in PsiDocCommentBase>) {
66+
buildList {
67+
addAll(PsiTreeUtil.findChildrenOfType(file, AttributesDefinition::class.java))
68+
}
69+
.forEach { expression ->
70+
println("comments for $expression")
71+
val comment = AttributesDocumentationUtils.findContextualDocumentationElement(expression) ?: return@forEach
72+
println("$comment for $expression")
73+
sink.accept(object : PsiCommentDelegate(comment), PsiDocCommentBase {
74+
override fun getOwner() = expression
75+
})
76+
}
77+
}
78+
79+
override fun generateHoverDoc(element: PsiElement, originalElement: PsiElement?) =
80+
generateDoc(element, originalElement)
81+
}
82+
83+
open class PsiCommentDelegate(val myComment: PsiComment) : PsiComment, ASTDelegatePsiElement() {
84+
override fun getTokenType() = myComment.tokenType
85+
86+
override fun getParent(): PsiElement? = myComment.parent
87+
88+
override fun getNode(): ASTNode = myComment.node
89+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package com.github.xepozz.crontab.ide.documentation
2+
3+
import com.github.xepozz.gitattributes.language.psi.AttributesTypes
4+
import com.intellij.psi.PsiComment
5+
import com.intellij.psi.PsiElement
6+
import com.intellij.psi.PsiWhiteSpace
7+
import com.intellij.psi.util.elementType
8+
9+
object AttributesDocumentationUtils {
10+
fun findCrontabElementDocumentation(element: PsiElement?): String =
11+
findContextualDocumentationElement(element)?.text?.replaceFirst("[# ]+", "") ?: ""
12+
13+
fun findContextualDocumentationElement(element: PsiElement?): PsiComment? {
14+
if (element == null) return null
15+
16+
var element = element.prevSibling
17+
while (element is PsiComment || element is PsiWhiteSpace || element.elementType == AttributesTypes.EOL) {
18+
if (element is PsiComment) {
19+
return element
20+
}
21+
element = element.prevSibling
22+
}
23+
24+
return null
25+
}
26+
}

src/main/kotlin/com/github/xepozz/gitattributes/language/psi/AttributesTokenSets.kt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,6 @@ package com.github.xepozz.gitattributes.language.psi
33
import com.intellij.psi.tree.TokenSet
44

55
object AttributesTokenSets {
6-
val EMPTY_SET = TokenSet.EMPTY
7-
86
val COMMENTS = TokenSet.create(AttributesTypes.COMMENT)
97
val STRING_LITERALS = TokenSet.create(AttributesTypes.PATTERN)
108
val WHITESPACES = TokenSet.WHITE_SPACE

src/main/resources/META-INF/plugin.xml

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,9 @@
3131
<!-- <lang.psiStructureViewFactory-->
3232
<!-- language="Gitattributes"-->
3333
<!-- implementationClass="com.github.xepozz.gitattributes.ide.structureView.AttributesStructureViewFactory"/>-->
34-
<!-- <lang.documentationProvider-->
35-
<!-- language="Gitattributes"-->
36-
<!-- implementationClass="com.github.xepozz.gitattributes.ide.documentation.AttributesDocumentationProvider"/>-->
34+
<lang.documentationProvider
35+
language="Gitattributes"
36+
implementationClass="com.github.xepozz.gitattributes.ide.documentation.AttributesDocumentationProvider"/>
3737
<codeInsight.lineMarkerProvider
3838
language="Gitattributes"
3939
implementationClass="com.github.xepozz.gitattributes.ide.AttributesLineMarkerProvider"/>
@@ -46,6 +46,7 @@
4646
<psi.referenceContributor
4747
language="Gitattributes"
4848
implementation="com.github.xepozz.gitattributes.ide.reference.AttributesReferenceContributor"/>
49+
4950
<!-- <localInspection-->
5051
<!-- language="Gitattributes" enabledByDefault="true" level="ERROR"-->
5152
<!-- groupName="Gitattributes schedule" displayName="Gitattributes schedule"-->

0 commit comments

Comments
 (0)