Skip to content
This repository was archived by the owner on Apr 22, 2020. It is now read-only.

Commit f425d31

Browse files
mibac138mikesamuel
authored andcommitted
Kotlin support (#496)
* Kotlin support * Added string interpolation * Added more keywords
1 parent 760e6e7 commit f425d31

File tree

3 files changed

+179
-0
lines changed

3 files changed

+179
-0
lines changed

src/lang-kotlin.js

+58
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
/**
2+
* @license
3+
* Copyright (C) 2017 Michał Bączkowski
4+
*
5+
* Licensed under the Apache License, Version 2.0 (the "License");
6+
* you may not use this file except in compliance with the License.
7+
* You may obtain a copy of the License at
8+
*
9+
* http://www.apache.org/licenses/LICENSE-2.0
10+
*
11+
* Unless required by applicable law or agreed to in writing, software
12+
* distributed under the License is distributed on an "AS IS" BASIS,
13+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
* See the License for the specific language governing permissions and
15+
* limitations under the License.
16+
*/
17+
18+
/**
19+
* @fileoverview
20+
* Registers a language handler for Kotlin.
21+
*
22+
* Limitations:
23+
* - doesn't support string interpolation ("$var")
24+
* - doesn't support labels if there is no space between the keyword (break@loop, loop@for)
25+
*
26+
27+
*/
28+
29+
PR['registerLangHandler'](
30+
PR['createSimpleLexer'](
31+
[
32+
[PR['PR_PLAIN'], /^[\t\n\r \xA0]+/, null, '\t\n\r \xA0'],
33+
[PR['PR_PUNCTUATION'], /^[.!%&()*+,\-;<=>?\[\\\]^{|}:]+/, null, '.!%&()*+,-;<=>?[\\]^{|}:']
34+
],
35+
[
36+
// keywords
37+
[PR['PR_KEYWORD'],
38+
/^\b(package|public|protected|private|open|abstract|constructor|final|override|import|for|while|as|typealias|get|set|((data|enum|annotation|sealed) )?class|this|super|val|var|fun|is|in|throw|return|break|continue|(companion )?object|if|try|else|do|when|init|interface|typeof)\b/],
39+
[PR['PR_LITERAL'], /^(?:true|false|null)\b/],
40+
// number literals
41+
[PR['PR_LITERAL'], /^(0[xX][0-9a-fA-F_]+L?|0[bB][0-1]+L?|[0-9_.]+([eE]-?[0-9]+)?[fFL]?)/],
42+
[PR['PR_TYPE'], /^(\b[A-Z]+[a-z][a-zA-Z0-9_$@]*|`.*`)/, null],
43+
//double slash comments
44+
[PR['PR_COMMENT'], /^\/\/.*/],
45+
//slash star comments and documentation
46+
[PR['PR_COMMENT'], /^\/\*[\s\S]*?(?:\*\/|$)/],
47+
// char
48+
[PR['PR_STRING'], /'.'/],
49+
// string
50+
[PR['PR_STRING'], /^"([^"\\]|\\[\s\S])*"/],
51+
// multiline string
52+
[PR['PR_STRING'], /^"{3}[\s\S]*?[^\\]"{3}/],
53+
// annotation (and label)
54+
[PR['PR_LITERAL'], /^@([a-zA-Z0-9_$@]*|`.*`)/],
55+
// label definition
56+
[PR['PR_LITERAL'], /^[a-zA-Z0-9_]+@/]
57+
]),
58+
['kotlin']);

tests/prettify_test_2.html

+61
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
'lang-css.js',
2727
'lang-dart.js',
2828
'lang-ex.js',
29+
'lang-kotlin.js',
2930
'lang-lisp.js',
3031
'lang-llvm.js',
3132
'lang-matlab.js',
@@ -1140,5 +1141,65 @@ <h1>Elixir</h1>
11401141
end
11411142
</pre>
11421143

