diff options
Diffstat (limited to 'test')
202 files changed, 0 insertions, 9919 deletions
diff --git a/test/data/classes/annotatedClass.kt b/test/data/classes/annotatedClass.kt deleted file mode 100644 index 1b58f56c..00000000 --- a/test/data/classes/annotatedClass.kt +++ /dev/null @@ -1 +0,0 @@ -@Strictfp class Foo() {} diff --git a/test/data/classes/annotatedClassWithAnnotationParameters.kt b/test/data/classes/annotatedClassWithAnnotationParameters.kt deleted file mode 100644 index 930d6a62..00000000 --- a/test/data/classes/annotatedClassWithAnnotationParameters.kt +++ /dev/null @@ -1 +0,0 @@ -@Deprecated("should no longer be used") class Foo() {} diff --git a/test/data/classes/classWithCompanionObject.kt b/test/data/classes/classWithCompanionObject.kt deleted file mode 100644 index fdbd915d..00000000 --- a/test/data/classes/classWithCompanionObject.kt +++ /dev/null @@ -1,7 +0,0 @@ -class Klass() { - companion object { - val x = 1 - - fun foo() {} - } -} diff --git a/test/data/classes/classWithConstructor.kt b/test/data/classes/classWithConstructor.kt deleted file mode 100644 index 0751d570..00000000 --- a/test/data/classes/classWithConstructor.kt +++ /dev/null @@ -1 +0,0 @@ -class Klass(name: String)
\ No newline at end of file diff --git a/test/data/classes/classWithFunction.kt b/test/data/classes/classWithFunction.kt deleted file mode 100644 index a981cfb6..00000000 --- a/test/data/classes/classWithFunction.kt +++ /dev/null @@ -1,4 +0,0 @@ -class Klass { - fun fn() { - } -} diff --git a/test/data/classes/classWithProperty.kt b/test/data/classes/classWithProperty.kt deleted file mode 100644 index 2a849572..00000000 --- a/test/data/classes/classWithProperty.kt +++ /dev/null @@ -1,3 +0,0 @@ -class Klass { - val name: String = "" -}
\ No newline at end of file diff --git a/test/data/classes/companionObjectExtension.kt b/test/data/classes/companionObjectExtension.kt deleted file mode 100644 index 4b471376..00000000 --- a/test/data/classes/companionObjectExtension.kt +++ /dev/null @@ -1,10 +0,0 @@ -class Foo { - companion object Default { - } -} - - -/** - * The def - */ -val Foo.Default.x: Int get() = 1 diff --git a/test/data/classes/dataClass.kt b/test/data/classes/dataClass.kt deleted file mode 100644 index 62c6f0ec..00000000 --- a/test/data/classes/dataClass.kt +++ /dev/null @@ -1 +0,0 @@ -data class Foo() {} diff --git a/test/data/classes/emptyClass.kt b/test/data/classes/emptyClass.kt deleted file mode 100644 index abd20cc8..00000000 --- a/test/data/classes/emptyClass.kt +++ /dev/null @@ -1,3 +0,0 @@ -class Klass { - -}
\ No newline at end of file diff --git a/test/data/classes/emptyObject.kt b/test/data/classes/emptyObject.kt deleted file mode 100644 index 4138bf31..00000000 --- a/test/data/classes/emptyObject.kt +++ /dev/null @@ -1,3 +0,0 @@ -object Obj { - -}
\ No newline at end of file diff --git a/test/data/classes/genericClass.kt b/test/data/classes/genericClass.kt deleted file mode 100644 index db20ff7e..00000000 --- a/test/data/classes/genericClass.kt +++ /dev/null @@ -1,3 +0,0 @@ -class Klass<T> { - -}
\ No newline at end of file diff --git a/test/data/classes/indirectOverride.kt b/test/data/classes/indirectOverride.kt deleted file mode 100644 index 8d091b80..00000000 --- a/test/data/classes/indirectOverride.kt +++ /dev/null @@ -1,9 +0,0 @@ -abstract class C() { - abstract fun foo() -} - -abstract class D(): C() - -class E(): D() { - override fun foo() {} -} diff --git a/test/data/classes/innerClass.kt b/test/data/classes/innerClass.kt deleted file mode 100644 index 3c6e497d..00000000 --- a/test/data/classes/innerClass.kt +++ /dev/null @@ -1,5 +0,0 @@ -class C { - inner class D { - - } -}
\ No newline at end of file diff --git a/test/data/classes/javaAnnotationClass.kt b/test/data/classes/javaAnnotationClass.kt deleted file mode 100644 index 95600147..00000000 --- a/test/data/classes/javaAnnotationClass.kt +++ /dev/null @@ -1,5 +0,0 @@ -import java.lang.annotation.Retention -import java.lang.annotation.RetentionPolicy - -@Retention(RetentionPolicy.SOURCE) -public annotation class throws() diff --git a/test/data/classes/notOpenClass.kt b/test/data/classes/notOpenClass.kt deleted file mode 100644 index edee2c1a..00000000 --- a/test/data/classes/notOpenClass.kt +++ /dev/null @@ -1,7 +0,0 @@ -open class C() { - open fun f() {} -} - -class D() : C() { - override fun f() {} -} diff --git a/test/data/classes/sealedClass.kt b/test/data/classes/sealedClass.kt deleted file mode 100644 index 93350393..00000000 --- a/test/data/classes/sealedClass.kt +++ /dev/null @@ -1 +0,0 @@ -sealed class Foo() {} diff --git a/test/data/classes/secondaryConstructor.kt b/test/data/classes/secondaryConstructor.kt deleted file mode 100644 index e5cb2557..00000000 --- a/test/data/classes/secondaryConstructor.kt +++ /dev/null @@ -1,5 +0,0 @@ -class C() { - /** This is a secondary constructor. */ - constructor(s: String): this() { - } -} diff --git a/test/data/comments/directive.kt b/test/data/comments/directive.kt deleted file mode 100644 index b27f5a48..00000000 --- a/test/data/comments/directive.kt +++ /dev/null @@ -1,35 +0,0 @@ -/** - * Summary - * - * @sample example1 - * @sample example2 - * @sample X.example3 - * @sample X.Y.example4 - */ -val property = "test" - -fun example1(node: String) = if (true) { - println(property) -} - -fun example2(node: String) { - if (true) { - println(property) - } -} - -class X { - fun example3(node: String) { - if (true) { - println(property) - } - } - - class Y { - fun example4(node: String) { - if (true) { - println(property) - } - } - } -} diff --git a/test/data/comments/emptyDoc.kt b/test/data/comments/emptyDoc.kt deleted file mode 100644 index b87cce57..00000000 --- a/test/data/comments/emptyDoc.kt +++ /dev/null @@ -1 +0,0 @@ -val property = "test"
\ No newline at end of file diff --git a/test/data/comments/emptyDocButComment.kt b/test/data/comments/emptyDocButComment.kt deleted file mode 100644 index ceb24753..00000000 --- a/test/data/comments/emptyDocButComment.kt +++ /dev/null @@ -1,2 +0,0 @@ -/* comment */ -val property = "test"
\ No newline at end of file diff --git a/test/data/comments/emptySection.kt b/test/data/comments/emptySection.kt deleted file mode 100644 index 47d6b1a5..00000000 --- a/test/data/comments/emptySection.kt +++ /dev/null @@ -1,6 +0,0 @@ - -/** - * Summary - * @one - */ -val property = "test"
\ No newline at end of file diff --git a/test/data/comments/multilineDoc.kt b/test/data/comments/multilineDoc.kt deleted file mode 100644 index 31cfa3a7..00000000 --- a/test/data/comments/multilineDoc.kt +++ /dev/null @@ -1,7 +0,0 @@ -/** - * doc1 - * - * doc2 - * doc3 - */ -val property = "test"
\ No newline at end of file diff --git a/test/data/comments/multilineDocWithComment.kt b/test/data/comments/multilineDocWithComment.kt deleted file mode 100644 index 88d22642..00000000 --- a/test/data/comments/multilineDocWithComment.kt +++ /dev/null @@ -1,8 +0,0 @@ -/** - * doc1 - * - * doc2 - * doc3 - */ -// comment -val property = "test"
\ No newline at end of file diff --git a/test/data/comments/multilineSection.kt b/test/data/comments/multilineSection.kt deleted file mode 100644 index 6ef4df2c..00000000 --- a/test/data/comments/multilineSection.kt +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Summary - * @one - * line one - * line two - */ -val property = "test"
\ No newline at end of file diff --git a/test/data/comments/oneLineDoc.kt b/test/data/comments/oneLineDoc.kt deleted file mode 100644 index 92a40c67..00000000 --- a/test/data/comments/oneLineDoc.kt +++ /dev/null @@ -1,2 +0,0 @@ -/** doc */ -val property = "test"
\ No newline at end of file diff --git a/test/data/comments/oneLineDocWithComment.kt b/test/data/comments/oneLineDocWithComment.kt deleted file mode 100644 index c8467933..00000000 --- a/test/data/comments/oneLineDocWithComment.kt +++ /dev/null @@ -1,3 +0,0 @@ -/** doc */ -// comment -val property = "test"
\ No newline at end of file diff --git a/test/data/comments/oneLineDocWithEmptyLine.kt b/test/data/comments/oneLineDocWithEmptyLine.kt deleted file mode 100644 index e364c416..00000000 --- a/test/data/comments/oneLineDocWithEmptyLine.kt +++ /dev/null @@ -1,3 +0,0 @@ -/** doc */ - -val property = "test"
\ No newline at end of file diff --git a/test/data/comments/section1.kt b/test/data/comments/section1.kt deleted file mode 100644 index 7c763b4c..00000000 --- a/test/data/comments/section1.kt +++ /dev/null @@ -1,5 +0,0 @@ -/** - * Summary - * @one section one - */ -val property = "test"
\ No newline at end of file diff --git a/test/data/comments/section2.kt b/test/data/comments/section2.kt deleted file mode 100644 index e280793e..00000000 --- a/test/data/comments/section2.kt +++ /dev/null @@ -1,6 +0,0 @@ -/** - * Summary - * @one section one - * @two section two - */ -val property = "test"
\ No newline at end of file diff --git a/test/data/format/accessor.kt b/test/data/format/accessor.kt deleted file mode 100644 index 5a4d1742..00000000 --- a/test/data/format/accessor.kt +++ /dev/null @@ -1,5 +0,0 @@ -class C() { - var x: String - /** The getter returns an empty string. */ get() = "" - /** The setter does nothing. */ set(value) { } -} diff --git a/test/data/format/accessor.md b/test/data/format/accessor.md deleted file mode 100644 index 8279f452..00000000 --- a/test/data/format/accessor.md +++ /dev/null @@ -1,18 +0,0 @@ -[test](test/index) / [C](test/-c/index) / [x](test/-c/x) - - -# x - -`var x: String` -**Getter** - -The getter returns an empty string. - - -**Setter** - -The setter does nothing. - - - - diff --git a/test/data/format/annotatedTypeParameter.kt b/test/data/format/annotatedTypeParameter.kt deleted file mode 100644 index cc3bfc1a..00000000 --- a/test/data/format/annotatedTypeParameter.kt +++ /dev/null @@ -1,2 +0,0 @@ -public fun <E> containsAll(elements: Collection<@UnsafeVariance E>): @UnsafeVariance E { -} diff --git a/test/data/format/annotatedTypeParameter.md b/test/data/format/annotatedTypeParameter.md deleted file mode 100644 index 7d26a162..00000000 --- a/test/data/format/annotatedTypeParameter.md +++ /dev/null @@ -1,8 +0,0 @@ -[test](test/index) / [containsAll](test/contains-all) - - -# containsAll - -`fun <E> containsAll(elements: Collection<@UnsafeVariance E>): @UnsafeVariance E` - - diff --git a/test/data/format/annotationClass.kt b/test/data/format/annotationClass.kt deleted file mode 100644 index 89d494fb..00000000 --- a/test/data/format/annotationClass.kt +++ /dev/null @@ -1 +0,0 @@ -annotation class fancy diff --git a/test/data/format/annotationClass.md b/test/data/format/annotationClass.md deleted file mode 100644 index 03548aa3..00000000 --- a/test/data/format/annotationClass.md +++ /dev/null @@ -1,14 +0,0 @@ -[test](test/index) / [fancy](test/fancy/index) - - -# fancy - -`annotation class fancy` - - - -### Constructors - - -| [<init>](test/fancy/-init-) | `fancy()` | - diff --git a/test/data/format/annotationParams.kt b/test/data/format/annotationParams.kt deleted file mode 100644 index f259a740..00000000 --- a/test/data/format/annotationParams.kt +++ /dev/null @@ -1 +0,0 @@ -@JvmName("FFF") fun f() {} diff --git a/test/data/format/annotationParams.md b/test/data/format/annotationParams.md deleted file mode 100644 index 8cdd6e96..00000000 --- a/test/data/format/annotationParams.md +++ /dev/null @@ -1,8 +0,0 @@ -[test](test/index) / [f](test/f) - - -# f - -`@JvmName("FFF") fun f(): Unit` - - diff --git a/test/data/format/annotations.kt b/test/data/format/annotations.kt deleted file mode 100644 index 57f76249..00000000 --- a/test/data/format/annotations.kt +++ /dev/null @@ -1,6 +0,0 @@ -data class Foo { - inline fun bar(noinline notInlined: () -> Unit) { - } - - inline val x: Int -} diff --git a/test/data/format/annotations.md b/test/data/format/annotations.md deleted file mode 100644 index b898d55c..00000000 --- a/test/data/format/annotations.md +++ /dev/null @@ -1,26 +0,0 @@ -[test](test/index) / [Foo](test/-foo/index) - - -# Foo - -`data class Foo` - - - -### Constructors - - -| [<init>](test/-foo/-init-) | `Foo()` | - - -### Properties - - -| [x](test/-foo/x) | `val x: Int` | - - -### Functions - - -| [bar](test/-foo/bar) | `fun bar(notInlined: () -> Unit): Unit` | - diff --git a/test/data/format/bracket.html b/test/data/format/bracket.html deleted file mode 100644 index 5630073d..00000000 --- a/test/data/format/bracket.html +++ /dev/null @@ -1,14 +0,0 @@ -<HTML> -<HEAD> -<title>test / foo</title> -</HEAD> -<BODY> -<a href="test/index">test</a> / <a href="test/foo">foo</a><br/> -<br/> -<h1>foo</h1> -<code><span class="keyword">fun </span><span class="identifier">foo</span><span class="symbol">(</span><span class="symbol">)</span><span class="symbol">: </span><span class="identifier">Unit</span></code><br/> -<p>bar[]</p> -<br/> -<br/> -</BODY> -</HTML> diff --git a/test/data/format/bracket.kt b/test/data/format/bracket.kt deleted file mode 100644 index d41b0073..00000000 --- a/test/data/format/bracket.kt +++ /dev/null @@ -1,4 +0,0 @@ -/** - * bar[] - */ -fun foo() {} diff --git a/test/data/format/brokenLink.html b/test/data/format/brokenLink.html deleted file mode 100644 index 32135787..00000000 --- a/test/data/format/brokenLink.html +++ /dev/null @@ -1,14 +0,0 @@ -<HTML> -<HEAD> -<title>test / f</title> -</HEAD> -<BODY> -<a href="test/index">test</a> / <a href="test/f">f</a><br/> -<br/> -<h1>f</h1> -<code><span class="keyword">fun </span><span class="identifier">f</span><span class="symbol">(</span><span class="symbol">)</span><span class="symbol">: </span><span class="identifier">Unit</span></code><br/> -<p>This references <a href="#">noSuchIdentifier</a>.</p> -<br/> -<br/> -</BODY> -</HTML> diff --git a/test/data/format/brokenLink.kt b/test/data/format/brokenLink.kt deleted file mode 100644 index 268a986e..00000000 --- a/test/data/format/brokenLink.kt +++ /dev/null @@ -1,4 +0,0 @@ -/** - * This references [noSuchIdentifier]. - */ -fun f() { } diff --git a/test/data/format/classWithCompanionObject.html b/test/data/format/classWithCompanionObject.html deleted file mode 100644 index be9247ea..00000000 --- a/test/data/format/classWithCompanionObject.html +++ /dev/null @@ -1,46 +0,0 @@ -<HTML> -<HEAD> -<title>test / Klass</title> -</HEAD> -<BODY> -<a href="test/index">test</a> / <a href="test/-klass/index">Klass</a><br/> -<br/> -<h1>Klass</h1> -<code><span class="keyword">class </span><span class="identifier">Klass</span></code><br/> -<br/> -<br/> -<h3>Constructors</h3> -<table> -<tbody> -<tr> -<td> -<a href="test/-klass/-init-"><init></a></td> -<td> -<code><span class="identifier">Klass</span><span class="symbol">(</span><span class="symbol">)</span></code></td> -</tr> -</tbody> -</table> -<h3>Companion Object Properties</h3> -<table> -<tbody> -<tr> -<td> -<a href="test/-klass/x">x</a></td> -<td> -<code><span class="keyword">val </span><span class="identifier">x</span><span class="symbol">: </span><span class="identifier">Int</span></code></td> -</tr> -</tbody> -</table> -<h3>Companion Object Functions</h3> -<table> -<tbody> -<tr> -<td> -<a href="test/-klass/foo">foo</a></td> -<td> -<code><span class="keyword">fun </span><span class="identifier">foo</span><span class="symbol">(</span><span class="symbol">)</span><span class="symbol">: </span><span class="identifier">Unit</span></code></td> -</tr> -</tbody> -</table> -</BODY> -</HTML> diff --git a/test/data/format/classWithCompanionObject.kt b/test/data/format/classWithCompanionObject.kt deleted file mode 100644 index fdbd915d..00000000 --- a/test/data/format/classWithCompanionObject.kt +++ /dev/null @@ -1,7 +0,0 @@ -class Klass() { - companion object { - val x = 1 - - fun foo() {} - } -} diff --git a/test/data/format/classWithCompanionObject.md b/test/data/format/classWithCompanionObject.md deleted file mode 100644 index 9398c3d3..00000000 --- a/test/data/format/classWithCompanionObject.md +++ /dev/null @@ -1,26 +0,0 @@ -[test](test/index) / [Klass](test/-klass/index) - - -# Klass - -`class Klass` - - - -### Constructors - - -| [<init>](test/-klass/-init-) | `Klass()` | - - -### Companion Object Properties - - -| [x](test/-klass/x) | `val x: Int` | - - -### Companion Object Functions - - -| [foo](test/-klass/foo) | `fun foo(): Unit` | - diff --git a/test/data/format/codeSpan.html b/test/data/format/codeSpan.html deleted file mode 100644 index cc553043..00000000 --- a/test/data/format/codeSpan.html +++ /dev/null @@ -1,14 +0,0 @@ -<HTML> -<HEAD> -<title>test / foo</title> -</HEAD> -<BODY> -<a href="test/index">test</a> / <a href="test/foo">foo</a><br/> -<br/> -<h1>foo</h1> -<code><span class="keyword">fun </span><span class="identifier">foo</span><span class="symbol">(</span><span class="symbol">)</span><span class="symbol">: </span><span class="identifier">Unit</span></code><br/> -<p>This is a <code>code span</code>.</p> -<br/> -<br/> -</BODY> -</HTML> diff --git a/test/data/format/codeSpan.kt b/test/data/format/codeSpan.kt deleted file mode 100644 index 645f454a..00000000 --- a/test/data/format/codeSpan.kt +++ /dev/null @@ -1,4 +0,0 @@ -/** - * This is a `code span`. - */ -fun foo() {}
\ No newline at end of file diff --git a/test/data/format/companionObjectExtension.kt b/test/data/format/companionObjectExtension.kt deleted file mode 100644 index f452de2c..00000000 --- a/test/data/format/companionObjectExtension.kt +++ /dev/null @@ -1,10 +0,0 @@ -class Foo { - companion object Default { - } -} - - -/** - * The default object property. - */ -val Foo.Default.x: Int get() = 1 diff --git a/test/data/format/companionObjectExtension.md b/test/data/format/companionObjectExtension.md deleted file mode 100644 index 271da5b0..00000000 --- a/test/data/format/companionObjectExtension.md +++ /dev/null @@ -1,23 +0,0 @@ -[test](test/index) / [Foo](test/-foo/index) - - -# Foo - -`class Foo` - - - -### Constructors - - -| [<init>](test/-foo/-init-) | `Foo()` | - - -### Companion Object Extension Properties - - -| [x](test/x) | `val Foo.Default.x: Int` -The default object property. - - | - diff --git a/test/data/format/crossLanguage/kotlinExtendsJava/Bar.html b/test/data/format/crossLanguage/kotlinExtendsJava/Bar.html deleted file mode 100644 index e7b139d8..00000000 --- a/test/data/format/crossLanguage/kotlinExtendsJava/Bar.html +++ /dev/null @@ -1,37 +0,0 @@ -<HTML> -<HEAD> -<title>test / test.Bar</title> -</HEAD> -<BODY> -<a href="test/index">test</a> / <a href="test/test/index">test</a> / <a href="test/test/-bar/index">Bar</a><br/> -<br/> -<h1>Bar</h1> -<code><span class="keyword">class </span><span class="identifier">Bar</span> <span class="symbol">:</span> <a href="test/test/-foo/index"><span class="identifier">Foo</span></a></code><br/> -<p>See <a href="test/test/-foo/xyzzy">xyzzy</a></p> -<br/> -<br/> -<h3>Constructors</h3> -<table> -<tbody> -<tr> -<td> -<a href="test/test/-bar/-init-"><init></a></td> -<td> -<code><span class="identifier">Bar</span><span class="symbol">(</span><span class="symbol">)</span></code><p>See <a href="test/test/-foo/xyzzy">xyzzy</a></p> -</td> -</tr> -</tbody> -</table> -<h3>Inherited Functions</h3> -<table> -<tbody> -<tr> -<td> -<a href="test/test/-foo/xyzzy">xyzzy</a></td> -<td> -<code><span class="keyword">open</span> <span class="keyword">fun </span><span class="identifier">xyzzy</span><span class="symbol">(</span><span class="symbol">)</span><span class="symbol">: </span><span class="identifier">Unit</span></code></td> -</tr> -</tbody> -</table> -</BODY> -</HTML> diff --git a/test/data/format/crossLanguage/kotlinExtendsJava/Bar.kt b/test/data/format/crossLanguage/kotlinExtendsJava/Bar.kt deleted file mode 100644 index 102782f9..00000000 --- a/test/data/format/crossLanguage/kotlinExtendsJava/Bar.kt +++ /dev/null @@ -1,6 +0,0 @@ -package test - -/** - * See [xyzzy] - */ -class Bar(): Foo() diff --git a/test/data/format/crossLanguage/kotlinExtendsJava/test/Foo.java b/test/data/format/crossLanguage/kotlinExtendsJava/test/Foo.java deleted file mode 100644 index 7c143030..00000000 --- a/test/data/format/crossLanguage/kotlinExtendsJava/test/Foo.java +++ /dev/null @@ -1,6 +0,0 @@ -package test; - -public class Foo { - public void xyzzy() { - } -} diff --git a/test/data/format/deprecated.class.html b/test/data/format/deprecated.class.html deleted file mode 100644 index 69da63a1..00000000 --- a/test/data/format/deprecated.class.html +++ /dev/null @@ -1,41 +0,0 @@ -<HTML> -<HEAD> -</HEAD> -<BODY> -<a href="test/index">test</a> / <a href="test/-c/index">C</a><br/> -<br/> -<h1>C</h1> -<code><span class="keyword">class </span><s><span class="identifier">C</span></s></code><br/> -<strong>Deprecated:</strong> This class sucks<br/> -<br/> -<br/> -<br/> -<a href="test/index">test</a> / <a href="test/f">f</a><br/> -<br/> -<h1>f</h1> -<code><span class="keyword">fun </span><s><span class="identifier">f</span></s><span class="symbol">(</span><span class="symbol">)</span><span class="symbol">: </span><span class="identifier">Unit</span></code><br/> -<strong>Deprecated:</strong> This function sucks<br/> -<br/> -<br/> -<br/> -<a href="test/index">test</a> / <a href="test/p">p</a><br/> -<br/> -<h1>p</h1> -<code><span class="keyword">val </span><s><span class="identifier">p</span></s><span class="symbol">: </span><span class="identifier">Int</span></code><br/> -<strong>Deprecated:</strong> This property sucks<br/> -<br/> -<br/> -<br/> -<h3>Constructors</h3> -<table> -<tbody> -<tr> -<td> -<a href="test/-c/-init-"><init></a></td> -<td> -<code><span class="identifier">C</span><span class="symbol">(</span><span class="symbol">)</span></code></td> -</tr> -</tbody> -</table> -</BODY> -</HTML> diff --git a/test/data/format/deprecated.kt b/test/data/format/deprecated.kt deleted file mode 100644 index 4fc568c2..00000000 --- a/test/data/format/deprecated.kt +++ /dev/null @@ -1,5 +0,0 @@ -@Deprecated("This class sucks") class C() { } - -@Deprecated("This function sucks") fun f() { } - -@Deprecated("This property sucks") val p: Int get() = 0 diff --git a/test/data/format/deprecated.package.html b/test/data/format/deprecated.package.html deleted file mode 100644 index dd80471c..00000000 --- a/test/data/format/deprecated.package.html +++ /dev/null @@ -1,43 +0,0 @@ -<HTML> -<HEAD> -<title>test / root package</title> -</HEAD> -<BODY> -<a href="test/index">test</a><br/> -<br/> -<h2>Package </h2> -<h3>Types</h3> -<table> -<tbody> -<tr> -<td> -<a href="test/-c/index">C</a></td> -<td> -<code><span class="keyword">class </span><s><span class="identifier">C</span></s></code></td> -</tr> -</tbody> -</table> -<h3>Properties</h3> -<table> -<tbody> -<tr> -<td> -<a href="test/p">p</a></td> -<td> -<code><span class="keyword">val </span><s><span class="identifier">p</span></s><span class="symbol">: </span><span class="identifier">Int</span></code></td> -</tr> -</tbody> -</table> -<h3>Functions</h3> -<table> -<tbody> -<tr> -<td> -<a href="test/f">f</a></td> -<td> -<code><span class="keyword">fun </span><s><span class="identifier">f</span></s><span class="symbol">(</span><span class="symbol">)</span><span class="symbol">: </span><span class="identifier">Unit</span></code></td> -</tr> -</tbody> -</table> -</BODY> -</HTML> diff --git a/test/data/format/emptyDescription.kt b/test/data/format/emptyDescription.kt deleted file mode 100644 index 3ed81dfa..00000000 --- a/test/data/format/emptyDescription.kt +++ /dev/null @@ -1,5 +0,0 @@ -/** - * Function fn - */ -fun fn() { -}
\ No newline at end of file diff --git a/test/data/format/emptyDescription.md b/test/data/format/emptyDescription.md deleted file mode 100644 index e82e7228..00000000 --- a/test/data/format/emptyDescription.md +++ /dev/null @@ -1,11 +0,0 @@ -[test](test/index) / [fn](test/fn) - - -# fn - -`fun fn(): Unit` - -Function fn - - - diff --git a/test/data/format/entity.html b/test/data/format/entity.html deleted file mode 100644 index a939faad..00000000 --- a/test/data/format/entity.html +++ /dev/null @@ -1,26 +0,0 @@ -<HTML> -<HEAD> -<title>test / Bar</title> -</HEAD> -<BODY> -<a href="test/index">test</a> / <a href="test/-bar/index">Bar</a><br/> -<br/> -<h1>Bar</h1> -<code><span class="keyword">class </span><span class="identifier">Bar</span></code><br/> -<p>Copyright © JetBrains 2015 "</p> -<br/> -<br/> -<h3>Constructors</h3> -<table> -<tbody> -<tr> -<td> -<a href="test/-bar/-init-"><init></a></td> -<td> -<code><span class="identifier">Bar</span><span class="symbol">(</span><span class="symbol">)</span></code><p>Copyright © JetBrains 2015 "</p> -</td> -</tr> -</tbody> -</table> -</BODY> -</HTML> diff --git a/test/data/format/entity.kt b/test/data/format/entity.kt deleted file mode 100644 index 163d2ee6..00000000 --- a/test/data/format/entity.kt +++ /dev/null @@ -1,4 +0,0 @@ -/** - * Copyright © JetBrains 2015 " - */ -class Bar {} diff --git a/test/data/format/enumClass.kt b/test/data/format/enumClass.kt deleted file mode 100644 index c1af69d8..00000000 --- a/test/data/format/enumClass.kt +++ /dev/null @@ -1,4 +0,0 @@ -public enum class InlineOption { - LOCAL_CONTINUE_AND_BREAK, - ONLY_LOCAL_RETURN -} diff --git a/test/data/format/enumClass.md b/test/data/format/enumClass.md deleted file mode 100644 index 7a0e03ff..00000000 --- a/test/data/format/enumClass.md +++ /dev/null @@ -1,15 +0,0 @@ -[test](test/index) / [InlineOption](test/-inline-option/index) - - -# InlineOption - -`enum class InlineOption` - - - -### Enum Values - - -| [LOCAL_CONTINUE_AND_BREAK](test/-inline-option/-l-o-c-a-l_-c-o-n-t-i-n-u-e_-a-n-d_-b-r-e-a-k) | | -| [ONLY_LOCAL_RETURN](test/-inline-option/-o-n-l-y_-l-o-c-a-l_-r-e-t-u-r-n) | | - diff --git a/test/data/format/enumClass.value.md b/test/data/format/enumClass.value.md deleted file mode 100644 index bcb685d1..00000000 --- a/test/data/format/enumClass.value.md +++ /dev/null @@ -1,8 +0,0 @@ -[test](test/index) / [InlineOption](test/-inline-option/index) / [LOCAL_CONTINUE_AND_BREAK](test/-inline-option/-l-o-c-a-l_-c-o-n-t-i-n-u-e_-a-n-d_-b-r-e-a-k) - - -# LOCAL_CONTINUE_AND_BREAK - -`LOCAL_CONTINUE_AND_BREAK` - - diff --git a/test/data/format/extensionFunctionParameter.kt b/test/data/format/extensionFunctionParameter.kt deleted file mode 100644 index bfb344b9..00000000 --- a/test/data/format/extensionFunctionParameter.kt +++ /dev/null @@ -1 +0,0 @@ -public inline fun <T> T.apply(f: T.() -> Unit): T { f(); return this } diff --git a/test/data/format/extensionFunctionParameter.md b/test/data/format/extensionFunctionParameter.md deleted file mode 100644 index 6980912d..00000000 --- a/test/data/format/extensionFunctionParameter.md +++ /dev/null @@ -1,8 +0,0 @@ -[test](test/index) / [apply](test/apply) - - -# apply - -`inline fun <T> T.apply(f: T.() -> Unit): T` - - diff --git a/test/data/format/extensions.class.md b/test/data/format/extensions.class.md deleted file mode 100644 index c66cdb01..00000000 --- a/test/data/format/extensions.class.md +++ /dev/null @@ -1,16 +0,0 @@ -[test](test/index) / [foo](test/foo/index) / [kotlin.String](test/foo/kotlin.-string/index) - - -### Extensions for kotlin.String - - -| [fn](test/foo/kotlin.-string/fn) | `fun String.fn(): Unit` -`fun String.fn(x: Int): Unit` -Function with receiver - - | -| [foobar](test/foo/kotlin.-string/foobar) | `val String.foobar: Int` -Property with receiver. - - | - diff --git a/test/data/format/extensions.kt b/test/data/format/extensions.kt deleted file mode 100644 index 6f2eff9d..00000000 --- a/test/data/format/extensions.kt +++ /dev/null @@ -1,19 +0,0 @@ -package foo - -/** - * Function with receiver - */ -fun String.fn() { -} - -/** - * Function with receiver - */ -fun String.fn(x: Int) { -} - -/** - * Property with receiver. - */ -val String.foobar: Int - get() = size() * 2 diff --git a/test/data/format/extensions.package.md b/test/data/format/extensions.package.md deleted file mode 100644 index 76ff3676..00000000 --- a/test/data/format/extensions.package.md +++ /dev/null @@ -1,11 +0,0 @@ -[test](test/index) / [foo](test/foo/index) - - -## Package foo - - -### Extensions for External Classes - - -| [kotlin.String](test/foo/kotlin.-string/index) | | - diff --git a/test/data/format/functionWithDefaultParameter.kt b/test/data/format/functionWithDefaultParameter.kt deleted file mode 100644 index 3a3a102f..00000000 --- a/test/data/format/functionWithDefaultParameter.kt +++ /dev/null @@ -1 +0,0 @@ -fun f(x: String = "") {} diff --git a/test/data/format/functionWithDefaultParameter.md b/test/data/format/functionWithDefaultParameter.md deleted file mode 100644 index 21e9eff7..00000000 --- a/test/data/format/functionWithDefaultParameter.md +++ /dev/null @@ -1,8 +0,0 @@ -[test](test/index) / [f](test/f) - - -# f - -`fun f(x: String = ""): Unit` - - diff --git a/test/data/format/htmlEscaping.html b/test/data/format/htmlEscaping.html deleted file mode 100644 index a485c08f..00000000 --- a/test/data/format/htmlEscaping.html +++ /dev/null @@ -1,14 +0,0 @@ -<HTML> -<HEAD> -<title>test / x</title> -</HEAD> -<BODY> -<a href="test/index">test</a> / <a href="test/x">x</a><br/> -<br/> -<h1>x</h1> -<code><span class="keyword">fun </span><span class="symbol"><</span><span class="identifier">T</span><span class="symbol">></span> <span class="identifier">x</span><span class="symbol">(</span><span class="symbol">)</span><span class="symbol">: </span><span class="identifier">T</span><span class="symbol">?</span></code><br/> -<p>Special characters: < is "less than", > is "greater than", & is "ampersand"</p> -<br/> -<br/> -</BODY> -</HTML> diff --git a/test/data/format/htmlEscaping.kt b/test/data/format/htmlEscaping.kt deleted file mode 100644 index 8778d8a5..00000000 --- a/test/data/format/htmlEscaping.kt +++ /dev/null @@ -1,4 +0,0 @@ -/** - * Special characters: < is "less than", > is "greater than", & is "ampersand" - */ -fun x<T>(): T? = null diff --git a/test/data/format/inheritedExtensions.kt b/test/data/format/inheritedExtensions.kt deleted file mode 100644 index e38fe00d..00000000 --- a/test/data/format/inheritedExtensions.kt +++ /dev/null @@ -1,11 +0,0 @@ -open class Foo - -class Bar : Foo() - -fun Foo.first() { - -} - -fun Bar.second() { - -} diff --git a/test/data/format/inheritedExtensions.md b/test/data/format/inheritedExtensions.md deleted file mode 100644 index 79137eac..00000000 --- a/test/data/format/inheritedExtensions.md +++ /dev/null @@ -1,21 +0,0 @@ -[test](test/index) / [Bar](test/-bar/index) - - -# Bar - -`class Bar : [Foo](test/-foo/index)` - - - -### Constructors - - -| [<init>](test/-bar/-init-) | `Bar()` | - - -### Extension Functions - - -| [first](test/first) | `fun [Foo](test/-foo/index).first(): Unit` | -| [second](test/second) | `fun [Bar](test/-bar/index).second(): Unit` | - diff --git a/test/data/format/inheritedMembers.kt b/test/data/format/inheritedMembers.kt deleted file mode 100644 index 2d0c4ca1..00000000 --- a/test/data/format/inheritedMembers.kt +++ /dev/null @@ -1,12 +0,0 @@ -open class Foo { - fun first() { - } - - val firstProp: Int = 0 -} - -class Bar : Foo() { - fun second() - - val secondProp: Int = 1 -} diff --git a/test/data/format/inheritedMembers.md b/test/data/format/inheritedMembers.md deleted file mode 100644 index d58d3974..00000000 --- a/test/data/format/inheritedMembers.md +++ /dev/null @@ -1,38 +0,0 @@ -[test](test/index) / [Bar](test/-bar/index) - - -# Bar - -`class Bar : [Foo](test/-foo/index)` - - - -### Constructors - - -| [<init>](test/-bar/-init-) | `Bar()` | - - -### Properties - - -| [secondProp](test/-bar/second-prop) | `val secondProp: Int` | - - -### Inherited Properties - - -| [firstProp](test/-foo/first-prop) | `val firstProp: Int` | - - -### Functions - - -| [second](test/-bar/second) | `fun second(): Unit` | - - -### Inherited Functions - - -| [first](test/-foo/first) | `fun first(): Unit` | - diff --git a/test/data/format/javaCodeInParam.java b/test/data/format/javaCodeInParam.java deleted file mode 100644 index 73025fcc..00000000 --- a/test/data/format/javaCodeInParam.java +++ /dev/null @@ -1,5 +0,0 @@ -/** - * @param T this is {@code some code} and other text - */ -class C<T> { -} diff --git a/test/data/format/javaCodeInParam.md b/test/data/format/javaCodeInParam.md deleted file mode 100644 index b1d2d871..00000000 --- a/test/data/format/javaCodeInParam.md +++ /dev/null @@ -1,21 +0,0 @@ -[test](test/index) / [C](test/-c/index) - - -# C - -`protected open class C<T : Any>` - - - - -### Parameters - -`T` - this is `some code` and other text - - - -### Constructors - - -| [<init>](test/-c/-init-) | `C()` | - diff --git a/test/data/format/javaCodeLiteralTags.java b/test/data/format/javaCodeLiteralTags.java deleted file mode 100644 index e71ddaa7..00000000 --- a/test/data/format/javaCodeLiteralTags.java +++ /dev/null @@ -1,6 +0,0 @@ -/** - * <p>{@code A<B>C}</p> - * <p>{@literal A<B>C}</p> - */ -class C { -} diff --git a/test/data/format/javaCodeLiteralTags.md b/test/data/format/javaCodeLiteralTags.md deleted file mode 100644 index 83c9cc33..00000000 --- a/test/data/format/javaCodeLiteralTags.md +++ /dev/null @@ -1,23 +0,0 @@ -[test](test/index) / [C](test/-c/index) - - -# C - -`protected open class C` - - -`A<B>C` - - -A<B>C - - - - - - -### Constructors - - -| [<init>](test/-c/-init-) | `C()` | - diff --git a/test/data/format/javaDeprecated.html b/test/data/format/javaDeprecated.html deleted file mode 100644 index 236c6490..00000000 --- a/test/data/format/javaDeprecated.html +++ /dev/null @@ -1,14 +0,0 @@ -<HTML> -<HEAD> -<title>test / Foo.foo</title> -</HEAD> -<BODY> -<a href="test/index">test</a> / <a href="test/-foo/index">Foo</a> / <a href="test/-foo/foo">foo</a><br/> -<br/> -<h1>foo</h1> -<code><span class="keyword">open</span> <span class="keyword">fun </span><s><span class="identifier">foo</span></s><span class="symbol">(</span><span class="symbol">)</span><span class="symbol">: </span><span class="identifier">Unit</span></code><br/> -<strong>Deprecated:</strong> use <code><a href="test/-foo/bar">#bar</a></code> instead <p></p> -<br/> -<br/> -</BODY> -</HTML> diff --git a/test/data/format/javaDeprecated.java b/test/data/format/javaDeprecated.java deleted file mode 100644 index 9694a444..00000000 --- a/test/data/format/javaDeprecated.java +++ /dev/null @@ -1,5 +0,0 @@ -class Foo { - /** @deprecated use {@link #bar} instead */ - public void foo() {} - public void bar() {} -} diff --git a/test/data/format/javaLinkTag.html b/test/data/format/javaLinkTag.html deleted file mode 100644 index 1b6921ab..00000000 --- a/test/data/format/javaLinkTag.html +++ /dev/null @@ -1,36 +0,0 @@ -<HTML> -<HEAD> -<title>test / Foo</title> -</HEAD> -<BODY> -<a href="test/index">test</a> / <a href="test/-foo/index">Foo</a><br/> -<br/> -<h1>Foo</h1> -<code><span class="keyword">protected</span> <span class="keyword">open</span> <span class="keyword">class </span><span class="identifier">Foo</span></code><br/> -<p>Call <code><a href="test/-foo/bar">#bar()</a></code> to do the job. </p> -<br/> -<br/> -<h3>Constructors</h3> -<table> -<tbody> -<tr> -<td> -<a href="test/-foo/-init-"><init></a></td> -<td> -<code><span class="identifier">Foo</span><span class="symbol">(</span><span class="symbol">)</span></code></td> -</tr> -</tbody> -</table> -<h3>Functions</h3> -<table> -<tbody> -<tr> -<td> -<a href="test/-foo/bar">bar</a></td> -<td> -<code><span class="keyword">open</span> <span class="keyword">fun </span><span class="identifier">bar</span><span class="symbol">(</span><span class="symbol">)</span><span class="symbol">: </span><span class="identifier">Unit</span></code></td> -</tr> -</tbody> -</table> -</BODY> -</HTML> diff --git a/test/data/format/javaLinkTag.java b/test/data/format/javaLinkTag.java deleted file mode 100644 index 84f761c6..00000000 --- a/test/data/format/javaLinkTag.java +++ /dev/null @@ -1,6 +0,0 @@ -/** - * Call {@link #bar()} to do the job. - */ -class Foo { - public void bar() -} diff --git a/test/data/format/javaLinkTagWithLabel.html b/test/data/format/javaLinkTagWithLabel.html deleted file mode 100644 index aabfbc58..00000000 --- a/test/data/format/javaLinkTagWithLabel.html +++ /dev/null @@ -1,36 +0,0 @@ -<HTML> -<HEAD> -<title>test / Foo</title> -</HEAD> -<BODY> -<a href="test/index">test</a> / <a href="test/-foo/index">Foo</a><br/> -<br/> -<h1>Foo</h1> -<code><span class="keyword">protected</span> <span class="keyword">open</span> <span class="keyword">class </span><span class="identifier">Foo</span></code><br/> -<p>Call <code><a href="test/-foo/bar">this wonderful method</a></code> to do the job. </p> -<br/> -<br/> -<h3>Constructors</h3> -<table> -<tbody> -<tr> -<td> -<a href="test/-foo/-init-"><init></a></td> -<td> -<code><span class="identifier">Foo</span><span class="symbol">(</span><span class="symbol">)</span></code></td> -</tr> -</tbody> -</table> -<h3>Functions</h3> -<table> -<tbody> -<tr> -<td> -<a href="test/-foo/bar">bar</a></td> -<td> -<code><span class="keyword">open</span> <span class="keyword">fun </span><span class="identifier">bar</span><span class="symbol">(</span><span class="symbol">)</span><span class="symbol">: </span><span class="identifier">Unit</span></code></td> -</tr> -</tbody> -</table> -</BODY> -</HTML> diff --git a/test/data/format/javaLinkTagWithLabel.java b/test/data/format/javaLinkTagWithLabel.java deleted file mode 100644 index 1db5ad70..00000000 --- a/test/data/format/javaLinkTagWithLabel.java +++ /dev/null @@ -1,6 +0,0 @@ -/** - * Call {@link #bar() this wonderful method} to do the job. - */ -class Foo { - public void bar() -} diff --git a/test/data/format/javaSeeTag.html b/test/data/format/javaSeeTag.html deleted file mode 100644 index a6813df3..00000000 --- a/test/data/format/javaSeeTag.html +++ /dev/null @@ -1,38 +0,0 @@ -<HTML> -<HEAD> -<title>test / Foo</title> -</HEAD> -<BODY> -<a href="test/index">test</a> / <a href="test/-foo/index">Foo</a><br/> -<br/> -<h1>Foo</h1> -<code><span class="keyword">open</span> <span class="keyword">class </span><span class="identifier">Foo</span></code><br/> -<p></p> -<strong>See Also</strong><br/> -<a href="test/-foo/bar">#bar</a><br/> -<br/> -<br/> -<h3>Constructors</h3> -<table> -<tbody> -<tr> -<td> -<a href="test/-foo/-init-"><init></a></td> -<td> -<code><span class="identifier">Foo</span><span class="symbol">(</span><span class="symbol">)</span></code></td> -</tr> -</tbody> -</table> -<h3>Functions</h3> -<table> -<tbody> -<tr> -<td> -<a href="test/-foo/bar">bar</a></td> -<td> -<code><span class="keyword">open</span> <span class="keyword">fun </span><span class="identifier">bar</span><span class="symbol">(</span><span class="symbol">)</span><span class="symbol">: </span><span class="identifier">Unit</span></code></td> -</tr> -</tbody> -</table> -</BODY> -</HTML> diff --git a/test/data/format/javaSeeTag.java b/test/data/format/javaSeeTag.java deleted file mode 100644 index 94a24606..00000000 --- a/test/data/format/javaSeeTag.java +++ /dev/null @@ -1,6 +0,0 @@ -/** - * @see #bar - */ -public class Foo { - public void bar() {} -}
\ No newline at end of file diff --git a/test/data/format/javaSpaceInAuthor.java b/test/data/format/javaSpaceInAuthor.java deleted file mode 100644 index f980ae07..00000000 --- a/test/data/format/javaSpaceInAuthor.java +++ /dev/null @@ -1,5 +0,0 @@ -/** - * @author Dmitry Jemerov - */ -class C { -}
\ No newline at end of file diff --git a/test/data/format/javaSpaceInAuthor.md b/test/data/format/javaSpaceInAuthor.md deleted file mode 100644 index 4d19ed01..00000000 --- a/test/data/format/javaSpaceInAuthor.md +++ /dev/null @@ -1,19 +0,0 @@ -[test](test/index) / [C](test/-c/index) - - -# C - -`protected open class C` - - - -**Author** -Dmitry Jemerov - - - -### Constructors - - -| [<init>](test/-c/-init-) | `C()` | - diff --git a/test/data/format/javaSupertype.html b/test/data/format/javaSupertype.html deleted file mode 100644 index 4c847281..00000000 --- a/test/data/format/javaSupertype.html +++ /dev/null @@ -1,35 +0,0 @@ -<HTML> -<HEAD> -<title>test / C.Bar</title> -</HEAD> -<BODY> -<a href="test/index">test</a> / <a href="test/-c/index">C</a> / <a href="test/-c/-bar/index">Bar</a><br/> -<br/> -<h1>Bar</h1> -<code><span class="keyword">open</span> <span class="keyword">class </span><span class="identifier">Bar</span> <span class="symbol">:</span> <a href="test/-c/-foo/index"><span class="identifier">Foo</span></a></code><br/> -<br/> -<br/> -<h3>Constructors</h3> -<table> -<tbody> -<tr> -<td> -<a href="test/-c/-bar/-init-"><init></a></td> -<td> -<code><span class="identifier">Bar</span><span class="symbol">(</span><span class="symbol">)</span></code></td> -</tr> -</tbody> -</table> -<h3>Functions</h3> -<table> -<tbody> -<tr> -<td> -<a href="test/-c/-bar/return-foo">returnFoo</a></td> -<td> -<code><span class="keyword">open</span> <span class="keyword">fun </span><span class="identifier">returnFoo</span><span class="symbol">(</span><span class="identifier">foo</span><span class="symbol">:</span> <a href="test/-c/-foo/index"><span class="identifier">Foo</span></a><span class="symbol">)</span><span class="symbol">: </span><a href="test/-c/-foo/index"><span class="identifier">Foo</span></a></code></td> -</tr> -</tbody> -</table> -</BODY> -</HTML> diff --git a/test/data/format/javaSupertype.java b/test/data/format/javaSupertype.java deleted file mode 100644 index b3142ff6..00000000 --- a/test/data/format/javaSupertype.java +++ /dev/null @@ -1,8 +0,0 @@ -class C { - public static class Foo { - } - - public static class Bar extends Foo { - public Foo returnFoo(Foo foo) { return foo; } - } -} diff --git a/test/data/format/javadocHtml.java b/test/data/format/javadocHtml.java deleted file mode 100644 index 622116b2..00000000 --- a/test/data/format/javadocHtml.java +++ /dev/null @@ -1,14 +0,0 @@ -/** - * <b>Bold</b> - * <strong>Strong</strong> - * <i>Italic</i> - * <em>Emphasized</em> - * <p>Paragraph</p> - * <s>Strikethrough</s> - * <del>Deleted</del> - * <code>Code</code> - * <pre>Block code</pre> - * <ul><li>List Item</li></ul> - */ -public class C { -} diff --git a/test/data/format/javadocHtml.md b/test/data/format/javadocHtml.md deleted file mode 100644 index db71cc3b..00000000 --- a/test/data/format/javadocHtml.md +++ /dev/null @@ -1,27 +0,0 @@ -[test](test/index) / [C](test/-c/index) - - -# C - -`open class C` - -**Bold** **Strong** *Italic* *Emphasized* -Paragraph - - ~~Strikethrough~~ ~~Deleted~~ `Code` -``` -Block code -``` - - * List Item - - - - - - -### Constructors - - -| [<init>](test/-c/-init-) | `C()` | - diff --git a/test/data/format/javadocOrderedList.java b/test/data/format/javadocOrderedList.java deleted file mode 100644 index c32d9032..00000000 --- a/test/data/format/javadocOrderedList.java +++ /dev/null @@ -1,8 +0,0 @@ -/** - * <ol> - * <li>Rinse</li> - * <li>Repeat</li> - * </ol> - */ -public class Bar { -} diff --git a/test/data/format/javadocOrderedList.md b/test/data/format/javadocOrderedList.md deleted file mode 100644 index 02a3c095..00000000 --- a/test/data/format/javadocOrderedList.md +++ /dev/null @@ -1,20 +0,0 @@ -[test](test/index) / [Bar](test/-bar/index) - - -# Bar - -`open class Bar` - - 1. Rinse - 1. Repeat - - - - - - -### Constructors - - -| [<init>](test/-bar/-init-) | `Bar()` | - diff --git a/test/data/format/linkWithLabel.html b/test/data/format/linkWithLabel.html deleted file mode 100644 index 75769ffd..00000000 --- a/test/data/format/linkWithLabel.html +++ /dev/null @@ -1,37 +0,0 @@ -<HTML> -<HEAD> -<title>test / Bar</title> -</HEAD> -<BODY> -<a href="test/index">test</a> / <a href="test/-bar/index">Bar</a><br/> -<br/> -<h1>Bar</h1> -<code><span class="keyword">class </span><span class="identifier">Bar</span></code><br/> -<p>Use <a href="test/-bar/foo">this method</a> for best results.</p> -<br/> -<br/> -<h3>Constructors</h3> -<table> -<tbody> -<tr> -<td> -<a href="test/-bar/-init-"><init></a></td> -<td> -<code><span class="identifier">Bar</span><span class="symbol">(</span><span class="symbol">)</span></code><p>Use <a href="test/-bar/foo">this method</a> for best results.</p> -</td> -</tr> -</tbody> -</table> -<h3>Functions</h3> -<table> -<tbody> -<tr> -<td> -<a href="test/-bar/foo">foo</a></td> -<td> -<code><span class="keyword">fun </span><span class="identifier">foo</span><span class="symbol">(</span><span class="symbol">)</span><span class="symbol">: </span><span class="identifier">Unit</span></code></td> -</tr> -</tbody> -</table> -</BODY> -</HTML> diff --git a/test/data/format/linkWithLabel.kt b/test/data/format/linkWithLabel.kt deleted file mode 100644 index 4a85c505..00000000 --- a/test/data/format/linkWithLabel.kt +++ /dev/null @@ -1,6 +0,0 @@ -/** - * Use [this method][Bar.foo] for best results. - */ -class Bar { - fun foo() {} -} diff --git a/test/data/format/nullability.kt b/test/data/format/nullability.kt deleted file mode 100644 index d1d4545b..00000000 --- a/test/data/format/nullability.kt +++ /dev/null @@ -1,5 +0,0 @@ -class C<T> { - fun foo(): Comparable<T>? { - return null - } -} diff --git a/test/data/format/nullability.md b/test/data/format/nullability.md deleted file mode 100644 index ee50a0a5..00000000 --- a/test/data/format/nullability.md +++ /dev/null @@ -1,20 +0,0 @@ -[test](test/index) / [C](test/-c/index) - - -# C - -`class C<T>` - - - -### Constructors - - -| [<init>](test/-c/-init-) | `C()` | - - -### Functions - - -| [foo](test/-c/foo) | `fun foo(): Comparable<T>?` | - diff --git a/test/data/format/operatorOverloading.kt b/test/data/format/operatorOverloading.kt deleted file mode 100644 index 6fe78e45..00000000 --- a/test/data/format/operatorOverloading.kt +++ /dev/null @@ -1,3 +0,0 @@ -class C { - fun plus(other: C): C -} diff --git a/test/data/format/operatorOverloading.md b/test/data/format/operatorOverloading.md deleted file mode 100644 index 05fe3206..00000000 --- a/test/data/format/operatorOverloading.md +++ /dev/null @@ -1,8 +0,0 @@ -[test](test/index) / [C](test/-c/index) / [plus](test/-c/plus) - - -# plus - -`fun plus(other: [C](test/-c/index)): [C](test/-c/index)` - - diff --git a/test/data/format/orderedList.html b/test/data/format/orderedList.html deleted file mode 100644 index 9917568f..00000000 --- a/test/data/format/orderedList.html +++ /dev/null @@ -1,30 +0,0 @@ -<HTML> -<HEAD> -<title>test / Bar</title> -</HEAD> -<BODY> -<a href="test/index">test</a> / <a href="test/-bar/index">Bar</a><br/> -<br/> -<h1>Bar</h1> -<code><span class="keyword">class </span><span class="identifier">Bar</span></code><br/> -<p>Usage instructions:</p> -<ol><li><p>Rinse</p> -</li><li><p>Repeat</p> -</li></ol><br/> -<br/> -<br/> -<br/> -<h3>Constructors</h3> -<table> -<tbody> -<tr> -<td> -<a href="test/-bar/-init-"><init></a></td> -<td> -<code><span class="identifier">Bar</span><span class="symbol">(</span><span class="symbol">)</span></code><p>Usage instructions:</p> -</td> -</tr> -</tbody> -</table> -</BODY> -</HTML> diff --git a/test/data/format/orderedList.kt b/test/data/format/orderedList.kt deleted file mode 100644 index 03681c7a..00000000 --- a/test/data/format/orderedList.kt +++ /dev/null @@ -1,8 +0,0 @@ -/** - * Usage instructions: - * - * 1. Rinse - * 1. Repeat - */ -class Bar { -} diff --git a/test/data/format/overloads.html b/test/data/format/overloads.html deleted file mode 100644 index 752f3989..00000000 --- a/test/data/format/overloads.html +++ /dev/null @@ -1,23 +0,0 @@ -<HTML> -<HEAD> -<title>test / root package</title> -</HEAD> -<BODY> -<a href="test/index">test</a><br/> -<br/> -<h2>Package </h2> -<h3>Functions</h3> -<table> -<tbody> -<tr> -<td> -<a href="test/f">f</a></td> -<td> -<code><span class="keyword">fun </span><span class="identifier">f</span><span class="symbol">(</span><span class="identifier">x</span><span class="symbol">:</span> <span class="identifier">Int</span><span class="symbol">)</span><span class="symbol">: </span><span class="identifier">Unit</span></code><br/> -<code><span class="keyword">fun </span><span class="identifier">f</span><span class="symbol">(</span><span class="identifier">x</span><span class="symbol">:</span> <span class="identifier">String</span><span class="symbol">)</span><span class="symbol">: </span><span class="identifier">Unit</span></code><p>Performs an action on x.</p> -</td> -</tr> -</tbody> -</table> -</BODY> -</HTML> diff --git a/test/data/format/overloads.kt b/test/data/format/overloads.kt deleted file mode 100644 index dcd2d097..00000000 --- a/test/data/format/overloads.kt +++ /dev/null @@ -1,5 +0,0 @@ -/** Performs an action on x. */ -fun f(x: Int) { } - -/** Performs an action on x. */ -fun f(x: String) { } diff --git a/test/data/format/overloadsWithDescription.html b/test/data/format/overloadsWithDescription.html deleted file mode 100644 index a0efb472..00000000 --- a/test/data/format/overloadsWithDescription.html +++ /dev/null @@ -1,21 +0,0 @@ -<HTML> -<HEAD> -<title>test / f</title> -</HEAD> -<BODY> -<a href="test/index">test</a> / <a href="test/f">f</a><br/> -<br/> -<h1>f</h1> -<code><span class="keyword">fun </span><span class="identifier">f</span><span class="symbol">(</span><span class="identifier">x</span><span class="symbol">:</span> <span class="identifier">Int</span><span class="symbol">)</span><span class="symbol">: </span><span class="identifier">Unit</span></code><br/> -<code><span class="keyword">fun </span><span class="identifier">f</span><span class="symbol">(</span><span class="identifier">x</span><span class="symbol">:</span> <span class="identifier">String</span><span class="symbol">)</span><span class="symbol">: </span><span class="identifier">Unit</span></code><br/> -<p>Performs an action on <a href="test/f#x">x</a>.</p> -<p>This is a long description.</p> -<br/> -<br/> -<h3>Parameters</h3> -<a name="x"></a> -<code>x</code> - the value to perform the action on.<br/> -<br/> -<br/> -</BODY> -</HTML> diff --git a/test/data/format/overloadsWithDescription.kt b/test/data/format/overloadsWithDescription.kt deleted file mode 100644 index 740e642f..00000000 --- a/test/data/format/overloadsWithDescription.kt +++ /dev/null @@ -1,15 +0,0 @@ -/** - * Performs an action on [x]. - * - * This is a long description. - * @param x the value to perform the action on. - */ -fun f(x: Int) { } - -/** - * Performs an action on [x]. - * - * This is a long description. - * @param x the value to perform the action on. - */ -fun f(x: String) { } diff --git a/test/data/format/overloadsWithDifferentDescriptions.html b/test/data/format/overloadsWithDifferentDescriptions.html deleted file mode 100644 index 30a37e75..00000000 --- a/test/data/format/overloadsWithDifferentDescriptions.html +++ /dev/null @@ -1,30 +0,0 @@ -<HTML> -<HEAD> -<title>test / f</title> -</HEAD> -<BODY> -<a href="test/index">test</a> / <a href="test/f">f</a><br/> -<br/> -<h1>f</h1> -<code><span class="keyword">fun </span><span class="identifier">f</span><span class="symbol">(</span><span class="identifier">x</span><span class="symbol">:</span> <span class="identifier">Int</span><span class="symbol">)</span><span class="symbol">: </span><span class="identifier">Unit</span></code><br/> -<p>Performs an action on x.</p> -<p>This is a long description.</p> -<br/> -<br/> -<h3>Parameters</h3> -<a name="x"></a> -<code>x</code> - the int value to perform the action on.<br/> -<br/> -<br/> -<code><span class="keyword">fun </span><span class="identifier">f</span><span class="symbol">(</span><span class="identifier">x</span><span class="symbol">:</span> <span class="identifier">String</span><span class="symbol">)</span><span class="symbol">: </span><span class="identifier">Unit</span></code><br/> -<p>Performs an action on x.</p> -<p>This is a long description.</p> -<br/> -<br/> -<h3>Parameters</h3> -<a name="x"></a> -<code>x</code> - the string value to perform the action on.<br/> -<br/> -<br/> -</BODY> -</HTML> diff --git a/test/data/format/overloadsWithDifferentDescriptions.kt b/test/data/format/overloadsWithDifferentDescriptions.kt deleted file mode 100644 index ad3169b0..00000000 --- a/test/data/format/overloadsWithDifferentDescriptions.kt +++ /dev/null @@ -1,15 +0,0 @@ -/** - * Performs an action on x. - * - * This is a long description. - * @param x the int value to perform the action on. - */ -fun f(x: Int) { } - -/** - * Performs an action on x. - * - * This is a long description. - * @param x the string value to perform the action on. - */ -fun f(x: String) { } diff --git a/test/data/format/overridingFunction.kt b/test/data/format/overridingFunction.kt deleted file mode 100644 index d7329489..00000000 --- a/test/data/format/overridingFunction.kt +++ /dev/null @@ -1,7 +0,0 @@ -open class C() { - open fun f() {} -} - -class D(): C() { - override fun f() {} -} diff --git a/test/data/format/overridingFunction.md b/test/data/format/overridingFunction.md deleted file mode 100644 index 2c898b9c..00000000 --- a/test/data/format/overridingFunction.md +++ /dev/null @@ -1,9 +0,0 @@ -[test](test/index) / [D](test/-d/index) / [f](test/-d/f) - - -# f - -`fun f(): Unit` -Overrides [C.f](test/-c/f) - - diff --git a/test/data/format/paramTag.kt b/test/data/format/paramTag.kt deleted file mode 100644 index 47e471f5..00000000 --- a/test/data/format/paramTag.kt +++ /dev/null @@ -1,6 +0,0 @@ -/** - * @param x A string - * @param y A number with a really long description that spans multiple lines and goes - * on and on and is very interesting to read - */ -fun f(x: String, y: Int) {} diff --git a/test/data/format/paramTag.md b/test/data/format/paramTag.md deleted file mode 100644 index 882083fe..00000000 --- a/test/data/format/paramTag.md +++ /dev/null @@ -1,14 +0,0 @@ -[test](test/index) / [f](test/f) - - -# f - -`fun f(x: String, y: Int): Unit` - -### Parameters - -`x` - A string -`y` - A number with a really long description that spans multiple lines and goes -on and on and is very interesting to read - - diff --git a/test/data/format/parameterAnchor.html b/test/data/format/parameterAnchor.html deleted file mode 100644 index c5920fb7..00000000 --- a/test/data/format/parameterAnchor.html +++ /dev/null @@ -1,17 +0,0 @@ -<HTML> -<HEAD> -<title>test / processFiles</title> -</HEAD> -<BODY> -<a href="test/index">test</a> / <a href="test/process-files">processFiles</a><br/> -<br/> -<h1>processFiles</h1> -<code><span class="keyword">fun </span><span class="symbol"><</span><span class="identifier">T</span><span class="symbol">></span> <span class="identifier">processFiles</span><span class="symbol">(</span><span class="identifier">processor</span><span class="symbol">:</span> <span class="symbol">(</span><span class="symbol">)</span> <span class="symbol">-></span> <span class="identifier">T</span><span class="symbol">)</span><span class="symbol">: </span><span class="identifier">List</span><span class="symbol"><</span><span class="identifier">T</span><span class="symbol">></span></code><br/> -<p>Runs <a href="test/process-files#processor">processor</a> for each file and collects its results into single list</p> -<h3>Parameters</h3> -<a name="processor"></a> -<code>processor</code> - function to receive context for symbol resolution and file for processing<br/> -<br/> -<br/> -</BODY> -</HTML> diff --git a/test/data/format/parameterAnchor.kt b/test/data/format/parameterAnchor.kt deleted file mode 100644 index ae36ee4c..00000000 --- a/test/data/format/parameterAnchor.kt +++ /dev/null @@ -1,6 +0,0 @@ -/** - * Runs [processor] for each file and collects its results into single list - * @param processor function to receive context for symbol resolution and file for processing - */ -public fun processFiles<T>(processor: () -> T): List<T> { -} diff --git a/test/data/format/parenthesis.html b/test/data/format/parenthesis.html deleted file mode 100644 index c36b311b..00000000 --- a/test/data/format/parenthesis.html +++ /dev/null @@ -1,14 +0,0 @@ -<HTML> -<HEAD> -<title>test / foo</title> -</HEAD> -<BODY> -<a href="test/index">test</a> / <a href="test/foo">foo</a><br/> -<br/> -<h1>foo</h1> -<code><span class="keyword">fun </span><span class="identifier">foo</span><span class="symbol">(</span><span class="symbol">)</span><span class="symbol">: </span><span class="identifier">Unit</span></code><br/> -<p>foo (bar)</p> -<br/> -<br/> -</BODY> -</HTML> diff --git a/test/data/format/parenthesis.kt b/test/data/format/parenthesis.kt deleted file mode 100644 index b906f64a..00000000 --- a/test/data/format/parenthesis.kt +++ /dev/null @@ -1,4 +0,0 @@ -/** - * foo (bar) - */ -fun foo() {} diff --git a/test/data/format/propertyVar.kt b/test/data/format/propertyVar.kt deleted file mode 100644 index 88be1a7a..00000000 --- a/test/data/format/propertyVar.kt +++ /dev/null @@ -1 +0,0 @@ -var x = 1
\ No newline at end of file diff --git a/test/data/format/propertyVar.md b/test/data/format/propertyVar.md deleted file mode 100644 index f2110992..00000000 --- a/test/data/format/propertyVar.md +++ /dev/null @@ -1,8 +0,0 @@ -[test](test/index) / [x](test/x) - - -# x - -`var x: Int` - - diff --git a/test/data/format/reifiedTypeParameter.kt b/test/data/format/reifiedTypeParameter.kt deleted file mode 100644 index 00fa1dc9..00000000 --- a/test/data/format/reifiedTypeParameter.kt +++ /dev/null @@ -1,3 +0,0 @@ -inline fun f<reified T>() { - -} diff --git a/test/data/format/reifiedTypeParameter.md b/test/data/format/reifiedTypeParameter.md deleted file mode 100644 index 2e96018e..00000000 --- a/test/data/format/reifiedTypeParameter.md +++ /dev/null @@ -1,8 +0,0 @@ -[test](test/index) / [f](test/f) - - -# f - -`inline fun <reified T> f(): Unit` - - diff --git a/test/data/format/see.html b/test/data/format/see.html deleted file mode 100644 index b3ffb74b..00000000 --- a/test/data/format/see.html +++ /dev/null @@ -1,28 +0,0 @@ -<HTML> -<HEAD> -</HEAD> -<BODY> -<a href="test/index">test</a> / <a href="test/quux">quux</a><br/> -<br/> -<h1>quux</h1> -<code><span class="keyword">fun </span><span class="identifier">quux</span><span class="symbol">(</span><span class="symbol">)</span><span class="symbol">: </span><span class="identifier">Unit</span></code><br/> -<strong>See Also</strong><br/> -<p><a href="test/foo">foo</a></p> -<p><a href="test/bar">bar</a></p> -<br/> -<br/> -<br/> -<a href="test/index">test</a> / <a href="test/foo">foo</a><br/> -<br/> -<h1>foo</h1> -<code><span class="keyword">fun </span><span class="identifier">foo</span><span class="symbol">(</span><span class="symbol">)</span><span class="symbol">: </span><span class="identifier">Unit</span></code><br/> -<br/> -<br/> -<a href="test/index">test</a> / <a href="test/bar">bar</a><br/> -<br/> -<h1>bar</h1> -<code><span class="keyword">fun </span><span class="identifier">bar</span><span class="symbol">(</span><span class="symbol">)</span><span class="symbol">: </span><span class="identifier">Unit</span></code><br/> -<br/> -<br/> -</BODY> -</HTML> diff --git a/test/data/format/see.kt b/test/data/format/see.kt deleted file mode 100644 index a0b153b0..00000000 --- a/test/data/format/see.kt +++ /dev/null @@ -1,12 +0,0 @@ -/** - * @see foo - * @see bar - */ -fun quux() { -} - -fun foo() { -} - -fun bar() { -}
\ No newline at end of file diff --git a/test/data/format/starProjection.kt b/test/data/format/starProjection.kt deleted file mode 100644 index 48d53e47..00000000 --- a/test/data/format/starProjection.kt +++ /dev/null @@ -1,3 +0,0 @@ -public fun Iterable<*>.containsFoo(element: Any?): Boolean { - return false -} diff --git a/test/data/format/starProjection.md b/test/data/format/starProjection.md deleted file mode 100644 index c9be2f58..00000000 --- a/test/data/format/starProjection.md +++ /dev/null @@ -1,8 +0,0 @@ -[test](test/index) / [kotlin.Iterable](test/kotlin.-iterable/index) - - -### Extensions for kotlin.Iterable - - -| [containsFoo](test/kotlin.-iterable/contains-foo) | `fun Iterable<*>.containsFoo(element: Any?): Boolean` | - diff --git a/test/data/format/summarizeSignatures.kt b/test/data/format/summarizeSignatures.kt deleted file mode 100644 index 1d875a50..00000000 --- a/test/data/format/summarizeSignatures.kt +++ /dev/null @@ -1,20 +0,0 @@ -package kotlin - -class Array<T> -class IntArray -class CharArray - -/** - * Returns true if foo. - */ -fun IntArray.foo(predicate: (Int) -> Boolean): Boolean = false - -/** - * Returns true if foo. - */ -fun CharArray.foo(predicate: (Char) -> Boolean): Boolean = false - -/** - * Returns true if foo. - */ -fun <T> Array<T>.foo(predicate: (T) -> Boolean): Boolean = false diff --git a/test/data/format/summarizeSignatures.md b/test/data/format/summarizeSignatures.md deleted file mode 100644 index b1707f40..00000000 --- a/test/data/format/summarizeSignatures.md +++ /dev/null @@ -1,23 +0,0 @@ -[test](test/index) / [kotlin](test/kotlin/index) - - -## Package kotlin - - -### Types - - -| [Array](test/kotlin/-array/index) | `class Array<T>` | -| [CharArray](test/kotlin/-char-array/index) | `class CharArray` | -| [IntArray](test/kotlin/-int-array/index) | `class IntArray` | - - -### Functions - - -| [foo](test/kotlin/foo) | `fun <T> any_array<T>.foo(predicate: (T) -> Boolean): Boolean` - -Returns true if foo. - - | - diff --git a/test/data/format/summarizeSignaturesProperty.kt b/test/data/format/summarizeSignaturesProperty.kt deleted file mode 100644 index fbbdd328..00000000 --- a/test/data/format/summarizeSignaturesProperty.kt +++ /dev/null @@ -1,20 +0,0 @@ -package kotlin - -class Array<T> -class IntArray -class CharArray - -/** - * Returns true if foo. - */ -val IntArray.foo: Int = 0 - -/** - * Returns true if foo. - */ -val CharArray.foo: Int = 0 - -/** - * Returns true if foo. - */ -val <T> Array<T>.foo: Int = 0 diff --git a/test/data/format/summarizeSignaturesProperty.md b/test/data/format/summarizeSignaturesProperty.md deleted file mode 100644 index 9646b0f1..00000000 --- a/test/data/format/summarizeSignaturesProperty.md +++ /dev/null @@ -1,23 +0,0 @@ -[test](test/index) / [kotlin](test/kotlin/index) - - -## Package kotlin - - -### Types - - -| [Array](test/kotlin/-array/index) | `class Array<T>` | -| [CharArray](test/kotlin/-char-array/index) | `class CharArray` | -| [IntArray](test/kotlin/-int-array/index) | `class IntArray` | - - -### Properties - - -| [foo](test/kotlin/foo) | `val <T> any_array<T>.foo: Int` - -Returns true if foo. - - | - diff --git a/test/data/format/throwsTag.kt b/test/data/format/throwsTag.kt deleted file mode 100644 index 29a9c3f7..00000000 --- a/test/data/format/throwsTag.kt +++ /dev/null @@ -1,5 +0,0 @@ -/** - * @throws IllegalArgumentException on Mondays - * @exception NullPointerException on Tuesdays - */ -fun f() {} diff --git a/test/data/format/throwsTag.md b/test/data/format/throwsTag.md deleted file mode 100644 index d0a4e610..00000000 --- a/test/data/format/throwsTag.md +++ /dev/null @@ -1,13 +0,0 @@ -[test](test/index) / [f](test/f) - - -# f - -`fun f(): Unit` - -### Exceptions - -`IllegalArgumentException` - on Mondays -`NullPointerException` - on Tuesdays - - diff --git a/test/data/format/tripleBackticks.html b/test/data/format/tripleBackticks.html deleted file mode 100644 index 13954985..00000000 --- a/test/data/format/tripleBackticks.html +++ /dev/null @@ -1,16 +0,0 @@ -<HTML> -<HEAD> -<title>test / f</title> -</HEAD> -<BODY> -<a href="test/index">test</a> / <a href="test/f">f</a><br/> -<br/> -<h1>f</h1> -<code><span class="keyword">fun </span><span class="identifier">f</span><span class="symbol">(</span><span class="symbol">)</span><span class="symbol">: </span><span class="identifier">Unit</span></code><br/> -<p>Description</p> -<pre><code>code sample</code></pre><br/> -<br/> -<br/> -<br/> -</BODY> -</HTML> diff --git a/test/data/format/tripleBackticks.kt b/test/data/format/tripleBackticks.kt deleted file mode 100644 index 54dfa6d5..00000000 --- a/test/data/format/tripleBackticks.kt +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Description - * ``` - * code sample - * ``` - */ -fun f() {} diff --git a/test/data/format/typeLink.html b/test/data/format/typeLink.html deleted file mode 100644 index ff99090a..00000000 --- a/test/data/format/typeLink.html +++ /dev/null @@ -1,24 +0,0 @@ -<HTML> -<HEAD> -<title>test / Bar</title> -</HEAD> -<BODY> -<a href="test/index">test</a> / <a href="test/-bar/index">Bar</a><br/> -<br/> -<h1>Bar</h1> -<code><span class="keyword">class </span><span class="identifier">Bar</span> <span class="symbol">:</span> <a href="test/-foo/index"><span class="identifier">Foo</span></a></code><br/> -<br/> -<br/> -<h3>Constructors</h3> -<table> -<tbody> -<tr> -<td> -<a href="test/-bar/-init-"><init></a></td> -<td> -<code><span class="identifier">Bar</span><span class="symbol">(</span><span class="symbol">)</span></code></td> -</tr> -</tbody> -</table> -</BODY> -</HTML> diff --git a/test/data/format/typeLink.kt b/test/data/format/typeLink.kt deleted file mode 100644 index 966e020e..00000000 --- a/test/data/format/typeLink.kt +++ /dev/null @@ -1,5 +0,0 @@ -class Foo() { -} - -class Bar(): Foo { -} diff --git a/test/data/format/typeParameterBounds.kt b/test/data/format/typeParameterBounds.kt deleted file mode 100644 index 5f22f8c5..00000000 --- a/test/data/format/typeParameterBounds.kt +++ /dev/null @@ -1,6 +0,0 @@ - -/** - * generic function - */ -public fun <T : R, R> generic() { -}
\ No newline at end of file diff --git a/test/data/format/typeParameterBounds.md b/test/data/format/typeParameterBounds.md deleted file mode 100644 index fe597878..00000000 --- a/test/data/format/typeParameterBounds.md +++ /dev/null @@ -1,11 +0,0 @@ -[test](test/index) / [generic](test/generic) - - -# generic - -`fun <T : R, R> generic(): Unit` - -generic function - - - diff --git a/test/data/format/typeParameterVariance.kt b/test/data/format/typeParameterVariance.kt deleted file mode 100644 index 28b29f4b..00000000 --- a/test/data/format/typeParameterVariance.kt +++ /dev/null @@ -1,2 +0,0 @@ -class Foo<out T> { -} diff --git a/test/data/format/typeParameterVariance.md b/test/data/format/typeParameterVariance.md deleted file mode 100644 index c0bfa6de..00000000 --- a/test/data/format/typeParameterVariance.md +++ /dev/null @@ -1,14 +0,0 @@ -[test](test/index) / [Foo](test/-foo/index) - - -# Foo - -`class Foo<out T>` - - - -### Constructors - - -| [<init>](test/-foo/-init-) | `Foo()` | - diff --git a/test/data/format/typeProjectionVariance.kt b/test/data/format/typeProjectionVariance.kt deleted file mode 100644 index 85ee344d..00000000 --- a/test/data/format/typeProjectionVariance.kt +++ /dev/null @@ -1 +0,0 @@ -fun <T> Array<out T>.foo() {} diff --git a/test/data/format/typeProjectionVariance.md b/test/data/format/typeProjectionVariance.md deleted file mode 100644 index 7aa34593..00000000 --- a/test/data/format/typeProjectionVariance.md +++ /dev/null @@ -1,8 +0,0 @@ -[test](test/index) / [kotlin.Array](test/kotlin.-array/index) - - -### Extensions for kotlin.Array - - -| [foo](test/kotlin.-array/foo) | `fun <T> Array<out T>.foo(): Unit` | - diff --git a/test/data/format/varargsFunction.kt b/test/data/format/varargsFunction.kt deleted file mode 100644 index deea127b..00000000 --- a/test/data/format/varargsFunction.kt +++ /dev/null @@ -1 +0,0 @@ -fun f(vararg s: String) {} diff --git a/test/data/format/varargsFunction.md b/test/data/format/varargsFunction.md deleted file mode 100644 index 723437aa..00000000 --- a/test/data/format/varargsFunction.md +++ /dev/null @@ -1,8 +0,0 @@ -[test](test/index) / [f](test/f) - - -# f - -`fun f(vararg s: String): Unit` - - diff --git a/test/data/functions/annotatedFunction.kt b/test/data/functions/annotatedFunction.kt deleted file mode 100644 index f7abbf6c..00000000 --- a/test/data/functions/annotatedFunction.kt +++ /dev/null @@ -1,2 +0,0 @@ -@Strictfp fun f() { -} diff --git a/test/data/functions/annotatedFunctionWithAnnotationParameters.kt b/test/data/functions/annotatedFunctionWithAnnotationParameters.kt deleted file mode 100644 index e559713a..00000000 --- a/test/data/functions/annotatedFunctionWithAnnotationParameters.kt +++ /dev/null @@ -1,7 +0,0 @@ -@Target(AnnotationTarget.VALUE_PARAMETER) -@Retention(AnnotationRetention.SOURCE) -@MustBeDocumented -public annotation class Fancy(val size: Int) - - -@Fancy(1) fun f() {} diff --git a/test/data/functions/function.kt b/test/data/functions/function.kt deleted file mode 100644 index 3ed81dfa..00000000 --- a/test/data/functions/function.kt +++ /dev/null @@ -1,5 +0,0 @@ -/** - * Function fn - */ -fun fn() { -}
\ No newline at end of file diff --git a/test/data/functions/functionWithAnnotatedParam.kt b/test/data/functions/functionWithAnnotatedParam.kt deleted file mode 100644 index f858e671..00000000 --- a/test/data/functions/functionWithAnnotatedParam.kt +++ /dev/null @@ -1,7 +0,0 @@ -@Target(AnnotationTarget.VALUE_PARAMETER) -@Retention(AnnotationRetention.SOURCE) -@MustBeDocumented -public annotation class Fancy - -fun function(@Fancy notInlined: () -> Unit) { -} diff --git a/test/data/functions/functionWithDefaultParameter.kt b/test/data/functions/functionWithDefaultParameter.kt deleted file mode 100644 index 3a3a102f..00000000 --- a/test/data/functions/functionWithDefaultParameter.kt +++ /dev/null @@ -1 +0,0 @@ -fun f(x: String = "") {} diff --git a/test/data/functions/functionWithNoinlineParam.kt b/test/data/functions/functionWithNoinlineParam.kt deleted file mode 100644 index 640bec83..00000000 --- a/test/data/functions/functionWithNoinlineParam.kt +++ /dev/null @@ -1,2 +0,0 @@ -fun function(noinline notInlined: () -> Unit) { -} diff --git a/test/data/functions/functionWithNotDocumentedAnnotation.kt b/test/data/functions/functionWithNotDocumentedAnnotation.kt deleted file mode 100644 index 3c7e2ff9..00000000 --- a/test/data/functions/functionWithNotDocumentedAnnotation.kt +++ /dev/null @@ -1,2 +0,0 @@ -@Suppress("FOO") fun f() { -} diff --git a/test/data/functions/functionWithParams.kt b/test/data/functions/functionWithParams.kt deleted file mode 100644 index 85c49368..00000000 --- a/test/data/functions/functionWithParams.kt +++ /dev/null @@ -1,8 +0,0 @@ -/** - * Multiline - * - * Function - * Documentation - */ -fun function(/** parameter */ x: Int) { -}
\ No newline at end of file diff --git a/test/data/functions/functionWithReceiver.kt b/test/data/functions/functionWithReceiver.kt deleted file mode 100644 index c8473251..00000000 --- a/test/data/functions/functionWithReceiver.kt +++ /dev/null @@ -1,11 +0,0 @@ -/** - * Function with receiver - */ -fun String.fn() { -} - -/** - * Function with receiver - */ -fun String.fn(x: Int) { -} diff --git a/test/data/functions/genericFunction.kt b/test/data/functions/genericFunction.kt deleted file mode 100644 index 05a65070..00000000 --- a/test/data/functions/genericFunction.kt +++ /dev/null @@ -1,5 +0,0 @@ - -/** - * generic function - */ -private fun <T> generic() {}
\ No newline at end of file diff --git a/test/data/functions/genericFunctionWithConstraints.kt b/test/data/functions/genericFunctionWithConstraints.kt deleted file mode 100644 index 5f22f8c5..00000000 --- a/test/data/functions/genericFunctionWithConstraints.kt +++ /dev/null @@ -1,6 +0,0 @@ - -/** - * generic function - */ -public fun <T : R, R> generic() { -}
\ No newline at end of file diff --git a/test/data/functions/inlineFunction.kt b/test/data/functions/inlineFunction.kt deleted file mode 100644 index 11c19672..00000000 --- a/test/data/functions/inlineFunction.kt +++ /dev/null @@ -1,2 +0,0 @@ -inline fun f() { -} diff --git a/test/data/java/annotatedAnnotation.java b/test/data/java/annotatedAnnotation.java deleted file mode 100644 index 6296e400..00000000 --- a/test/data/java/annotatedAnnotation.java +++ /dev/null @@ -1,6 +0,0 @@ -import java.lang.annotation.*; - -@Target({ElementType.FIELD, ElementType.TYPE, ElementType.METHOD}) -public @interface Attribute { - String value() default ""; -} diff --git a/test/data/java/arrayType.java b/test/data/java/arrayType.java deleted file mode 100644 index dc42a207..00000000 --- a/test/data/java/arrayType.java +++ /dev/null @@ -1,5 +0,0 @@ -class Test { - public String[] arrayToString(int[] data) { - return null; - } -} diff --git a/test/data/java/constructors.java b/test/data/java/constructors.java deleted file mode 100644 index 6f899d18..00000000 --- a/test/data/java/constructors.java +++ /dev/null @@ -1,5 +0,0 @@ -class Test { - public Test() {} - - public Test(String s) {} -} diff --git a/test/data/java/deprecation.java b/test/data/java/deprecation.java deleted file mode 100644 index be8decd6..00000000 --- a/test/data/java/deprecation.java +++ /dev/null @@ -1,6 +0,0 @@ -class C { - /** - * @deprecated This should no longer be used - */ - void fn() {} -}
\ No newline at end of file diff --git a/test/data/java/enumValues.java b/test/data/java/enumValues.java deleted file mode 100644 index d8dda934..00000000 --- a/test/data/java/enumValues.java +++ /dev/null @@ -1,3 +0,0 @@ -enum E { - Foo -}
\ No newline at end of file diff --git a/test/data/java/field.java b/test/data/java/field.java deleted file mode 100644 index d9ae75f9..00000000 --- a/test/data/java/field.java +++ /dev/null @@ -1,4 +0,0 @@ -class Test { - public int i; - public static final String s; -} diff --git a/test/data/java/inheritorLinks.java b/test/data/java/inheritorLinks.java deleted file mode 100644 index 2378f5c6..00000000 --- a/test/data/java/inheritorLinks.java +++ /dev/null @@ -1,7 +0,0 @@ -class C { - public static class Foo { - } - - public static class Bar extends Foo { - } -} diff --git a/test/data/java/innerClass.java b/test/data/java/innerClass.java deleted file mode 100644 index 0f1be948..00000000 --- a/test/data/java/innerClass.java +++ /dev/null @@ -1,4 +0,0 @@ -class Test { - public class D { - } -} diff --git a/test/data/java/javaLangObject.java b/test/data/java/javaLangObject.java deleted file mode 100644 index be3dd570..00000000 --- a/test/data/java/javaLangObject.java +++ /dev/null @@ -1,3 +0,0 @@ -class Test { - public Object fn() { return null; } -} diff --git a/test/data/java/member.java b/test/data/java/member.java deleted file mode 100644 index d4f4b8d5..00000000 --- a/test/data/java/member.java +++ /dev/null @@ -1,11 +0,0 @@ -class Test { - /** - * Summary for Function - * @param name is String parameter - * @param value is int parameter - * @author yole - */ - public void fn(String name, int value) { - - } -}
\ No newline at end of file diff --git a/test/data/java/memberWithModifiers.java b/test/data/java/memberWithModifiers.java deleted file mode 100644 index ea645c21..00000000 --- a/test/data/java/memberWithModifiers.java +++ /dev/null @@ -1,12 +0,0 @@ -public abstract class Test { - /** - * Summary for Function - * @param name is String parameter - * @param value is int parameter - */ - protected final void fn(String name, int value) { - - } - - protected void openFn() {} -}
\ No newline at end of file diff --git a/test/data/java/staticMethod.java b/test/data/java/staticMethod.java deleted file mode 100644 index a2ecd7f1..00000000 --- a/test/data/java/staticMethod.java +++ /dev/null @@ -1,4 +0,0 @@ -class C { - public static void foo() { - } -} diff --git a/test/data/java/superClass.java b/test/data/java/superClass.java deleted file mode 100644 index 31b5fa96..00000000 --- a/test/data/java/superClass.java +++ /dev/null @@ -1,2 +0,0 @@ -public class Foo extends Exception implements Cloneable { -} diff --git a/test/data/java/typeParameter.java b/test/data/java/typeParameter.java deleted file mode 100644 index 5a24b30a..00000000 --- a/test/data/java/typeParameter.java +++ /dev/null @@ -1,3 +0,0 @@ -class Foo<T extends Comparable<T>> { - public <E> E foo(); -} diff --git a/test/data/java/varargs.java b/test/data/java/varargs.java deleted file mode 100644 index d184564e..00000000 --- a/test/data/java/varargs.java +++ /dev/null @@ -1,3 +0,0 @@ -class Foo { - public void bar(String... x); -} diff --git a/test/data/links/linkToJDK.kt b/test/data/links/linkToJDK.kt deleted file mode 100644 index e69de29b..00000000 --- a/test/data/links/linkToJDK.kt +++ /dev/null diff --git a/test/data/links/linkToMember.kt b/test/data/links/linkToMember.kt deleted file mode 100644 index b60eaedb..00000000 --- a/test/data/links/linkToMember.kt +++ /dev/null @@ -1,6 +0,0 @@ -/** - * This is link to [member] - */ -class Foo { - fun member() {} -}
\ No newline at end of file diff --git a/test/data/links/linkToParam.kt b/test/data/links/linkToParam.kt deleted file mode 100644 index ca42a742..00000000 --- a/test/data/links/linkToParam.kt +++ /dev/null @@ -1,5 +0,0 @@ -/** - * This is link to [param] - */ -fun Foo(param: String) { -}
\ No newline at end of file diff --git a/test/data/links/linkToQualifiedMember.kt b/test/data/links/linkToQualifiedMember.kt deleted file mode 100644 index 22c154fe..00000000 --- a/test/data/links/linkToQualifiedMember.kt +++ /dev/null @@ -1,6 +0,0 @@ -/** - * This is link to [Foo.member] - */ -class Foo { - fun member() {} -}
\ No newline at end of file diff --git a/test/data/links/linkToSelf.kt b/test/data/links/linkToSelf.kt deleted file mode 100644 index 74395f0f..00000000 --- a/test/data/links/linkToSelf.kt +++ /dev/null @@ -1,6 +0,0 @@ -/** - * This is link to [Foo] - */ -class Foo { - -}
\ No newline at end of file diff --git a/test/data/markdown/spec.txt b/test/data/markdown/spec.txt deleted file mode 100644 index fce87924..00000000 --- a/test/data/markdown/spec.txt +++ /dev/null @@ -1,6150 +0,0 @@ ---- -title: CommonMark Spec -author: -- John MacFarlane -version: 2 -date: 2014-09-19 -... - -# Introduction - -## What is Markdown? - -Markdown is a plain text format for writing structured documents, -based on conventions used for indicating formatting in email and -usenet posts. It was developed in 2004 by John Gruber, who wrote -the first Markdown-to-HTML converter in perl, and it soon became -widely used in websites. By 2014 there were dozens of -implementations in many languages. Some of them extended basic -Markdown syntax with conventions for footnotes, definition lists, -tables, and other constructs, and some allowed output not just in -HTML but in LaTeX and many other formats. - -## Why is a spec needed? - -John Gruber's [canonical description of Markdown's -syntax](http://daringfireball.net/projects/markdown/syntax) -does not specify the syntax unambiguously. Here are some examples of -questions it does not answer: - -1. How much indentation is needed for a sublist? The spec says that - continuation paragraphs need to be indented four spaces, but is - not fully explicit about sublists. It is natural to think that - they, too, must be indented four spaces, but `Markdown.pl` does - not require that. This is hardly a "corner case," and divergences - between implementations on this issue often lead to surprises for - users in real documents. (See [this comment by John - Gruber](http://article.gmane.org/gmane.text.markdown.general/1997).) - -2. Is a blank line needed before a block quote or header? - Most implementations do not require the blank line. However, - this can lead to unexpected results in hard-wrapped text, and - also to ambiguities in parsing (note that some implementations - put the header inside the blockquote, while others do not). - (John Gruber has also spoken [in favor of requiring the blank - lines](http://article.gmane.org/gmane.text.markdown.general/2146).) - -3. Is a blank line needed before an indented code block? - (`Markdown.pl` requires it, but this is not mentioned in the - documentation, and some implementations do not require it.) - - ``` markdown - paragraph - code? - ``` - -4. What is the exact rule for determining when list items get - wrapped in `<p>` tags? Can a list be partially "loose" and partially - "tight"? What should we do with a list like this? - - ``` markdown - 1. one - - 2. two - 3. three - ``` - - Or this? - - ``` markdown - 1. one - - a - - - b - 2. two - ``` - - (There are some relevant comments by John Gruber - [here](http://article.gmane.org/gmane.text.markdown.general/2554).) - -5. Can list markers be indented? Can ordered list markers be right-aligned? - - ``` markdown - 8. item 1 - 9. item 2 - 10. item 2a - ``` - -6. Is this one list with a horizontal rule in its second item, - or two lists separated by a horizontal rule? - - ``` markdown - * a - * * * * * - * b - ``` - -7. When list markers change from numbers to bullets, do we have - two lists or one? (The Markdown syntax description suggests two, - but the perl scripts and many other implementations produce one.) - - ``` markdown - 1. fee - 2. fie - - foe - - fum - ``` - -8. What are the precedence rules for the markers of inline structure? - For example, is the following a valid link, or does the code span - take precedence ? - - ``` markdown - [a backtick (`)](/url) and [another backtick (`)](/url). - ``` - -9. What are the precedence rules for markers of emphasis and strong - emphasis? For example, how should the following be parsed? - - ``` markdown - *foo *bar* baz* - ``` - -10. What are the precedence rules between block-level and inline-level - structure? For example, how should the following be parsed? - - ``` markdown - - `a long code span can contain a hyphen like this - - and it can screw things up` - ``` - -11. Can list items include headers? (`Markdown.pl` does not allow this, - but headers can occur in blockquotes.) - - ``` markdown - - # Heading - ``` - -12. Can link references be defined inside block quotes or list items? - - ``` markdown - > Blockquote [foo]. - > - > [foo]: /url - ``` - -13. If there are multiple definitions for the same reference, which takes - precedence? - - ``` markdown - [foo]: /url1 - [foo]: /url2 - - [foo][] - ``` - -In the absence of a spec, early implementers consulted `Markdown.pl` -to resolve these ambiguities. But `Markdown.pl` was quite buggy, and -gave manifestly bad results in many cases, so it was not a -satisfactory replacement for a spec. - -Because there is no unambiguous spec, implementations have diverged -considerably. As a result, users are often surprised to find that -a document that renders one way on one system (say, a github wiki) -renders differently on another (say, converting to docbook using -pandoc). To make matters worse, because nothing in Markdown counts -as a "syntax error," the divergence often isn't discovered right away. - -## About this document - -This document attempts to specify Markdown syntax unambiguously. -It contains many examples with side-by-side Markdown and -HTML. These are intended to double as conformance tests. An -accompanying script `runtests.pl` can be used to run the tests -against any Markdown program: - - perl runtests.pl spec.txt PROGRAM - -Since this document describes how Markdown is to be parsed into -an abstract syntax tree, it would have made sense to use an abstract -representation of the syntax tree instead of HTML. But HTML is capable -of representing the structural distinctions we need to make, and the -choice of HTML for the tests makes it possible to run the tests against -an implementation without writing an abstract syntax tree renderer. - -This document is generated from a text file, `spec.txt`, written -in Markdown with a small extension for the side-by-side tests. -The script `spec2md.pl` can be used to turn `spec.txt` into pandoc -Markdown, which can then be converted into other formats. - -In the examples, the `→` character is used to represent tabs. - -# Preprocessing - -A [line](#line) <a id="line"></a> -is a sequence of zero or more characters followed by a line -ending (CR, LF, or CRLF) or by the end of -file. - -This spec does not specify an encoding; it thinks of lines as composed -of characters rather than bytes. A conforming parser may be limited -to a certain encoding. - -Tabs in lines are expanded to spaces, with a tab stop of 4 characters: - -. -→foo→baz→→bim -. -<pre><code>foo baz bim -</code></pre> -. - -. - a→a - ὐ→a -. -<pre><code>a a -ὐ a -</code></pre> -. - -Line endings are replaced by newline characters (LF). - -A line containing no characters, or a line containing only spaces (after -tab expansion), is called a [blank line](#blank-line). -<a id="blank-line"></a> - -# Blocks and inlines - -We can think of a document as a sequence of [blocks](#block)<a -id="block"></a>---structural elements like paragraphs, block quotations, -lists, headers, rules, and code blocks. Blocks can contain other -blocks, or they can contain [inline](#inline)<a id="inline"></a> content: -words, spaces, links, emphasized text, images, and inline code. - -## Precedence - -Indicators of block structure always take precedence over indicators -of inline structure. So, for example, the following is a list with -two items, not a list with one item containing a code span: - -. -- `one -- two` -. -<ul> -<li>`one</li> -<li>two`</li> -</ul> -. - -This means that parsing can proceed in two steps: first, the block -structure of the document can be discerned; second, text lines inside -paragraphs, headers, and other block constructs can be parsed for inline -structure. The second step requires information about link reference -definitions that will be available only at the end of the first -step. Note that the first step requires processing lines in sequence, -but the second can be parallelized, since the inline parsing of -one block element does not affect the inline parsing of any other. - -## Container blocks and leaf blocks - -We can divide blocks into two types: -[container blocks](#container-block), <a id="container-block"></a> -which can contain other blocks, and [leaf blocks](#leaf-block), -<a id="leaf-block"></a> which cannot. - -# Leaf blocks - -This section describes the different kinds of leaf block that make up a -Markdown document. - -## Horizontal rules - -A line consisting of 0-3 spaces of indentation, followed by a sequence -of three or more matching `-`, `_`, or `*` characters, each followed -optionally by any number of spaces, forms a [horizontal -rule](#horizontal-rule). <a id="horizontal-rule"></a> - -. -*** ---- -___ -. -<hr /> -<hr /> -<hr /> -. - -Wrong characters: - -. -+++ -. -<p>+++</p> -. - -. -=== -. -<p>===</p> -. - -Not enough characters: - -. --- -** -__ -. -<p>-- -** -__</p> -. - -One to three spaces indent are allowed: - -. - *** - *** - *** -. -<hr /> -<hr /> -<hr /> -. - -Four spaces is too many: - -. - *** -. -<pre><code>*** -</code></pre> -. - -. -Foo - *** -. -<p>Foo -***</p> -. - -More than three characters may be used: - -. -_____________________________________ -. -<hr /> -. - -Spaces are allowed between the characters: - -. - - - - -. -<hr /> -. - -. - ** * ** * ** * ** -. -<hr /> -. - -. -- - - - -. -<hr /> -. - -Spaces are allowed at the end: - -. -- - - - -. -<hr /> -. - -However, no other characters may occur at the end or the -beginning: - -. -_ _ _ _ a - -a------ -. -<p>_ _ _ _ a</p> -<p>a------</p> -. - -It is required that all of the non-space characters be the same. -So, this is not a horizontal rule: - -. - *-* -. -<p><em>-</em></p> -. - -Horizontal rules do not need blank lines before or after: - -. -- foo -*** -- bar -. -<ul> -<li>foo</li> -</ul> -<hr /> -<ul> -<li>bar</li> -</ul> -. - -Horizontal rules can interrupt a paragraph: - -. -Foo -*** -bar -. -<p>Foo</p> -<hr /> -<p>bar</p> -. - -Note, however, that this is a setext header, not a paragraph followed -by a horizontal rule: - -. -Foo ---- -bar -. -<h2>Foo</h2> -<p>bar</p> -. - -When both a horizontal rule and a list item are possible -interpretations of a line, the horizontal rule is preferred: - -. -* Foo -* * * -* Bar -. -<ul> -<li>Foo</li> -</ul> -<hr /> -<ul> -<li>Bar</li> -</ul> -. - -If you want a horizontal rule in a list item, use a different bullet: - -. -- Foo -- * * * -. -<ul> -<li>Foo</li> -<li><hr /></li> -</ul> -. - -## ATX headers - -An [ATX header](#atx-header) <a id="atx-header"></a> -consists of a string of characters, parsed as inline content, between an -opening sequence of 1--6 unescaped `#` characters and an optional -closing sequence of any number of `#` characters. The opening sequence -of `#` characters cannot be followed directly by a nonspace character. -The closing `#` characters may be followed by spaces only. The opening -`#` character may be indented 0-3 spaces. The raw contents of the -header are stripped of leading and trailing spaces before being parsed -as inline content. The header level is equal to the number of `#` -characters in the opening sequence. - -Simple headers: - -. -# foo -## foo -### foo -#### foo -##### foo -###### foo -. -<h1>foo</h1> -<h2>foo</h2> -<h3>foo</h3> -<h4>foo</h4> -<h5>foo</h5> -<h6>foo</h6> -. - -More than six `#` characters is not a header: - -. -####### foo -. -<p>####### foo</p> -. - -A space is required between the `#` characters and the header's -contents. Note that many implementations currently do not require -the space. However, the space was required by the [original ATX -implementation](http://www.aaronsw.com/2002/atx/atx.py), and it helps -prevent things like the following from being parsed as headers: - -. -#5 bolt -. -<p>#5 bolt</p> -. - -This is not a header, because the first `#` is escaped: - -. -\## foo -. -<p>## foo</p> -. - -Contents are parsed as inlines: - -. -# foo *bar* \*baz\* -. -<h1>foo <em>bar</em> *baz*</h1> -. - -Leading and trailing blanks are ignored in parsing inline content: - -. -# foo -. -<h1>foo</h1> -. - -One to three spaces indentation are allowed: - -. - ### foo - ## foo - # foo -. -<h3>foo</h3> -<h2>foo</h2> -<h1>foo</h1> -. - -Four spaces are too much: - -. - # foo -. -<pre><code># foo -</code></pre> -. - -. -foo - # bar -. -<p>foo -# bar</p> -. - -A closing sequence of `#` characters is optional: - -. -## foo ## - ### bar ### -. -<h2>foo</h2> -<h3>bar</h3> -. - -It need not be the same length as the opening sequence: - -. -# foo ################################## -##### foo ## -. -<h1>foo</h1> -<h5>foo</h5> -. - -Spaces are allowed after the closing sequence: - -. -### foo ### -. -<h3>foo</h3> -. - -A sequence of `#` characters with a nonspace character following it -is not a closing sequence, but counts as part of the contents of the -header: - -. -### foo ### b -. -<h3>foo ### b</h3> -. - -Backslash-escaped `#` characters do not count as part -of the closing sequence: - -. -### foo \### -## foo \#\## -# foo \# -. -<h3>foo #</h3> -<h2>foo ##</h2> -<h1>foo #</h1> -. - -ATX headers need not be separated from surrounding content by blank -lines, and they can interrupt paragraphs: - -. -**** -## foo -**** -. -<hr /> -<h2>foo</h2> -<hr /> -. - -. -Foo bar -# baz -Bar foo -. -<p>Foo bar</p> -<h1>baz</h1> -<p>Bar foo</p> -. - -ATX headers can be empty: - -. -## -# -### ### -. -<h2></h2> -<h1></h1> -<h3></h3> -. - -## Setext headers - -A [setext header](#setext-header) <a id="setext-header"></a> -consists of a line of text, containing at least one nonspace character, -with no more than 3 spaces indentation, followed by a [setext header -underline](#setext-header-underline). A [setext header -underline](#setext-header-underline) <a id="setext-header-underline"></a> -is a sequence of `=` characters or a sequence of `-` characters, with no -more than 3 spaces indentation and any number of trailing -spaces. The header is a level 1 header if `=` characters are used, and -a level 2 header if `-` characters are used. The contents of the header -are the result of parsing the first line as Markdown inline content. - -In general, a setext header need not be preceded or followed by a -blank line. However, it cannot interrupt a paragraph, so when a -setext header comes after a paragraph, a blank line is needed between -them. - -Simple examples: - -. -Foo *bar* -========= - -Foo *bar* ---------- -. -<h1>Foo <em>bar</em></h1> -<h2>Foo <em>bar</em></h2> -. - -The underlining can be any length: - -. -Foo -------------------------- - -Foo -= -. -<h2>Foo</h2> -<h1>Foo</h1> -. - -The header content can be indented up to three spaces, and need -not line up with the underlining: - -. - Foo ---- - - Foo ------ - - Foo - === -. -<h2>Foo</h2> -<h2>Foo</h2> -<h1>Foo</h1> -. - -Four spaces indent is too much: - -. - Foo - --- - - Foo ---- -. -<pre><code>Foo ---- - -Foo -</code></pre> -<hr /> -. - -The setext header underline can be indented up to three spaces, and -may have trailing spaces: - -. -Foo - ---- -. -<h2>Foo</h2> -. - -Four spaces is too much: - -. -Foo - --- -. -<p>Foo ----</p> -. - -The setext header underline cannot contain internal spaces: - -. -Foo -= = - -Foo ---- - -. -<p>Foo -= =</p> -<p>Foo</p> -<hr /> -. - -Trailing spaces in the content line do not cause a line break: - -. -Foo ------ -. -<h2>Foo</h2> -. - -Nor does a backslash at the end: - -. -Foo\ ----- -. -<h2>Foo\</h2> -. - -Since indicators of block structure take precedence over -indicators of inline structure, the following are setext headers: - -. -`Foo ----- -` - -<a title="a lot ---- -of dashes"/> -. -<h2>`Foo</h2> -<p>`</p> -<h2><a title="a lot</h2> -<p>of dashes"/></p> -. - -The setext header underline cannot be a lazy line: - -. -> Foo ---- -. -<blockquote> -<p>Foo</p> -</blockquote> -<hr /> -. - -A setext header cannot interrupt a paragraph: - -. -Foo -Bar ---- - -Foo -Bar -=== -. -<p>Foo -Bar</p> -<hr /> -<p>Foo -Bar -===</p> -. - -But in general a blank line is not required before or after: - -. ---- -Foo ---- -Bar ---- -Baz -. -<hr /> -<h2>Foo</h2> -<h2>Bar</h2> -<p>Baz</p> -. - -Setext headers cannot be empty: - -. - -==== -. -<p>====</p> -. - - -## Indented code blocks - -An [indented code block](#indented-code-block) -<a id="indented-code-block"></a> is composed of one or more -[indented chunks](#indented-chunk) separated by blank lines. -An [indented chunk](#indented-chunk) <a id="indented-chunk"></a> -is a sequence of non-blank lines, each indented four or more -spaces. An indented code block cannot interrupt a paragraph, so -if it occurs before or after a paragraph, there must be an -intervening blank line. The contents of the code block are -the literal contents of the lines, including trailing newlines, -minus four spaces of indentation. An indented code block has no -attributes. - -. - a simple - indented code block -. -<pre><code>a simple - indented code block -</code></pre> -. - -The contents are literal text, and do not get parsed as Markdown: - -. - <a/> - *hi* - - - one -. -<pre><code><a/> -*hi* - -- one -</code></pre> -. - -Here we have three chunks separated by blank lines: - -. - chunk1 - - chunk2 - - - - chunk3 -. -<pre><code>chunk1 - -chunk2 - - - -chunk3 -</code></pre> -. - -Any initial spaces beyond four will be included in the content, even -in interior blank lines: - -. - chunk1 - - chunk2 -. -<pre><code>chunk1 - - chunk2 -</code></pre> -. - -An indented code block cannot interrupt a paragraph. (This -allows hanging indents and the like.) - -. -Foo - bar - -. -<p>Foo -bar</p> -. - -However, any non-blank line with fewer than four leading spaces ends -the code block immediately. So a paragraph may occur immediately -after indented code: - -. - foo -bar -. -<pre><code>foo -</code></pre> -<p>bar</p> -. - -And indented code can occur immediately before and after other kinds of -blocks: - -. -# Header - foo -Header ------- - foo ----- -. -<h1>Header</h1> -<pre><code>foo -</code></pre> -<h2>Header</h2> -<pre><code>foo -</code></pre> -<hr /> -. - -The first line can be indented more than four spaces: - -. - foo - bar -. -<pre><code> foo -bar -</code></pre> -. - -Blank lines preceding or following an indented code block -are not included in it: - -. - - - foo - - -. -<pre><code>foo -</code></pre> -. - -Trailing spaces are included in the code block's content: - -. - foo -. -<pre><code>foo -</code></pre> -. - - -## Fenced code blocks - -A [code fence](#code-fence) <a id="code-fence"></a> is a sequence -of at least three consecutive backtick characters (`` ` ``) or -tildes (`~`). (Tildes and backticks cannot be mixed.) -A [fenced code block](#fenced-code-block) <a id="fenced-code-block"></a> -begins with a code fence, indented no more than three spaces. - -The line with the opening code fence may optionally contain some text -following the code fence; this is trimmed of leading and trailing -spaces and called the [info string](#info-string). -<a id="info-string"></a> The info string may not contain any backtick -characters. (The reason for this restriction is that otherwise -some inline code would be incorrectly interpreted as the -beginning of a fenced code block.) - -The content of the code block consists of all subsequent lines, until -a closing [code fence](#code-fence) of the same type as the code block -began with (backticks or tildes), and with at least as many backticks -or tildes as the opening code fence. If the leading code fence is -indented N spaces, then up to N spaces of indentation are removed from -each line of the content (if present). (If a content line is not -indented, it is preserved unchanged. If it is indented less than N -spaces, all of the indentation is removed.) - -The closing code fence may be indented up to three spaces, and may be -followed only by spaces, which are ignored. If the end of the -containing block (or document) is reached and no closing code fence -has been found, the code block contains all of the lines after the -opening code fence until the end of the containing block (or -document). (An alternative spec would require backtracking in the -event that a closing code fence is not found. But this makes parsing -much less efficient, and there seems to be no real down side to the -behavior described here.) - -A fenced code block may interrupt a paragraph, and does not require -a blank line either before or after. - -The content of a code fence is treated as literal text, not parsed -as inlines. The first word of the info string is typically used to -specify the language of the code sample, and rendered in the `class` -attribute of the `code` tag. However, this spec does not mandate any -particular treatment of the info string. - -Here is a simple example with backticks: - -. -``` -< - > -``` -. -<pre><code>< - > -</code></pre> -. - -With tildes: - -. -~~~ -< - > -~~~ -. -<pre><code>< - > -</code></pre> -. - -The closing code fence must use the same character as the opening -fence: - -. -``` -aaa -~~~ -``` -. -<pre><code>aaa -~~~ -</code></pre> -. - -. -~~~ -aaa -``` -~~~ -. -<pre><code>aaa -``` -</code></pre> -. - -The closing code fence must be at least as long as the opening fence: - -. -```` -aaa -``` -`````` -. -<pre><code>aaa -``` -</code></pre> -. - -. -~~~~ -aaa -~~~ -~~~~ -. -<pre><code>aaa -~~~ -</code></pre> -. - -Unclosed code blocks are closed by the end of the document: - -. -``` -. -<pre><code></code></pre> -. - -. -````` - -``` -aaa -. -<pre><code> -``` -aaa -</code></pre> -. - -A code block can have all empty lines as its content: - -. -``` - - -``` -. -<pre><code> - -</code></pre> -. - -A code block can be empty: - -. -``` -``` -. -<pre><code></code></pre> -. - -Fences can be indented. If the opening fence is indented, -content lines will have equivalent opening indentation removed, -if present: - -. - ``` - aaa -aaa -``` -. -<pre><code>aaa -aaa -</code></pre> -. - -. - ``` -aaa - aaa -aaa - ``` -. -<pre><code>aaa -aaa -aaa -</code></pre> -. - -. - ``` - aaa - aaa - aaa - ``` -. -<pre><code>aaa - aaa -aaa -</code></pre> -. - -Four spaces indentation produces an indented code block: - -. - ``` - aaa - ``` -. -<pre><code>``` -aaa -``` -</code></pre> -. - -Code fences (opening and closing) cannot contain internal spaces: - -. -``` ``` -aaa -. -<p><code></code> -aaa</p> -. - -. -~~~~~~ -aaa -~~~ ~~ -. -<pre><code>aaa -~~~ ~~ -</code></pre> -. - -Fenced code blocks can interrupt paragraphs, and can be followed -directly by paragraphs, without a blank line between: - -. -foo -``` -bar -``` -baz -. -<p>foo</p> -<pre><code>bar -</code></pre> -<p>baz</p> -. - -Other blocks can also occur before and after fenced code blocks -without an intervening blank line: - -. -foo ---- -~~~ -bar -~~~ -# baz -. -<h2>foo</h2> -<pre><code>bar -</code></pre> -<h1>baz</h1> -. - -An [info string](#info-string) can be provided after the opening code fence. -Opening and closing spaces will be stripped, and the first word, prefixed -with `language-`, is used as the value for the `class` attribute of the -`code` element within the enclosing `pre` element. - -. -```ruby -def foo(x) - return 3 -end -``` -. -<pre><code class="language-ruby">def foo(x) - return 3 -end -</code></pre> -. - -. -~~~~ ruby startline=3 $%@#$ -def foo(x) - return 3 -end -~~~~~~~ -. -<pre><code class="language-ruby">def foo(x) - return 3 -end -</code></pre> -. - -. -````; -```` -. -<pre><code class="language-;"></code></pre> -. - -Info strings for backtick code blocks cannot contain backticks: - -. -``` aa ``` -foo -. -<p><code>aa</code> -foo</p> -. - -Closing code fences cannot have info strings: - -. -``` -``` aaa -``` -. -<pre><code>``` aaa -</code></pre> -. - - -## HTML blocks - -An [HTML block tag](#html-block-tag) <a id="html-block-tag"></a> is -an [open tag](#open-tag) or [closing tag](#closing-tag) whose tag -name is one of the following (case-insensitive): -`article`, `header`, `aside`, `hgroup`, `blockquote`, `hr`, `iframe`, -`body`, `li`, `map`, `button`, `object`, `canvas`, `ol`, `caption`, -`output`, `col`, `p`, `colgroup`, `pre`, `dd`, `progress`, `div`, -`section`, `dl`, `table`, `td`, `dt`, `tbody`, `embed`, `textarea`, -`fieldset`, `tfoot`, `figcaption`, `th`, `figure`, `thead`, `footer`, -`footer`, `tr`, `form`, `ul`, `h1`, `h2`, `h3`, `h4`, `h5`, `h6`, -`video`, `script`, `style`. - -An [HTML block](#html-block) <a id="html-block"></a> begins with an -[HTML block tag](#html-block-tag), [HTML comment](#html-comment), -[processing instruction](#processing-instruction), -[declaration](#declaration), or [CDATA section](#cdata-section). -It ends when a [blank line](#blank-line) or the end of the -input is encountered. The initial line may be indented up to three -spaces, and subsequent lines may have any indentation. The contents -of the HTML block are interpreted as raw HTML, and will not be escaped -in HTML output. - -Some simple examples: - -. -<table> - <tr> - <td> - hi - </td> - </tr> -</table> - -okay. -. -<table> - <tr> - <td> - hi - </td> - </tr> -</table> -<p>okay.</p> -. - -. - <div> - *hello* - <foo><a> -. - <div> - *hello* - <foo><a> -. - -Here we have two code blocks with a Markdown paragraph between them: - -. -<DIV CLASS="foo"> - -*Markdown* - -</DIV> -. -<DIV CLASS="foo"> -<p><em>Markdown</em></p> -</DIV> -. - -In the following example, what looks like a Markdown code block -is actually part of the HTML block, which continues until a blank -line or the end of the document is reached: - -. -<div></div> -``` c -int x = 33; -``` -. -<div></div> -``` c -int x = 33; -``` -. - -A comment: - -. -<!-- Foo -bar - baz --> -. -<!-- Foo -bar - baz --> -. - -A processing instruction: - -. -<?php - echo 'foo' -?> -. -<?php - echo 'foo' -?> -. - -CDATA: - -. -<![CDATA[ -function matchwo(a,b) -{ -if (a < b && a < 0) then - { - return 1; - } -else - { - return 0; - } -} -]]> -. -<![CDATA[ -function matchwo(a,b) -{ -if (a < b && a < 0) then - { - return 1; - } -else - { - return 0; - } -} -]]> -. - -The opening tag can be indented 1-3 spaces, but not 4: - -. - <!-- foo --> - - <!-- foo --> -. - <!-- foo --> -<pre><code><!-- foo --> -</code></pre> -. - -An HTML block can interrupt a paragraph, and need not be preceded -by a blank line. - -. -Foo -<div> -bar -</div> -. -<p>Foo</p> -<div> -bar -</div> -. - -However, a following blank line is always needed, except at the end of -a document: - -. -<div> -bar -</div> -*foo* -. -<div> -bar -</div> -*foo* -. - -An incomplete HTML block tag may also start an HTML block: - -. -<div class -foo -. -<div class -foo -. - -This rule differs from John Gruber's original Markdown syntax -specification, which says: - -> The only restrictions are that block-level HTML elements — -> e.g. `<div>`, `<table>`, `<pre>`, `<p>`, etc. — must be separated from -> surrounding content by blank lines, and the start and end tags of the -> block should not be indented with tabs or spaces. - -In some ways Gruber's rule is more restrictive than the one given -here: - -- It requires that an HTML block be preceded by a blank line. -- It does not allow the start tag to be indented. -- It requires a matching end tag, which it also does not allow to - be indented. - -Indeed, most Markdown implementations, including some of Gruber's -own perl implementations, do not impose these restrictions. - -There is one respect, however, in which Gruber's rule is more liberal -than the one given here, since it allows blank lines to occur inside -an HTML block. There are two reasons for disallowing them here. -First, it removes the need to parse balanced tags, which is -expensive and can require backtracking from the end of the document -if no matching end tag is found. Second, it provides a very simple -and flexible way of including Markdown content inside HTML tags: -simply separate the Markdown from the HTML using blank lines: - -. -<div> - -*Emphasized* text. - -</div> -. -<div> -<p><em>Emphasized</em> text.</p> -</div> -. - -Compare: - -. -<div> -*Emphasized* text. -</div> -. -<div> -*Emphasized* text. -</div> -. - -Some Markdown implementations have adopted a convention of -interpreting content inside tags as text if the open tag has -the attribute `markdown=1`. The rule given above seems a simpler and -more elegant way of achieving the same expressive power, which is also -much simpler to parse. - -The main potential drawback is that one can no longer paste HTML -blocks into Markdown documents with 100% reliability. However, -*in most cases* this will work fine, because the blank lines in -HTML are usually followed by HTML block tags. For example: - -. -<table> - -<tr> - -<td> -Hi -</td> - -</tr> - -</table> -. -<table> -<tr> -<td> -Hi -</td> -</tr> -</table> -. - -Moreover, blank lines are usually not necessary and can be -deleted. The exception is inside `<pre>` tags; here, one can -replace the blank lines with ` ` entities. - -So there is no important loss of expressive power with the new rule. - -## Link reference definitions - -A [link reference definition](#link-reference-definition) -<a id="link-reference-definition"></a> consists of a [link -label](#link-label), indented up to three spaces, followed -by a colon (`:`), optional blank space (including up to one -newline), a [link destination](#link-destination), optional -blank space (including up to one newline), and an optional [link -title](#link-title), which if it is present must be separated -from the [link destination](#link-destination) by whitespace. -No further non-space characters may occur on the line. - -A [link reference-definition](#link-reference-definition) -does not correspond to a structural element of a document. Instead, it -defines a label which can be used in [reference links](#reference-link) -and reference-style [images](#image) elsewhere in the document. [Link -reference definitions] can come either before or after the links that use -them. - -. -[foo]: /url "title" - -[foo] -. -<p><a href="/url" title="title">foo</a></p> -. - -. - [foo]: - /url - 'the title' - -[foo] -. -<p><a href="/url" title="the title">foo</a></p> -. - -. -[Foo*bar\]]:my_(url) 'title (with parens)' - -[Foo*bar\]] -. -<p><a href="my_(url)" title="title (with parens)">Foo*bar]</a></p> -. - -. -[Foo bar]: -<my url> -'title' - -[Foo bar] -. -<p><a href="my%20url" title="title">Foo bar</a></p> -. - -The title may be omitted: - -. -[foo]: -/url - -[foo] -. -<p><a href="/url">foo</a></p> -. - -The link destination may not be omitted: - -. -[foo]: - -[foo] -. -<p>[foo]:</p> -<p>[foo]</p> -. - -A link can come before its corresponding definition: - -. -[foo] - -[foo]: url -. -<p><a href="url">foo</a></p> -. - -If there are several matching definitions, the first one takes -precedence: - -. -[foo] - -[foo]: first -[foo]: second -. -<p><a href="first">foo</a></p> -. - -As noted in the section on [Links], matching of labels is -case-insensitive (see [matches](#matches)). - -. -[FOO]: /url - -[Foo] -. -<p><a href="/url">Foo</a></p> -. - -. -[ΑΓΩ]: /φου - -[αγω] -. -<p><a href="/%CF%86%CE%BF%CF%85">αγω</a></p> -. - -Here is a link reference definition with no corresponding link. -It contributes nothing to the document. - -. -[foo]: /url -. -. - -This is not a link reference definition, because there are -non-space characters after the title: - -. -[foo]: /url "title" ok -. -<p>[foo]: /url "title" ok</p> -. - -This is not a link reference definition, because it is indented -four spaces: - -. - [foo]: /url "title" - -[foo] -. -<pre><code>[foo]: /url "title" -</code></pre> -<p>[foo]</p> -. - -This is not a link reference definition, because it occurs inside -a code block: - -. -``` -[foo]: /url -``` - -[foo] -. -<pre><code>[foo]: /url -</code></pre> -<p>[foo]</p> -. - -A [link reference definition](#link-reference-definition) cannot -interrupt a paragraph. - -. -Foo -[bar]: /baz - -[bar] -. -<p>Foo -[bar]: /baz</p> -<p>[bar]</p> -. - -However, it can directly follow other block elements, such as headers -and horizontal rules, and it need not be followed by a blank line. - -. -# [Foo] -[foo]: /url -> bar -. -<h1><a href="/url">Foo</a></h1> -<blockquote> -<p>bar</p> -</blockquote> -. - -Several [link references](#link-reference) can occur one after another, -without intervening blank lines. - -. -[foo]: /foo-url "foo" -[bar]: /bar-url - "bar" -[baz]: /baz-url - -[foo], -[bar], -[baz] -. -<p><a href="/foo-url" title="foo">foo</a>, -<a href="/bar-url" title="bar">bar</a>, -<a href="/baz-url">baz</a></p> -. - -[Link reference definitions](#link-reference-definition) can occur -inside block containers, like lists and block quotations. They -affect the entire document, not just the container in which they -are defined: - -. -[foo] - -> [foo]: /url -. -<p><a href="/url">foo</a></p> -<blockquote> -</blockquote> -. - - -## Paragraphs - -A sequence of non-blank lines that cannot be interpreted as other -kinds of blocks forms a [paragraph](#paragraph).<a id="paragraph"></a> -The contents of the paragraph are the result of parsing the -paragraph's raw content as inlines. The paragraph's raw content -is formed by concatenating the lines and removing initial and final -spaces. - -A simple example with two paragraphs: - -. -aaa - -bbb -. -<p>aaa</p> -<p>bbb</p> -. - -Paragraphs can contain multiple lines, but no blank lines: - -. -aaa -bbb - -ccc -ddd -. -<p>aaa -bbb</p> -<p>ccc -ddd</p> -. - -Multiple blank lines between paragraph have no effect: - -. -aaa - - -bbb -. -<p>aaa</p> -<p>bbb</p> -. - -Leading spaces are skipped: - -. - aaa - bbb -. -<p>aaa -bbb</p> -. - -Lines after the first may be indented any amount, since indented -code blocks cannot interrupt paragraphs. - -. -aaa - bbb - ccc -. -<p>aaa -bbb -ccc</p> -. - -However, the first line may be indented at most three spaces, -or an indented code block will be triggered: - -. - aaa -bbb -. -<p>aaa -bbb</p> -. - -. - aaa -bbb -. -<pre><code>aaa -</code></pre> -<p>bbb</p> -. - -Final spaces are stripped before inline parsing, so a paragraph -that ends with two or more spaces will not end with a hard line -break: - -. -aaa -bbb -. -<p>aaa<br /> -bbb</p> -. - -## Blank lines - -[Blank lines](#blank-line) between block-level elements are ignored, -except for the role they play in determining whether a [list](#list) -is [tight](#tight) or [loose](#loose). - -Blank lines at the beginning and end of the document are also ignored. - -. - - -aaa - - -# aaa - - -. -<p>aaa</p> -<h1>aaa</h1> -. - - -# Container blocks - -A [container block](#container-block) is a block that has other -blocks as its contents. There are two basic kinds of container blocks: -[block quotes](#block-quote) and [list items](#list-item). -[Lists](#list) are meta-containers for [list items](#list-item). - -We define the syntax for container blocks recursively. The general -form of the definition is: - -> If X is a sequence of blocks, then the result of -> transforming X in such-and-such a way is a container of type Y -> with these blocks as its content. - -So, we explain what counts as a block quote or list item by explaining -how these can be *generated* from their contents. This should suffice -to define the syntax, although it does not give a recipe for *parsing* -these constructions. (A recipe is provided below in the section entitled -[A parsing strategy](#appendix-a-a-parsing-strategy).) - -## Block quotes - -A [block quote marker](#block-quote-marker) <a id="block-quote-marker"></a> -consists of 0-3 spaces of initial indent, plus (a) the character `>` together -with a following space, or (b) a single character `>` not followed by a space. - -The following rules define [block quotes](#block-quote): -<a id="block-quote"></a> - -1. **Basic case.** If a string of lines *Ls* constitute a sequence - of blocks *Bs*, then the result of appending a [block quote - marker](#block-quote-marker) to the beginning of each line in *Ls* - is a [block quote](#block-quote) containing *Bs*. - -2. **Laziness.** If a string of lines *Ls* constitute a [block - quote](#block-quote) with contents *Bs*, then the result of deleting - the initial [block quote marker](#block-quote-marker) from one or - more lines in which the next non-space character after the [block - quote marker](#block-quote-marker) is [paragraph continuation - text](#paragraph-continuation-text) is a block quote with *Bs* as - its content. <a id="paragraph-continuation-text"></a> - [Paragraph continuation text](#paragraph-continuation-text) is text - that will be parsed as part of the content of a paragraph, but does - not occur at the beginning of the paragraph. - -3. **Consecutiveness.** A document cannot contain two [block - quotes](#block-quote) in a row unless there is a [blank - line](#blank-line) between them. - -Nothing else counts as a [block quote](#block-quote). - -Here is a simple example: - -. -> # Foo -> bar -> baz -. -<blockquote> -<h1>Foo</h1> -<p>bar -baz</p> -</blockquote> -. - -The spaces after the `>` characters can be omitted: - -. -># Foo ->bar -> baz -. -<blockquote> -<h1>Foo</h1> -<p>bar -baz</p> -</blockquote> -. - -The `>` characters can be indented 1-3 spaces: - -. - > # Foo - > bar - > baz -. -<blockquote> -<h1>Foo</h1> -<p>bar -baz</p> -</blockquote> -. - -Four spaces gives us a code block: - -. - > # Foo - > bar - > baz -. -<pre><code>> # Foo -> bar -> baz -</code></pre> -. - -The Laziness clause allows us to omit the `>` before a -paragraph continuation line: - -. -> # Foo -> bar -baz -. -<blockquote> -<h1>Foo</h1> -<p>bar -baz</p> -</blockquote> -. - -A block quote can contain some lazy and some non-lazy -continuation lines: - -. -> bar -baz -> foo -. -<blockquote> -<p>bar -baz -foo</p> -</blockquote> -. - -Laziness only applies to lines that are continuations of -paragraphs. Lines containing characters or indentation that indicate -block structure cannot be lazy. - -. -> foo ---- -. -<blockquote> -<p>foo</p> -</blockquote> -<hr /> -. - -. -> - foo -- bar -. -<blockquote> -<ul> -<li>foo</li> -</ul> -</blockquote> -<ul> -<li>bar</li> -</ul> -. - -. -> foo - bar -. -<blockquote> -<pre><code>foo -</code></pre> -</blockquote> -<pre><code>bar -</code></pre> -. - -. -> ``` -foo -``` -. -<blockquote> -<pre><code></code></pre> -</blockquote> -<p>foo</p> -<pre><code></code></pre> -. - -A block quote can be empty: - -. -> -. -<blockquote> -</blockquote> -. - -. -> -> -> -. -<blockquote> -</blockquote> -. - -A block quote can have initial or final blank lines: - -. -> -> foo -> -. -<blockquote> -<p>foo</p> -</blockquote> -. - -A blank line always separates block quotes: - -. -> foo - -> bar -. -<blockquote> -<p>foo</p> -</blockquote> -<blockquote> -<p>bar</p> -</blockquote> -. - -(Most current Markdown implementations, including John Gruber's -original `Markdown.pl`, will parse this example as a single block quote -with two paragraphs. But it seems better to allow the author to decide -whether two block quotes or one are wanted.) - -Consecutiveness means that if we put these block quotes together, -we get a single block quote: - -. -> foo -> bar -. -<blockquote> -<p>foo -bar</p> -</blockquote> -. - -To get a block quote with two paragraphs, use: - -. -> foo -> -> bar -. -<blockquote> -<p>foo</p> -<p>bar</p> -</blockquote> -. - -Block quotes can interrupt paragraphs: - -. -foo -> bar -. -<p>foo</p> -<blockquote> -<p>bar</p> -</blockquote> -. - -In general, blank lines are not needed before or after block -quotes: - -. -> aaa -*** -> bbb -. -<blockquote> -<p>aaa</p> -</blockquote> -<hr /> -<blockquote> -<p>bbb</p> -</blockquote> -. - -However, because of laziness, a blank line is needed between -a block quote and a following paragraph: - -. -> bar -baz -. -<blockquote> -<p>bar -baz</p> -</blockquote> -. - -. -> bar - -baz -. -<blockquote> -<p>bar</p> -</blockquote> -<p>baz</p> -. - -. -> bar -> -baz -. -<blockquote> -<p>bar</p> -</blockquote> -<p>baz</p> -. - -It is a consequence of the Laziness rule that any number -of initial `>`s may be omitted on a continuation line of a -nested block quote: - -. -> > > foo -bar -. -<blockquote> -<blockquote> -<blockquote> -<p>foo -bar</p> -</blockquote> -</blockquote> -</blockquote> -. - -. ->>> foo -> bar ->>baz -. -<blockquote> -<blockquote> -<blockquote> -<p>foo -bar -baz</p> -</blockquote> -</blockquote> -</blockquote> -. - -When including an indented code block in a block quote, -remember that the [block quote marker](#block-quote-marker) includes -both the `>` and a following space. So *five spaces* are needed after -the `>`: - -. -> code - -> not code -. -<blockquote> -<pre><code>code -</code></pre> -</blockquote> -<blockquote> -<p>not code</p> -</blockquote> -. - - -## List items - -A [list marker](#list-marker) <a id="list-marker"></a> is a -[bullet list marker](#bullet-list-marker) or an [ordered list -marker](#ordered-list-marker). - -A [bullet list marker](#bullet-list-marker) <a id="bullet-list-marker"></a> -is a `-`, `+`, or `*` character. - -An [ordered list marker](#ordered-list-marker) <a id="ordered-list-marker"></a> -is a sequence of one of more digits (`0-9`), followed by either a -`.` character or a `)` character. - -The following rules define [list items](#list-item): - -1. **Basic case.** If a sequence of lines *Ls* constitute a sequence of - blocks *Bs* starting with a non-space character and not separated - from each other by more than one blank line, and *M* is a list - marker *M* of width *W* followed by 0 < *N* < 5 spaces, then the result - of prepending *M* and the following spaces to the first line of - *Ls*, and indenting subsequent lines of *Ls* by *W + N* spaces, is a - list item with *Bs* as its contents. The type of the list item - (bullet or ordered) is determined by the type of its list marker. - If the list item is ordered, then it is also assigned a start - number, based on the ordered list marker. - -For example, let *Ls* be the lines - -. -A paragraph -with two lines. - - indented code - -> A block quote. -. -<p>A paragraph -with two lines.</p> -<pre><code>indented code -</code></pre> -<blockquote> -<p>A block quote.</p> -</blockquote> -. - -And let *M* be the marker `1.`, and *N* = 2. Then rule #1 says -that the following is an ordered list item with start number 1, -and the same contents as *Ls*: - -. -1. A paragraph - with two lines. - - indented code - - > A block quote. -. -<ol> -<li><p>A paragraph -with two lines.</p> -<pre><code>indented code -</code></pre> -<blockquote> -<p>A block quote.</p> -</blockquote></li> -</ol> -. - -The most important thing to notice is that the position of -the text after the list marker determines how much indentation -is needed in subsequent blocks in the list item. If the list -marker takes up two spaces, and there are three spaces between -the list marker and the next nonspace character, then blocks -must be indented five spaces in order to fall under the list -item. - -Here are some examples showing how far content must be indented to be -put under the list item: - -. -- one - - two -. -<ul> -<li>one</li> -</ul> -<p>two</p> -. - -. -- one - - two -. -<ul> -<li><p>one</p> -<p>two</p></li> -</ul> -. - -. - - one - - two -. -<ul> -<li>one</li> -</ul> -<pre><code> two -</code></pre> -. - -. - - one - - two -. -<ul> -<li><p>one</p> -<p>two</p></li> -</ul> -. - -It is tempting to think of this in terms of columns: the continuation -blocks must be indented at least to the column of the first nonspace -character after the list marker. However, that is not quite right. -The spaces after the list marker determine how much relative indentation -is needed. Which column this indentation reaches will depend on -how the list item is embedded in other constructions, as shown by -this example: - -. - > > 1. one ->> ->> two -. -<blockquote> -<blockquote> -<ol> -<li><p>one</p> -<p>two</p></li> -</ol> -</blockquote> -</blockquote> -. - -Here `two` occurs in the same column as the list marker `1.`, -but is actually contained in the list item, because there is -sufficent indentation after the last containing blockquote marker. - -The converse is also possible. In the following example, the word `two` -occurs far to the right of the initial text of the list item, `one`, but -it is not considered part of the list item, because it is not indented -far enough past the blockquote marker: - -. ->>- one ->> - > > two -. -<blockquote> -<blockquote> -<ul> -<li>one</li> -</ul> -<p>two</p> -</blockquote> -</blockquote> -. - -A list item may not contain blocks that are separated by more than -one blank line. Thus, two blank lines will end a list, unless the -two blanks are contained in a [fenced code block](#fenced-code-block). - -. -- foo - - bar - -- foo - - - bar - -- ``` - foo - - - bar - ``` -. -<ul> -<li><p>foo</p> -<p>bar</p></li> -<li><p>foo</p></li> -</ul> -<p>bar</p> -<ul> -<li><pre><code>foo - - -bar -</code></pre></li> -</ul> -. - -A list item may contain any kind of block: - -. -1. foo - - ``` - bar - ``` - - baz - - > bam -. -<ol> -<li><p>foo</p> -<pre><code>bar -</code></pre> -<p>baz</p> -<blockquote> -<p>bam</p> -</blockquote></li> -</ol> -. - -2. **Item starting with indented code.** If a sequence of lines *Ls* - constitute a sequence of blocks *Bs* starting with an indented code - block and not separated from each other by more than one blank line, - and *M* is a list marker *M* of width *W* followed by - one space, then the result of prepending *M* and the following - space to the first line of *Ls*, and indenting subsequent lines of - *Ls* by *W + 1* spaces, is a list item with *Bs* as its contents. - If a line is empty, then it need not be indented. The type of the - list item (bullet or ordered) is determined by the type of its list - marker. If the list item is ordered, then it is also assigned a - start number, based on the ordered list marker. - -An indented code block will have to be indented four spaces beyond -the edge of the region where text will be included in the list item. -In the following case that is 6 spaces: - -. -- foo - - bar -. -<ul> -<li><p>foo</p> -<pre><code>bar -</code></pre></li> -</ul> -. - -And in this case it is 11 spaces: - -. - 10. foo - - bar -. -<ol start="10"> -<li><p>foo</p> -<pre><code>bar -</code></pre></li> -</ol> -. - -If the *first* block in the list item is an indented code block, -then by rule #2, the contents must be indented *one* space after the -list marker: - -. - indented code - -paragraph - - more code -. -<pre><code>indented code -</code></pre> -<p>paragraph</p> -<pre><code>more code -</code></pre> -. - -. -1. indented code - - paragraph - - more code -. -<ol> -<li><pre><code>indented code -</code></pre> -<p>paragraph</p> -<pre><code>more code -</code></pre></li> -</ol> -. - -Note that an additional space indent is interpreted as space -inside the code block: - -. -1. indented code - - paragraph - - more code -. -<ol> -<li><pre><code> indented code -</code></pre> -<p>paragraph</p> -<pre><code>more code -</code></pre></li> -</ol> -. - -Note that rules #1 and #2 only apply to two cases: (a) cases -in which the lines to be included in a list item begin with a nonspace -character, and (b) cases in which they begin with an indented code -block. In a case like the following, where the first block begins with -a three-space indent, the rules do not allow us to form a list item by -indenting the whole thing and prepending a list marker: - -. - foo - -bar -. -<p>foo</p> -<p>bar</p> -. - -. -- foo - - bar -. -<ul> -<li>foo</li> -</ul> -<p>bar</p> -. - -This is not a significant restriction, because when a block begins -with 1-3 spaces indent, the indentation can always be removed without -a change in interpretation, allowing rule #1 to be applied. So, in -the above case: - -. -- foo - - bar -. -<ul> -<li><p>foo</p> -<p>bar</p></li> -</ul> -. - - -3. **Indentation.** If a sequence of lines *Ls* constitutes a list item - according to rule #1 or #2, then the result of indenting each line - of *L* by 1-3 spaces (the same for each line) also constitutes a - list item with the same contents and attributes. If a line is - empty, then it need not be indented. - -Indented one space: - -. - 1. A paragraph - with two lines. - - indented code - - > A block quote. -. -<ol> -<li><p>A paragraph -with two lines.</p> -<pre><code>indented code -</code></pre> -<blockquote> -<p>A block quote.</p> -</blockquote></li> -</ol> -. - -Indented two spaces: - -. - 1. A paragraph - with two lines. - - indented code - - > A block quote. -. -<ol> -<li><p>A paragraph -with two lines.</p> -<pre><code>indented code -</code></pre> -<blockquote> -<p>A block quote.</p> -</blockquote></li> -</ol> -. - -Indented three spaces: - -. - 1. A paragraph - with two lines. - - indented code - - > A block quote. -. -<ol> -<li><p>A paragraph -with two lines.</p> -<pre><code>indented code -</code></pre> -<blockquote> -<p>A block quote.</p> -</blockquote></li> -</ol> -. - -Four spaces indent gives a code block: - -. - 1. A paragraph - with two lines. - - indented code - - > A block quote. -. -<pre><code>1. A paragraph - with two lines. - - indented code - - > A block quote. -</code></pre> -. - - -4. **Laziness.** If a string of lines *Ls* constitute a [list - item](#list-item) with contents *Bs*, then the result of deleting - some or all of the indentation from one or more lines in which the - next non-space character after the indentation is - [paragraph continuation text](#paragraph-continuation-text) is a - list item with the same contents and attributes. - -Here is an example with lazy continuation lines: - -. - 1. A paragraph -with two lines. - - indented code - - > A block quote. -. -<ol> -<li><p>A paragraph -with two lines.</p> -<pre><code>indented code -</code></pre> -<blockquote> -<p>A block quote.</p> -</blockquote></li> -</ol> -. - -Indentation can be partially deleted: - -. - 1. A paragraph - with two lines. -. -<ol> -<li>A paragraph -with two lines.</li> -</ol> -. - -These examples show how laziness can work in nested structures: - -. -> 1. > Blockquote -continued here. -. -<blockquote> -<ol> -<li><blockquote> -<p>Blockquote -continued here.</p> -</blockquote></li> -</ol> -</blockquote> -. - -. -> 1. > Blockquote -> continued here. -. -<blockquote> -<ol> -<li><blockquote> -<p>Blockquote -continued here.</p> -</blockquote></li> -</ol> -</blockquote> -. - - -5. **That's all.** Nothing that is not counted as a list item by rules - #1--4 counts as a [list item](#list-item). - -The rules for sublists follow from the general rules above. A sublist -must be indented the same number of spaces a paragraph would need to be -in order to be included in the list item. - -So, in this case we need two spaces indent: - -. -- foo - - bar - - baz -. -<ul> -<li>foo -<ul> -<li>bar -<ul> -<li>baz</li> -</ul></li> -</ul></li> -</ul> -. - -One is not enough: - -. -- foo - - bar - - baz -. -<ul> -<li>foo</li> -<li>bar</li> -<li>baz</li> -</ul> -. - -Here we need four, because the list marker is wider: - -. -10) foo - - bar -. -<ol start="10"> -<li>foo -<ul> -<li>bar</li> -</ul></li> -</ol> -. - -Three is not enough: - -. -10) foo - - bar -. -<ol start="10"> -<li>foo</li> -</ol> -<ul> -<li>bar</li> -</ul> -. - -A list may be the first block in a list item: - -. -- - foo -. -<ul> -<li><ul> -<li>foo</li> -</ul></li> -</ul> -. - -. -1. - 2. foo -. -<ol> -<li><ul> -<li><ol start="2"> -<li>foo</li> -</ol></li> -</ul></li> -</ol> -. - -A list item may be empty: - -. -- foo -- -- bar -. -<ul> -<li>foo</li> -<li></li> -<li>bar</li> -</ul> -. - -. -- -. -<ul> -<li></li> -</ul> -. - -### Motivation - -John Gruber's Markdown spec says the following about list items: - -1. "List markers typically start at the left margin, but may be indented - by up to three spaces. List markers must be followed by one or more - spaces or a tab." - -2. "To make lists look nice, you can wrap items with hanging indents.... - But if you don't want to, you don't have to." - -3. "List items may consist of multiple paragraphs. Each subsequent - paragraph in a list item must be indented by either 4 spaces or one - tab." - -4. "It looks nice if you indent every line of the subsequent paragraphs, - but here again, Markdown will allow you to be lazy." - -5. "To put a blockquote within a list item, the blockquote's `>` - delimiters need to be indented." - -6. "To put a code block within a list item, the code block needs to be - indented twice — 8 spaces or two tabs." - -These rules specify that a paragraph under a list item must be indented -four spaces (presumably, from the left margin, rather than the start of -the list marker, but this is not said), and that code under a list item -must be indented eight spaces instead of the usual four. They also say -that a block quote must be indented, but not by how much; however, the -example given has four spaces indentation. Although nothing is said -about other kinds of block-level content, it is certainly reasonable to -infer that *all* block elements under a list item, including other -lists, must be indented four spaces. This principle has been called the -*four-space rule*. - -The four-space rule is clear and principled, and if the reference -implementation `Markdown.pl` had followed it, it probably would have -become the standard. However, `Markdown.pl` allowed paragraphs and -sublists to start with only two spaces indentation, at least on the -outer level. Worse, its behavior was inconsistent: a sublist of an -outer-level list needed two spaces indentation, but a sublist of this -sublist needed three spaces. It is not surprising, then, that different -implementations of Markdown have developed very different rules for -determining what comes under a list item. (Pandoc and python-Markdown, -for example, stuck with Gruber's syntax description and the four-space -rule, while discount, redcarpet, marked, PHP Markdown, and others -followed `Markdown.pl`'s behavior more closely.) - -Unfortunately, given the divergences between implementations, there -is no way to give a spec for list items that will be guaranteed not -to break any existing documents. However, the spec given here should -correctly handle lists formatted with either the four-space rule or -the more forgiving `Markdown.pl` behavior, provided they are laid out -in a way that is natural for a human to read. - -The strategy here is to let the width and indentation of the list marker -determine the indentation necessary for blocks to fall under the list -item, rather than having a fixed and arbitrary number. The writer can -think of the body of the list item as a unit which gets indented to the -right enough to fit the list marker (and any indentation on the list -marker). (The laziness rule, #4, then allows continuation lines to be -unindented if needed.) - -This rule is superior, we claim, to any rule requiring a fixed level of -indentation from the margin. The four-space rule is clear but -unnatural. It is quite unintuitive that - -``` markdown -- foo - - bar - - - baz -``` - -should be parsed as two lists with an intervening paragraph, - -``` html -<ul> -<li>foo</li> -</ul> -<p>bar</p> -<ul> -<li>baz</li> -</ul> -``` - -as the four-space rule demands, rather than a single list, - -``` html -<ul> -<li><p>foo</p> -<p>bar</p> -<ul> -<li>baz</li> -</ul></li> -</ul> -``` - -The choice of four spaces is arbitrary. It can be learned, but it is -not likely to be guessed, and it trips up beginners regularly. - -Would it help to adopt a two-space rule? The problem is that such -a rule, together with the rule allowing 1--3 spaces indentation of the -initial list marker, allows text that is indented *less than* the -original list marker to be included in the list item. For example, -`Markdown.pl` parses - -``` markdown - - one - - two -``` - -as a single list item, with `two` a continuation paragraph: - -``` html -<ul> -<li><p>one</p> -<p>two</p></li> -</ul> -``` - -and similarly - -``` markdown -> - one -> -> two -``` - -as - -``` html -<blockquote> -<ul> -<li><p>one</p> -<p>two</p></li> -</ul> -</blockquote> -``` - -This is extremely unintuitive. - -Rather than requiring a fixed indent from the margin, we could require -a fixed indent (say, two spaces, or even one space) from the list marker (which -may itself be indented). This proposal would remove the last anomaly -discussed. Unlike the spec presented above, it would count the following -as a list item with a subparagraph, even though the paragraph `bar` -is not indented as far as the first paragraph `foo`: - -``` markdown - 10. foo - - bar -``` - -Arguably this text does read like a list item with `bar` as a subparagraph, -which may count in favor of the proposal. However, on this proposal indented -code would have to be indented six spaces after the list marker. And this -would break a lot of existing Markdown, which has the pattern: - -``` markdown -1. foo - - indented code -``` - -where the code is indented eight spaces. The spec above, by contrast, will -parse this text as expected, since the code block's indentation is measured -from the beginning of `foo`. - -The one case that needs special treatment is a list item that *starts* -with indented code. How much indentation is required in that case, since -we don't have a "first paragraph" to measure from? Rule #2 simply stipulates -that in such cases, we require one space indentation from the list marker -(and then the normal four spaces for the indented code). This will match the -four-space rule in cases where the list marker plus its initial indentation -takes four spaces (a common case), but diverge in other cases. - -## Lists - -A [list](#list) <a id="list"></a> is a sequence of one or more -list items [of the same type](#of-the-same-type). The list items -may be separated by single [blank lines](#blank-line), but two -blank lines end all containing lists. - -Two list items are [of the same type](#of-the-same-type) -<a id="of-the-same-type"></a> if they begin with a [list -marker](#list-marker) of the same type. Two list markers are of the -same type if (a) they are bullet list markers using the same character -(`-`, `+`, or `*`) or (b) they are ordered list numbers with the same -delimiter (either `.` or `)`). - -A list is an [ordered list](#ordered-list) <a id="ordered-list"></a> -if its constituent list items begin with -[ordered list markers](#ordered-list-marker), and a [bullet -list](#bullet-list) <a id="bullet-list"></a> if its constituent list -items begin with [bullet list markers](#bullet-list-marker). - -The [start number](#start-number) <a id="start-number"></a> -of an [ordered list](#ordered-list) is determined by the list number of -its initial list item. The numbers of subsequent list items are -disregarded. - -A list is [loose](#loose) if it any of its constituent list items are -separated by blank lines, or if any of its constituent list items -directly contain two block-level elements with a blank line between -them. Otherwise a list is [tight](#tight). (The difference in HTML output -is that paragraphs in a loose with are wrapped in `<p>` tags, while -paragraphs in a tight list are not.) - -Changing the bullet or ordered list delimiter starts a new list: - -. -- foo -- bar -+ baz -. -<ul> -<li>foo</li> -<li>bar</li> -</ul> -<ul> -<li>baz</li> -</ul> -. - -. -1. foo -2. bar -3) baz -. -<ol> -<li>foo</li> -<li>bar</li> -</ol> -<ol start="3"> -<li>baz</li> -</ol> -. - -There can be blank lines between items, but two blank lines end -a list: - -. -- foo - -- bar - - -- baz -. -<ul> -<li><p>foo</p></li> -<li><p>bar</p></li> -</ul> -<ul> -<li>baz</li> -</ul> -. - -As illustrated above in the section on [list items](#list-item), -two blank lines between blocks *within* a list item will also end a -list: - -. -- foo - - - bar -- baz -. -<ul> -<li>foo</li> -</ul> -<p>bar</p> -<ul> -<li>baz</li> -</ul> -. - -Indeed, two blank lines will end *all* containing lists: - -. -- foo - - bar - - baz - - - bim -. -<ul> -<li>foo -<ul> -<li>bar -<ul> -<li>baz</li> -</ul></li> -</ul></li> -</ul> -<pre><code> bim -</code></pre> -. - -Thus, two blank lines can be used to separate consecutive lists of -the same type, or to separate a list from an indented code block -that would otherwise be parsed as a subparagraph of the final list -item: - -. -- foo -- bar - - -- baz -- bim -. -<ul> -<li>foo</li> -<li>bar</li> -</ul> -<ul> -<li>baz</li> -<li>bim</li> -</ul> -. - -. -- foo - - notcode - -- foo - - - code -. -<ul> -<li><p>foo</p> -<p>notcode</p></li> -<li><p>foo</p></li> -</ul> -<pre><code>code -</code></pre> -. - -List items need not be indented to the same level. The following -list items will be treated as items at the same list level, -since none is indented enough to belong to the previous list -item: - -. -- a - - b - - c - - d - - e - - f -- g -. -<ul> -<li>a</li> -<li>b</li> -<li>c</li> -<li>d</li> -<li>e</li> -<li>f</li> -<li>g</li> -</ul> -. - -This is a loose list, because there is a blank line between -two of the list items: - -. -- a -- b - -- c -. -<ul> -<li><p>a</p></li> -<li><p>b</p></li> -<li><p>c</p></li> -</ul> -. - -So is this, with a empty second item: - -. -* a -* - -* c -. -<ul> -<li><p>a</p></li> -<li></li> -<li><p>c</p></li> -</ul> -. - -These are loose lists, even though there is no space between the items, -because one of the items directly contains two block-level elements -with a blank line between them: - -. -- a -- b - - c -- d -. -<ul> -<li><p>a</p></li> -<li><p>b</p> -<p>c</p></li> -<li><p>d</p></li> -</ul> -. - -. -- a -- b - - [ref]: /url -- d -. -<ul> -<li><p>a</p></li> -<li><p>b</p></li> -<li><p>d</p></li> -</ul> -. - -This is a tight list, because the blank lines are in a code block: - -. -- a -- ``` - b - - - ``` -- c -. -<ul> -<li>a</li> -<li><pre><code>b - - -</code></pre></li> -<li>c</li> -</ul> -. - -This is a tight list, because the blank line is between two -paragraphs of a sublist. So the inner list is loose while -the other list is tight: - -. -- a - - b - - c -- d -. -<ul> -<li>a -<ul> -<li><p>b</p> -<p>c</p></li> -</ul></li> -<li>d</li> -</ul> -. - -This is a tight list, because the blank line is inside the -block quote: - -. -* a - > b - > -* c -. -<ul> -<li>a -<blockquote> -<p>b</p> -</blockquote></li> -<li>c</li> -</ul> -. - -This list is tight, because the consecutive block elements -are not separated by blank lines: - -. -- a - > b - ``` - c - ``` -- d -. -<ul> -<li>a -<blockquote> -<p>b</p> -</blockquote> -<pre><code>c -</code></pre></li> -<li>d</li> -</ul> -. - -A single-paragraph list is tight: - -. -- a -. -<ul> -<li>a</li> -</ul> -. - -. -- a - - b -. -<ul> -<li>a -<ul> -<li>b</li> -</ul></li> -</ul> -. - -Here the outer list is loose, the inner list tight: - -. -* foo - * bar - - baz -. -<ul> -<li><p>foo</p> -<ul> -<li>bar</li> -</ul> -<p>baz</p></li> -</ul> -. - -. -- a - - b - - c - -- d - - e - - f -. -<ul> -<li><p>a</p> -<ul> -<li>b</li> -<li>c</li> -</ul></li> -<li><p>d</p> -<ul> -<li>e</li> -<li>f</li> -</ul></li> -</ul> -. - -# Inlines - -Inlines are parsed sequentially from the beginning of the character -stream to the end (left to right, in left-to-right languages). -Thus, for example, in - -. -`hi`lo` -. -<p><code>hi</code>lo`</p> -. - -`hi` is parsed as code, leaving the backtick at the end as a literal -backtick. - -## Backslash escapes - -Any ASCII punctuation character may be backslash-escaped: - -. -\!\"\#\$\%\&\'\(\)\*\+\,\-\.\/\:\;\<\=\>\?\@\[\\\]\^\_\`\{\|\}\~ -. -<p>!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~</p> -. - -Backslashes before other characters are treated as literal -backslashes: - -. -\→\A\a\ \3\φ\« -. -<p>\ \A\a\ \3\φ\«</p> -. - -Escaped characters are treated as regular characters and do -not have their usual Markdown meanings: - -. -\*not emphasized* -\<br/> not a tag -\[not a link](/foo) -\`not code` -1\. not a list -\* not a list -\# not a header -\[foo]: /url "not a reference" -. -<p>*not emphasized* -<br/> not a tag -[not a link](/foo) -`not code` -1. not a list -* not a list -# not a header -[foo]: /url "not a reference"</p> -. - -If a backslash is itself escaped, the following character is not: - -. -\\*emphasis* -. -<p>\<em>emphasis</em></p> -. - -A backslash at the end of the line is a hard line break: - -. -foo\ -bar -. -<p>foo<br /> -bar</p> -. - -Backslash escapes do not work in code blocks, code spans, autolinks, or -raw HTML: - -. -`` \[\` `` -. -<p><code>\[\`</code></p> -. - -. - \[\] -. -<pre><code>\[\] -</code></pre> -. - -. -~~~ -\[\] -~~~ -. -<pre><code>\[\] -</code></pre> -. - -. -<http://google.com?find=\*> -. -<p><a href="http://google.com?find=%5C*">http://google.com?find=\*</a></p> -. - -. -<a href="/bar\/)"> -. -<p><a href="/bar\/)"></p> -. - -But they work in all other contexts, including URLs and link titles, -link references, and info strings in [fenced code -blocks](#fenced-code-block): - -. -[foo](/bar\* "ti\*tle") -. -<p><a href="/bar*" title="ti*tle">foo</a></p> -. - -. -[foo] - -[foo]: /bar\* "ti\*tle" -. -<p><a href="/bar*" title="ti*tle">foo</a></p> -. - -. -``` foo\+bar -foo -``` -. -<pre><code class="language-foo+bar">foo -</code></pre> -. - - -## Entities - -With the goal of making this standard as HTML-agnostic as possible, all HTML valid HTML Entities in any -context are recognized as such and converted into their actual values (i.e. the UTF8 characters representing -the entity itself) before they are stored in the AST. - -This allows implementations that target HTML output to trivially escape the entities when generating HTML, -and simplifies the job of implementations targetting other languages, as these will only need to handle the -UTF8 chars and need not be HTML-entity aware. - -[Named entities](#name-entities) <a id="named-entities"></a> consist of `&` -+ any of the valid HTML5 entity names + `;`. The [following document](http://www.whatwg.org/specs/web-apps/current-work/multipage/entities.json) -is used as an authoritative source of the valid entity names and their corresponding codepoints. - -Conforming implementations that target Markdown don't need to generate entities for all the valid -named entities that exist, with the exception of `"` (`"`), `&` (`&`), `<` (`<`) and `>` (`>`), -which always need to be written as entities for security reasons. - -. - & © Æ Ď ¾ ℋ ⅆ ∲ -. -<p> & © Æ Ď ¾ ℋ ⅆ ∲</p> -. - -[Decimal entities](#decimal-entities) <a id="decimal-entities"></a> -consist of `&#` + a string of 1--8 arabic digits + `;`. Again, these entities need to be recognised -and tranformed into their corresponding UTF8 codepoints. Invalid Unicode codepoints will be written -as the "unknown codepoint" character (`0xFFFD`) - -. -# Ӓ Ϡ � -. -<p># Ӓ Ϡ �</p> -. - -[Hexadecimal entities](#hexadecimal-entities) <a id="hexadecimal-entities"></a> -consist of `&#` + either `X` or `x` + a string of 1-8 hexadecimal digits -+ `;`. They will also be parsed and turned into their corresponding UTF8 values in the AST. - -. -" ആ ಫ -. -<p>" ആ ಫ</p> -. - -Here are some nonentities: - -. -  &x; &#; &#x; &ThisIsWayTooLongToBeAnEntityIsntIt; &hi?; -. -<p>&nbsp &x; &#; &#x; &ThisIsWayTooLongToBeAnEntityIsntIt; &hi?;</p> -. - -Although HTML5 does accept some entities without a trailing semicolon -(such as `©`), these are not recognized as entities here, because it makes the grammar too ambiguous: - -. -© -. -<p>&copy</p> -. - -Strings that are not on the list of HTML5 named entities are not recognized as entities either: - -. -&MadeUpEntity; -. -<p>&MadeUpEntity;</p> -. - -Entities are recognized in any context besides code spans or -code blocks, including raw HTML, URLs, [link titles](#link-title), and -[fenced code block](#fenced-code-block) info strings: - -. -<a href="öö.html"> -. -<p><a href="öö.html"></p> -. - -. -[foo](/föö "föö") -. -<p><a href="/f%C3%B6%C3%B6" title="föö">foo</a></p> -. - -. -[foo] - -[foo]: /föö "föö" -. -<p><a href="/f%C3%B6%C3%B6" title="föö">foo</a></p> -. - -. -``` föö -foo -``` -. -<pre><code class="language-föö">foo -</code></pre> -. - -Entities are treated as literal text in code spans and code blocks: - -. -`föö` -. -<p><code>f&ouml;&ouml;</code></p> -. - -. - föfö -. -<pre><code>f&ouml;f&ouml; -</code></pre> -. - -## Code span - -A [backtick string](#backtick-string) <a id="backtick-string"></a> -is a string of one or more backtick characters (`` ` ``) that is neither -preceded nor followed by a backtick. - -A code span begins with a backtick string and ends with a backtick -string of equal length. The contents of the code span are the -characters between the two backtick strings, with leading and trailing -spaces and newlines removed, and consecutive spaces and newlines -collapsed to single spaces. - -This is a simple code span: - -. -`foo` -. -<p><code>foo</code></p> -. - -Here two backticks are used, because the code contains a backtick. -This example also illustrates stripping of leading and trailing spaces: - -. -`` foo ` bar `` -. -<p><code>foo ` bar</code></p> -. - -This example shows the motivation for stripping leading and trailing -spaces: - -. -` `` ` -. -<p><code>``</code></p> -. - -Newlines are treated like spaces: - -. -`` -foo -`` -. -<p><code>foo</code></p> -. - -Interior spaces and newlines are collapsed into single spaces, just -as they would be by a browser: - -. -`foo bar - baz` -. -<p><code>foo bar baz</code></p> -. - -Q: Why not just leave the spaces, since browsers will collapse them -anyway? A: Because we might be targeting a non-HTML format, and we -shouldn't rely on HTML-specific rendering assumptions. - -(Existing implementations differ in their treatment of internal -spaces and newlines. Some, including `Markdown.pl` and -`showdown`, convert an internal newline into a `<br />` tag. -But this makes things difficult for those who like to hard-wrap -their paragraphs, since a line break in the midst of a code -span will cause an unintended line break in the output. Others -just leave internal spaces as they are, which is fine if only -HTML is being targeted.) - -. -`foo `` bar` -. -<p><code>foo `` bar</code></p> -. - -Note that backslash escapes do not work in code spans. All backslashes -are treated literally: - -. -`foo\`bar` -. -<p><code>foo\</code>bar`</p> -. - -Backslash escapes are never needed, because one can always choose a -string of *n* backtick characters as delimiters, where the code does -not contain any strings of exactly *n* backtick characters. - -Code span backticks have higher precedence than any other inline -constructs except HTML tags and autolinks. Thus, for example, this is -not parsed as emphasized text, since the second `*` is part of a code -span: - -. -*foo`*` -. -<p>*foo<code>*</code></p> -. - -And this is not parsed as a link: - -. -[not a `link](/foo`) -. -<p>[not a <code>link](/foo</code>)</p> -. - -But this is a link: - -. -<http://foo.bar.`baz>` -. -<p><a href="http://foo.bar.%60baz">http://foo.bar.`baz</a>`</p> -. - -And this is an HTML tag: - -. -<a href="`">` -. -<p><a href="`">`</p> -. - -When a backtick string is not closed by a matching backtick string, -we just have literal backticks: - -. -```foo`` -. -<p>```foo``</p> -. - -. -`foo -. -<p>`foo</p> -. - -## Emphasis and strong emphasis - -John Gruber's original [Markdown syntax -description](http://daringfireball.net/projects/markdown/syntax#em) says: - -> Markdown treats asterisks (`*`) and underscores (`_`) as indicators of -> emphasis. Text wrapped with one `*` or `_` will be wrapped with an HTML -> `<em>` tag; double `*`'s or `_`'s will be wrapped with an HTML `<strong>` -> tag. - -This is enough for most users, but these rules leave much undecided, -especially when it comes to nested emphasis. The original -`Markdown.pl` test suite makes it clear that triple `***` and -`___` delimiters can be used for strong emphasis, and most -implementations have also allowed the following patterns: - -``` markdown -***strong emph*** -***strong** in emph* -***emph* in strong** -**in strong *emph*** -*in emph **strong*** -``` - -The following patterns are less widely supported, but the intent -is clear and they are useful (especially in contexts like bibliography -entries): - -``` markdown -*emph *with emph* in it* -**strong **with strong** in it** -``` - -Many implementations have also restricted intraword emphasis to -the `*` forms, to avoid unwanted emphasis in words containing -internal underscores. (It is best practice to put these in code -spans, but users often do not.) - -``` markdown -internal emphasis: foo*bar*baz -no emphasis: foo_bar_baz -``` - -The following rules capture all of these patterns, while allowing -for efficient parsing strategies that do not backtrack: - -1. A single `*` character [can open emphasis](#can-open-emphasis) - <a id="can-open-emphasis"></a> iff - - (a) it is not part of a sequence of four or more unescaped `*`s, - (b) it is not followed by whitespace, and - (c) either it is not followed by a `*` character or it is - followed immediately by strong emphasis. - -2. A single `_` character [can open emphasis](#can-open-emphasis) iff - - (a) it is not part of a sequence of four or more unescaped `_`s, - (b) it is not followed by whitespace, - (c) it is not preceded by an ASCII alphanumeric character, and - (d) either it is not followed by a `_` character or it is - followed immediately by strong emphasis. - -3. A single `*` character [can close emphasis](#can-close-emphasis) - <a id="can-close-emphasis"></a> iff - - (a) it is not part of a sequence of four or more unescaped `*`s, and - (b) it is not preceded by whitespace. - -4. A single `_` character [can close emphasis](#can-close-emphasis) iff - - (a) it is not part of a sequence of four or more unescaped `_`s, - (b) it is not preceded by whitespace, and - (c) it is not followed by an ASCII alphanumeric character. - -5. A double `**` [can open strong emphasis](#can-open-strong-emphasis) - <a id="can-open-strong-emphasis" ></a> iff - - (a) it is not part of a sequence of four or more unescaped `*`s, - (b) it is not followed by whitespace, and - (c) either it is not followed by a `*` character or it is - followed immediately by emphasis. - -6. A double `__` [can open strong emphasis](#can-open-strong-emphasis) - iff - - (a) it is not part of a sequence of four or more unescaped `_`s, - (b) it is not followed by whitespace, and - (c) it is not preceded by an ASCII alphanumeric character, and - (d) either it is not followed by a `_` character or it is - followed immediately by emphasis. - -7. A double `**` [can close strong emphasis](#can-close-strong-emphasis) - <a id="can-close-strong-emphasis" ></a> iff - - (a) it is not part of a sequence of four or more unescaped `*`s, and - (b) it is not preceded by whitespace. - -8. A double `__` [can close strong emphasis](#can-close-strong-emphasis) - iff - - (a) it is not part of a sequence of four or more unescaped `_`s, - (b) it is not preceded by whitespace, and - (c) it is not followed by an ASCII alphanumeric character. - -9. Emphasis begins with a delimiter that [can open - emphasis](#can-open-emphasis) and includes inlines parsed - sequentially until a delimiter that [can close - emphasis](#can-close-emphasis), and that uses the same - character (`_` or `*`) as the opening delimiter, is reached. - -10. Strong emphasis begins with a delimiter that [can open strong - emphasis](#can-open-strong-emphasis) and includes inlines parsed - sequentially until a delimiter that [can close strong - emphasis](#can-close-strong-emphasis), and that uses the - same character (`_` or `*`) as the opening delimiter, is reached. - -These rules can be illustrated through a series of examples. - -Simple emphasis: - -. -*foo bar* -. -<p><em>foo bar</em></p> -. - -. -_foo bar_ -. -<p><em>foo bar</em></p> -. - -Simple strong emphasis: - -. -**foo bar** -. -<p><strong>foo bar</strong></p> -. - -. -__foo bar__ -. -<p><strong>foo bar</strong></p> -. - -Emphasis can continue over line breaks: - -. -*foo -bar* -. -<p><em>foo -bar</em></p> -. - -. -_foo -bar_ -. -<p><em>foo -bar</em></p> -. - -. -**foo -bar** -. -<p><strong>foo -bar</strong></p> -. - -. -__foo -bar__ -. -<p><strong>foo -bar</strong></p> -. - -Emphasis can contain other inline constructs: - -. -*foo [bar](/url)* -. -<p><em>foo <a href="/url">bar</a></em></p> -. - -. -_foo [bar](/url)_ -. -<p><em>foo <a href="/url">bar</a></em></p> -. - -. -**foo [bar](/url)** -. -<p><strong>foo <a href="/url">bar</a></strong></p> -. - -. -__foo [bar](/url)__ -. -<p><strong>foo <a href="/url">bar</a></strong></p> -. - -Symbols contained in other inline constructs will not -close emphasis: - -. -*foo [bar*](/url) -. -<p>*foo <a href="/url">bar*</a></p> -. - -. -_foo [bar_](/url) -. -<p>_foo <a href="/url">bar_</a></p> -. - -. -**<a href="**"> -. -<p>**<a href="**"></p> -. - -. -__<a href="__"> -. -<p>__<a href="__"></p> -. - -. -*a `*`* -. -<p><em>a <code>*</code></em></p> -. - -. -_a `_`_ -. -<p><em>a <code>_</code></em></p> -. - -. -**a<http://foo.bar?q=**> -. -<p>**a<a href="http://foo.bar?q=**">http://foo.bar?q=**</a></p> -. - -. -__a<http://foo.bar?q=__> -. -<p>__a<a href="http://foo.bar?q=__">http://foo.bar?q=__</a></p> -. - -This is not emphasis, because the opening delimiter is -followed by white space: - -. -and * foo bar* -. -<p>and * foo bar*</p> -. - -. -_ foo bar_ -. -<p>_ foo bar_</p> -. - -. -and ** foo bar** -. -<p>and ** foo bar**</p> -. - -. -__ foo bar__ -. -<p>__ foo bar__</p> -. - -This is not emphasis, because the closing delimiter is -preceded by white space: - -. -and *foo bar * -. -<p>and *foo bar *</p> -. - -. -and _foo bar _ -. -<p>and _foo bar _</p> -. - -. -and **foo bar ** -. -<p>and **foo bar **</p> -. - -. -and __foo bar __ -. -<p>and __foo bar __</p> -. - -The rules imply that a sequence of four or more unescaped `*` or -`_` characters will always be parsed as a literal string: - -. -****hi**** -. -<p>****hi****</p> -. - -. -_____hi_____ -. -<p>_____hi_____</p> -. - -. -Sign here: _________ -. -<p>Sign here: _________</p> -. - -The rules also imply that there can be no empty emphasis or strong -emphasis: - -. -** is not an empty emphasis -. -<p>** is not an empty emphasis</p> -. - -. -**** is not an empty strong emphasis -. -<p>**** is not an empty strong emphasis</p> -. - -To include `*` or `_` in emphasized sections, use backslash escapes -or code spans: - -. -*here is a \** -. -<p><em>here is a *</em></p> -. - -. -__this is a double underscore (`__`)__ -. -<p><strong>this is a double underscore (<code>__</code>)</strong></p> -. - -`*` delimiters allow intra-word emphasis; `_` delimiters do not: - -. -foo*bar*baz -. -<p>foo<em>bar</em>baz</p> -. - -. -foo_bar_baz -. -<p>foo_bar_baz</p> -. - -. -foo__bar__baz -. -<p>foo__bar__baz</p> -. - -. -_foo_bar_baz_ -. -<p><em>foo_bar_baz</em></p> -. - -. -11*15*32 -. -<p>11<em>15</em>32</p> -. - -. -11_15_32 -. -<p>11_15_32</p> -. - -Internal underscores will be ignored in underscore-delimited -emphasis: - -. -_foo_bar_baz_ -. -<p><em>foo_bar_baz</em></p> -. - -. -__foo__bar__baz__ -. -<p><strong>foo__bar__baz</strong></p> -. - -The rules are sufficient for the following nesting patterns: - -. -***foo bar*** -. -<p><strong><em>foo bar</em></strong></p> -. - -. -___foo bar___ -. -<p><strong><em>foo bar</em></strong></p> -. - -. -***foo** bar* -. -<p><em><strong>foo</strong> bar</em></p> -. - -. -___foo__ bar_ -. -<p><em><strong>foo</strong> bar</em></p> -. - -. -***foo* bar** -. -<p><strong><em>foo</em> bar</strong></p> -. - -. -___foo_ bar__ -. -<p><strong><em>foo</em> bar</strong></p> -. - -. -*foo **bar*** -. -<p><em>foo <strong>bar</strong></em></p> -. - -. -_foo __bar___ -. -<p><em>foo <strong>bar</strong></em></p> -. - -. -**foo *bar*** -. -<p><strong>foo <em>bar</em></strong></p> -. - -. -__foo _bar___ -. -<p><strong>foo <em>bar</em></strong></p> -. - -. -*foo **bar*** -. -<p><em>foo <strong>bar</strong></em></p> -. - -. -_foo __bar___ -. -<p><em>foo <strong>bar</strong></em></p> -. - -. -*foo *bar* baz* -. -<p><em>foo <em>bar</em> baz</em></p> -. - -. -_foo _bar_ baz_ -. -<p><em>foo <em>bar</em> baz</em></p> -. - -. -**foo **bar** baz** -. -<p><strong>foo <strong>bar</strong> baz</strong></p> -. - -. -__foo __bar__ baz__ -. -<p><strong>foo <strong>bar</strong> baz</strong></p> -. - -. -*foo **bar** baz* -. -<p><em>foo <strong>bar</strong> baz</em></p> -. - -. -_foo __bar__ baz_ -. -<p><em>foo <strong>bar</strong> baz</em></p> -. - -. -**foo *bar* baz** -. -<p><strong>foo <em>bar</em> baz</strong></p> -. - -. -__foo _bar_ baz__ -. -<p><strong>foo <em>bar</em> baz</strong></p> -. - -Note that you cannot nest emphasis directly inside emphasis -using the same delimeter, or strong emphasis directly inside -strong emphasis: - -. -**foo** -. -<p><strong>foo</strong></p> -. - -. -****foo**** -. -<p>****foo****</p> -. - -For these nestings, you need to switch delimiters: - -. -*_foo_* -. -<p><em><em>foo</em></em></p> -. - -. -**__foo__** -. -<p><strong><strong>foo</strong></strong></p> -. - -Note that a `*` followed by a `*` can close emphasis, and -a `**` followed by a `*` can close strong emphasis (and -similarly for `_` and `__`): - -. -*foo** -. -<p><em>foo</em>*</p> -. - -. -*foo *bar** -. -<p><em>foo <em>bar</em></em></p> -. - -. -**foo*** -. -<p><strong>foo</strong>*</p> -. - -. -***foo* bar*** -. -<p><strong><em>foo</em> bar</strong>*</p> -. - -. -***foo** bar*** -. -<p><em><strong>foo</strong> bar</em>**</p> -. - -The following contains no strong emphasis, because the opening -delimiter is closed by the first `*` before `bar`: - -. -*foo**bar*** -. -<p><em>foo</em><em>bar</em>**</p> -. - -However, a string of four or more `****` can never close emphasis: - -. -*foo**** -. -<p>*foo****</p> -. - -Note that there are some asymmetries here: - -. -*foo** - -**foo* -. -<p><em>foo</em>*</p> -<p>**foo*</p> -. - -. -*foo *bar** - -**foo* bar* -. -<p><em>foo <em>bar</em></em></p> -<p>**foo* bar*</p> -. - -More cases with mismatched delimiters: - -. -**foo* bar* -. -<p>**foo* bar*</p> -. - -. -*bar*** -. -<p><em>bar</em>**</p> -. - -. -***foo* -. -<p>***foo*</p> -. - -. -**bar*** -. -<p><strong>bar</strong>*</p> -. - -. -***foo** -. -<p>***foo**</p> -. - -. -***foo *bar* -. -<p>***foo <em>bar</em></p> -. - -## Links - -A link contains a [link label](#link-label) (the visible text), -a [destination](#destination) (the URI that is the link destination), -and optionally a [link title](#link-title). There are two basic kinds -of links in Markdown. In [inline links](#inline-links) the destination -and title are given immediately after the label. In [reference -links](#reference-links) the destination and title are defined elsewhere -in the document. - -A [link label](#link-label) <a id="link-label"></a> consists of - -- an opening `[`, followed by -- zero or more backtick code spans, autolinks, HTML tags, link labels, - backslash-escaped ASCII punctuation characters, or non-`]` characters, - followed by -- a closing `]`. - -These rules are motivated by the following intuitive ideas: - -- A link label is a container for inline elements. -- The square brackets bind more tightly than emphasis markers, - but less tightly than `<>` or `` ` ``. -- Link labels may contain material in matching square brackets. - -A [link destination](#link-destination) <a id="link-destination"></a> -consists of either - -- a sequence of zero or more characters between an opening `<` and a - closing `>` that contains no line breaks or unescaped `<` or `>` - characters, or - -- a nonempty sequence of characters that does not include - ASCII space or control characters, and includes parentheses - only if (a) they are backslash-escaped or (b) they are part of - a balanced pair of unescaped parentheses that is not itself - inside a balanced pair of unescaped paretheses. - -A [link title](#link-title) <a id="link-title"></a> consists of either - -- a sequence of zero or more characters between straight double-quote - characters (`"`), including a `"` character only if it is - backslash-escaped, or - -- a sequence of zero or more characters between straight single-quote - characters (`'`), including a `'` character only if it is - backslash-escaped, or - -- a sequence of zero or more characters between matching parentheses - (`(...)`), including a `)` character only if it is backslash-escaped. - -An [inline link](#inline-link) <a id="inline-link"></a> -consists of a [link label](#link-label) followed immediately -by a left parenthesis `(`, optional whitespace, -an optional [link destination](#link-destination), -an optional [link title](#link-title) separated from the link -destination by whitespace, optional whitespace, and a right -parenthesis `)`. The link's text consists of the label (excluding -the enclosing square brackets) parsed as inlines. The link's -URI consists of the link destination, excluding enclosing `<...>` if -present, with backslash-escapes in effect as described above. The -link's title consists of the link title, excluding its enclosing -delimiters, with backslash-escapes in effect as described above. - -Here is a simple inline link: - -. -[link](/uri "title") -. -<p><a href="/uri" title="title">link</a></p> -. - -The title may be omitted: - -. -[link](/uri) -. -<p><a href="/uri">link</a></p> -. - -Both the title and the destination may be omitted: - -. -[link]() -. -<p><a href="">link</a></p> -. - -. -[link](<>) -. -<p><a href="">link</a></p> -. - - -If the destination contains spaces, it must be enclosed in pointy -braces: - -. -[link](/my uri) -. -<p>[link](/my uri)</p> -. - -. -[link](</my uri>) -. -<p><a href="/my%20uri">link</a></p> -. - -The destination cannot contain line breaks, even with pointy braces: - -. -[link](foo -bar) -. -<p>[link](foo -bar)</p> -. - -One level of balanced parentheses is allowed without escaping: - -. -[link]((foo)and(bar)) -. -<p><a href="(foo)and(bar)">link</a></p> -. - -However, if you have parentheses within parentheses, you need to escape -or use the `<...>` form: - -. -[link](foo(and(bar))) -. -<p>[link](foo(and(bar)))</p> -. - -. -[link](foo(and\(bar\))) -. -<p><a href="foo(and(bar))">link</a></p> -. - -. -[link](<foo(and(bar))>) -. -<p><a href="foo(and(bar))">link</a></p> -. - -Parentheses and other symbols can also be escaped, as usual -in Markdown: - -. -[link](foo\)\:) -. -<p><a href="foo):">link</a></p> -. - -URL-escaping and should be left alone inside the destination, as all URL-escaped characters -are also valid URL characters. HTML entities in the destination will be parsed into their UTF8 -codepoints, as usual, and optionally URL-escaped when written as HTML. - -. -[link](foo%20bä) -. -<p><a href="foo%20b%C3%A4">link</a></p> -. - -Note that, because titles can often be parsed as destinations, -if you try to omit the destination and keep the title, you'll -get unexpected results: - -. -[link]("title") -. -<p><a href="%22title%22">link</a></p> -. - -Titles may be in single quotes, double quotes, or parentheses: - -. -[link](/url "title") -[link](/url 'title') -[link](/url (title)) -. -<p><a href="/url" title="title">link</a> -<a href="/url" title="title">link</a> -<a href="/url" title="title">link</a></p> -. - -Backslash escapes and entities may be used in titles: - -. -[link](/url "title \""") -. -<p><a href="/url" title="title """>link</a></p> -. - -Nested balanced quotes are not allowed without escaping: - -. -[link](/url "title "and" title") -. -<p>[link](/url "title "and" title")</p> -. - -But it is easy to work around this by using a different quote type: - -. -[link](/url 'title "and" title') -. -<p><a href="/url" title="title "and" title">link</a></p> -. - -(Note: `Markdown.pl` did allow double quotes inside a double-quoted -title, and its test suite included a test demonstrating this. -But it is hard to see a good rationale for the extra complexity this -brings, since there are already many ways---backslash escaping, -entities, or using a different quote type for the enclosing title---to -write titles containing double quotes. `Markdown.pl`'s handling of -titles has a number of other strange features. For example, it allows -single-quoted titles in inline links, but not reference links. And, in -reference links but not inline links, it allows a title to begin with -`"` and end with `)`. `Markdown.pl` 1.0.1 even allows titles with no closing -quotation mark, though 1.0.2b8 does not. It seems preferable to adopt -a simple, rational rule that works the same way in inline links and -link reference definitions.) - -Whitespace is allowed around the destination and title: - -. -[link]( /uri - "title" ) -. -<p><a href="/uri" title="title">link</a></p> -. - -But it is not allowed between the link label and the -following parenthesis: - -. -[link] (/uri) -. -<p>[link] (/uri)</p> -. - -Note that this is not a link, because the closing `]` occurs in -an HTML tag: - -. -[foo <bar attr="](baz)"> -. -<p>[foo <bar attr="](baz)"></p> -. - - -There are three kinds of [reference links](#reference-link): -<a id="reference-link"></a> - -A [full reference link](#full-reference-link) <a id="full-reference-link"></a> -consists of a [link label](#link-label), optional whitespace, and -another [link label](#link-label) that [matches](#matches) a -[link reference definition](#link-reference-definition) elsewhere in the -document. - -One label [matches](#matches) <a id="matches"></a> -another just in case their normalized forms are equal. To normalize a -label, perform the *unicode case fold* and collapse consecutive internal -whitespace to a single space. If there are multiple matching reference -link definitions, the one that comes first in the document is used. (It -is desirable in such cases to emit a warning.) - -The contents of the first link label are parsed as inlines, which are -used as the link's text. The link's URI and title are provided by the -matching [link reference definition](#link-reference-definition). - -Here is a simple example: - -. -[foo][bar] - -[bar]: /url "title" -. -<p><a href="/url" title="title">foo</a></p> -. - -The first label can contain inline content: - -. -[*foo\!*][bar] - -[bar]: /url "title" -. -<p><a href="/url" title="title"><em>foo!</em></a></p> -. - -Matching is case-insensitive: - -. -[foo][BaR] - -[bar]: /url "title" -. -<p><a href="/url" title="title">foo</a></p> -. - -Unicode case fold is used: - -. -[Толпой][Толпой] is a Russian word. - -[ТОЛПОЙ]: /url -. -<p><a href="/url">Толпой</a> is a Russian word.</p> -. - -Consecutive internal whitespace is treated as one space for -purposes of determining matching: - -. -[Foo - bar]: /url - -[Baz][Foo bar] -. -<p><a href="/url">Baz</a></p> -. - -There can be whitespace between the two labels: - -. -[foo] [bar] - -[bar]: /url "title" -. -<p><a href="/url" title="title">foo</a></p> -. - -. -[foo] -[bar] - -[bar]: /url "title" -. -<p><a href="/url" title="title">foo</a></p> -. - -When there are multiple matching [link reference -definitions](#link-reference-definition), the first is used: - -. -[foo]: /url1 - -[foo]: /url2 - -[bar][foo] -. -<p><a href="/url1">bar</a></p> -. - -Note that matching is performed on normalized strings, not parsed -inline content. So the following does not match, even though the -labels define equivalent inline content: - -. -[bar][foo\!] - -[foo!]: /url -. -<p>[bar][foo!]</p> -. - -A [collapsed reference link](#collapsed-reference-link) -<a id="collapsed-reference-link"></a> consists of a [link -label](#link-label) that [matches](#matches) a [link reference -definition](#link-reference-definition) elsewhere in the -document, optional whitespace, and the string `[]`. The contents of the -first link label are parsed as inlines, which are used as the link's -text. The link's URI and title are provided by the matching reference -link definition. Thus, `[foo][]` is equivalent to `[foo][foo]`. - -. -[foo][] - -[foo]: /url "title" -. -<p><a href="/url" title="title">foo</a></p> -. - -. -[*foo* bar][] - -[*foo* bar]: /url "title" -. -<p><a href="/url" title="title"><em>foo</em> bar</a></p> -. - -The link labels are case-insensitive: - -. -[Foo][] - -[foo]: /url "title" -. -<p><a href="/url" title="title">Foo</a></p> -. - - -As with full reference links, whitespace is allowed -between the two sets of brackets: - -. -[foo] -[] - -[foo]: /url "title" -. -<p><a href="/url" title="title">foo</a></p> -. - -A [shortcut reference link](#shortcut-reference-link) -<a id="shortcut-reference-link"></a> consists of a [link -label](#link-label) that [matches](#matches) a [link reference -definition](#link-reference-definition) elsewhere in the -document and is not followed by `[]` or a link label. -The contents of the first link label are parsed as inlines, -which are used as the link's text. the link's URI and title -are provided by the matching link reference definition. -Thus, `[foo]` is equivalent to `[foo][]`. - -. -[foo] - -[foo]: /url "title" -. -<p><a href="/url" title="title">foo</a></p> -. - -. -[*foo* bar] - -[*foo* bar]: /url "title" -. -<p><a href="/url" title="title"><em>foo</em> bar</a></p> -. - -. -[[*foo* bar]] - -[*foo* bar]: /url "title" -. -<p>[<a href="/url" title="title"><em>foo</em> bar</a>]</p> -. - -The link labels are case-insensitive: - -. -[Foo] - -[foo]: /url "title" -. -<p><a href="/url" title="title">Foo</a></p> -. - -If you just want bracketed text, you can backslash-escape the -opening bracket to avoid links: - -. -\[foo] - -[foo]: /url "title" -. -<p>[foo]</p> -. - -Note that this is a link, because link labels bind more tightly -than emphasis: - -. -[foo*]: /url - -*[foo*] -. -<p>*<a href="/url">foo*</a></p> -. - -However, this is not, because link labels bind less -tightly than code backticks: - -. -[foo`]: /url - -[foo`]` -. -<p>[foo<code>]</code></p> -. - -Link labels can contain matched square brackets: - -. -[[[foo]]] - -[[[foo]]]: /url -. -<p><a href="/url">[[foo]]</a></p> -. - -. -[[[foo]]] - -[[[foo]]]: /url1 -[foo]: /url2 -. -<p><a href="/url1">[[foo]]</a></p> -. - -For non-matching brackets, use backslash escapes: - -. -[\[foo] - -[\[foo]: /url -. -<p><a href="/url">[foo</a></p> -. - -Full references take precedence over shortcut references: - -. -[foo][bar] - -[foo]: /url1 -[bar]: /url2 -. -<p><a href="/url2">foo</a></p> -. - -In the following case `[bar][baz]` is parsed as a reference, -`[foo]` as normal text: - -. -[foo][bar][baz] - -[baz]: /url -. -<p>[foo]<a href="/url">bar</a></p> -. - -Here, though, `[foo][bar]` is parsed as a reference, since -`[bar]` is defined: - -. -[foo][bar][baz] - -[baz]: /url1 -[bar]: /url2 -. -<p><a href="/url2">foo</a><a href="/url1">baz</a></p> -. - -Here `[foo]` is not parsed as a shortcut reference, because it -is followed by a link label (even though `[bar]` is not defined): - -. -[foo][bar][baz] - -[baz]: /url1 -[foo]: /url2 -. -<p>[foo]<a href="/url1">bar</a></p> -. - - -## Images - -An (unescaped) exclamation mark (`!`) followed by a reference or -inline link will be parsed as an image. The link label will be -used as the image's alt text, and the link title, if any, will -be used as the image's title. - -. -![foo](/url "title") -. -<p><img src="/url" alt="foo" title="title" /></p> -. - -. -![foo *bar*] - -[foo *bar*]: train.jpg "train & tracks" -. -<p><img src="train.jpg" alt="foo <em>bar</em>" title="train & tracks" /></p> -. - -. -![foo *bar*][] - -[foo *bar*]: train.jpg "train & tracks" -. -<p><img src="train.jpg" alt="foo <em>bar</em>" title="train & tracks" /></p> -. - -. -![foo *bar*][foobar] - -[FOOBAR]: train.jpg "train & tracks" -. -<p><img src="train.jpg" alt="foo <em>bar</em>" title="train & tracks" /></p> -. - -. -![foo](train.jpg) -. -<p><img src="train.jpg" alt="foo" /></p> -. - -. -My ![foo bar](/path/to/train.jpg "title" ) -. -<p>My <img src="/path/to/train.jpg" alt="foo bar" title="title" /></p> -. - -. -![foo](<url>) -. -<p><img src="url" alt="foo" /></p> -. - -. -![](/url) -. -<p><img src="/url" alt="" /></p> -. - -Reference-style: - -. -![foo] [bar] - -[bar]: /url -. -<p><img src="/url" alt="foo" /></p> -. - -. -![foo] [bar] - -[BAR]: /url -. -<p><img src="/url" alt="foo" /></p> -. - -Collapsed: - -. -![foo][] - -[foo]: /url "title" -. -<p><img src="/url" alt="foo" title="title" /></p> -. - -. -![*foo* bar][] - -[*foo* bar]: /url "title" -. -<p><img src="/url" alt="<em>foo</em> bar" title="title" /></p> -. - -The labels are case-insensitive: - -. -![Foo][] - -[foo]: /url "title" -. -<p><img src="/url" alt="Foo" title="title" /></p> -. - -As with full reference links, whitespace is allowed -between the two sets of brackets: - -. -![foo] -[] - -[foo]: /url "title" -. -<p><img src="/url" alt="foo" title="title" /></p> -. - -Shortcut: - -. -![foo] - -[foo]: /url "title" -. -<p><img src="/url" alt="foo" title="title" /></p> -. - -. -![*foo* bar] - -[*foo* bar]: /url "title" -. -<p><img src="/url" alt="<em>foo</em> bar" title="title" /></p> -. - -. -![[foo]] - -[[foo]]: /url "title" -. -<p><img src="/url" alt="[foo]" title="title" /></p> -. - -The link labels are case-insensitive: - -. -![Foo] - -[foo]: /url "title" -. -<p><img src="/url" alt="Foo" title="title" /></p> -. - -If you just want bracketed text, you can backslash-escape the -opening `!` and `[`: - -. -\!\[foo] - -[foo]: /url "title" -. -<p>![foo]</p> -. - -If you want a link after a literal `!`, backslash-escape the -`!`: - -. -\![foo] - -[foo]: /url "title" -. -<p>!<a href="/url" title="title">foo</a></p> -. - -## Autolinks - -Autolinks are absolute URIs and email addresses inside `<` and `>`. -They are parsed as links, with the URL or email address as the link -label. - -A [URI autolink](#uri-autolink) <a id="uri-autolink"></a> -consists of `<`, followed by an [absolute -URI](#absolute-uri) not containing `<`, followed by `>`. It is parsed -as a link to the URI, with the URI as the link's label. - -An [absolute URI](#absolute-uri), <a id="absolute-uri"></a> -for these purposes, consists of a [scheme](#scheme) followed by a colon (`:`) -followed by zero or more characters other than ASCII whitespace and -control characters, `<`, and `>`. If the URI includes these characters, -you must use percent-encoding (e.g. `%20` for a space). - -The following [schemes](#scheme) <a id="scheme"></a> -are recognized (case-insensitive): -`coap`, `doi`, `javascript`, `aaa`, `aaas`, `about`, `acap`, `cap`, -`cid`, `crid`, `data`, `dav`, `dict`, `dns`, `file`, `ftp`, `geo`, `go`, -`gopher`, `h323`, `http`, `https`, `iax`, `icap`, `im`, `imap`, `info`, -`ipp`, `iris`, `iris.beep`, `iris.xpc`, `iris.xpcs`, `iris.lwz`, `ldap`, -`mailto`, `mid`, `msrp`, `msrps`, `mtqp`, `mupdate`, `news`, `nfs`, -`ni`, `nih`, `nntp`, `opaquelocktoken`, `pop`, `pres`, `rtsp`, -`service`, `session`, `shttp`, `sieve`, `sip`, `sips`, `sms`, `snmp`,` -soap.beep`, `soap.beeps`, `tag`, `tel`, `telnet`, `tftp`, `thismessage`, -`tn3270`, `tip`, `tv`, `urn`, `vemmi`, `ws`, `wss`, `xcon`, -`xcon-userid`, `xmlrpc.beep`, `xmlrpc.beeps`, `xmpp`, `z39.50r`, -`z39.50s`, `adiumxtra`, `afp`, `afs`, `aim`, `apt`,` attachment`, `aw`, -`beshare`, `bitcoin`, `bolo`, `callto`, `chrome`,` chrome-extension`, -`com-eventbrite-attendee`, `content`, `cvs`,` dlna-playsingle`, -`dlna-playcontainer`, `dtn`, `dvb`, `ed2k`, `facetime`, `feed`, -`finger`, `fish`, `gg`, `git`, `gizmoproject`, `gtalk`, `hcp`, `icon`, -`ipn`, `irc`, `irc6`, `ircs`, `itms`, `jar`, `jms`, `keyparc`, `lastfm`, -`ldaps`, `magnet`, `maps`, `market`,` message`, `mms`, `ms-help`, -`msnim`, `mumble`, `mvn`, `notes`, `oid`, `palm`, `paparazzi`, -`platform`, `proxy`, `psyc`, `query`, `res`, `resource`, `rmi`, `rsync`, -`rtmp`, `secondlife`, `sftp`, `sgn`, `skype`, `smb`, `soldat`, -`spotify`, `ssh`, `steam`, `svn`, `teamspeak`, `things`, `udp`, -`unreal`, `ut2004`, `ventrilo`, `view-source`, `webcal`, `wtai`, -`wyciwyg`, `xfire`, `xri`, `ymsgr`. - -Here are some valid autolinks: - -. -<http://foo.bar.baz> -. -<p><a href="http://foo.bar.baz">http://foo.bar.baz</a></p> -. - -. -<http://foo.bar.baz?q=hello&id=22&boolean> -. -<p><a href="http://foo.bar.baz?q=hello&id=22&boolean">http://foo.bar.baz?q=hello&id=22&boolean</a></p> -. - -. -<irc://foo.bar:2233/baz> -. -<p><a href="irc://foo.bar:2233/baz">irc://foo.bar:2233/baz</a></p> -. - -Uppercase is also fine: - -. -<MAILTO:FOO@BAR.BAZ> -. -<p><a href="MAILTO:FOO@BAR.BAZ">MAILTO:FOO@BAR.BAZ</a></p> -. - -Spaces are not allowed in autolinks: - -. -<http://foo.bar/baz bim> -. -<p><http://foo.bar/baz bim></p> -. - -An [email autolink](#email-autolink) <a id="email-autolink"></a> -consists of `<`, followed by an [email address](#email-address), -followed by `>`. The link's label is the email address, -and the URL is `mailto:` followed by the email address. - -An [email address](#email-address), <a id="email-address"></a> -for these purposes, is anything that matches -the [non-normative regex from the HTML5 -spec](http://www.whatwg.org/specs/web-apps/current-work/multipage/forms.html#e-mail-state-%28type=email%29): - - /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])? - (?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/ - -Examples of email autolinks: - -. -<foo@bar.baz.com> -. -<p><a href="mailto:foo@bar.baz.com">foo@bar.baz.com</a></p> -. - -. -<foo+special@Bar.baz-bar0.com> -. -<p><a href="mailto:foo+special@Bar.baz-bar0.com">foo+special@Bar.baz-bar0.com</a></p> -. - -These are not autolinks: - -. -<> -. -<p><></p> -. - -. -<heck://bing.bong> -. -<p><heck://bing.bong></p> -. - -. -< http://foo.bar > -. -<p>< http://foo.bar ></p> -. - -. -<foo.bar.baz> -. -<p><foo.bar.baz></p> -. - -. -<localhost:5001/foo> -. -<p><localhost:5001/foo></p> -. - -. -http://google.com -. -<p>http://google.com</p> -. - -. -foo@bar.baz.com -. -<p>foo@bar.baz.com</p> -. - -## Raw HTML - -Text between `<` and `>` that looks like an HTML tag is parsed as a -raw HTML tag and will be rendered in HTML without escaping. -Tag and attribute names are not limited to current HTML tags, -so custom tags (and even, say, DocBook tags) may be used. - -Here is the grammar for tags: - -A [tag name](#tag-name) <a id="tag-name"></a> consists of an ASCII letter -followed by zero or more ASCII letters or digits. - -An [attribute](#attribute) <a id="attribute"></a> consists of whitespace, -an **attribute name**, and an optional **attribute value -specification**. - -An [attribute name](#attribute-name) <a id="attribute-name"></a> -consists of an ASCII letter, `_`, or `:`, followed by zero or more ASCII -letters, digits, `_`, `.`, `:`, or `-`. (Note: This is the XML -specification restricted to ASCII. HTML5 is laxer.) - -An [attribute value specification](#attribute-value-specification) -<a id="attribute-value-specification"></a> consists of optional whitespace, -a `=` character, optional whitespace, and an [attribute -value](#attribute-value). - -An [attribute value](#attribute-value) <a id="attribute-value"></a> -consists of an [unquoted attribute value](#unquoted-attribute-value), -a [single-quoted attribute value](#single-quoted-attribute-value), -or a [double-quoted attribute value](#double-quoted-attribute-value). - -An [unquoted attribute value](#unquoted-attribute-value) -<a id="unquoted-attribute-value"></a> is a nonempty string of characters not -including spaces, `"`, `'`, `=`, `<`, `>`, or `` ` ``. - -A [single-quoted attribute value](#single-quoted-attribute-value) -<a id="single-quoted-attribute-value"></a> consists of `'`, zero or more -characters not including `'`, and a final `'`. - -A [double-quoted attribute value](#double-quoted-attribute-value) -<a id="double-quoted-attribute-value"></a> consists of `"`, zero or more -characters not including `"`, and a final `"`. - -An [open tag](#open-tag) <a id="open-tag"></a> consists of a `<` character, -a [tag name](#tag-name), zero or more [attributes](#attribute), -optional whitespace, an optional `/` character, and a `>` character. - -A [closing tag](#closing-tag) <a id="closing-tag"></a> consists of the -string `</`, a [tag name](#tag-name), optional whitespace, and the -character `>`. - -An [HTML comment](#html-comment) <a id="html-comment"></a> consists of the -string `<!--`, a string of characters not including the string `--`, and -the string `-->`. - -A [processing instruction](#processing-instruction) -<a id="processing-instruction"></a> consists of the string `<?`, a string -of characters not including the string `?>`, and the string -`?>`. - -A [declaration](#declaration) <a id="declaration"></a> consists of the -string `<!`, a name consisting of one or more uppercase ASCII letters, -whitespace, a string of characters not including the character `>`, and -the character `>`. - -A [CDATA section](#cdata-section) <a id="cdata-section"></a> consists of -the string `<![CDATA[`, a string of characters not including the string -`]]>`, and the string `]]>`. - -An [HTML tag](#html-tag) <a id="html-tag"></a> consists of an [open -tag](#open-tag), a [closing tag](#closing-tag), an [HTML -comment](#html-comment), a [processing -instruction](#processing-instruction), an [element type -declaration](#element-type-declaration), or a [CDATA -section](#cdata-section). - -Here are some simple open tags: - -. -<a><bab><c2c> -. -<p><a><bab><c2c></p> -. - -Empty elements: - -. -<a/><b2/> -. -<p><a/><b2/></p> -. - -Whitespace is allowed: - -. -<a /><b2 -data="foo" > -. -<p><a /><b2 -data="foo" ></p> -. - -With attributes: - -. -<a foo="bar" bam = 'baz <em>"</em>' -_boolean zoop:33=zoop:33 /> -. -<p><a foo="bar" bam = 'baz <em>"</em>' -_boolean zoop:33=zoop:33 /></p> -. - -Illegal tag names, not parsed as HTML: - -. -<33> <__> -. -<p><33> <__></p> -. - -Illegal attribute names: - -. -<a h*#ref="hi"> -. -<p><a h*#ref="hi"></p> -. - -Illegal attribute values: - -. -<a href="hi'> <a href=hi'> -. -<p><a href="hi'> <a href=hi'></p> -. - -Illegal whitespace: - -. -< a>< -foo><bar/ > -. -<p>< a>< -foo><bar/ ></p> -. - -Missing whitespace: - -. -<a href='bar'title=title> -. -<p><a href='bar'title=title></p> -. - -Closing tags: - -. -</a> -</foo > -. -<p></a> -</foo ></p> -. - -Illegal attributes in closing tag: - -. -</a href="foo"> -. -<p></a href="foo"></p> -. - -Comments: - -. -foo <!-- this is a -comment - with hyphen --> -. -<p>foo <!-- this is a -comment - with hyphen --></p> -. - -. -foo <!-- not a comment -- two hyphens --> -. -<p>foo <!-- not a comment -- two hyphens --></p> -. - -Processing instructions: - -. -foo <?php echo $a; ?> -. -<p>foo <?php echo $a; ?></p> -. - -Declarations: - -. -foo <!ELEMENT br EMPTY> -. -<p>foo <!ELEMENT br EMPTY></p> -. - -CDATA sections: - -. -foo <![CDATA[>&<]]> -. -<p>foo <![CDATA[>&<]]></p> -. - -Entities are preserved in HTML attributes: - -. -<a href="ö"> -. -<p><a href="ö"></p> -. - -Backslash escapes do not work in HTML attributes: - -. -<a href="\*"> -. -<p><a href="\*"></p> -. - -. -<a href="\""> -. -<p><a href="""></p> -. - -## Hard line breaks - -A line break (not in a code span or HTML tag) that is preceded -by two or more spaces is parsed as a linebreak (rendered -in HTML as a `<br />` tag): - -. -foo -baz -. -<p>foo<br /> -baz</p> -. - -For a more visible alternative, a backslash before the newline may be -used instead of two spaces: - -. -foo\ -baz -. -<p>foo<br /> -baz</p> -. - -More than two spaces can be used: - -. -foo -baz -. -<p>foo<br /> -baz</p> -. - -Leading spaces at the beginning of the next line are ignored: - -. -foo - bar -. -<p>foo<br /> -bar</p> -. - -. -foo\ - bar -. -<p>foo<br /> -bar</p> -. - -Line breaks can occur inside emphasis, links, and other constructs -that allow inline content: - -. -*foo -bar* -. -<p><em>foo<br /> -bar</em></p> -. - -. -*foo\ -bar* -. -<p><em>foo<br /> -bar</em></p> -. - -Line breaks do not occur inside code spans - -. -`code -span` -. -<p><code>code span</code></p> -. - -. -`code\ -span` -. -<p><code>code\ span</code></p> -. - -or HTML tags: - -. -<a href="foo -bar"> -. -<p><a href="foo -bar"></p> -. - -. -<a href="foo\ -bar"> -. -<p><a href="foo\ -bar"></p> -. - -## Soft line breaks - -A regular line break (not in a code span or HTML tag) that is not -preceded by two or more spaces is parsed as a softbreak. (A -softbreak may be rendered in HTML either as a newline or as a space. -The result will be the same in browsers. In the examples here, a -newline will be used.) - -. -foo -baz -. -<p>foo -baz</p> -. - -Spaces at the end of the line and beginning of the next line are -removed: - -. -foo - baz -. -<p>foo -baz</p> -. - -A conforming parser may render a soft line break in HTML either as a -line break or as a space. - -A renderer may also provide an option to render soft line breaks -as hard line breaks. - -## Strings - -Any characters not given an interpretation by the above rules will -be parsed as string content. - -. -hello $.;'there -. -<p>hello $.;'there</p> -. - -. -Foo χρῆν -. -<p>Foo χρῆν</p> -. - -Internal spaces are preserved verbatim: - -. -Multiple spaces -. -<p>Multiple spaces</p> -. - -<!-- END TESTS --> - -# Appendix A: A parsing strategy {-} - -## Overview {-} - -Parsing has two phases: - -1. In the first phase, lines of input are consumed and the block -structure of the document---its division into paragraphs, block quotes, -list items, and so on---is constructed. Text is assigned to these -blocks but not parsed. Link reference definitions are parsed and a -map of links is constructed. - -2. In the second phase, the raw text contents of paragraphs and headers -are parsed into sequences of Markdown inline elements (strings, -code spans, links, emphasis, and so on), using the map of link -references constructed in phase 1. - -## The document tree {-} - -At each point in processing, the document is represented as a tree of -**blocks**. The root of the tree is a `document` block. The `document` -may have any number of other blocks as **children**. These children -may, in turn, have other blocks as children. The last child of a block -is normally considered **open**, meaning that subsequent lines of input -can alter its contents. (Blocks that are not open are **closed**.) -Here, for example, is a possible document tree, with the open blocks -marked by arrows: - -``` tree --> document - -> block_quote - paragraph - "Lorem ipsum dolor\nsit amet." - -> list (type=bullet tight=true bullet_char=-) - list_item - paragraph - "Qui *quodsi iracundia*" - -> list_item - -> paragraph - "aliquando id" -``` - -## How source lines alter the document tree {-} - -Each line that is processed has an effect on this tree. The line is -analyzed and, depending on its contents, the document may be altered -in one or more of the following ways: - -1. One or more open blocks may be closed. -2. One or more new blocks may be created as children of the - last open block. -3. Text may be added to the last (deepest) open block remaining - on the tree. - -Once a line has been incorporated into the tree in this way, -it can be discarded, so input can be read in a stream. - -We can see how this works by considering how the tree above is -generated by four lines of Markdown: - -``` markdown -> Lorem ipsum dolor -sit amet. -> - Qui *quodsi iracundia* -> - aliquando id -``` - -At the outset, our document model is just - -``` tree --> document -``` - -The first line of our text, - -``` markdown -> Lorem ipsum dolor -``` - -causes a `block_quote` block to be created as a child of our -open `document` block, and a `paragraph` block as a child of -the `block_quote`. Then the text is added to the last open -block, the `paragraph`: - -``` tree --> document - -> block_quote - -> paragraph - "Lorem ipsum dolor" -``` - -The next line, - -``` markdown -sit amet. -``` - -is a "lazy continuation" of the open `paragraph`, so it gets added -to the paragraph's text: - -``` tree --> document - -> block_quote - -> paragraph - "Lorem ipsum dolor\nsit amet." -``` - -The third line, - -``` markdown -> - Qui *quodsi iracundia* -``` - -causes the `paragraph` block to be closed, and a new `list` block -opened as a child of the `block_quote`. A `list_item` is also -added as a child of the `list`, and a `paragraph` as a child of -the `list_item`. The text is then added to the new `paragraph`: - -``` tree --> document - -> block_quote - paragraph - "Lorem ipsum dolor\nsit amet." - -> list (type=bullet tight=true bullet_char=-) - -> list_item - -> paragraph - "Qui *quodsi iracundia*" -``` - -The fourth line, - -``` markdown -> - aliquando id -``` - -causes the `list_item` (and its child the `paragraph`) to be closed, -and a new `list_item` opened up as child of the `list`. A `paragraph` -is added as a child of the new `list_item`, to contain the text. -We thus obtain the final tree: - -``` tree --> document - -> block_quote - paragraph - "Lorem ipsum dolor\nsit amet." - -> list (type=bullet tight=true bullet_char=-) - list_item - paragraph - "Qui *quodsi iracundia*" - -> list_item - -> paragraph - "aliquando id" -``` - -## From block structure to the final document {-} - -Once all of the input has been parsed, all open blocks are closed. - -We then "walk the tree," visiting every node, and parse raw -string contents of paragraphs and headers as inlines. At this -point we have seen all the link reference definitions, so we can -resolve reference links as we go. - -``` tree -document - block_quote - paragraph - str "Lorem ipsum dolor" - softbreak - str "sit amet." - list (type=bullet tight=true bullet_char=-) - list_item - paragraph - str "Qui " - emph - str "quodsi iracundia" - list_item - paragraph - str "aliquando id" -``` - -Notice how the newline in the first paragraph has been parsed as -a `softbreak`, and the asterisks in the first list item have become -an `emph`. - -The document can be rendered as HTML, or in any other format, given -an appropriate renderer. - - diff --git a/test/data/packagedocs/stdlib.md b/test/data/packagedocs/stdlib.md deleted file mode 100644 index 5d7432b5..00000000 --- a/test/data/packagedocs/stdlib.md +++ /dev/null @@ -1,11 +0,0 @@ -# Module stdlib - -## Kotlin Standard Library - -The Kotlin standard library is a set of functions and types implementing idiomatic patterns when working with collections, -text and files. - -# Package kotlin - -Core functions and types - diff --git a/test/data/packages/dottedNamePackage.kt b/test/data/packages/dottedNamePackage.kt deleted file mode 100644 index 38619310..00000000 --- a/test/data/packages/dottedNamePackage.kt +++ /dev/null @@ -1 +0,0 @@ -package dot.name
\ No newline at end of file diff --git a/test/data/packages/rootPackage.kt b/test/data/packages/rootPackage.kt deleted file mode 100644 index e69de29b..00000000 --- a/test/data/packages/rootPackage.kt +++ /dev/null diff --git a/test/data/packages/simpleNamePackage.kt b/test/data/packages/simpleNamePackage.kt deleted file mode 100644 index 2c29f4c7..00000000 --- a/test/data/packages/simpleNamePackage.kt +++ /dev/null @@ -1 +0,0 @@ -package simple diff --git a/test/data/packages/simpleNamePackage2.kt b/test/data/packages/simpleNamePackage2.kt deleted file mode 100644 index 2c29f4c7..00000000 --- a/test/data/packages/simpleNamePackage2.kt +++ /dev/null @@ -1 +0,0 @@ -package simple diff --git a/test/data/properties/annotatedProperty.kt b/test/data/properties/annotatedProperty.kt deleted file mode 100644 index 8990af29..00000000 --- a/test/data/properties/annotatedProperty.kt +++ /dev/null @@ -1 +0,0 @@ -@Volatile var property = "test"
\ No newline at end of file diff --git a/test/data/properties/propertyOverride.kt b/test/data/properties/propertyOverride.kt deleted file mode 100644 index 625d1da0..00000000 --- a/test/data/properties/propertyOverride.kt +++ /dev/null @@ -1,7 +0,0 @@ -open class Foo() { - open val xyzzy: Int get() = 0 -} - -class Bar(): Foo() { - override val xyzzy: Int get() = 1 -} diff --git a/test/data/properties/propertyWithReceiver.kt b/test/data/properties/propertyWithReceiver.kt deleted file mode 100644 index e282f6bd..00000000 --- a/test/data/properties/propertyWithReceiver.kt +++ /dev/null @@ -1,2 +0,0 @@ -val String.foobar: Int - get() = size() * 2 diff --git a/test/data/properties/valueProperty.kt b/test/data/properties/valueProperty.kt deleted file mode 100644 index b87cce57..00000000 --- a/test/data/properties/valueProperty.kt +++ /dev/null @@ -1 +0,0 @@ -val property = "test"
\ No newline at end of file diff --git a/test/data/properties/valuePropertyWithGetter.kt b/test/data/properties/valuePropertyWithGetter.kt deleted file mode 100644 index 64d3848c..00000000 --- a/test/data/properties/valuePropertyWithGetter.kt +++ /dev/null @@ -1,2 +0,0 @@ -val property: String - get() = "test"
\ No newline at end of file diff --git a/test/data/properties/variableProperty.kt b/test/data/properties/variableProperty.kt deleted file mode 100644 index 54ab4595..00000000 --- a/test/data/properties/variableProperty.kt +++ /dev/null @@ -1 +0,0 @@ -var property = "test"
\ No newline at end of file diff --git a/test/data/properties/variablePropertyWithAccessors.kt b/test/data/properties/variablePropertyWithAccessors.kt deleted file mode 100644 index 152fb7d0..00000000 --- a/test/data/properties/variablePropertyWithAccessors.kt +++ /dev/null @@ -1,4 +0,0 @@ -var property: String - get() = "test" - set(value) { - }
\ No newline at end of file diff --git a/test/src/TestAPI.kt b/test/src/TestAPI.kt deleted file mode 100644 index 6b21b7da..00000000 --- a/test/src/TestAPI.kt +++ /dev/null @@ -1,211 +0,0 @@ -package org.jetbrains.dokka.tests - -import com.google.inject.Guice -import com.intellij.openapi.application.PathManager -import com.intellij.openapi.util.Disposer -import com.intellij.openapi.util.io.FileUtil -import org.jetbrains.dokka.* -import org.jetbrains.dokka.Utilities.DokkaModule -import org.jetbrains.kotlin.cli.common.messages.CompilerMessageLocation -import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity -import org.jetbrains.kotlin.cli.common.messages.MessageCollector -import org.jetbrains.kotlin.cli.jvm.config.JavaSourceRoot -import org.jetbrains.kotlin.config.ContentRoot -import org.jetbrains.kotlin.config.KotlinSourceRoot -import org.junit.Assert -import java.io.File -import kotlin.test.fail - -public fun verifyModel(vararg roots: ContentRoot, - withJdk: Boolean = false, - withKotlinRuntime: Boolean = false, - format: String = "html", - verifier: (DocumentationModule) -> Unit) { - val messageCollector = object : MessageCollector { - override fun report(severity: CompilerMessageSeverity, message: String, location: CompilerMessageLocation) { - when (severity) { - CompilerMessageSeverity.WARNING, - CompilerMessageSeverity.LOGGING, - CompilerMessageSeverity.OUTPUT, - CompilerMessageSeverity.INFO, - CompilerMessageSeverity.ERROR -> { - println("$severity: $message at $location") - } - CompilerMessageSeverity.EXCEPTION -> { - fail("$severity: $message at $location") - } - } - } - } - - val environment = AnalysisEnvironment(messageCollector) - environment.apply { - if (withJdk || withKotlinRuntime) { - val stringRoot = PathManager.getResourceRoot(String::class.java, "/java/lang/String.class") - addClasspath(File(stringRoot)) - } - if (withKotlinRuntime) { - val kotlinPairRoot = PathManager.getResourceRoot(Pair::class.java, "/kotlin/Pair.class") - addClasspath(File(kotlinPairRoot)) - } - addRoots(roots.toList()) - } - val options = DocumentationOptions("", format, includeNonPublic = true, skipEmptyPackages = false, sourceLinks = listOf<SourceLinkDefinition>()) - val injector = Guice.createInjector(DokkaModule(environment, options, DokkaConsoleLogger)) - val documentation = buildDocumentationModule(injector, "test") - verifier(documentation) - Disposer.dispose(environment) -} - -public fun verifyModel(source: String, - withJdk: Boolean = false, - withKotlinRuntime: Boolean = false, - format: String = "html", - verifier: (DocumentationModule) -> Unit) { - if (!File(source).exists()) { - throw IllegalArgumentException("Can't find test data file $source") - } - verifyModel(contentRootFromPath(source), - withJdk = withJdk, - withKotlinRuntime = withKotlinRuntime, - format = format, - verifier = verifier) -} - -public fun verifyPackageMember(source: String, - withJdk: Boolean = false, - withKotlinRuntime: Boolean = false, - verifier: (DocumentationNode) -> Unit) { - verifyModel(source, withJdk = withJdk, withKotlinRuntime = withKotlinRuntime) { model -> - val pkg = model.members.single() - verifier(pkg.members.single()) - } -} - -public fun verifyJavaModel(source: String, - withKotlinRuntime: Boolean = false, - verifier: (DocumentationModule) -> Unit) { - val tempDir = FileUtil.createTempDirectory("dokka", "") - try { - val sourceFile = File(source) - FileUtil.copy(sourceFile, File(tempDir, sourceFile.name)) - verifyModel(JavaSourceRoot(tempDir, null), withJdk = true, withKotlinRuntime = withKotlinRuntime, verifier = verifier) - } - finally { - FileUtil.delete(tempDir) - } -} - -public fun verifyJavaPackageMember(source: String, - withKotlinRuntime: Boolean = false, - verifier: (DocumentationNode) -> Unit) { - verifyJavaModel(source, withKotlinRuntime) { model -> - val pkg = model.members.single() - verifier(pkg.members.single()) - } -} - -public fun verifyOutput(roots: Array<ContentRoot>, - outputExtension: String, - withJdk: Boolean = false, - withKotlinRuntime: Boolean = false, - outputGenerator: (DocumentationModule, StringBuilder) -> Unit) { - verifyModel(*roots, withJdk = withJdk, withKotlinRuntime = withKotlinRuntime) { - verifyModelOutput(it, outputExtension, outputGenerator, roots.first().path) - } -} - -private fun verifyModelOutput(it: DocumentationModule, - outputExtension: String, - outputGenerator: (DocumentationModule, StringBuilder) -> Unit, - sourcePath: String) { - val output = StringBuilder() - outputGenerator(it, output) - val ext = outputExtension.removePrefix(".") - val path = sourcePath - val expectedOutput = File(path.replaceAfterLast(".", ext, path + "." + ext)).readText() - assertEqualsIgnoringSeparators(expectedOutput, output.toString()) -} - -public fun verifyOutput(path: String, - outputExtension: String, - withJdk: Boolean = false, - withKotlinRuntime: Boolean = false, - outputGenerator: (DocumentationModule, StringBuilder) -> Unit) { - verifyOutput(arrayOf(contentRootFromPath(path)), outputExtension, withJdk, withKotlinRuntime, outputGenerator) -} - -public fun verifyJavaOutput(path: String, - outputExtension: String, - withKotlinRuntime: Boolean = false, - outputGenerator: (DocumentationModule, StringBuilder) -> Unit) { - verifyJavaModel(path, withKotlinRuntime) { model -> - verifyModelOutput(model, outputExtension, outputGenerator, path) - } -} - -public fun assertEqualsIgnoringSeparators(expectedOutput: String, output: String) { - Assert.assertEquals(expectedOutput.replace("\r\n", "\n"), output.replace("\r\n", "\n")) -} - -fun StringBuilder.appendChildren(node: ContentBlock): StringBuilder { - for (child in node.children) { - val childText = child.toTestString() - append(childText) - } - return this -} - -fun StringBuilder.appendNode(node: ContentNode): StringBuilder { - when (node) { - is ContentText -> { - append(node.text) - } - is ContentEmphasis -> append("*").appendChildren(node).append("*") - is ContentBlockCode -> { - appendln("[code]") - appendChildren(node) - appendln() - appendln("[/code]") - } - is ContentNodeLink -> { - append("[") - appendChildren(node) - append(" -> ") - append(node.node.toString()) - append("]") - } - is ContentBlock -> { - appendChildren(node) - } - is ContentEmpty -> { /* nothing */ } - else -> throw IllegalStateException("Don't know how to format node $node") - } - return this -} - -fun ContentNode.toTestString(): String { - val node = this - return StringBuilder().apply { - appendNode(node) - }.toString() -} - -class InMemoryLocation(override val path: String): Location { - override fun relativePathTo(other: Location, anchor: String?): String = - if (anchor != null) other.path + "#" + anchor else other.path -} - -object InMemoryLocationService: LocationService { - override fun location(qualifiedName: List<String>, hasMembers: Boolean) = - InMemoryLocation(relativePathToNode(qualifiedName, hasMembers)) -} - -val tempLocation = InMemoryLocation("") - -val ContentRoot.path: String - get() = when(this) { - is KotlinSourceRoot -> path - is JavaSourceRoot -> file.path - else -> throw UnsupportedOperationException() - } diff --git a/test/src/format/HtmlFormatTest.kt b/test/src/format/HtmlFormatTest.kt deleted file mode 100644 index 90291bff..00000000 --- a/test/src/format/HtmlFormatTest.kt +++ /dev/null @@ -1,157 +0,0 @@ -package org.jetbrains.dokka.tests - -import org.jetbrains.dokka.HtmlFormatService -import org.jetbrains.dokka.HtmlTemplateService -import org.jetbrains.dokka.KotlinLanguageService -import org.jetbrains.kotlin.cli.jvm.config.JavaSourceRoot -import org.jetbrains.kotlin.config.KotlinSourceRoot -import org.junit.Test -import java.io.File - -public class HtmlFormatTest { - private val htmlService = HtmlFormatService(InMemoryLocationService, KotlinLanguageService(), HtmlTemplateService.default()) - - @Test fun classWithCompanionObject() { - verifyOutput("test/data/format/classWithCompanionObject.kt", ".html") { model, output -> - htmlService.appendNodes(tempLocation, output, model.members.single().members) - } - } - - @Test fun htmlEscaping() { - verifyOutput("test/data/format/htmlEscaping.kt", ".html") { model, output -> - htmlService.appendNodes(tempLocation, output, model.members.single().members) - } - } - - @Test fun overloads() { - verifyOutput("test/data/format/overloads.kt", ".html") { model, output -> - htmlService.appendNodes(tempLocation, output, model.members) - } - } - - @Test fun overloadsWithDescription() { - verifyOutput("test/data/format/overloadsWithDescription.kt", ".html") { model, output -> - htmlService.appendNodes(tempLocation, output, model.members.single().members) - } - } - - @Test fun overloadsWithDifferentDescriptions() { - verifyOutput("test/data/format/overloadsWithDifferentDescriptions.kt", ".html") { model, output -> - htmlService.appendNodes(tempLocation, output, model.members.single().members) - } - } - - @Test fun deprecated() { - verifyOutput("test/data/format/deprecated.kt", ".package.html") { model, output -> - htmlService.appendNodes(tempLocation, output, model.members) - } - verifyOutput("test/data/format/deprecated.kt", ".class.html") { model, output -> - htmlService.appendNodes(tempLocation, output, model.members.single().members) - } - } - - @Test fun brokenLink() { - verifyOutput("test/data/format/brokenLink.kt", ".html") { model, output -> - htmlService.appendNodes(tempLocation, output, model.members.single().members) - } - } - - @Test fun codeSpan() { - verifyOutput("test/data/format/codeSpan.kt", ".html") { model, output -> - htmlService.appendNodes(tempLocation, output, model.members.single().members) - } - } - - @Test fun parenthesis() { - verifyOutput("test/data/format/parenthesis.kt", ".html") { model, output -> - htmlService.appendNodes(tempLocation, output, model.members.single().members) - } - } - - @Test fun bracket() { - verifyOutput("test/data/format/bracket.kt", ".html") { model, output -> - htmlService.appendNodes(tempLocation, output, model.members.single().members) - } - } - - @Test fun see() { - verifyOutput("test/data/format/see.kt", ".html") { model, output -> - htmlService.appendNodes(tempLocation, output, model.members.single().members) - } - } - - @Test fun tripleBackticks() { - verifyOutput("test/data/format/tripleBackticks.kt", ".html") { model, output -> - htmlService.appendNodes(tempLocation, output, model.members.single().members) - } - } - - @Test fun typeLink() { - verifyOutput("test/data/format/typeLink.kt", ".html") { model, output -> - htmlService.appendNodes(tempLocation, output, model.members.single().members.filter { it.name == "Bar"} ) - } - } - - @Test fun parameterAnchor() { - verifyOutput("test/data/format/parameterAnchor.kt", ".html") { model, output -> - htmlService.appendNodes(tempLocation, output, model.members.single().members) - } - } - - @Test fun javaSupertypeLink() { - verifyJavaOutput("test/data/format/javaSupertype.java", ".html") { model, output -> - htmlService.appendNodes(tempLocation, output, model.members.single().members.single { it.name == "C"}.members.filter { it.name == "Bar"} ) - } - } - - @Test fun javaLinkTag() { - verifyJavaOutput("test/data/format/javaLinkTag.java", ".html") { model, output -> - htmlService.appendNodes(tempLocation, output, model.members.single().members) - } - } - - @Test fun javaLinkTagWithLabel() { - verifyJavaOutput("test/data/format/javaLinkTagWithLabel.java", ".html") { model, output -> - htmlService.appendNodes(tempLocation, output, model.members.single().members) - } - } - - @Test fun javaSeeTag() { - verifyJavaOutput("test/data/format/javaSeeTag.java", ".html") { model, output -> - htmlService.appendNodes(tempLocation, output, model.members.single().members) - } - } - - @Test fun javaDeprecated() { - verifyJavaOutput("test/data/format/javaDeprecated.java", ".html") { model, output -> - htmlService.appendNodes(tempLocation, output, model.members.single().members.single { it.name == "Foo" }.members.filter { it.name == "foo" }) - } - } - - @Test fun crossLanguageKotlinExtendsJava() { - verifyOutput(arrayOf(KotlinSourceRoot("test/data/format/crossLanguage/kotlinExtendsJava/Bar.kt"), - JavaSourceRoot(File("test/data/format/crossLanguage/kotlinExtendsJava"), null)), - ".html") { model, output -> - htmlService.appendNodes(tempLocation, output, model.members.single().members.filter { it.name == "Bar" }) - } - } - - @Test fun orderedList() { - verifyOutput("test/data/format/orderedList.kt", ".html") { model, output -> - htmlService.appendNodes(tempLocation, output, model.members.single().members.filter { it.name == "Bar" }) - } - } - - @Test fun linkWithLabel() { - verifyOutput("test/data/format/linkWithLabel.kt", ".html") { model, output -> - htmlService.appendNodes(tempLocation, output, model.members.single().members.filter { it.name == "Bar" }) - } - } - - @Test fun entity() { - verifyOutput("test/data/format/entity.kt", ".html") { model, output -> - htmlService.appendNodes(tempLocation, output, model.members.single().members.filter { it.name == "Bar" }) - } - } -} - diff --git a/test/src/format/MarkdownFormatTest.kt b/test/src/format/MarkdownFormatTest.kt deleted file mode 100644 index 1a09ae60..00000000 --- a/test/src/format/MarkdownFormatTest.kt +++ /dev/null @@ -1,218 +0,0 @@ -package org.jetbrains.dokka.tests - -import org.jetbrains.dokka.KotlinLanguageService -import org.jetbrains.dokka.MarkdownFormatService -import org.junit.Test - -public class MarkdownFormatTest { - private val markdownService = MarkdownFormatService(InMemoryLocationService, KotlinLanguageService()) - - @Test fun emptyDescription() { - verifyOutput("test/data/format/emptyDescription.kt", ".md") { model, output -> - markdownService.appendNodes(tempLocation, output, model.members.single().members) - } - } - - @Test fun classWithCompanionObject() { - verifyOutput("test/data/format/classWithCompanionObject.kt", ".md") { model, output -> - markdownService.appendNodes(tempLocation, output, model.members.single().members) - } - } - - @Test fun annotations() { - verifyOutput("test/data/format/annotations.kt", ".md") { model, output -> - markdownService.appendNodes(tempLocation, output, model.members.single().members) - } - } - - @Test fun annotationClass() { - verifyOutput("test/data/format/annotationClass.kt", ".md") { model, output -> - markdownService.appendNodes(tempLocation, output, model.members.single().members) - } - } - - @Test fun annotationParams() { - verifyOutput("test/data/format/annotationParams.kt", ".md", withKotlinRuntime = true) { model, output -> - markdownService.appendNodes(tempLocation, output, model.members.single().members) - } - } - - @Test fun extensions() { - verifyOutput("test/data/format/extensions.kt", ".package.md") { model, output -> - markdownService.appendNodes(tempLocation, output, model.members) - } - verifyOutput("test/data/format/extensions.kt", ".class.md") { model, output -> - markdownService.appendNodes(tempLocation, output, model.members.single().members) - } - } - - @Test fun enumClass() { - verifyOutput("test/data/format/enumClass.kt", ".md") { model, output -> - markdownService.appendNodes(tempLocation, output, model.members.single().members) - } - verifyOutput("test/data/format/enumClass.kt", ".value.md") { model, output -> - val enumClassNode = model.members.single().members[0] - markdownService.appendNodes(tempLocation, output, - enumClassNode.members.filter { it.name == "LOCAL_CONTINUE_AND_BREAK" }) - } - } - - @Test fun varargsFunction() { - verifyOutput("test/data/format/varargsFunction.kt", ".md") { model, output -> - markdownService.appendNodes(tempLocation, output, model.members.single().members) - } - } - - @Test fun overridingFunction() { - verifyOutput("test/data/format/overridingFunction.kt", ".md") { model, output -> - val classMembers = model.members.single().members.first { it.name == "D" }.members - markdownService.appendNodes(tempLocation, output, classMembers.filter { it.name == "f" }) - } - - } - - @Test fun propertyVar() { - verifyOutput("test/data/format/propertyVar.kt", ".md") { model, output -> - markdownService.appendNodes(tempLocation, output, model.members.single().members) - } - } - - @Test fun functionWithDefaultParameter() { - verifyOutput("test/data/format/functionWithDefaultParameter.kt", ".md") { model, output -> - markdownService.appendNodes(tempLocation, output, model.members.single().members) - } - } - - @Test fun accessor() { - verifyOutput("test/data/format/accessor.kt", ".md") { model, output -> - val propertyNode = model.members.single().members.first { it.name == "C" }.members.filter { it.name == "x" } - markdownService.appendNodes(tempLocation, output, propertyNode) - } - } - - @Test fun paramTag() { - verifyOutput("test/data/format/paramTag.kt", ".md") { model, output -> - markdownService.appendNodes(tempLocation, output, model.members.single().members) - } - } - - @Test fun throwsTag() { - verifyOutput("test/data/format/throwsTag.kt", ".md") { model, output -> - markdownService.appendNodes(tempLocation, output, model.members.single().members) - } - } - - @Test fun typeParameterBounds() { - verifyOutput("test/data/format/typeParameterBounds.kt", ".md") { model, output -> - markdownService.appendNodes(tempLocation, output, model.members.single().members) - } - } - - @Test fun typeParameterVariance() { - verifyOutput("test/data/format/typeParameterVariance.kt", ".md") { model, output -> - markdownService.appendNodes(tempLocation, output, model.members.single().members) - } - } - - @Test fun typeProjectionVariance() { - verifyOutput("test/data/format/typeProjectionVariance.kt", ".md") { model, output -> - markdownService.appendNodes(tempLocation, output, model.members.single().members) - } - } - - @Test fun javadocHtml() { - verifyJavaOutput("test/data/format/javadocHtml.java", ".md") { model, output -> - markdownService.appendNodes(tempLocation, output, model.members.single().members) - } - } - - @Test fun javaCodeLiteralTags() { - verifyJavaOutput("test/data/format/javaCodeLiteralTags.java", ".md") { model, output -> - markdownService.appendNodes(tempLocation, output, model.members.single().members) - } - } - - @Test fun javaCodeInParam() { - verifyJavaOutput("test/data/format/javaCodeInParam.java", ".md") { model, output -> - markdownService.appendNodes(tempLocation, output, model.members.single().members) - } - } - - @Test fun javaSpaceInAuthor() { - verifyJavaOutput("test/data/format/javaSpaceInAuthor.java", ".md") { model, output -> - markdownService.appendNodes(tempLocation, output, model.members.single().members) - } - } - - @Test fun nullability() { - verifyOutput("test/data/format/nullability.kt", ".md") { model, output -> - markdownService.appendNodes(tempLocation, output, model.members.single().members) - } - } - - @Test fun operatorOverloading() { - verifyOutput("test/data/format/operatorOverloading.kt", ".md") { model, output -> - markdownService.appendNodes(tempLocation, output, model.members.single().members.single { it.name == "C" }.members.filter { it.name == "plus" }) - } - } - - @Test fun javadocOrderedList() { - verifyJavaOutput("test/data/format/javadocOrderedList.java", ".md") { model, output -> - markdownService.appendNodes(tempLocation, output, model.members.single().members.filter { it.name == "Bar" }) - } - } - - @Test fun companionObjectExtension() { - verifyOutput("test/data/format/companionObjectExtension.kt", ".md") { model, output -> - markdownService.appendNodes(tempLocation, output, model.members.single().members.filter { it.name == "Foo" }) - } - } - - @Test fun starProjection() { - verifyOutput("test/data/format/starProjection.kt", ".md") { model, output -> - markdownService.appendNodes(tempLocation, output, model.members.single().members) - } - } - - @Test fun extensionFunctionParameter() { - verifyOutput("test/data/format/extensionFunctionParameter.kt", ".md") { model, output -> - markdownService.appendNodes(tempLocation, output, model.members.single().members) - } - } - - @Test fun summarizeSignatures() { - verifyOutput("test/data/format/summarizeSignatures.kt", ".md") { model, output -> - markdownService.appendNodes(tempLocation, output, model.members) - } - } - - @Test fun summarizeSignaturesProperty() { - verifyOutput("test/data/format/summarizeSignaturesProperty.kt", ".md") { model, output -> - markdownService.appendNodes(tempLocation, output, model.members) - } - } - - @Test fun reifiedTypeParameter() { - verifyOutput("test/data/format/reifiedTypeParameter.kt", ".md") { model, output -> - markdownService.appendNodes(tempLocation, output, model.members.single().members) - } - } - - @Test fun annotatedTypeParameter() { - verifyOutput("test/data/format/annotatedTypeParameter.kt", ".md", withKotlinRuntime = true) { model, output -> - markdownService.appendNodes(tempLocation, output, model.members.single().members) - } - } - - @Test fun inheritedMembers() { - verifyOutput("test/data/format/inheritedMembers.kt", ".md") { model, output -> - markdownService.appendNodes(tempLocation, output, model.members.single().members.filter { it.name == "Bar" }) - } - } - - @Test fun inheritedExtensions() { - verifyOutput("test/data/format/inheritedExtensions.kt", ".md") { model, output -> - markdownService.appendNodes(tempLocation, output, model.members.single().members.filter { it.name == "Bar" }) - } - } -} diff --git a/test/src/format/PackageDocsTest.kt b/test/src/format/PackageDocsTest.kt deleted file mode 100644 index 57a08563..00000000 --- a/test/src/format/PackageDocsTest.kt +++ /dev/null @@ -1,18 +0,0 @@ -package org.jetbrains.dokka.tests.format - -import org.jetbrains.dokka.ContentBlock -import org.jetbrains.dokka.ContentText -import org.jetbrains.dokka.DokkaConsoleLogger -import org.jetbrains.dokka.PackageDocs -import org.junit.Test -import kotlin.test.assertEquals - -public class PackageDocsTest { - @Test fun verifyParse() { - val docs = PackageDocs(null, DokkaConsoleLogger) - docs.parse("test/data/packagedocs/stdlib.md", null) - val packageContent = docs.packageContent["kotlin"]!! - val block = (packageContent.children.single() as ContentBlock).children.first() as ContentText - assertEquals("Core functions and types", block.text) - } -} diff --git a/test/src/markdown/ParserTest.kt b/test/src/markdown/ParserTest.kt deleted file mode 100644 index 5a7adf05..00000000 --- a/test/src/markdown/ParserTest.kt +++ /dev/null @@ -1,142 +0,0 @@ -package org.jetbrains.dokka.tests - -import org.junit.Test -import org.jetbrains.dokka.toTestString -import org.jetbrains.dokka.parseMarkdown -import org.junit.Ignore - -@Ignore public class ParserTest { - fun runTestFor(text : String) { - println("MD: ---") - println(text) - val markdownTree = parseMarkdown(text) - println("AST: ---") - println(markdownTree.toTestString()) - println() - } - - @Test fun text() { - runTestFor("text") - } - - @Test fun textWithSpaces() { - runTestFor("text and string") - } - - @Test fun textWithColon() { - runTestFor("text and string: cool!") - } - - @Test fun link() { - runTestFor("text [links]") - } - - @Test fun linkWithHref() { - runTestFor("text [links](http://google.com)") - } - - @Test fun multiline() { - runTestFor( - """ -text -and -string -""") - } - - @Test fun para() { - runTestFor( - """ -paragraph number -one - -paragraph -number two -""") - } - - @Test fun bulletList() { - runTestFor( - """* list item 1 -* list item 2 -""") - } - - @Test fun bulletListWithLines() { - runTestFor( - """ -* list item 1 - continue 1 -* list item 2 - continue 2 - """) - } - - @Test fun bulletListStrong() { - runTestFor( - """ -* list *item* 1 - continue 1 -* list *item* 2 - continue 2 - """) - } - - @Test fun emph() { - runTestFor("*text*") - } - - @Test fun directive() { - runTestFor("A text \${code with.another.value} with directive") - } - - @Test fun emphAndEmptySection() { - runTestFor("*text*\n\$sec:\n") - } - - @Test fun emphAndSection() { - runTestFor("*text*\n\$sec: some text\n") - } - - @Test fun emphAndBracedSection() { - runTestFor("Text *bold* text \n\${sec}: some text") - } - - @Test fun section() { - runTestFor( - "Plain text \n\$one: Summary \n\${two}: Description with *emphasis* \n\${An example of a section}: Example") - } - - @Test fun anonymousSection() { - runTestFor("Summary\n\nDescription\n") - } - - @Test fun specialSection() { - runTestFor( - "Plain text \n\$\$summary: Summary \n\${\$description}: Description \n\${\$An example of a section}: Example") - } - - @Test fun emptySection() { - runTestFor( - "Plain text \n\$summary:") - } - - val b = "$" - @Test fun pair() { - runTestFor( - """Represents a generic pair of two values. - -There is no meaning attached to values in this class, it can be used for any purpose. -Pair exhibits value semantics, i.e. two pairs are equal if both components are equal. - -An example of decomposing it into values: -${b}{code test.tuples.PairTest.pairMultiAssignment} - -${b}constructor: Creates new instance of [Pair] -${b}first: First value -${b}second: Second value"""" - ) - } - -} - diff --git a/test/src/model/ClassTest.kt b/test/src/model/ClassTest.kt deleted file mode 100644 index ce4b4683..00000000 --- a/test/src/model/ClassTest.kt +++ /dev/null @@ -1,275 +0,0 @@ -package org.jetbrains.dokka.tests - -import org.jetbrains.dokka.Content -import org.jetbrains.dokka.DocumentationNode -import org.jetbrains.dokka.DocumentationReference -import org.junit.Test -import kotlin.test.assertEquals -import kotlin.test.assertTrue - -public class ClassTest { - @Test fun emptyClass() { - verifyModel("test/data/classes/emptyClass.kt") { model -> - with(model.members.single().members.single()) { - assertEquals(DocumentationNode.Kind.Class, kind) - assertEquals("Klass", name) - assertEquals(Content.Empty, content) - assertEquals("<init>", members.single().name) - assertTrue(links.none()) - } - } - } - - @Test fun emptyObject() { - verifyModel("test/data/classes/emptyObject.kt") { model -> - with(model.members.single().members.single()) { - assertEquals(DocumentationNode.Kind.Object, kind) - assertEquals("Obj", name) - assertEquals(Content.Empty, content) - assertTrue(members.none()) - assertTrue(links.none()) - } - } - } - - @Test fun classWithConstructor() { - verifyModel("test/data/classes/classWithConstructor.kt") { model -> - with (model.members.single().members.single()) { - assertEquals(DocumentationNode.Kind.Class, kind) - assertEquals("Klass", name) - assertEquals(Content.Empty, content) - assertTrue(links.none()) - - assertEquals(1, members.count()) - with(members.elementAt(0)) { - assertEquals("<init>", name) - assertEquals(Content.Empty, content) - assertEquals(DocumentationNode.Kind.Constructor, kind) - assertEquals(2, details.count()) - assertEquals("public", details.elementAt(0).name) - with(details.elementAt(1)) { - assertEquals("name", name) - assertEquals(DocumentationNode.Kind.Parameter, kind) - assertEquals(Content.Empty, content) - assertEquals("String", details.single().name) - assertTrue(links.none()) - assertTrue(members.none()) - } - assertTrue(links.none()) - assertTrue(members.none()) - } - } - } - } - - @Test fun classWithFunction() { - verifyModel("test/data/classes/classWithFunction.kt") { model -> - with(model.members.single().members.single()) { - assertEquals(DocumentationNode.Kind.Class, kind) - assertEquals("Klass", name) - assertEquals(Content.Empty, content) - assertTrue(links.none()) - - assertEquals(2, members.count()) - with(members.elementAt(0)) { - assertEquals("<init>", name) - assertEquals(Content.Empty, content) - assertEquals(DocumentationNode.Kind.Constructor, kind) - assertEquals(1, details.count()) - assertEquals("public", details.elementAt(0).name) - assertTrue(links.none()) - assertTrue(members.none()) - } - with(members.elementAt(1)) { - assertEquals("fn", name) - assertEquals(Content.Empty, content) - assertEquals(DocumentationNode.Kind.Function, kind) - assertEquals("Unit", detail(DocumentationNode.Kind.Type).name) - assertTrue(links.none()) - assertTrue(members.none()) - } - } - } - } - - @Test fun classWithProperty() { - verifyModel("test/data/classes/classWithProperty.kt") { model -> - with(model.members.single().members.single()) { - assertEquals(DocumentationNode.Kind.Class, kind) - assertEquals("Klass", name) - assertEquals(Content.Empty, content) - assertTrue(links.none()) - - assertEquals(2, members.count()) - with(members.elementAt(0)) { - assertEquals("<init>", name) - assertEquals(Content.Empty, content) - assertEquals(DocumentationNode.Kind.Constructor, kind) - assertEquals(1, details.count()) - assertEquals("public", details.elementAt(0).name) - assertTrue(members.none()) - assertTrue(links.none()) - } - with(members.elementAt(1)) { - assertEquals("name", name) - assertEquals(Content.Empty, content) - assertEquals(DocumentationNode.Kind.Property, kind) - assertEquals("String", detail(DocumentationNode.Kind.Type).name) - assertTrue(members.none()) - assertTrue(links.none()) - } - } - } - } - - @Test fun classWithCompanionObject() { - verifyModel("test/data/classes/classWithCompanionObject.kt") { model -> - with(model.members.single().members.single()) { - assertEquals(DocumentationNode.Kind.Class, kind) - assertEquals("Klass", name) - assertEquals(Content.Empty, content) - assertTrue(links.none()) - - assertEquals(3, members.count()) - with(members.elementAt(0)) { - assertEquals("<init>", name) - assertEquals(Content.Empty, content) - } - with(members.elementAt(1)) { - assertEquals("x", name) - assertEquals(DocumentationNode.Kind.CompanionObjectProperty, kind) - assertTrue(members.none()) - assertTrue(links.none()) - } - with(members.elementAt(2)) { - assertEquals("foo", name) - assertEquals(DocumentationNode.Kind.CompanionObjectFunction, kind) - assertTrue(members.none()) - assertTrue(links.none()) - } - } - } - } - - @Test fun annotatedClass() { - verifyPackageMember("test/data/classes/annotatedClass.kt", withKotlinRuntime = true) { cls -> - assertEquals(1, cls.annotations.count()) - with(cls.annotations[0]) { - assertEquals("Strictfp", name) - assertEquals(Content.Empty, content) - assertEquals(DocumentationNode.Kind.Annotation, kind) - } - } - } - - @Test fun dataClass() { - verifyPackageMember("test/data/classes/dataClass.kt") { cls -> - val modifiers = cls.details(DocumentationNode.Kind.Modifier).map { it.name } - assertTrue("data" in modifiers) - } - } - - @Test fun sealedClass() { - verifyPackageMember("test/data/classes/sealedClass.kt") { cls -> - val modifiers = cls.details(DocumentationNode.Kind.Modifier).map { it.name } - assertEquals(1, modifiers.count { it == "sealed" }) - } - } - - @Test fun annotatedClassWithAnnotationParameters() { - verifyModel("test/data/classes/annotatedClassWithAnnotationParameters.kt") { model -> - with(model.members.single().members.single()) { - with(deprecation!!) { - assertEquals("Deprecated", name) - assertEquals(Content.Empty, content) - assertEquals(DocumentationNode.Kind.Annotation, kind) - assertEquals(1, details.count()) - with(details[0]) { - assertEquals(DocumentationNode.Kind.Parameter, kind) - assertEquals(1, details.count()) - with(details[0]) { - assertEquals(DocumentationNode.Kind.Value, kind) - assertEquals("\"should no longer be used\"", name) - } - } - } - } - } - } - - @Test fun javaAnnotationClass() { - verifyModel("test/data/classes/javaAnnotationClass.kt", withJdk = true) { model -> - with(model.members.single().members.single()) { - assertEquals(1, annotations.count()) - with(annotations[0]) { - assertEquals("Retention", name) - assertEquals(Content.Empty, content) - assertEquals(DocumentationNode.Kind.Annotation, kind) - with(details[0]) { - assertEquals(DocumentationNode.Kind.Parameter, kind) - assertEquals(1, details.count()) - with(details[0]) { - assertEquals(DocumentationNode.Kind.Value, kind) - assertEquals("RetentionPolicy.SOURCE", name) - } - } - } - } - } - } - - @Test fun notOpenClass() { - verifyModel("test/data/classes/notOpenClass.kt") { model -> - with(model.members.single().members.first { it.name == "D"}.members.first { it.name == "f" }) { - val modifiers = details(DocumentationNode.Kind.Modifier) - assertEquals(2, modifiers.size) - assertEquals("final", modifiers[1].name) - - val overrideReferences = references(DocumentationReference.Kind.Override) - assertEquals(1, overrideReferences.size) - } - } - } - - @Test fun indirectOverride() { - verifyModel("test/data/classes/indirectOverride.kt") { model -> - with(model.members.single().members.first { it.name == "E"}.members.first { it.name == "foo" }) { - val modifiers = details(DocumentationNode.Kind.Modifier) - assertEquals(2, modifiers.size) - assertEquals("final", modifiers[1].name) - - val overrideReferences = references(DocumentationReference.Kind.Override) - assertEquals(1, overrideReferences.size) - } - } - } - - @Test fun innerClass() { - verifyPackageMember("test/data/classes/innerClass.kt") { cls -> - val innerClass = cls.members.single { it.name == "D" } - val modifiers = innerClass.details(DocumentationNode.Kind.Modifier) - assertEquals(3, modifiers.size) - assertEquals("inner", modifiers[2].name) - } - } - - @Test fun companionObjectExtension() { - verifyModel("test/data/classes/companionObjectExtension.kt") { model -> - val pkg = model.members.single() - val cls = pkg.members.single { it.name == "Foo" } - val extensions = cls.extensions.filter { it.kind == DocumentationNode.Kind.CompanionObjectProperty } - assertEquals(1, extensions.size) - } - } - - @Test fun secondaryConstructor() { - verifyPackageMember("test/data/classes/secondaryConstructor.kt") { cls -> - val constructors = cls.members(DocumentationNode.Kind.Constructor) - assertEquals(2, constructors.size) - with (constructors.first { it.details(DocumentationNode.Kind.Parameter).size == 1}) { - assertEquals("<init>", name) - assertEquals("This is a secondary constructor.", summary.toTestString()) - } - } - } -} diff --git a/test/src/model/CommentTest.kt b/test/src/model/CommentTest.kt deleted file mode 100644 index c4d867fb..00000000 --- a/test/src/model/CommentTest.kt +++ /dev/null @@ -1,153 +0,0 @@ -package org.jetbrains.dokka.tests - -import org.junit.Test -import kotlin.test.* -import org.jetbrains.dokka.* - -public class CommentTest { - @Test fun emptyDoc() { - verifyModel("test/data/comments/emptyDoc.kt") { model -> - with(model.members.single().members.single()) { - assertEquals(Content.Empty, content) - } - } - } - - @Test fun emptyDocButComment() { - verifyModel("test/data/comments/emptyDocButComment.kt") { model -> - with(model.members.single().members.single()) { - assertEquals(Content.Empty, content) - } - } - } - - @Test fun multilineDoc() { - verifyModel("test/data/comments/multilineDoc.kt") { model -> - with(model.members.single().members.single()) { - assertEquals("doc1", content.summary.toTestString()) - assertEquals("doc2\ndoc3", content.description.toTestString()) - } - } - } - - @Test fun multilineDocWithComment() { - verifyModel("test/data/comments/multilineDocWithComment.kt") { model -> - with(model.members.single().members.single()) { - assertEquals("doc1", content.summary.toTestString()) - assertEquals("doc2\ndoc3", content.description.toTestString()) - } - } - } - - @Test fun oneLineDoc() { - verifyModel("test/data/comments/oneLineDoc.kt") { model -> - with(model.members.single().members.single()) { - assertEquals("doc", content.summary.toTestString()) - } - } - } - - @Test fun oneLineDocWithComment() { - verifyModel("test/data/comments/oneLineDocWithComment.kt") { model -> - with(model.members.single().members.single()) { - assertEquals("doc", content.summary.toTestString()) - } - } - } - - @Test fun oneLineDocWithEmptyLine() { - verifyModel("test/data/comments/oneLineDocWithEmptyLine.kt") { model -> - with(model.members.single().members.single()) { - assertEquals("doc", content.summary.toTestString()) - } - } - } - - @Test fun emptySection() { - verifyModel("test/data/comments/emptySection.kt") { model -> - with(model.members.single().members.single()) { - assertEquals("Summary", content.summary.toTestString()) - assertEquals(1, content.sections.count()) - with (content.findSectionByTag("one")!!) { - assertEquals("One", tag) - assertEquals("", toTestString()) - } - } - } - } - - @Test fun section1() { - verifyModel("test/data/comments/section1.kt") { model -> - with(model.members.single().members.single()) { - assertEquals("Summary", content.summary.toTestString()) - assertEquals(1, content.sections.count()) - with (content.findSectionByTag("one")!!) { - assertEquals("One", tag) - assertEquals("section one", toTestString()) - } - } - } - } - - @Test fun section2() { - verifyModel("test/data/comments/section2.kt") { model -> - with(model.members.single().members.single()) { - assertEquals("Summary", content.summary.toTestString()) - assertEquals(2, content.sections.count()) - with (content.findSectionByTag("one")!!) { - assertEquals("One", tag) - assertEquals("section one", toTestString()) - } - with (content.findSectionByTag("two")!!) { - assertEquals("Two", tag) - assertEquals("section two", toTestString()) - } - } - } - } - - @Test fun multilineSection() { - verifyModel("test/data/comments/multilineSection.kt") { model -> - with(model.members.single().members.single()) { - assertEquals("Summary", content.summary.toTestString()) - assertEquals(1, content.sections.count()) - with (content.findSectionByTag("one")!!) { - assertEquals("One", tag) - assertEquals("""line one -line two""", toTestString()) - } - } - } - } - - @Test fun directive() { - verifyModel("test/data/comments/directive.kt") { model -> - with(model.members.single().members.first()) { - assertEquals("Summary", content.summary.toTestString()) - with (content.description) { - assertEqualsIgnoringSeparators("""[code] -if (true) { - println(property) -} -[/code] -[code] -if (true) { - println(property) -} -[/code] -[code] -if (true) { - println(property) -} -[/code] -[code] -if (true) { - println(property) -} -[/code] -""", toTestString()) - } - } - } - } -} diff --git a/test/src/model/FunctionTest.kt b/test/src/model/FunctionTest.kt deleted file mode 100644 index 8d1cf609..00000000 --- a/test/src/model/FunctionTest.kt +++ /dev/null @@ -1,227 +0,0 @@ -package org.jetbrains.dokka.tests - -import org.jetbrains.dokka.Content -import org.jetbrains.dokka.DocumentationNode -import org.junit.Test -import kotlin.test.assertEquals -import kotlin.test.assertTrue - -public class FunctionTest { - @Test fun function() { - verifyModel("test/data/functions/function.kt") { model -> - with(model.members.single().members.single()) { - assertEquals("fn", name) - assertEquals(DocumentationNode.Kind.Function, kind) - assertEquals("Function fn", content.summary.toTestString()) - assertEquals("Unit", detail(DocumentationNode.Kind.Type).name) - assertTrue(members.none()) - assertTrue(links.none()) - } - } - } - - @Test fun functionWithReceiver() { - verifyModel("test/data/functions/functionWithReceiver.kt") { model -> - with(model.members.single().members.single()) { - assertEquals("kotlin.String", name) - assertEquals(DocumentationNode.Kind.ExternalClass, kind) - assertEquals(2, members.count()) - with(members[0]) { - assertEquals("fn", name) - assertEquals(DocumentationNode.Kind.Function, kind) - assertEquals("Function with receiver", content.summary.toTestString()) - assertEquals("public", details.elementAt(0).name) - assertEquals("final", details.elementAt(1).name) - with(details.elementAt(2)) { - assertEquals("<this>", name) - assertEquals(DocumentationNode.Kind.Receiver, kind) - assertEquals(Content.Empty, content) - assertEquals("String", details.single().name) - assertTrue(members.none()) - assertTrue(links.none()) - } - assertEquals("Unit", details.elementAt(3).name) - assertTrue(members.none()) - assertTrue(links.none()) - } - with(members[1]) { - assertEquals("fn", name) - assertEquals(DocumentationNode.Kind.Function, kind) - } - } - } - } - - @Test fun genericFunction() { - verifyModel("test/data/functions/genericFunction.kt") { model -> - with(model.members.single().members.single()) { - assertEquals("generic", name) - assertEquals(DocumentationNode.Kind.Function, kind) - assertEquals("generic function", content.summary.toTestString()) - - assertEquals("private", details.elementAt(0).name) - assertEquals("final", details.elementAt(1).name) - with(details.elementAt(2)) { - assertEquals("T", name) - assertEquals(DocumentationNode.Kind.TypeParameter, kind) - assertEquals(Content.Empty, content) - assertTrue(details.none()) - assertTrue(members.none()) - assertTrue(links.none()) - } - assertEquals("Unit", details.elementAt(3).name) - - assertTrue(members.none()) - assertTrue(links.none()) - } - } - } - @Test fun genericFunctionWithConstraints() { - verifyModel("test/data/functions/genericFunctionWithConstraints.kt") { model -> - with(model.members.single().members.single()) { - assertEquals("generic", name) - assertEquals(DocumentationNode.Kind.Function, kind) - assertEquals("generic function", content.summary.toTestString()) - - assertEquals("public", details.elementAt(0).name) - assertEquals("final", details.elementAt(1).name) - with(details.elementAt(2)) { - assertEquals("T", name) - assertEquals(DocumentationNode.Kind.TypeParameter, kind) - assertEquals(Content.Empty, content) - with(details.single()) { - assertEquals("R", name) - assertEquals(DocumentationNode.Kind.UpperBound, kind) - assertEquals(Content.Empty, content) - assertTrue(details.none()) - assertTrue(members.none()) - assertTrue(links.none()) - } - assertTrue(members.none()) - assertTrue(links.none()) - } - with(details.elementAt(3)) { - assertEquals("R", name) - assertEquals(DocumentationNode.Kind.TypeParameter, kind) - assertEquals(Content.Empty, content) - assertTrue(members.none()) - assertTrue(links.none()) - } - assertEquals("Unit", details.elementAt(4).name) - - assertTrue(members.none()) - assertTrue(links.none()) - } - } - } - - @Test fun functionWithParams() { - verifyModel("test/data/functions/functionWithParams.kt") { model -> - with(model.members.single().members.single()) { - assertEquals("function", name) - assertEquals(DocumentationNode.Kind.Function, kind) - assertEquals("Multiline", content.summary.toTestString()) - assertEquals("""Function -Documentation""", content.description.toTestString()) - - assertEquals("public", details.elementAt(0).name) - assertEquals("final", details.elementAt(1).name) - with(details.elementAt(2)) { - assertEquals("x", name) - assertEquals(DocumentationNode.Kind.Parameter, kind) - assertEquals("parameter", content.summary.toTestString()) - assertEquals("Int", details.single().name) - assertTrue(members.none()) - assertTrue(links.none()) - } - assertEquals("Unit", details.elementAt(3).name) - assertTrue(members.none()) - assertTrue(links.none()) - } - } - } - - @Test fun annotatedFunction() { - verifyPackageMember("test/data/functions/annotatedFunction.kt", withKotlinRuntime = true) { func -> - assertEquals(1, func.annotations.count()) - with(func.annotations[0]) { - assertEquals("Strictfp", name) - assertEquals(Content.Empty, content) - assertEquals(DocumentationNode.Kind.Annotation, kind) - } - } - } - - @Test fun functionWithNotDocumentedAnnotation() { - verifyPackageMember("test/data/functions/functionWithNotDocumentedAnnotation.kt") { func -> - assertEquals(0, func.annotations.count()) - } - } - - @Test fun inlineFunction() { - verifyPackageMember("test/data/functions/inlineFunction.kt") { func -> - val modifiers = func.details(DocumentationNode.Kind.Modifier).map { it.name } - assertTrue("inline" in modifiers) - } - } - - @Test fun functionWithAnnotatedParam() { - verifyModel("test/data/functions/functionWithAnnotatedParam.kt") { model -> - with(model.members.single().members.single { it.name == "function"} ) { - with(details.elementAt(2)) { - assertEquals(1, annotations.count()) - with(annotations[0]) { - assertEquals("Fancy", name) - assertEquals(Content.Empty, content) - assertEquals(DocumentationNode.Kind.Annotation, kind) - } - } - } - } - } - - @Test fun functionWithNoinlineParam() { - verifyPackageMember("test/data/functions/functionWithNoinlineParam.kt") { func -> - with(func.details.elementAt(2)) { - val modifiers = details(DocumentationNode.Kind.Modifier).map { it.name } - assertTrue("noinline" in modifiers) - } - } - } - - @Test fun annotatedFunctionWithAnnotationParameters() { - verifyModel("test/data/functions/annotatedFunctionWithAnnotationParameters.kt") { model -> - with(model.members.single().members.single { it.name == "f"}) { - assertEquals(1, annotations.count()) - with(annotations[0]) { - assertEquals("Fancy", name) - assertEquals(Content.Empty, content) - assertEquals(DocumentationNode.Kind.Annotation, kind) - assertEquals(1, details.count()) - with(details[0]) { - assertEquals(DocumentationNode.Kind.Parameter, kind) - assertEquals(1, details.count()) - with(details[0]) { - assertEquals(DocumentationNode.Kind.Value, kind) - assertEquals("1", name) - } - } - } - } - } - } - - @Test fun functionWithDefaultParameter() { - verifyModel("test/data/functions/functionWithDefaultParameter.kt") { model -> - with(model.members.single().members.single()) { - with(details.elementAt(2)) { - val value = details(DocumentationNode.Kind.Value) - assertEquals(1, value.count()) - with(value[0]) { - assertEquals("\"\"", name) - } - } - } - } - } -} diff --git a/test/src/model/JavaTest.kt b/test/src/model/JavaTest.kt deleted file mode 100644 index 0633a5cc..00000000 --- a/test/src/model/JavaTest.kt +++ /dev/null @@ -1,197 +0,0 @@ -package org.jetbrains.dokka.tests - -import org.jetbrains.dokka.DocumentationNode -import org.jetbrains.dokka.DocumentationReference -import org.junit.Test -import kotlin.test.assertEquals -import kotlin.test.assertFalse -import kotlin.test.assertTrue - -public class JavaTest { - @Test fun function() { - verifyJavaPackageMember("test/data/java/member.java") { cls -> - assertEquals("Test", cls.name) - assertEquals(DocumentationNode.Kind.Class, cls.kind) - with(cls.members(DocumentationNode.Kind.Function).single()) { - assertEquals("fn", name) - assertEquals("Summary for Function", content.summary.toTestString().trimEnd()) - assertEquals(3, content.sections.size) - with(content.sections[0]) { - assertEquals("Parameters", tag) - assertEquals("name", subjectName) - assertEquals("is String parameter ", toTestString()) - } - with(content.sections[1]) { - assertEquals("Parameters", tag) - assertEquals("value", subjectName) - assertEquals("is int parameter ", toTestString()) - } - with(content.sections[2]) { - assertEquals("Author", tag) - assertEquals("yole", toTestString()) - } - assertEquals("Unit", detail(DocumentationNode.Kind.Type).name) - assertTrue(members.none()) - assertTrue(links.none()) - with(details.first { it.name == "name" }) { - assertEquals(DocumentationNode.Kind.Parameter, kind) - assertEquals("String", detail(DocumentationNode.Kind.Type).name) - } - with(details.first { it.name == "value" }) { - assertEquals(DocumentationNode.Kind.Parameter, kind) - assertEquals("Int", detail(DocumentationNode.Kind.Type).name) - } - } - } - } - - @Test fun memberWithModifiers() { - verifyJavaPackageMember("test/data/java/memberWithModifiers.java") { cls -> - val modifiers = cls.details(DocumentationNode.Kind.Modifier).map { it.name } - assertTrue("abstract" in modifiers) - with(cls.members.single { it.name == "fn" }) { - assertEquals("protected", details[0].name) - } - with(cls.members.single { it.name == "openFn" }) { - assertEquals("open", details[1].name) - } - } - } - - @Test fun superClass() { - verifyJavaPackageMember("test/data/java/superClass.java") { cls -> - val superTypes = cls.details(DocumentationNode.Kind.Supertype) - assertEquals(2, superTypes.size) - assertEquals("Exception", superTypes[0].name) - assertEquals("Cloneable", superTypes[1].name) - } - } - - @Test fun arrayType() { - verifyJavaPackageMember("test/data/java/arrayType.java") { cls -> - with(cls.members(DocumentationNode.Kind.Function).single()) { - val type = detail(DocumentationNode.Kind.Type) - assertEquals("Array", type.name) - assertEquals("String", type.detail(DocumentationNode.Kind.Type).name) - with(details(DocumentationNode.Kind.Parameter).single()) { - val parameterType = detail(DocumentationNode.Kind.Type) - assertEquals("IntArray", parameterType.name) - } - } - } - } - - @Test fun typeParameter() { - verifyJavaPackageMember("test/data/java/typeParameter.java") { cls -> - val typeParameters = cls.details(DocumentationNode.Kind.TypeParameter) - with(typeParameters.single()) { - assertEquals("T", name) - with(detail(DocumentationNode.Kind.UpperBound)) { - assertEquals("Comparable", name) - assertEquals("T", detail(DocumentationNode.Kind.Type).name) - } - } - with(cls.members(DocumentationNode.Kind.Function).single()) { - val methodTypeParameters = details(DocumentationNode.Kind.TypeParameter) - with(methodTypeParameters.single()) { - assertEquals("E", name) - } - } - } - } - - @Test fun constructors() { - verifyJavaPackageMember("test/data/java/constructors.java") { cls -> - val constructors = cls.members(DocumentationNode.Kind.Constructor) - assertEquals(2, constructors.size) - with(constructors[0]) { - assertEquals("<init>", name) - } - } - } - - @Test fun innerClass() { - verifyJavaPackageMember("test/data/java/innerClass.java") { cls -> - val innerClass = cls.members(DocumentationNode.Kind.Class).single() - assertEquals("D", innerClass.name) - } - } - - @Test fun varargs() { - verifyJavaPackageMember("test/data/java/varargs.java") { cls -> - val fn = cls.members(DocumentationNode.Kind.Function).single() - val param = fn.detail(DocumentationNode.Kind.Parameter) - assertEquals("vararg", param.details(DocumentationNode.Kind.Modifier).first().name) - val psiType = param.detail(DocumentationNode.Kind.Type) - assertEquals("String", psiType.name) - assertTrue(psiType.details(DocumentationNode.Kind.Type).isEmpty()) - } - } - - @Test fun fields() { - verifyJavaPackageMember("test/data/java/field.java") { cls -> - val i = cls.members(DocumentationNode.Kind.Property).single { it.name == "i" } - assertEquals("Int", i.detail(DocumentationNode.Kind.Type).name) - assertTrue("var" in i.details(DocumentationNode.Kind.Modifier).map { it.name }) - - val s = cls.members(DocumentationNode.Kind.Property).single { it.name == "s" } - assertEquals("String", s.detail(DocumentationNode.Kind.Type).name) - assertFalse("var" in s.details(DocumentationNode.Kind.Modifier).map { it.name }) - assertTrue("static" in s.details(DocumentationNode.Kind.Modifier).map { it.name }) - } - } - - @Test fun staticMethod() { - verifyJavaPackageMember("test/data/java/staticMethod.java") { cls -> - val m = cls.members(DocumentationNode.Kind.Function).single { it.name == "foo" } - assertTrue("static" in m.details(DocumentationNode.Kind.Modifier).map { it.name }) - } - } - - @Test fun annotatedAnnotation() { - verifyJavaPackageMember("test/data/java/annotatedAnnotation.java") { cls -> - assertEquals(1, cls.annotations.size) - with(cls.annotations[0]) { - assertEquals(1, details.count()) - with(details[0]) { - assertEquals(DocumentationNode.Kind.Parameter, kind) - assertEquals(1, details.count()) - with(details[0]) { - assertEquals(DocumentationNode.Kind.Value, kind) - assertEquals("[AnnotationTarget.FIELD, AnnotationTarget.CLASS, AnnotationTarget.FILE, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.PROPERTY_SETTER]", name) - } - } - } - } - } - - @Test fun deprecation() { - verifyJavaPackageMember("test/data/java/deprecation.java") { cls -> - val fn = cls.members(DocumentationNode.Kind.Function).single() - assertEquals("This should no longer be used", fn.deprecation!!.content.toTestString()) - } - } - - @Test fun javaLangObject() { - verifyJavaPackageMember("test/data/java/javaLangObject.java") { cls -> - val fn = cls.members(DocumentationNode.Kind.Function).single() - assertEquals("Any", fn.detail(DocumentationNode.Kind.Type).name) - } - } - - @Test fun enumValues() { - verifyJavaPackageMember("test/data/java/enumValues.java") { cls -> - val superTypes = cls.details(DocumentationNode.Kind.Supertype) - assertEquals(0, superTypes.size) - assertEquals(1, cls.members(DocumentationNode.Kind.EnumItem).size) - } - } - - @Test fun inheritorLinks() { - verifyJavaPackageMember("test/data/java/inheritorLinks.java") { cls -> - val fooClass = cls.members.single { it.name == "Foo" } - val inheritors = fooClass.references(DocumentationReference.Kind.Inheritor) - assertEquals(1, inheritors.size) - } - } -} diff --git a/test/src/model/KotlinAsJavaTest.kt b/test/src/model/KotlinAsJavaTest.kt deleted file mode 100644 index 18a1cfef..00000000 --- a/test/src/model/KotlinAsJavaTest.kt +++ /dev/null @@ -1,40 +0,0 @@ -package org.jetbrains.dokka.tests - -import org.jetbrains.dokka.DocumentationModule -import org.jetbrains.dokka.DocumentationNode -import org.junit.Test -import kotlin.test.assertEquals - -class KotlinAsJavaTest { - @Test fun function() { - verifyModelAsJava("test/data/functions/function.kt") { model -> - val pkg = model.members.single() - - val facadeClass = pkg.members.single { it.name == "FunctionKt" } - assertEquals(DocumentationNode.Kind.Class, facadeClass.kind) - - val fn = facadeClass.members.single() - assertEquals("fn", fn.name) - assertEquals(DocumentationNode.Kind.Function, fn.kind) - } - } - - @Test fun propertyWithComment() { - verifyModelAsJava("test/data/comments/oneLineDoc.kt") { model -> - val facadeClass = model.members.single().members.single { it.name == "OneLineDocKt" } - val getter = facadeClass.members.single { it.name == "getProperty" } - assertEquals(DocumentationNode.Kind.Function, getter.kind) - assertEquals("doc", getter.content.summary.toTestString()) - } - } -} - -fun verifyModelAsJava(source: String, - withJdk: Boolean = false, - withKotlinRuntime: Boolean = false, - verifier: (DocumentationModule) -> Unit) { - verifyModel(source, - withJdk = withJdk, withKotlinRuntime = withKotlinRuntime, - format = "html-as-java", - verifier = verifier) -} diff --git a/test/src/model/LinkTest.kt b/test/src/model/LinkTest.kt deleted file mode 100644 index a8004367..00000000 --- a/test/src/model/LinkTest.kt +++ /dev/null @@ -1,48 +0,0 @@ -package org.jetbrains.dokka.tests - -import org.junit.Test -import kotlin.test.* -import org.jetbrains.dokka.* - -public class LinkTest { - @Test fun linkToSelf() { - verifyModel("test/data/links/linkToSelf.kt") { model -> - with(model.members.single().members.single()) { - assertEquals("Foo", name) - assertEquals(DocumentationNode.Kind.Class, kind) - assertEquals("This is link to [Foo -> Class:Foo]", content.summary.toTestString()) - } - } - } - - @Test fun linkToMember() { - verifyModel("test/data/links/linkToMember.kt") { model -> - with(model.members.single().members.single()) { - assertEquals("Foo", name) - assertEquals(DocumentationNode.Kind.Class, kind) - assertEquals("This is link to [member -> Function:member]", content.summary.toTestString()) - } - } - } - - @Test fun linkToQualifiedMember() { - verifyModel("test/data/links/linkToQualifiedMember.kt") { model -> - with(model.members.single().members.single()) { - assertEquals("Foo", name) - assertEquals(DocumentationNode.Kind.Class, kind) - assertEquals("This is link to [Foo.member -> Function:member]", content.summary.toTestString()) - } - } - } - - @Test fun linkToParam() { - verifyModel("test/data/links/linkToParam.kt") { model -> - with(model.members.single().members.single()) { - assertEquals("Foo", name) - assertEquals(DocumentationNode.Kind.Function, kind) - assertEquals("This is link to [param -> Parameter:param]", content.summary.toTestString()) - } - } - } - -}
\ No newline at end of file diff --git a/test/src/model/PackageTest.kt b/test/src/model/PackageTest.kt deleted file mode 100644 index 52324f1d..00000000 --- a/test/src/model/PackageTest.kt +++ /dev/null @@ -1,86 +0,0 @@ -package org.jetbrains.dokka.tests - -import org.jetbrains.dokka.Content -import org.jetbrains.dokka.DocumentationNode -import org.jetbrains.kotlin.config.KotlinSourceRoot -import org.junit.Test -import kotlin.test.assertEquals -import kotlin.test.assertTrue - -public class PackageTest { - @Test fun rootPackage() { - verifyModel("test/data/packages/rootPackage.kt") { model -> - with(model.members.single()) { - assertEquals(DocumentationNode.Kind.Package, kind) - assertEquals("", name) - assertEquals(Content.Empty, content) - assertTrue(details.none()) - assertTrue(members.none()) - assertTrue(links.none()) - } - } - } - - @Test fun simpleNamePackage() { - verifyModel("test/data/packages/simpleNamePackage.kt") { model -> - with(model.members.single()) { - assertEquals(DocumentationNode.Kind.Package, kind) - assertEquals("simple", name) - assertEquals(Content.Empty, content) - assertTrue(details.none()) - assertTrue(members.none()) - assertTrue(links.none()) - } - } - } - - @Test fun dottedNamePackage() { - verifyModel("test/data/packages/dottedNamePackage.kt") { model -> - with(model.members.single()) { - assertEquals(DocumentationNode.Kind.Package, kind) - assertEquals("dot.name", name) - assertEquals(Content.Empty, content) - assertTrue(details.none()) - assertTrue(members.none()) - assertTrue(links.none()) - } - } - } - - @Test fun multipleFiles() { - verifyModel(KotlinSourceRoot("test/data/packages/dottedNamePackage.kt"), - KotlinSourceRoot("test/data/packages/simpleNamePackage.kt")) { model -> - assertEquals(2, model.members.count()) - with(model.members.single { it.name == "simple" }) { - assertEquals(DocumentationNode.Kind.Package, kind) - assertEquals("simple", name) - assertEquals(Content.Empty, content) - assertTrue(details.none()) - assertTrue(members.none()) - assertTrue(links.none()) - } - with(model.members.single { it.name == "dot.name" }) { - assertEquals(DocumentationNode.Kind.Package, kind) - assertEquals(Content.Empty, content) - assertTrue(details.none()) - assertTrue(members.none()) - assertTrue(links.none()) - } - } - } - - @Test fun multipleFilesSamePackage() { - verifyModel(KotlinSourceRoot("test/data/packages/simpleNamePackage.kt"), - KotlinSourceRoot("test/data/packages/simpleNamePackage2.kt")) { model -> - assertEquals(1, model.members.count()) - with(model.members.elementAt(0)) { - assertEquals(DocumentationNode.Kind.Package, kind) - assertEquals("simple", name) - assertEquals(Content.Empty, content) - assertTrue(details.none()) - assertTrue(members.none()) - assertTrue(links.none()) - } - } - } -}
\ No newline at end of file diff --git a/test/src/model/PropertyTest.kt b/test/src/model/PropertyTest.kt deleted file mode 100644 index 093772b4..00000000 --- a/test/src/model/PropertyTest.kt +++ /dev/null @@ -1,103 +0,0 @@ -package org.jetbrains.dokka.tests - -import org.jetbrains.dokka.Content -import org.jetbrains.dokka.DocumentationNode -import org.jetbrains.dokka.DocumentationReference -import org.junit.Test -import kotlin.test.assertEquals -import kotlin.test.assertTrue - -public class PropertyTest { - @Test fun valueProperty() { - verifyModel("test/data/properties/valueProperty.kt") { model -> - with(model.members.single().members.single()) { - assertEquals("property", name) - assertEquals(DocumentationNode.Kind.Property, kind) - assertEquals(Content.Empty, content) - assertEquals("String", detail(DocumentationNode.Kind.Type).name) - assertTrue(members.none()) - assertTrue(links.none()) - } - } - } - - @Test fun variableProperty() { - verifyModel("test/data/properties/variableProperty.kt") { model -> - with(model.members.single().members.single()) { - assertEquals("property", name) - assertEquals(DocumentationNode.Kind.Property, kind) - assertEquals(Content.Empty, content) - assertEquals("String", detail(DocumentationNode.Kind.Type).name) - assertTrue(members.none()) - assertTrue(links.none()) - } - } - } - - @Test fun valuePropertyWithGetter() { - verifyModel("test/data/properties/valuePropertyWithGetter.kt") { model -> - with(model.members.single().members.single()) { - assertEquals("property", name) - assertEquals(DocumentationNode.Kind.Property, kind) - assertEquals(Content.Empty, content) - assertEquals("String", detail(DocumentationNode.Kind.Type).name) - assertTrue(links.none()) - assertTrue(members.none()) - } - } - } - - @Test fun variablePropertyWithAccessors() { - verifyModel("test/data/properties/variablePropertyWithAccessors.kt") { model -> - with(model.members.single().members.single()) { - assertEquals("property", name) - assertEquals(DocumentationNode.Kind.Property, kind) - assertEquals(Content.Empty, content) - assertEquals("String", detail(DocumentationNode.Kind.Type).name) - val modifiers = details(DocumentationNode.Kind.Modifier).map { it.name } - assertTrue("final" in modifiers) - assertTrue("public" in modifiers) - assertTrue("var" in modifiers) - assertTrue(links.none()) - assertTrue(members.none()) - } - } - } - - @Test fun annotatedProperty() { - verifyModel("test/data/properties/annotatedProperty.kt", withKotlinRuntime = true) { model -> - with(model.members.single().members.single()) { - assertEquals(1, annotations.count()) - with(annotations[0]) { - assertEquals("Volatile", name) - assertEquals(Content.Empty, content) - assertEquals(DocumentationNode.Kind.Annotation, kind) - } - } - } - } - - @Test fun propertyWithReceiver() { - verifyModel("test/data/properties/propertyWithReceiver.kt") { model -> - with(model.members.single().members.single()) { - assertEquals("kotlin.String", name) - assertEquals(DocumentationNode.Kind.ExternalClass, kind) - with(members.single()) { - assertEquals("foobar", name) - assertEquals(DocumentationNode.Kind.Property, kind) - } - } - } - } - - @Test fun propertyOverride() { - verifyModel("test/data/properties/propertyOverride.kt") { model -> - with(model.members.single().members.single { it.name == "Bar" }.members.single { it.name == "xyzzy"}) { - assertEquals("xyzzy", name) - val override = references(DocumentationReference.Kind.Override).single().to - assertEquals("xyzzy", override.name) - assertEquals("Foo", override.owner!!.name) - } - } - } -} |