diff --git a/changelog.md b/changelog.md
--- a/changelog.md
+++ b/changelog.md
@@ -1,5 +1,13 @@
 # Revision history for skylighting and skylighting-core
 
+## 0.10.5.2
+
+  * Added swift grammar definition (Igor Ranieri).
+
+  * Simplify README.md instructions for two-step build.
+
+  * Fix link to KDE documentation.
+
 ## 0.10.5.1
 
   * Regex: Allow lookaheads to capture groups.  Previously
diff --git a/skylighting-core.cabal b/skylighting-core.cabal
--- a/skylighting-core.cabal
+++ b/skylighting-core.cabal
@@ -1,5 +1,5 @@
 name:                skylighting-core
-version:             0.10.5.1
+version:             0.10.5.2
 synopsis:            syntax highlighting library
 description:         Skylighting is a syntax highlighting library.
                      It derives its tokenizers from XML syntax
diff --git a/xml/swift.xml b/xml/swift.xml
new file mode 100644
--- /dev/null
+++ b/xml/swift.xml
@@ -0,0 +1,385 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE language SYSTEM "language.dtd"
+[
+    <!ENTITY int "(?:[0-9]++(_++[0-9]++)*+)">
+    <!ENTITY hex "(?:[0-9a-fA-F]++(_++[0-9a-fA-F]++)*+)">
+    <!ENTITY exp "(?:[eE][-+]?&int;)">
+    <!ENTITY float "(\b&int;(\.((&int;&exp;?+|&exp;)[fF]?\b|[fF]\b)?|&exp;[fF]?\b|[fF]\b)|\.&int;&exp;?[fF]?\b)">
+    <!ENTITY hexfloat "\b0[xX](&hex;\.?+&hex;?+|\.&hex;?)[pP][-+]?&int;[fF]?\b">
+]>
+
+<language
+    name="Swift"
+    version="1"
+    kateversion="5.62"
+    section="Sources"
+    extensions="*.swift"
+    license="MIT"
+    author="I. Elland (igor@elland.me)"
+    style="cstyle"
+    indenter="cstyle">
+    <highlighting>
+        <list name="keywords">
+            <item>@testable</item>
+            <item>import</item>
+
+            <item>struct</item>
+            <item>class</item>
+            <item>enum</item>
+            <item>protocol</item>
+            <item>extension</item>
+
+            <item>private</item>
+            <item>lazy</item>
+            <item>public</item>
+            <item>fileprivate</item>
+            <item>internal</item>
+            <item>final</item>
+            <item>dynamic</item>
+            <item>static</item>
+            <item>mutating</item>
+            <item>nonmutating</item>
+
+            <item>get</item>
+            <item>set</item>
+            <item>func</item>
+            <item>var</item>
+            <item>let</item>
+
+            <item>is</item>
+            <item>as</item>
+            <item>where</item>
+
+            <item>willSet</item>
+            <item>didSet</item>
+            <item>willGet</item>
+            <item>didGet</item>
+
+            <item>return</item>
+            <item>throws</item>
+            <item>rethrows</item>
+            <item>throw</item>
+
+            <item>typealias</item>
+            <item>typeof</item>
+            <item>override</item>
+            <item>infix</item>
+            <item>operator</item>
+        </list>
+        <list name="controlFlowKeyword">
+            <item>if</item>
+            <item>else</item>
+            <item>guard</item>
+            <item>defer</item>
+
+            <item>in</item>
+            <item>inout</item>
+
+            <item>for</item>
+            <item>repeat</item>
+            <item>while</item>
+            <item>case</item>
+            <item>switch</item>
+
+            <item>do</item>
+            <item>try</item>
+            <item>catch</item>
+
+            <item>async</item>
+            <item>await</item>
+            <item>actor</item>
+
+            <item>continue</item>
+            <item>break</item>
+            <item>fallthrough</item>
+            <item>fatalError</item>
+        </list>
+        <list name="predeclared">
+            <item>nil</item>
+            <item>super</item>
+            <item>self</item>
+            <item>init</item>
+            <item>deinit</item>
+            <item>true</item>
+            <item>false</item>
+            <item>required</item>
+            <item>weak</item>
+            <item>strong</item>
+            <item>unowned</item>
+            <item>default</item>
+        </list>
+        <list name="types">
+            <item>Unit</item>
+            <item>Nothing</item>
+
+            <item>String</item>
+            <item>Char</item>
+
+            <item>Int</item>
+            <item>Long</item>
+            <item>Byte</item>
+            <item>Short</item>
+            <item>Float</item>
+            <item>Double</item>
+
+            <item>Boolean</item>
+        </list>
+
+        <contexts>
+            <context attribute="Normal Text" lineEndContext="#stay" name="Start" fallthroughContext="Normal">
+                <Detect2Chars attribute="Comment" context="Shebang" char="#" char1="!" />
+            </context>
+            <context attribute="Normal Text" lineEndContext="#pop!Normal" name="Shebang">
+            </context>
+
+            <context attribute="Normal Text" lineEndContext="#stay" name="Normal">
+                <DetectSpaces context="#stay"/>
+
+                <DetectChar attribute="Symbol" context="Dot" char="." lookAhead="1"/>
+                <DetectChar attribute="Symbol" context="#stay" char="{" beginRegion="Brace1"/>
+                <DetectChar attribute="Symbol" context="#stay" char="}" endRegion="Brace1"/>
+                <DetectChar attribute="Annotation" context="Annotation" char="@" />
+
+                <Detect2Chars attribute="Comment" context="CommentSingleLine" char="/" char1="/"/>
+                <Detect2Chars attribute="Comment" context="CommentMultiline" char="/" char1="*" beginRegion="Comment"/>
+
+                <AnyChar attribute="Symbol" context="#stay" String="()[]&amp;|+,-/*&lt;=&gt;;!%?:~^"/>
+
+                <AnyChar context="Number" String="0123456789" lookAhead="1"/>
+
+                <DetectChar context="String" char="&quot;" lookAhead="1"/>
+                <DetectChar context="Char" char="'" lookAhead="1"/>
+
+                <WordDetect attribute="Keyword" context="VariableDeclaration" String="let"/>
+                <WordDetect attribute="Keyword" context="VariableDeclaration" String="var"/>
+
+                <WordDetect attribute="Keyword" context="FunctionDeclaration" String="func"/>
+
+                <WordDetect attribute="Keyword" context="Imports" String="@testable"/>
+                <WordDetect attribute="Keyword" context="Imports" String="import"/>
+
+                <WordDetect attribute="Keyword" context="TypeDeclaration" String="struct"/>
+                <WordDetect attribute="Keyword" context="TypeDeclaration" String="class"/>
+                <WordDetect attribute="Keyword" context="TypeDeclaration" String="protocol"/>
+                <WordDetect attribute="Keyword" context="TypeDeclaration" String="enum"/>
+                <WordDetect attribute="Keyword" context="TypeDeclaration" String="extension"/>
+
+                <keyword attribute="Keyword" context="#stay" String="predeclared"/>
+                <keyword attribute="Keyword" context="#stay" String="keywords"/>
+                <keyword attribute="ControlFlowKeyword" context="#stay" String="controlFlowKeyword"/>
+
+                <DetectIdentifier attribute="Normal Text"/>
+            </context>
+
+            <context attribute="Normal Text" lineEndContext="#stay" name="Number">
+                <IncludeRules context="FindFloat"/>
+                <RegExpr attribute="Hex" context="#pop" String="\b0[xX]&hex;[lL]?\b"/>
+                <RegExpr attribute="Binary" context="#pop" String="\b0[bB][01]++(_++[01]++)*+[uUlL]?\b"/>
+                <RegExpr attribute="Decimal" context="#pop" String="\b(0|[1-9][0-9]*+(_++[0-9_]++)*+)[uUlL]?\b"/>
+                <AnyChar attribute="Error" context="#pop" String="0123456789"/>
+            </context>
+            <context attribute="Normal Text" lineEndContext="#stay" name="FindFloat">
+                <RegExpr attribute="Float" context="#pop" String="&float;|&hexfloat;"/>
+            </context>
+
+            <context attribute="Normal Text" lineEndContext="#stay" name="Dot">
+                <IncludeRules context="FindFloat"/>
+                <DetectChar attribute="Symbol" context="#pop" char="." />
+            </context>
+
+            <context attribute="Normal Text" lineEndContext="#pop" name="Annotation" fallthroughContext="#pop">
+                <DetectIdentifier attribute="Annotation" context="#pop"/>
+            </context>
+
+            <context attribute="Normal Text" lineEndContext="#stay" name="Char">
+                <HlCChar attribute="Char" context="#pop"/>
+                <RegExpr attribute="Char" context="#pop" String="'\\u[0-9a-fA-F]{4}'"/>
+                <RegExpr attribute="Error" context="#pop" String="'(\\(u[0-9a-fA-F]*|.))?'?"/>
+            </context>
+
+            <context attribute="String" lineEndContext="#pop" name="String">
+                <StringDetect attribute="String" context="#pop!MultiLineString" String="&quot;&quot;&quot;" beginRegion="MultiLineString"/>
+                <DetectChar attribute="String" context="#pop!SingleLineString" char="&quot;"/>
+            </context>
+            <context attribute="String" lineEndContext="#pop" name="SingleLineString">
+                <DetectChar context="StringEscapedChar" char="\" lookAhead="1"/>
+                <DetectChar context="Interpolation" char="$" lookAhead="1"/>
+                <DetectChar attribute="String" context="#pop" char="&quot;"/>
+            </context>
+            <context attribute="String" lineEndContext="#stay" name="MultiLineString">
+                <DetectChar context="StringEscapedChar" char="\" lookAhead="1"/>
+                <DetectChar context="Interpolation" char="$" lookAhead="1"/>
+                <DetectChar context="MultiLineStringFinal" char="&quot;" lookAhead="1"/>
+            </context>
+            <context attribute="String" lineEndContext="#stay" name="MultiLineStringFinal">
+                <StringDetect context="MultiLineStringNoFinal" String="&quot;&quot;&quot;&quot;" lookAhead="1"/>
+                <StringDetect attribute="String" context="#pop#pop" String="&quot;&quot;&quot;" endRegion="MultiLineString"/>
+                <Detect2Chars attribute="String" context="#pop" char="&quot;" char1="&quot;"/>
+                <DetectChar attribute="String" context="#pop" char="&quot;"/>
+            </context>
+            <context attribute="String" lineEndContext="#stay" name="MultiLineStringNoFinal">
+                <DetectChar attribute="String" context="#pop" char="&quot;"/>
+            </context>
+            <context attribute="String" lineEndContext="#pop" name="StringEscapedChar">
+                <HlCStringChar attribute="String Char" context="#pop"/>
+                <Detect2Chars attribute="String Char" context="#pop" char="\" char1="$"/>
+                <RegExpr attribute="String Char" context="#pop" String="\\u[0-9a-fA-F]{4}"/>
+                <RegExpr attribute="Error" context="#pop" String="\\(u[0-9a-fA-F]*|.)?"/>
+            </context>
+
+            <context attribute="String" lineEndContext="#stay" name="Interpolation">
+                <Detect2Chars attribute="String Interpolation" context="#pop!InInterpolation" char="$" char1="{"/>
+                <DetectChar attribute="String Interpolation" context="#pop!Variable" char="$"/>
+            </context>
+            <context attribute="String Interpolation" lineEndContext="#stay" name="InInterpolation">
+                <DetectChar attribute="String Interpolation" context="#pop" char="}"/>
+                <IncludeRules context="Normal"/>
+            </context>
+            <context attribute="String" lineEndContext="#pop" name="Variable" fallthroughContext="#pop">
+                <DetectIdentifier attribute="String Interpolation" context="#pop"/>
+            </context>
+
+            <context attribute="Normal Text" lineEndContext="#pop" name="Imports">
+                <AnyChar attribute="Symbol" context="#stay" String=".*"/>
+                <WordDetect attribute="Keyword" context="TypeName" String="as" />
+                <DetectIdentifier attribute="Imports" context="#stay"/>
+                <DetectChar attribute="Symbol" context="#pop" char=";"/>
+            </context>
+
+            <context name="VariableDeclaration" lineEndContext="#stay" attribute="Normal Text">
+                <DetectIdentifier attribute="Variable" context="#pop" />
+            </context>
+
+            <context name="TypeDeclaration" lineEndContext="#stay" attribute="Normal Text">
+                <keyword attribute="Keyword" context="#stay" String="keywords"/>
+                <RegExpr attribute="Type" context="#stay" String="([A-Z])+?[A-Za-z0-9]+" />
+                <DetectChar attribute="Symbol" context="TypeParameters" char="&lt;" />
+                <DetectChar attribute="Symbol" context="Parameters" char="(" />
+                <DetectChar attribute="Symbol" context="#pop" char="{" lookAhead="true" />
+            </context>
+
+            <context name="FunctionDeclaration" lineEndContext="#stay" attribute="Normal Text">
+                <keyword attribute="Keyword" context="#stay" String="func"/>
+                <DetectChar attribute="Symbol" context="#stay" char="." />
+                <DetectChar attribute="Symbol" context="Parameters" char="(" />
+                <DetectChar attribute="Symbol" context="TypeParameters" char="&lt;" />
+                <AnyChar attribute="Symbol" context="#pop" String="{=" lookAhead="true" />
+
+                <DetectIdentifier attribute="Function" context="#stay"/>
+            </context>
+
+            <context name="TypeParameters" lineEndContext="#stay" attribute="Normal Text">
+                <keyword attribute="Keyword" context="#stay" String="keywords"/>
+
+                <DetectChar attribute="Symbol" context="TypeName" char=":" />
+                <DetectChar attribute="Symbol" context="#stay" char="*" />
+
+                <DetectChar attribute="Symbol" context="#pop" char="&gt;" />
+                <DetectChar attribute="Symbol" context="TypeParameters" char="&lt;" />
+
+                <DetectIdentifier attribute="Data Type" context="DataTypeSuffix"/>
+            </context>
+            <context name="DataTypeSuffix" lineEndContext="#pop" attribute="Normal Text" fallthroughContext="#pop">
+                <DetectChar attribute="Symbol" context="#pop" char="?"/>
+            </context>
+
+            <context name="Parameters" lineEndContext="#stay" attribute="Normal Text">
+                <keyword attribute="Keyword" context="#stay" String="keywords" />
+                <DetectChar attribute="Symbol" context="#pop" char=")" />
+                <DetectChar attribute="Symbol" context="TypeName" char=":" />
+                <DetectChar attribute="Symbol" context="Expression" char="=" />
+                <DetectIdentifier attribute="Variable" context="#stay"/>
+                <DetectChar attribute="Symbol" context="#stay" char=","/>
+            </context>
+
+            <context name="TypeName" lineEndContext="#stay" attribute="Normal Text">
+                <AnyChar attribute="Symbol" context="#pop" String=",*" />
+                <DetectChar attribute="Symbol" context="FunctionType" char="(" />
+                <Detect2Chars attribute="Symbol" context="#stay" char="-" char1="&gt;" />
+                <DetectIdentifier attribute="Data Type" context="#pop!DataTypeSuffix"/>
+            </context>
+
+            <context name="FunctionType" lineEndContext="#stay" attribute="Normal Text">
+                <DetectChar attribute="Symbol" context="#pop" char=")" />
+                <DetectIdentifier attribute="Data Type" context="DataTypeSuffix"/>
+                <Detect2Chars attribute="Symbol" context="#stay" char="-" char1="&gt;" />
+                <DetectChar attribute="Symbol" context="#stay" char="," />
+            </context>
+
+            <context name="Expression" lineEndContext="#stay" attribute="Normal Text">
+                <DetectChar attribute="Symbol" context="#pop" char=")" lookAhead="true" />
+                <DetectChar attribute="Error" context="#pop" char="}" />
+                <DetectChar attribute="Symbol" context="#pop" char=","/>
+                <IncludeRules context="FindSubExpression"/>
+            </context>
+            <context name="FindSubExpression" lineEndContext="#stay" attribute="Normal Text">
+                <DetectSpaces attribute="Normal Text"/>
+
+                <AnyChar attribute="Symbol" context="ExpressionInner" String="({" />
+
+                <DetectChar context="MaybeTypeParameters" char="&lt;" lookAhead="1" />
+
+                <DetectChar attribute="Symbol" context="Dot" char="." lookAhead="1"/>
+                <AnyChar context="Number" String="0123456789" lookAhead="1"/>
+                <DetectChar context="String" char="&quot;" lookAhead="1"/>
+                <DetectChar context="Char" char="'" lookAhead="1"/>
+
+                <Detect2Chars attribute="Comment" context="CommentSingleLine" char="/" char1="/"/>
+                <Detect2Chars attribute="Comment" context="CommentMultiline" char="/" char1="*" beginRegion="Comment"/>
+
+                <DetectIdentifier attribute="Normal Text"/>
+            </context>
+            <context name="MaybeTypeParameters" lineEndContext="#pop" attribute="Normal Text">
+                <RegExpr context="#pop!TypeParameters" String="&lt;\w" lookAhead="1" />
+                <DetectChar attribute="Symbol" context="#pop" char="&lt;"/>
+            </context>
+
+            <context name="ExpressionInner" lineEndContext="#stay" attribute="Normal Text">
+                <AnyChar attribute="Symbol" context="#pop" String=")}" />
+                <IncludeRules context="FindSubExpression"/>
+            </context>
+
+            <context attribute="Comment" lineEndContext="#pop" name="CommentSingleLine">
+                <DetectSpaces />
+                <IncludeRules context="##Comments"/>
+            </context>
+            <context attribute="Comment" lineEndContext="#stay" name="CommentMultiline">
+                <Detect2Chars attribute="Comment" context="#pop" char="*" char1="/" endRegion="Comment"/>
+                <Detect2Chars attribute="Comment" context="CommentMultiline" char="/" char1="*" beginRegion="Comment"/>
+                <DetectSpaces />
+                <IncludeRules context="##Comments"/>
+            </context>
+
+        </contexts>
+
+        <itemDatas>
+            <itemData name="Normal Text"  defStyleNum="dsNormal" spellChecking="false"/>
+            <itemData name="Keyword"      defStyleNum="dsKeyword" spellChecking="false"/>
+            <itemData name="ControlFlowKeyword" defStyleNum="dsControlFlow" spellChecking="false"/>
+            <itemData name="Function"     defStyleNum="dsFunction" spellChecking="false"/>
+            <itemData name="Variable"     defStyleNum="dsVariable" spellChecking="false"/>
+            <itemData name="Imports"      defStyleNum="dsImport" spellChecking="false"/>
+            <itemData name="Annotation"   defStyleNum="dsAttribute" spellChecking="false"/>
+            <itemData name="Data Type"    defStyleNum="dsDataType" spellChecking="false"/>
+            <itemData name="Decimal"      defStyleNum="dsDecVal" spellChecking="false"/>
+            <itemData name="Hex"          defStyleNum="dsBaseN" spellChecking="false"/>
+            <itemData name="Binary"       defStyleNum="dsBaseN" spellChecking="false"/>
+            <itemData name="Float"        defStyleNum="dsFloat" spellChecking="false"/>
+            <itemData name="Char"         defStyleNum="dsChar" spellChecking="false"/>
+            <itemData name="String"       defStyleNum="dsString"/>
+            <itemData name="String Char"  defStyleNum="dsSpecialChar" spellChecking="false"/>
+            <itemData name="String Interpolation" defStyleNum="dsSpecialString"/>
+            <itemData name="Comment"      defStyleNum="dsComment"/>
+            <itemData name="Symbol"       defStyleNum="dsOperator" spellChecking="false"/>
+            <itemData name="Error"        defStyleNum="dsError" spellChecking="false"/>
+    </itemDatas>
+    </highlighting>
+    <general>
+        <comments>
+            <comment name="singleLine" start="//"/>
+            <comment name="multiLine" start="/*" end="*/" region="Comment"/>
+        </comments>
+        <keywords casesensitive="1"/>
+    </general>
+</language>
+<!-- kate: replace-tabs on; tab-width 4; indent-width 4; -->