1144+
<h1>Kotlin</h1>
1145+
<pre class="prettyprint lang-kotlin" id="kotlin">
1146+
package test;
1147+
1148+
import kotlin.Int
1149+
1150+
// Single line comment
1151+
/*
1152+
* Multiline
1153+
* comment
1154+
*/
1155+
1156+
typealias SomeNumber = Int
1157+
1158+
val number: Long = 1_000L
1159+
var float: Float = 12.34f
1160+
0xFF_FF
1161+
3.14
1162+
1163+
314e-2
1164+
0.314e1
1165+
1166+
protected override fun ifBoolean(condition: Boolean? = null) {}
1167+
1168+
::ifBoolean
1169+
1170+
constructor() : super()
1171+
1172+
"\"true\""
1173+
'a'
1174+
1175+
"""
1176+
aaaaaaaaaaa
1177+
"""
1178+
1179+
loop@ for()
1180+
1181+
break @loop
1182+
1183+
enum class `true`
1184+
1185+
data class Person(val name: String)
1186+
1187+
enum class Size {
1188+
BIG, MEDIUM, SMALL
1189+
}
1190+
1191+
class Ball(val color: String, val size: Size) {
1192+
companion object {}
1193+
1194+
fun isBig() = size == Size.BIG
1195+
1196+
val isMedium: Boolean
1197+
get() = size == Size.MEDIUM
1198+
}
1199+
1200+
fun Boolean?.isNull(): Boolean = this == null
1201+
1202+
fun Boolean?.getOrThrow(): Boolean = this ?: throw Exception()
1203+
</pre>
11431204
</body>
11441205
</html>

tests/prettify_test_2.js

