diff --git a/kdoc/kdoc.iml b/kdoc/kdoc.iml index 1b17856053a..8803e05068b 100644 --- a/kdoc/kdoc.iml +++ b/kdoc/kdoc.iml @@ -128,6 +128,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/kdoc/module.kt b/kdoc/module.kt index 1b1d078931a..e9249b20365 100644 --- a/kdoc/module.kt +++ b/kdoc/module.kt @@ -4,6 +4,12 @@ fun project() { module("kdoc") { classpath += "dist/kotlinc/lib/intellij-core.jar" classpath += "dist/kotlinc/lib/kotlin-compiler.jar" + + // TODO its a bit sad we can't use patterns here... + addClasspathEntry("dist/kotlinc/lib/pegdown-1.1.0.jar") + addClasspathEntry("dist/kotlinc/lib/parboiled-core-1.0.2.jar") + addClasspathEntry("dist/kotlinc/lib/parboiled-java-1.0.2.jar") + addSourceFiles("src/main/kotlin") } } \ No newline at end of file diff --git a/kdoc/pom.xml b/kdoc/pom.xml index 89cf9ed90f2..5e697a084e2 100644 --- a/kdoc/pom.xml +++ b/kdoc/pom.xml @@ -39,6 +39,13 @@ system ${kotlin-sdk}/lib/kotlin-compiler.jar + + + org.pegdown + pegdown + 1.1.0 + + junit junit diff --git a/kdoc/src/main/kotlin/org/jetbrains/kotlin/doc/templates/PackageTemplateSupport.kt b/kdoc/src/main/kotlin/org/jetbrains/kotlin/doc/templates/PackageTemplateSupport.kt index b0170dd734c..1224d555fc0 100644 --- a/kdoc/src/main/kotlin/org/jetbrains/kotlin/doc/templates/PackageTemplateSupport.kt +++ b/kdoc/src/main/kotlin/org/jetbrains/kotlin/doc/templates/PackageTemplateSupport.kt @@ -63,9 +63,15 @@ abstract class PackageTemplateSupport(open val pkg: KPackage) : KDocTemplate() { print("""${function.name}""") printParameters(function) println("""""") - println("""""") - println("""
""") - println("""          ${deprecated} ${function.detailedDescription}""") + println("") + if (true) { + val detail = function.detailedDescription + println("""${detail}""") + } else { + println("""
""") + println("""          ${deprecated} ${function.detailedDescription}""") + } + println("""""") println("""""") } diff --git a/kdoc/src/main/kotlin/org/jetbrains/kotlin/model/KotlinModel.kt b/kdoc/src/main/kotlin/org/jetbrains/kotlin/model/KotlinModel.kt index c7808e5e4ff..2f90ff67d32 100644 --- a/kdoc/src/main/kotlin/org/jetbrains/kotlin/model/KotlinModel.kt +++ b/kdoc/src/main/kotlin/org/jetbrains/kotlin/model/KotlinModel.kt @@ -21,6 +21,14 @@ import org.jetbrains.jet.lang.descriptors.ValueParameterDescriptor import org.jetbrains.jet.lang.psi.JetFile import org.jetbrains.jet.lang.descriptors.PropertyDescriptor import org.jetbrains.jet.lang.descriptors.TypeParameterDescriptor +import org.pegdown.PegDownProcessor +import org.pegdown.LinkRenderer +import org.pegdown.ast.WikiLinkNode +import org.pegdown.LinkRenderer.Rendering +import org.pegdown.ast.RefLinkNode +import org.pegdown.ast.AutoLinkNode +import org.pegdown.ast.ExpLinkNode +import org.pegdown.Extensions fun containerName(descriptor: DeclarationDescriptor): String = qualifiedName(descriptor.getContainingDeclaration()) @@ -132,6 +140,8 @@ class KModel(var context: BindingContext, var title: String = "Documentation", v public val classes: Collection get() = packages.flatMap{ it.classes } + public var markdownProcessor: PegDownProcessor = PegDownProcessor(Extensions.ALL) + /** Loads the model from the given set of source files */ fun load(sources: List): Unit { val allNamespaces = HashSet() @@ -317,8 +327,8 @@ class KModel(var context: BindingContext, var title: String = "Documentation", v } buffer.append(text) } - // TODO convert any macros or wiki text! - return buffer.toString() ?: "" + val linkRenderer = CustomLinkRenderer(descriptor) + return wikiConvert(buffer.toString() ?: "", linkRenderer) } else { return text } @@ -326,6 +336,9 @@ class KModel(var context: BindingContext, var title: String = "Documentation", v return "" } + fun wikiConvert(text: String, linkRenderer: LinkRenderer): String { + return markdownProcessor.markdownToHtml(text, linkRenderer).sure() + } fun getType(aType: JetType?): KType? { if (aType != null) { @@ -361,6 +374,30 @@ class KModel(var context: BindingContext, var title: String = "Documentation", v } } +class CustomLinkRenderer(descriptor: DeclarationDescriptor) : LinkRenderer() { + + override fun render(node : WikiLinkNode?) : Rendering? { + println("LinkRenderer.render(WikiLinkNode): $node") + // TODO translate the wiki link to a Class/function/property/extensionFunction etc + return super.render(node) + } + + override fun render(node : RefLinkNode?, url : String?, title : String?, text : String?) : Rendering? { + // println("LinkRenderer.render(RefLinkNode): $node url: $url title: $title text: $text") + return super.render(node, url, title, text) + } + + override fun render(node : AutoLinkNode?) : Rendering? { + // println("LinkRenderer.render(AutoLinkNode): $node") + return super.render(node) + } + + override fun render(node : ExpLinkNode?, text : String?) : Rendering? { + // println("LinkRenderer.render(ExpLinkNode): $node text: $text") + return super.render(node, text) + } +} + abstract class KAnnotated { public open var description: String = "" diff --git a/kdoc/src/test/kotlin/test/kotlin/template/PegdownTest.kt b/kdoc/src/test/kotlin/test/kotlin/template/PegdownTest.kt new file mode 100644 index 00000000000..0cc52610617 --- /dev/null +++ b/kdoc/src/test/kotlin/test/kotlin/template/PegdownTest.kt @@ -0,0 +1,54 @@ +package test.pegdown + +import kotlin.* +import kotlin.util.* +import kotlin.test.* + +import junit.framework.TestCase +import org.pegdown.* +import org.pegdown.ast.* +import org.pegdown.LinkRenderer.Rendering + +class PegdownTest() : TestCase() { + var markdownProcessor = PegDownProcessor(Extensions.ALL) + var linkRenderer = CustomLinkRenderer() + + fun testPegDown() { + val markups = arrayList( + "hello **there **", + "a [[WikiLink]] blah", + "a [[WikiLink someText]] blah", + "a [[SomeClass.property]] blah", + "a [[SomeClass.method()]] blah", + "a [Link](somewhere) blah") + + for (text in markups) { + val answer = markdownProcessor.markdownToHtml(text, linkRenderer).sure() + println("$text = $answer") + } + } +} + + +class CustomLinkRenderer() : LinkRenderer() { + + override fun render(node : WikiLinkNode?) : Rendering? { + println("LinkRenderer.render(WikiLinkNode): $node") + return super.render(node) + } + + override fun render(node : RefLinkNode?, url : String?, title : String?, text : String?) : Rendering? { + println("LinkRenderer.render(RefLinkNode): $node url: $url title: $title text: $text") + return super.render(node, url, title, text) + } + + override fun render(node : AutoLinkNode?) : Rendering? { + println("LinkRenderer.render(AutoLinkNode): $node") + return super.render(node) + } + + override fun render(node : ExpLinkNode?, text : String?) : Rendering? { + println("LinkRenderer.render(ExpLinkNode): $node text: $text") + return super.render(node, text) + } +} diff --git a/runtests/runtests.iml b/runtests/runtests.iml index 6676eb47c23..d3512eba98c 100644 --- a/runtests/runtests.iml +++ b/runtests/runtests.iml @@ -11,6 +11,7 @@ + diff --git a/runtests/test/stdlib/testall/PegdownAllTest.java b/runtests/test/stdlib/testall/PegdownAllTest.java new file mode 100644 index 00000000000..338ae434fd8 --- /dev/null +++ b/runtests/test/stdlib/testall/PegdownAllTest.java @@ -0,0 +1,28 @@ +/* + * Copyright 2010-2012 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 stdlib.testall; + +import junit.framework.TestSuite; +import test.pegdown.*; + +/** + */ +public class PegdownAllTest { + public static TestSuite suite() { + return new TestSuite(PegdownTest.class); + } +} diff --git a/stdlib/ktSrc/JavaIterablesSpecial.kt b/stdlib/ktSrc/JavaIterablesSpecial.kt index 6edbb82e0e4..266593b150c 100644 --- a/stdlib/ktSrc/JavaIterablesSpecial.kt +++ b/stdlib/ktSrc/JavaIterablesSpecial.kt @@ -9,7 +9,7 @@ import java.util.Iterator /** * Count the number of elements in collection. * - * If base collection implements Collection interface method Collection#size() will be used. + * If base collection implements [[Collection]] interface method [[Collection.size()]] will be used. * Otherwise, this method determines the count by iterating through the all items. */ fun java.lang.Iterable.count() : Int {