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+ }
0 commit comments