+60
Original file line numberDiff line numberDiff line change
@@ -708,6 +708,66 @@ var goldens = {
708708
' `END`KWDEND`END`PUN;`END`PLN\n' +
709709
'`END`KWDEND`END`PUN;`END'
710710
),
711+
kotlin: (
712+
'`KWDpackage`END`PLN test`END`PUN;`END`PLN\n' +
713+
'\n' +
714+
'`END`KWDimport`END`PLN kotlin`END`PUN.`END`TYPInt`END`PLN\n' +
715+
'\n' +
716+
'`END`COM// Single line comment`END`PLN\n' +
717+
'`END`COM/*\n' +
718+
' * Multiline\n' +
719+
' * comment\n' +
720+
' */`END`PLN\n' +
721+
'\n' +
722+
'`END`KWDtypealias`END`PLN `END`TYPSomeNumber`END`PLN `END`PUN=`END`PLN `END`TYPInt`END`PLN\n' +
723+
'\n' +
724+
'`END`KWDval`END`PLN number`END`PUN:`END`PLN `END`TYPLong`END`PLN `END`PUN=`END`PLN `END`LIT1_000L`END`PLN\n' +
725+
'`END`KWDvar`END`PLN float`END`PUN:`END`PLN `END`TYPFloat`END`PLN `END`PUN=`END`PLN `END`LIT12.34f`END`PLN\n' +
726+
'`END`LIT0xFF_FF`END`PLN\n' +
727+
'`END`LIT3.14`END`PLN\n' +
728+
'\n' +
729+
'`END`LIT314e-2`END`PLN\n' +
730+
'`END`LIT0.314e1`END`PLN\n' +
731+
'\n' +
732+
'`END`KWDprotected`END`PLN `END`KWDoverride`END`PLN `END`KWDfun`END`PLN ifBoolean`END`PUN(`END`PLNcondition`END`PUN:`END`PLN `END`TYPBoolean`END`PUN?`END`PLN `END`PUN=`END`PLN `END`LITnull`END`PUN)`END' +
733+
'`PLN `END`PUN{}`END`PLN\n' +
734+
'\n' +
735+
'`END`PUN::`END`PLNifBoolean\n' +
736+
'\n' +
737+
'`END`KWDconstructor`END`PUN()`END`PLN `END`PUN:`END`PLN `END`KWDsuper`END`PUN()`END`PLN\n' +
738+
'\n' +
739+
'`END`STR"\\\"true\\\""`END`PLN\n' +
740+
'`END`STR\'a\'`END`PLN\n' +
741+
'\n' +
742+
'`END`STR"""\n' +
743+
'aaaaaaaaaaa\n' +
744+
'"""`END`PLN\n' +
745+
'\n' +
746+
'`END`LITloop@`END`PLN `END`KWDfor`END`PUN()`END`PLN\n' +
747+
'\n' +
748+
'`END`KWDbreak`END`PLN `END`LIT@loop`END`PLN\n' +
749+
'\n' +
750+
'`END`KWDenum class`END`PLN `END`TYP\`true\``END`PLN\n' +
751+
'\n' +
752+
'`END`KWDdata class`END`PLN `END`TYPPerson`END`PUN(`END`KWDval`END`PLN name`END`PUN:`END`PLN `END`TYPString`END`PUN)`END`PLN\n' +
753+
'\n' +
754+
'`END`KWDenum class`END`PLN `END`TYPSize`END`PLN `END`PUN{`END`PLN\n' +
755+
' BIG`END`PUN,`END`PLN MEDIUM`END`PUN,`END`PLN SMALL\n' +
756+
'`END`PUN}`END`PLN\n' +
757+
'\n' +
758+
'`END`KWDclass`END`PLN `END`TYPBall`END`PUN(`END`KWDval`END`PLN color`END`PUN:`END`PLN `END`TYPString`END`PUN,`END`PLN `END`KWDval`END`PLN size`END`PUN:`END`PLN `END`TYPSize`END`PUN)`END`PLN `END`PUN{`END`PLN\n' +
759+
' `END`KWDcompanion object`END`PLN `END`PUN{}`END`PLN\n' +
760+
'\n' +
761+
' `END`KWDfun`END`PLN isBig`END`PUN()`END`PLN `END`PUN=`END`PLN size `END`PUN==`END`PLN `END`TYPSize`END`PUN.`END`PLNBIG\n' +
762+
'\n' +
763+
' `END`KWDval`END`PLN isMedium`END`PUN:`END`PLN `END`TYPBoolean`END`PLN\n' +
764+
' `END`KWDget`END`PUN()`END`PLN `END`PUN=`END`PLN size `END`PUN==`END`PLN `END`TYPSize`END`PUN.`END`PLNMEDIUM\n' +
765+
'`END`PUN}`END`PLN\n' +
766+
'\n' +
767+
'`END`KWDfun`END`PLN `END`TYPBoolean`END`PUN?.`END`PLNisNull`END`PUN():`END`PLN `END`TYPBoolean`END`PLN `END`PUN=`END`PLN `END`KWDthis`END`PLN `END`PUN==`END`PLN `END`LITnull`END`PLN\n' +
768+
'\n' +
769+
'`END`KWDfun`END`PLN `END`TYPBoolean`END`PUN?.`END`PLNgetOrThrow`END`PUN():`END`PLN `END`TYPBoolean`END`PLN `END`PUN=`END`PLN `END`KWDthis`END`PLN `END`PUN?:`END`PLN `END`KWDthrow`END`PLN `END`TYPException`END`PUN()`END'
770+
),
711771
llvm: (
712772
'`COM; Declare the string constant as a global constant.`END`PLN\n' +
713773
'@.str `END`PUN=`END`PLN `END`KWDprivate`END`PLN `END`KWDunnamed_addr`END`PLN `END`KWDconstant`END`PLN `END`PUN[`END`LIT13`END`PLN `END`KWDx`END`PLN `END`KWDi8`END`PUN]`END`PLN `END`KWDc`END`STR"hello world\\0A\\00"`END`PLN\n' +

0 commit comments

Comments
 (0)