diff --git a/confluence/confluence.iml b/confluence/confluence.iml index ab4a8b1a4e5..b7031cfb474 100644 --- a/confluence/confluence.iml +++ b/confluence/confluence.iml @@ -6,6 +6,7 @@ + diff --git a/confluence/src/test/java/org.jetbrains.jet.confluence/TestUtils.java b/confluence/src/test/java/org.jetbrains.jet.confluence/TestUtils.java new file mode 100644 index 00000000000..fb86e10779c --- /dev/null +++ b/confluence/src/test/java/org.jetbrains.jet.confluence/TestUtils.java @@ -0,0 +1,34 @@ +package org.jetbrains.jet.confluence; + +import java.io.File; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; + +/** + * @author Natalia.Ukhorskaya + */ + +public class TestUtils { + + public static String readFile(File file) throws IOException { + FileReader reader = new FileReader(file); + StringBuilder builder = new StringBuilder(); + int c; + while ((c = reader.read()) >= 0) { + builder.append((char) c); + } + reader.close(); + return builder.toString(); + } + + public static void writeFile(File file, String str) throws IOException { + FileWriter writer = new FileWriter(file); + writer.write(str); + writer.close(); + } + + public static String divideResultForLines(String result) { + return result.replaceAll("
", "\n
"); + } +} diff --git a/confluence/src/test/java/org.jetbrains.jet.confluence/rendering/ConfluenceRenderingTest.java b/confluence/src/test/java/org.jetbrains.jet.confluence/rendering/ConfluenceRenderingTest.java new file mode 100644 index 00000000000..b0ae2a407a7 --- /dev/null +++ b/confluence/src/test/java/org.jetbrains.jet.confluence/rendering/ConfluenceRenderingTest.java @@ -0,0 +1,71 @@ +package org.jetbrains.jet.confluence.rendering; + +import com.atlassian.renderer.v2.macro.MacroException; +import junit.framework.Test; +import junit.framework.TestCase; +import junit.framework.TestSuite; +import org.jetbrains.jet.confluence.TestUtils; +import org.jetbrains.jet.lexer.JetMacro; + +import java.io.File; +import java.io.IOException; + +/** + * @author Natalia.Ukhorskaya + */ + +public class ConfluenceRenderingTest extends TestCase { + + public static Test suite() { + TestSuite suite = new TestSuite(); + TestSuite ats = new TestSuite(); + suite.addTest(ats); + File parsingSourceDir = new File("./testData/rendering"); + addFilesFromDirToSuite(parsingSourceDir, ats); + return suite; + } + + private static void addFilesFromDirToSuite(File file, TestSuite ats) { + if (file.isDirectory()) { + for (File sourceFile : file.listFiles()) { + addFilesFromDirToSuite(sourceFile, ats); + } + } else { + if (file.getName().endsWith(".kt")) { + ats.addTest(new ConfluenceRenderingTest(file.getName(), file)); + } + } + } + + private final File sourceFile; + + public ConfluenceRenderingTest(String name, File sourceFile) { + super(name); + this.sourceFile = sourceFile; + } + + @Override + protected void runTest() throws Throwable { + checkSourceFile(sourceFile); + } + + private void checkSourceFile(File sourceFile) throws IOException, MacroException { + String source = TestUtils.readFile(sourceFile); + + StringBuilder actualResult = new StringBuilder(); + new JetMacro().generateHtmlFromCode(source, actualResult); + + File expectedResultFile = new File(sourceFile.getAbsolutePath().replace(".kt", ".txt")); + if (!expectedResultFile.exists()) { + expectedResultFile.createNewFile(); + TestUtils.writeFile(expectedResultFile, TestUtils.divideResultForLines(actualResult.toString())); + assertTrue("File with expected result for " + expectedResultFile.getAbsolutePath() + " is absent.", false); + } + + String expectedResult = TestUtils.readFile(expectedResultFile); + + + assertEquals(expectedResult, + TestUtils.divideResultForLines(actualResult.toString())); + } +} diff --git a/confluence/testData/rendering/elements/class.kt b/confluence/testData/rendering/elements/class.kt new file mode 100644 index 00000000000..a082c511e08 --- /dev/null +++ b/confluence/testData/rendering/elements/class.kt @@ -0,0 +1,7 @@ +class Greeter1() { + +} + +class Greeter2(val name : String) { + +} \ No newline at end of file diff --git a/confluence/testData/rendering/elements/class.txt b/confluence/testData/rendering/elements/class.txt new file mode 100644 index 00000000000..a579e219588 --- /dev/null +++ b/confluence/testData/rendering/elements/class.txt @@ -0,0 +1,8 @@ +
+
class Greeter1() { 
+
 
+
} 
+
 
+
class Greeter2(val name : String) { 
+
 
+
}
\ No newline at end of file diff --git a/confluence/testData/rendering/elements/variable.kt b/confluence/testData/rendering/elements/variable.kt new file mode 100644 index 00000000000..7364e4d32c7 --- /dev/null +++ b/confluence/testData/rendering/elements/variable.kt @@ -0,0 +1,5 @@ +val a : Int = 1 +val b = 1 +val c : Int +c = 1 +var a : String = "sss" \ No newline at end of file diff --git a/confluence/testData/rendering/elements/variable.txt b/confluence/testData/rendering/elements/variable.txt new file mode 100644 index 00000000000..bdfa9adad8b --- /dev/null +++ b/confluence/testData/rendering/elements/variable.txt @@ -0,0 +1,6 @@ +
+
val a : Int = 1 
+
val b = 1 
+
val c : Int 
+
c = 1 
+
var a : String = "sss"
\ No newline at end of file diff --git a/confluence/testData/rendering/elements/when.kt b/confluence/testData/rendering/elements/when.kt new file mode 100644 index 00000000000..6faddf20ae9 --- /dev/null +++ b/confluence/testData/rendering/elements/when.kt @@ -0,0 +1,7 @@ +val language = if (args.size == 0) "EN" else args[0] +when (language) { + "EN" -> "Hello!" + "ES" -> "¡Hola!" + "RU" -> "Привет!" + else -> "Sorry, I can't greet you in $language yet" +} \ No newline at end of file diff --git a/confluence/testData/rendering/elements/when.txt b/confluence/testData/rendering/elements/when.txt new file mode 100644 index 00000000000..b316772466b --- /dev/null +++ b/confluence/testData/rendering/elements/when.txt @@ -0,0 +1,8 @@ +
+
val language = if (args.size == 0) "EN" else args[0] 
+
when (language) { 
+
 "EN" -> "Hello!" 
+
 "ES" -> "¡Hola!" 
+
 "RU" -> "Привет!" 
+
 else -> "Sorry, I can't greet you in $language yet" 
+
}
\ No newline at end of file diff --git a/confluence/testData/rendering/examples/adress_book.kt b/confluence/testData/rendering/examples/adress_book.kt new file mode 100644 index 00000000000..9cb0446a0e9 --- /dev/null +++ b/confluence/testData/rendering/examples/adress_book.kt @@ -0,0 +1,47 @@ +namespace addressbook + +class Contact( + val name : String, + val emails : List, + val addresses : List, + val phonenums : List +) + +class EmailAddress( + val user : String, + val host : String +) + +class PostalAddress( + val streetAddress : String, + val city : String, + val zip : String, + val state : USState?, + val country : Country +) { + assert {(state == null) xor (country == Countries["US"]) } +} + +class PhoneNumber( + val country : Country, + val areaCode : Int, + val number : Long +) + +object Countries { + fun get(id : CountryID) : Country = countryTable[id] + + private var table : Map? = null + private val countryTable : Map + get() { + if (table == null) { + table = HashMap() + for (line in TextFile("countries.txt").lines(stripWhiteSpace = true)) { + table[line] = Country(line) + } + } + return table + } +} + +class Country(val name : String) \ No newline at end of file diff --git a/confluence/testData/rendering/examples/adress_book.txt b/confluence/testData/rendering/examples/adress_book.txt new file mode 100644 index 00000000000..a650d815f59 --- /dev/null +++ b/confluence/testData/rendering/examples/adress_book.txt @@ -0,0 +1,48 @@ +
+
namespace addressbook 
+
 
+
class Contact( 
+
  val name : String, 
+
  val emails : List<EmailAddress>, 
+
  val addresses : List<PostalAddress>, 
+
  val phonenums : List<PhoneNumber> 
+
) 
+
 
+
class EmailAddress( 
+
  val user : String, 
+
  val host : String 
+
) 
+
 
+
class PostalAddress( 
+
  val streetAddress : String, 
+
  val city : String, 
+
  val zip : String, 
+
  val state : USState?, 
+
  val country : Country 
+
) { 
+
   assert {(state == null) xor (country == Countries["US"]) } 
+
} 
+
 
+
class PhoneNumber( 
+
  val country : Country, 
+
  val areaCode : Int, 
+
  val number : Long 
+
) 
+
 
+
object Countries { 
+
  fun get(id : CountryID) : Country = countryTable[id] 
+
 
+
  private var table : Map<String, Country>? = null 
+
  private val countryTable : Map<String, Country> 
+
    get() { 
+
      if (table == null) { 
+
        table = HashMap() 
+
        for (line in TextFile("countries.txt").lines(stripWhiteSpace = true)) { 
+
          table[line] = Country(line) 
+
        } 
+
      } 
+
      return table 
+
    } 
+
} 
+
 
+
class Country(val name : String)
\ No newline at end of file diff --git a/confluence/testData/rendering/examples/basic_syntax_define_a_function.kt b/confluence/testData/rendering/examples/basic_syntax_define_a_function.kt new file mode 100644 index 00000000000..3c0054a9da7 --- /dev/null +++ b/confluence/testData/rendering/examples/basic_syntax_define_a_function.kt @@ -0,0 +1,4 @@ +// Return type mandatory +fun sum(a : Int, b : Int) : Int { + return a + b +} \ No newline at end of file diff --git a/confluence/testData/rendering/examples/basic_syntax_define_a_function.txt b/confluence/testData/rendering/examples/basic_syntax_define_a_function.txt new file mode 100644 index 00000000000..5f330cc898d --- /dev/null +++ b/confluence/testData/rendering/examples/basic_syntax_define_a_function.txt @@ -0,0 +1,5 @@ +
+
// Return type mandatory 
+
fun sum(a : Int, b : Int) : Int { 
+
  return a + b 
+
}
\ No newline at end of file diff --git a/confluence/testData/rendering/examples/basic_syntax_define_a_variable.kt b/confluence/testData/rendering/examples/basic_syntax_define_a_variable.kt new file mode 100644 index 00000000000..84edfdb2aed --- /dev/null +++ b/confluence/testData/rendering/examples/basic_syntax_define_a_variable.kt @@ -0,0 +1,4 @@ +val a : Int = 1 +val b = 1 // Type is inferred +val c : Int // Type required when no initializer provided +c = 1 // definite assignment \ No newline at end of file diff --git a/confluence/testData/rendering/examples/basic_syntax_define_a_variable.txt b/confluence/testData/rendering/examples/basic_syntax_define_a_variable.txt new file mode 100644 index 00000000000..51ee4531913 --- /dev/null +++ b/confluence/testData/rendering/examples/basic_syntax_define_a_variable.txt @@ -0,0 +1,5 @@ +
+
val a : Int = 1 
+
val b = 1 // Type is inferred 
+
val c : Int // Type required when no initializer provided 
+
c = 1 // definite assignment
\ No newline at end of file diff --git a/confluence/testData/rendering/examples/basic_syntax_null_checks.kt b/confluence/testData/rendering/examples/basic_syntax_null_checks.kt new file mode 100644 index 00000000000..b33f0088667 --- /dev/null +++ b/confluence/testData/rendering/examples/basic_syntax_null_checks.kt @@ -0,0 +1,32 @@ +package multiplier + +// Return null if str does not hold a number +fun parseInt(str : String) : Int? { + // ... +} + +fun main(args : Array) { + if (args.size < 2) { + print("No number supplied"); + } + val x = parseInt(args[0]) + val y = parseInt(args[1]) + + // We cannot say 'x * y' now because they may hold nulls + + if (x != null && y != null) { + print(x * y) // Now we can + } + + // ... + if (x == null) { + print("Wrong number format in '${args[0]}'") + return + } + if (y == null) { + print("Wrong number format in '${args[1]}'") + return + } + print(x * y) // Now we know that x and y are not nulls +} + diff --git a/confluence/testData/rendering/examples/basic_syntax_null_checks.txt b/confluence/testData/rendering/examples/basic_syntax_null_checks.txt new file mode 100644 index 00000000000..d35c9839f0b --- /dev/null +++ b/confluence/testData/rendering/examples/basic_syntax_null_checks.txt @@ -0,0 +1,32 @@ +
+
package multiplier 
+
 
+
// Return null if str does not hold a number 
+
fun parseInt(str : String) : Int? { 
+
  // ... 
+
} 
+
 
+
fun main(args : Array<String>) { 
+
  if (args.size < 2) { 
+
    print("No number supplied"); 
+
  } 
+
  val x = parseInt(args[0]) 
+
  val y = parseInt(args[1]) 
+
 
+
  // We cannot say 'x * y' now because they may hold nulls 
+
 
+
  if (x != null && y != null) { 
+
    print(x * y) // Now we can 
+
  } 
+
 
+
  // ... 
+
    if  (x == null) { 
+
      print("Wrong number format in '${args[0]}'") 
+
      return 
+
    } 
+
    if  (y == null) { 
+
      print("Wrong number format in '${args[1]}'") 
+
      return 
+
    } 
+
    print(x * y) // Now we know that x and y are not nulls 
+
}
\ No newline at end of file diff --git a/confluence/testData/rendering/examples/basic_syntax_use_a_conditional_expression.kt b/confluence/testData/rendering/examples/basic_syntax_use_a_conditional_expression.kt new file mode 100644 index 00000000000..68c5739a540 --- /dev/null +++ b/confluence/testData/rendering/examples/basic_syntax_use_a_conditional_expression.kt @@ -0,0 +1,6 @@ +fun max(a : Int, b : Int) : Int { + if (a > b) + return a + else + return b +} \ No newline at end of file diff --git a/confluence/testData/rendering/examples/basic_syntax_use_a_conditional_expression.txt b/confluence/testData/rendering/examples/basic_syntax_use_a_conditional_expression.txt new file mode 100644 index 00000000000..648c9af2ce2 --- /dev/null +++ b/confluence/testData/rendering/examples/basic_syntax_use_a_conditional_expression.txt @@ -0,0 +1,7 @@ +
+
fun max(a : Int, b : Int) : Int { 
+
  if (a > b) 
+
    return a 
+
  else 
+
    return b 
+
}
\ No newline at end of file diff --git a/confluence/testData/rendering/examples/hello_world_a_multi_language_hello.kt b/confluence/testData/rendering/examples/hello_world_a_multi_language_hello.kt new file mode 100644 index 00000000000..2d44afdbca6 --- /dev/null +++ b/confluence/testData/rendering/examples/hello_world_a_multi_language_hello.kt @@ -0,0 +1,9 @@ +fun main(args : Array) { + val language = if (args.size == 0) "EN" else args[0] + println(when (language) { + "EN" -> "Hello!" + "ES" -> "¡Hola!" + "RU" -> "Привет!" + else -> "Sorry, I can't greet you in $language yet" + }) +} \ No newline at end of file diff --git a/confluence/testData/rendering/examples/hello_world_a_multi_language_hello.txt b/confluence/testData/rendering/examples/hello_world_a_multi_language_hello.txt new file mode 100644 index 00000000000..48b9d279c0a --- /dev/null +++ b/confluence/testData/rendering/examples/hello_world_a_multi_language_hello.txt @@ -0,0 +1,10 @@ +
+
fun main(args : Array<String>) { 
+
  val language = if (args.size == 0) "EN" else args[0] 
+
  println(when (language) { 
+
    "EN" -> "Hello!" 
+
    "ES" -> "¡Hola!" 
+
    "RU" -> "Привет!" 
+
    else -> "Sorry, I can't greet you in $language yet" 
+
  }) 
+
}
\ No newline at end of file diff --git a/confluence/testData/rendering/examples/hello_world_an_object_oriented_hello.kt b/confluence/testData/rendering/examples/hello_world_an_object_oriented_hello.kt new file mode 100644 index 00000000000..03499b9e807 --- /dev/null +++ b/confluence/testData/rendering/examples/hello_world_an_object_oriented_hello.kt @@ -0,0 +1,9 @@ +class Greeter(val name : String) { + fun greet() { + println("Hello, ${name}"); + } +} + +fun main(args : Array) { + Greeter(args[0]).greet() +} \ No newline at end of file diff --git a/confluence/testData/rendering/examples/hello_world_an_object_oriented_hello.txt b/confluence/testData/rendering/examples/hello_world_an_object_oriented_hello.txt new file mode 100644 index 00000000000..d85c333e4cd --- /dev/null +++ b/confluence/testData/rendering/examples/hello_world_an_object_oriented_hello.txt @@ -0,0 +1,10 @@ +
+
class Greeter(val name : String) { 
+
  fun greet() { 
+
    println("Hello, ${name}"); 
+
  } 
+
} 
+
 
+
fun main(args : Array<String>) { 
+
  Greeter(args[0]).greet() 
+
}
\ No newline at end of file diff --git a/confluence/testData/rendering/examples/hello_world_reading_a_name_from_command_line.kt b/confluence/testData/rendering/examples/hello_world_reading_a_name_from_command_line.kt new file mode 100644 index 00000000000..c1db6631119 --- /dev/null +++ b/confluence/testData/rendering/examples/hello_world_reading_a_name_from_command_line.kt @@ -0,0 +1,7 @@ +fun main(args : Array) { + if (args.size == 0) { + println("Please provide a name as a command-line argument") + return + } + println("Hello, ${args[0]}!") +} \ No newline at end of file diff --git a/confluence/testData/rendering/examples/hello_world_reading_a_name_from_command_line.txt b/confluence/testData/rendering/examples/hello_world_reading_a_name_from_command_line.txt new file mode 100644 index 00000000000..272661aa570 --- /dev/null +++ b/confluence/testData/rendering/examples/hello_world_reading_a_name_from_command_line.txt @@ -0,0 +1,8 @@ +
+
fun main(args : Array<String>) { 
+
  if (args.size == 0) { 
+
    println("Please provide a name as a command-line argument") 
+
    return 
+
  } 
+
  println("Hello, ${args[0]}!") 
+
}
\ No newline at end of file diff --git a/confluence/testData/rendering/examples/html_builder.kt b/confluence/testData/rendering/examples/html_builder.kt new file mode 100644 index 00000000000..00bee9aa529 --- /dev/null +++ b/confluence/testData/rendering/examples/html_builder.kt @@ -0,0 +1,31 @@ +import html.* + +fun result(args : Array) = + html { + head { + title {+"XML encoding with Kotlin"} + } + body { + h1 {+"XML encoding with Kotlin"} + p {+"this format can be used as an alternative markup to XML"} + + // an element with attributes and text content + a(href = "http://jetbrains.com/kotlin") {+"Kotlin"} + + // mixed content + p { + +"This is some" + b {+"mixed"} + +"text. For more see the" + a(href = "http://jetbrains.com/kotlin") {+"Kotlin"} + +"project" + } + p {+"some text"} + + // content generated by + p { + for (arg in args) + +arg + } + } + } \ No newline at end of file diff --git a/confluence/testData/rendering/examples/html_builder.txt b/confluence/testData/rendering/examples/html_builder.txt new file mode 100644 index 00000000000..a4e0257d8fd --- /dev/null +++ b/confluence/testData/rendering/examples/html_builder.txt @@ -0,0 +1,32 @@ +
+
import html.* 
+
 
+
fun result(args : Array<String>) = 
+
  html { 
+
    head { 
+
      title {+"XML encoding with Kotlin"} 
+
    } 
+
    body { 
+
      h1 {+"XML encoding with Kotlin"} 
+
      p {+"this format can be used as an alternative markup to XML"} 
+
 
+
      // an element with attributes and text content 
+
      a(href = "http://jetbrains.com/kotlin") {+"Kotlin"} 
+
 
+
      // mixed content 
+
      p { 
+
        +"This is some" 
+
        b {+"mixed"} 
+
        +"text. For more see the" 
+
        a(href = "http://jetbrains.com/kotlin") {+"Kotlin"} 
+
        +"project" 
+
      } 
+
      p {+"some text"} 
+
 
+
      // content generated by 
+
      p { 
+
        for (arg in args) 
+
          +arg 
+
      } 
+
    } 
+
  }
\ No newline at end of file diff --git a/confluence/testData/rendering/examples/html_builder_with_refs.kt b/confluence/testData/rendering/examples/html_builder_with_refs.kt new file mode 100644 index 00000000000..70ce56a58d5 --- /dev/null +++ b/confluence/testData/rendering/examples/html_builder_with_refs.kt @@ -0,0 +1,114 @@ +import html.* + +fun result(args : Array) = + html { + head { + title {+"XML encoding with Kotlin"} + } + body { + h1 {+"XML encoding with Kotlin"} + p {+"this format can be used as an alternative markup to XML"} + + // an element with attributes and text content + a(href = "http://jetbrains.com/kotlin") {+"Kotlin"} + + // mixed content + p { + +"This is some" + b {+"mixed"} + +"text. For more see the" + a(href = "http://jetbrains.com/kotlin") {+"Kotlin"} + +"project" + } + p {+"some text"} + + // content generated by + p { + for (arg in args) + +arg + } + } + } + +namespace html { + + abstract class Factory { + fun create() : T + } + + abstract class Element + + class TextElement(val text : String) : Element + + abstract class Tag(val name : String) : Element { + val children = ArrayList() + val attributes = HashMap() + + protected fun initTag(init : T.() -> Unit) : T + where class object T : Factory { + val tag = T.create() + tag.init() + children.add(tag) + return tag + } + } + + abstract class TagWithText(name : String) : Tag(name) { + fun String.plus() { + children.add(TextElement(this)) + } + } + + class HTML() : TagWithText("html") { + class object : Factory { + override fun create() = HTML() + } + + fun head(init : Head.() -> Unit) = initTag(init) + + fun body(init : Body.() -> Unit) = initTag(init) + } + + class Head() : TagWithText("head") { + class object : Factory { + override fun create() = Head() + } + + fun title(init : Title.() -> Unit) = initTag(init) + } + + class Title() : TagWithText("title") + + abstract class BodyTag(name : String) : TagWithText(name) { + } + + class Body() : BodyTag("body") { + class object : Factory { + override fun create() = Body() + } + + fun b(init : B.() -> Unit) = initTag(init) + fun p(init : P.() -> Unit) = initTag(init) + fun h1(init : H1.() -> Unit) = initTag(init) + fun a(href : String, init : A.() -> Unit) { + val a = initTag(init) + a.href = href + } + } + + class B() : BodyTag("b") + class P() : BodyTag("p") + class H1() : BodyTag("h1") + class A() : BodyTag("a") { + var href : String + get() = attributes["href"] + set(value) { attributes["href"] = value } + } + + fun html(init : HTML.() -> Unit) : HTML { + val html = HTML() + html.init() + return html + } + +} \ No newline at end of file diff --git a/confluence/testData/rendering/examples/html_builder_with_refs.txt b/confluence/testData/rendering/examples/html_builder_with_refs.txt new file mode 100644 index 00000000000..2e723e94802 --- /dev/null +++ b/confluence/testData/rendering/examples/html_builder_with_refs.txt @@ -0,0 +1,115 @@ +
+
import html.* 
+
 
+
fun result(args : Array<String>) = 
+
  html { 
+
    head { 
+
      title {+"XML encoding with Kotlin"} 
+
    } 
+
    body { 
+
      h1 {+"XML encoding with Kotlin"} 
+
      p {+"this format can be used as an alternative markup to XML"} 
+
 
+
      // an element with attributes and text content 
+
      a(href = "http://jetbrains.com/kotlin") {+"Kotlin"} 
+
 
+
      // mixed content 
+
      p { 
+
        +"This is some" 
+
        b {+"mixed"} 
+
        +"text. For more see the" 
+
        a(href = "http://jetbrains.com/kotlin") {+"Kotlin"} 
+
        +"project" 
+
      } 
+
      p {+"some text"} 
+
 
+
      // content generated by 
+
      p { 
+
        for (arg in args) 
+
          +arg 
+
      } 
+
    } 
+
  } 
+
 
+
namespace html { 
+
 
+
  abstract class Factory<T> { 
+
    fun create() : T 
+
  } 
+
 
+
  abstract class Element 
+
 
+
  class TextElement(val text : String) : Element 
+
 
+
  abstract class Tag(val name : String) : Element { 
+
    val children = ArrayList<Element>() 
+
    val attributes = HashMap<String, String>() 
+
 
+
    protected fun initTag<T : Element>(init : T.() -> Unit) : T 
+
      where class object T : Factory<T> { 
+
      val tag = T.create() 
+
      tag.init() 
+
      children.add(tag) 
+
      return tag 
+
    } 
+
  } 
+
 
+
  abstract class TagWithText(name : String) : Tag(name) { 
+
    fun String.plus() { 
+
      children.add(TextElement(this)) 
+
    } 
+
  } 
+
 
+
  class HTML() : TagWithText("html") { 
+
    class object : Factory<HTML> { 
+
      override fun create() = HTML() 
+
    } 
+
 
+
    fun head(init : Head.() -> Unit) = initTag(init) 
+
 
+
    fun body(init : Body.() -> Unit) = initTag(init) 
+
  } 
+
 
+
  class Head() : TagWithText("head") { 
+
    class object : Factory<Head> { 
+
      override fun create() = Head() 
+
    } 
+
 
+
    fun title(init : Title.() -> Unit) = initTag(init) 
+
  } 
+
 
+
  class Title() : TagWithText("title") 
+
 
+
  abstract class BodyTag(name : String) : TagWithText(name) { 
+
  } 
+
 
+
  class Body() : BodyTag("body") { 
+
    class object : Factory<Body> { 
+
      override fun create() = Body() 
+
    } 
+
 
+
    fun b(init : B.() -> Unit) = initTag(init) 
+
    fun p(init : P.() -> Unit) = initTag(init) 
+
    fun h1(init : H1.() -> Unit) = initTag(init) 
+
    fun a(href : String, init : A.() -> Unit) { 
+
      val a = initTag(init) 
+
      a.href = href 
+
    } 
+
  } 
+
 
+
  class B() : BodyTag("b") 
+
  class P() : BodyTag("p") 
+
  class H1() : BodyTag("h1") 
+
  class A() : BodyTag("a") { 
+
    var href : String 
+
      get() = attributes["href"] 
+
      set(value) { attributes["href"] = value } 
+
  } 
+
 
+
  fun html(init : HTML.() -> Unit) : HTML { 
+
    val html = HTML() 
+
    html.init() 
+
    return html 
+
  } 
+
 
+
}
\ No newline at end of file diff --git a/confluence/testData/rendering/examples/welcome_hello.kt b/confluence/testData/rendering/examples/welcome_hello.kt new file mode 100644 index 00000000000..bfb70255c67 --- /dev/null +++ b/confluence/testData/rendering/examples/welcome_hello.kt @@ -0,0 +1,5 @@ +package hello + +fun main(args : Array) { + println("Hello, world!") +} \ No newline at end of file diff --git a/confluence/testData/rendering/examples/welcome_hello.txt b/confluence/testData/rendering/examples/welcome_hello.txt new file mode 100644 index 00000000000..b195b31b3df --- /dev/null +++ b/confluence/testData/rendering/examples/welcome_hello.txt @@ -0,0 +1,6 @@ +
+
package hello 
+
 
+
fun main(args : Array<String>) { 
+
  println("Hello, world!") 
+
}
\ No newline at end of file diff --git a/confluence/testData/rendering/tagTypes/a/a_closed_tag.kt b/confluence/testData/rendering/tagTypes/a/a_closed_tag.kt new file mode 100644 index 00000000000..c98a4f5f197 --- /dev/null +++ b/confluence/testData/rendering/tagTypes/a/a_closed_tag.kt @@ -0,0 +1 @@ +var allByDefault : Int? \ No newline at end of file diff --git a/confluence/testData/rendering/tagTypes/a/a_next_token_tag.kt b/confluence/testData/rendering/tagTypes/a/a_next_token_tag.kt new file mode 100644 index 00000000000..ae45b3ba6db --- /dev/null +++ b/confluence/testData/rendering/tagTypes/a/a_next_token_tag.kt @@ -0,0 +1 @@ +var allByDefault : Int? \ No newline at end of file diff --git a/confluence/testData/rendering/tagTypes/a/a_with_close_tag.kt b/confluence/testData/rendering/tagTypes/a/a_with_close_tag.kt new file mode 100644 index 00000000000..228a8326dcb --- /dev/null +++ b/confluence/testData/rendering/tagTypes/a/a_with_close_tag.kt @@ -0,0 +1 @@ +var allByDefault : Int? \ No newline at end of file diff --git a/confluence/testData/rendering/tagTypes/class/class_closed_tag.kt b/confluence/testData/rendering/tagTypes/class/class_closed_tag.kt new file mode 100644 index 00000000000..fd10ed411be --- /dev/null +++ b/confluence/testData/rendering/tagTypes/class/class_closed_tag.kt @@ -0,0 +1 @@ +var allByDefault : Int? \ No newline at end of file diff --git a/confluence/testData/rendering/tagTypes/class/class_next_token_tag.kt b/confluence/testData/rendering/tagTypes/class/class_next_token_tag.kt new file mode 100644 index 00000000000..09226ddfcda --- /dev/null +++ b/confluence/testData/rendering/tagTypes/class/class_next_token_tag.kt @@ -0,0 +1 @@ +var allByDefault : Int? \ No newline at end of file diff --git a/confluence/testData/rendering/tagTypes/class/class_with_close_tag.kt b/confluence/testData/rendering/tagTypes/class/class_with_close_tag.kt new file mode 100644 index 00000000000..86e5c557073 --- /dev/null +++ b/confluence/testData/rendering/tagTypes/class/class_with_close_tag.kt @@ -0,0 +1 @@ +var allByDefault : Int? \ No newline at end of file diff --git a/confluence/testData/rendering/tagTypes/label/label_closed_tag.kt b/confluence/testData/rendering/tagTypes/label/label_closed_tag.kt new file mode 100644 index 00000000000..d35661b6352 --- /dev/null +++ b/confluence/testData/rendering/tagTypes/label/label_closed_tag.kt @@ -0,0 +1 @@ +var allByDefault : Int? \ No newline at end of file diff --git a/confluence/testData/rendering/tagTypes/label/label_next_token_tag.kt b/confluence/testData/rendering/tagTypes/label/label_next_token_tag.kt new file mode 100644 index 00000000000..78351b67683 --- /dev/null +++ b/confluence/testData/rendering/tagTypes/label/label_next_token_tag.kt @@ -0,0 +1 @@ +var allByDefault : Int? \ No newline at end of file diff --git a/confluence/testData/rendering/tagTypes/label/label_with_close_tag.kt b/confluence/testData/rendering/tagTypes/label/label_with_close_tag.kt new file mode 100644 index 00000000000..b0222263ca1 --- /dev/null +++ b/confluence/testData/rendering/tagTypes/label/label_with_close_tag.kt @@ -0,0 +1 @@ +var allByDefault : Int? \ No newline at end of file diff --git a/confluence/testData/rendering/tagTypes/ref/ref_closed_tag.kt b/confluence/testData/rendering/tagTypes/ref/ref_closed_tag.kt new file mode 100644 index 00000000000..3e6e164d9b9 --- /dev/null +++ b/confluence/testData/rendering/tagTypes/ref/ref_closed_tag.kt @@ -0,0 +1 @@ +var allByDefault : Int? \ No newline at end of file diff --git a/confluence/testData/rendering/tagTypes/ref/ref_next_token_tag.kt b/confluence/testData/rendering/tagTypes/ref/ref_next_token_tag.kt new file mode 100644 index 00000000000..4441c579807 --- /dev/null +++ b/confluence/testData/rendering/tagTypes/ref/ref_next_token_tag.kt @@ -0,0 +1 @@ +var allByDefault : Int? \ No newline at end of file diff --git a/confluence/testData/rendering/tagTypes/ref/ref_with_close_tag.kt b/confluence/testData/rendering/tagTypes/ref/ref_with_close_tag.kt new file mode 100644 index 00000000000..5c55181140d --- /dev/null +++ b/confluence/testData/rendering/tagTypes/ref/ref_with_close_tag.kt @@ -0,0 +1 @@ +var allByDefault : Int? \ No newline at end of file diff --git a/confluence/testData/rendering/tagTypes/style/style_closed_tag.kt b/confluence/testData/rendering/tagTypes/style/style_closed_tag.kt new file mode 100644 index 00000000000..ed45a3c83c6 --- /dev/null +++ b/confluence/testData/rendering/tagTypes/style/style_closed_tag.kt @@ -0,0 +1 @@ +var allByDefault : Int? \ No newline at end of file diff --git a/confluence/testData/rendering/tagTypes/style/style_next_token_tag.kt b/confluence/testData/rendering/tagTypes/style/style_next_token_tag.kt new file mode 100644 index 00000000000..a4908a6fec6 --- /dev/null +++ b/confluence/testData/rendering/tagTypes/style/style_next_token_tag.kt @@ -0,0 +1 @@ +var allByDefault : Int? \ No newline at end of file diff --git a/confluence/testData/rendering/tagTypes/style/style_with_close_tag.kt b/confluence/testData/rendering/tagTypes/style/style_with_close_tag.kt new file mode 100644 index 00000000000..5faa01a98a8 --- /dev/null +++ b/confluence/testData/rendering/tagTypes/style/style_with_close_tag.kt @@ -0,0 +1 @@ +var allByDefault : Int? \ No newline at end of file diff --git a/confluence/testData/rendering/tagTypes/unresolved/unresolved_closed_tag.kt b/confluence/testData/rendering/tagTypes/unresolved/unresolved_closed_tag.kt new file mode 100644 index 00000000000..3eaf212b37e --- /dev/null +++ b/confluence/testData/rendering/tagTypes/unresolved/unresolved_closed_tag.kt @@ -0,0 +1 @@ +var allByDefault : Int? \ No newline at end of file diff --git a/confluence/testData/rendering/tagTypes/unresolved/unresolved_next_token_tag.kt b/confluence/testData/rendering/tagTypes/unresolved/unresolved_next_token_tag.kt new file mode 100644 index 00000000000..a148882adf3 --- /dev/null +++ b/confluence/testData/rendering/tagTypes/unresolved/unresolved_next_token_tag.kt @@ -0,0 +1 @@ +var allByDefault : Int? \ No newline at end of file diff --git a/confluence/testData/rendering/tagTypes/unresolved/unresolved_with_close_tag.kt b/confluence/testData/rendering/tagTypes/unresolved/unresolved_with_close_tag.kt new file mode 100644 index 00000000000..c75d20afdab --- /dev/null +++ b/confluence/testData/rendering/tagTypes/unresolved/unresolved_with_close_tag.kt @@ -0,0 +1 @@ +var allByDefault : Int? \ No newline at end of file diff --git a/confluence/testData/rendering/tagTypes/warnings/warning_closed_tag.kt b/confluence/testData/rendering/tagTypes/warnings/warning_closed_tag.kt new file mode 100644 index 00000000000..32a9994d9a2 --- /dev/null +++ b/confluence/testData/rendering/tagTypes/warnings/warning_closed_tag.kt @@ -0,0 +1 @@ +var allByDefault : Int? \ No newline at end of file diff --git a/confluence/testData/rendering/tagTypes/warnings/warning_closed_tag.txt b/confluence/testData/rendering/tagTypes/warnings/warning_closed_tag.txt new file mode 100644 index 00000000000..5d3f39b7ba8 --- /dev/null +++ b/confluence/testData/rendering/tagTypes/warnings/warning_closed_tag.txt @@ -0,0 +1,2 @@ +
+
var 
allByDefault : Int?
\ No newline at end of file diff --git a/confluence/testData/rendering/tagTypes/warnings/warning_next_token_tag.kt b/confluence/testData/rendering/tagTypes/warnings/warning_next_token_tag.kt new file mode 100644 index 00000000000..89c39d6d4ec --- /dev/null +++ b/confluence/testData/rendering/tagTypes/warnings/warning_next_token_tag.kt @@ -0,0 +1 @@ +var allByDefault : Int? \ No newline at end of file diff --git a/confluence/testData/rendering/tagTypes/warnings/warning_next_token_tag.txt b/confluence/testData/rendering/tagTypes/warnings/warning_next_token_tag.txt new file mode 100644 index 00000000000..5aeb3ef0460 --- /dev/null +++ b/confluence/testData/rendering/tagTypes/warnings/warning_next_token_tag.txt @@ -0,0 +1,2 @@ +
+
var 
allByDefault
 : Int?
\ No newline at end of file diff --git a/confluence/testData/rendering/tagTypes/warnings/warning_with_close_tag.kt b/confluence/testData/rendering/tagTypes/warnings/warning_with_close_tag.kt new file mode 100644 index 00000000000..2924effc7e4 --- /dev/null +++ b/confluence/testData/rendering/tagTypes/warnings/warning_with_close_tag.kt @@ -0,0 +1 @@ +var allByDefault : Int? \ No newline at end of file diff --git a/confluence/testData/rendering/tagTypes/warnings/warning_with_close_tag.txt b/confluence/testData/rendering/tagTypes/warnings/warning_with_close_tag.txt new file mode 100644 index 00000000000..4d6df03ae3d --- /dev/null +++ b/confluence/testData/rendering/tagTypes/warnings/warning_with_close_tag.txt @@ -0,0 +1,2 @@ +
+
var 
allByDefault : Int?
\ No newline at end of file