From e26501f53fe4fa6171460a876063deec7c4e1113 Mon Sep 17 00:00:00 2001
From: "Deployment Bot (from Travis CI)" <deploy@travis-ci.org>
Date: Fri, 16 Mar 2018 18:08:51 +0000
Subject: [PATCH] Deploy string-metrics to
 github.com/mlobl/string-metrics.git:gh-pages

---
 StringMetrics.html | 267 ++++++++++++++++++++++++++++
 css/style.css      | 432 +++++++++++++++++++++++++++++++++++++++++++++
 index.html         |  68 +++++++
 index.json         |   1 +
 js/doc.js          | 111 ++++++++++++
 5 files changed, 879 insertions(+)
 create mode 100644 StringMetrics.html
 create mode 100644 css/style.css
 create mode 100644 index.html
 create mode 100644 index.json
 create mode 100644 js/doc.js

diff --git a/StringMetrics.html b/StringMetrics.html
new file mode 100644
index 0000000..778427b
--- /dev/null
+++ b/StringMetrics.html
@@ -0,0 +1,267 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+  <meta charset="utf-8" />
+  <meta id="repository-name" content="github.com/mlobl/string-metrics">
+  <link href="css/style.css" rel="stylesheet" type="text/css" />
+  <script type="text/javascript" src="js/doc.js"></script>
+  <title>StringMetrics - github.com/mlobl/string-metrics</title>
+</head>
+<body>
+
+<div id="types-list">
+  <div id="search-box">
+    <input type="search" id="search-input" placeholder="Search...">
+  </div>
+
+  <ul>
+    <li><a href="index.html">README</a></li>
+  </ul>
+
+  <ul>
+  
+  <li class=" current" data-id="github.com/mlobl/string-metrics/StringMetrics" data-name="stringmetrics">
+      <a href="StringMetrics.html">StringMetrics</a>
+      
+    </li>
+  
+</ul>
+
+</div>
+
+<div id="main-content">
+<h1 class="type-name">
+
+  <span class="kind">module</span> StringMetrics
+
+</h1>
+
+
+
+
+
+  <h2>Overview</h2>
+
+  <p>A module containing a collection of well known string metric algorithms</p>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  <h2>Defined in:</h2>
+  
+    
+      <a href="https://github.com/mlobl/string-metrics/blob/c7cf5d71b4b6d37fc657381a7242553208354ade/src/string-metrics/version.cr#L1" target="_blank">string-metrics/version.cr</a>
+    
+    <br/>
+  
+    
+      <a href="https://github.com/mlobl/string-metrics/blob/c7cf5d71b4b6d37fc657381a7242553208354ade/src/string-metrics.cr#L4" target="_blank">string-metrics.cr</a>
+    
+    <br/>
+  
+
+
+
+  
+    <h2>Constant Summary</h2>
+  
+  <dl>
+    
+      <dt class="entry-const" id="VERSION">
+        <strong>VERSION</strong> = <code><span class="s">&quot;0.1.0&quot;</span></code>
+      </dt>
+      
+    
+  </dl>
+
+
+
+
+
+  <h2>Class Method Summary</h2>
+  <ul class="list-summary">
+    
+      <li class="entry-summary">
+        <a href="#damerau_levenshtein%28s1%3AString%2Cs2%3AString%29%3AInt-class-method" class="signature"><strong>.damerau_levenshtein</strong>(s1 : String, s2 : String) : Int</a>
+        
+          <div class="summary"><p>A variation of the Levenshtein distance, this counts transpositions as a single edit.</p></div>
+        
+      </li>
+    
+      <li class="entry-summary">
+        <a href="#hamming%28s1%3AString%2Cs2%3AString%29%3AInt-class-method" class="signature"><strong>.hamming</strong>(s1 : String, s2 : String) : Int</a>
+        
+          <div class="summary"><p>Returns the number of substitutions that exist between two strings of equal length.</p></div>
+        
+      </li>
+    
+      <li class="entry-summary">
+        <a href="#jaro%28s1%3AString%2Cs2%3AString%29-class-method" class="signature"><strong>.jaro</strong>(s1 : String, s2 : String)</a>
+        
+          <div class="summary"><p>A measure of similarity between two strings based on matching characters.</p></div>
+        
+      </li>
+    
+      <li class="entry-summary">
+        <a href="#jaro_winkler%28s1%3AString%2Cs2%3AString%2Cscaling_factor%3D0.1%29-class-method" class="signature"><strong>.jaro_winkler</strong>(s1 : String, s2 : String, scaling_factor = <span class="n">0.1</span>)</a>
+        
+          <div class="summary"><p>Similar to regular Jaro, but gives a higher score for matching from the beginning of the string.</p></div>
+        
+      </li>
+    
+      <li class="entry-summary">
+        <a href="#levenshtein%28s1%3AString%2Cs2%3AString%29%3AInt-class-method" class="signature"><strong>.levenshtein</strong>(s1 : String, s2 : String) : Int</a>
+        
+          <div class="summary"><p>Returns the min edit distance between two strings.</p></div>
+        
+      </li>
+    
+  </ul>
+
+
+
+
+
+
+
+<div class="methods-inherited">
+  
+</div>
+
+
+
+
+  <h2>Class Method Detail</h2>
+  
+    <div class="entry-detail" id="damerau_levenshtein(s1:String,s2:String):Int-class-method">
+      <div class="signature">
+        
+        def self.<strong>damerau_levenshtein</strong>(s1 : String, s2 : String) : Int
+
+        <a class="method-permalink" href="#damerau_levenshtein%28s1%3AString%2Cs2%3AString%29%3AInt-class-method">#</a>
+      </div>
+      
+        <div class="doc"><p>A variation of the Levenshtein distance, this counts transpositions as a single edit.</p>
+
+<pre><code class='language-crystal'><span class="t">StringMetrics</span>.damerau_levenshtein(<span class="s">&quot;char&quot;</span>, <span class="s">&quot;hcar&quot;</span>) <span class="o">==</span> <span class="n">1</span></code></pre>
+
+<p>as opposed to a distance of 2 from levenshtein on it's own</p>
+
+<p>Ported from <a href="https://github.com/jamesturk/jellyfish/blob/master/jellyfish/_jellyfish.py" target="_blank">here</a></p></div>
+      
+      <br/>
+      <div>
+        
+          [<a href="https://github.com/mlobl/string-metrics/blob/c7cf5d71b4b6d37fc657381a7242553208354ade/src/string-metrics.cr#L59" target="_blank">View source</a>]
+        
+      </div>
+    </div>
+  
+    <div class="entry-detail" id="hamming(s1:String,s2:String):Int-class-method">
+      <div class="signature">
+        
+        def self.<strong>hamming</strong>(s1 : String, s2 : String) : Int
+
+        <a class="method-permalink" href="#hamming%28s1%3AString%2Cs2%3AString%29%3AInt-class-method">#</a>
+      </div>
+      
+        <div class="doc"><p>Returns the number of substitutions that exist between two strings of equal length.
+Will raise an ArgumentError if both parameters aren't of the same length</p>
+
+<pre><code class='language-crystal'><span class="t">StringMetrics</span>.hamming(<span class="s">&quot;Micro&quot;</span>, <span class="s">&quot;Macro&quot;</span>) <span class="o">==</span> <span class="n">1</span></code></pre></div>
+      
+      <br/>
+      <div>
+        
+          [<a href="https://github.com/mlobl/string-metrics/blob/c7cf5d71b4b6d37fc657381a7242553208354ade/src/string-metrics.cr#L47" target="_blank">View source</a>]
+        
+      </div>
+    </div>
+  
+    <div class="entry-detail" id="jaro(s1:String,s2:String)-class-method">
+      <div class="signature">
+        
+        def self.<strong>jaro</strong>(s1 : String, s2 : String)
+
+        <a class="method-permalink" href="#jaro%28s1%3AString%2Cs2%3AString%29-class-method">#</a>
+      </div>
+      
+        <div class="doc"><p>A measure of similarity between two strings based on matching characters.
+Returns 0 if there is no similarity while 1 is an exact match</p>
+
+<pre><code class='language-crystal'><span class="t">StringMetrics</span>.jaro(<span class="s">&quot;MARTHA&quot;</span>, <span class="s">&quot;MARHTA&quot;</span>).round(<span class="n">2</span>) <span class="o">==</span> <span class="n">0.94</span></code></pre></div>
+      
+      <br/>
+      <div>
+        
+          [<a href="https://github.com/mlobl/string-metrics/blob/c7cf5d71b4b6d37fc657381a7242553208354ade/src/string-metrics.cr#L169" target="_blank">View source</a>]
+        
+      </div>
+    </div>
+  
+    <div class="entry-detail" id="jaro_winkler(s1:String,s2:String,scaling_factor=0.1)-class-method">
+      <div class="signature">
+        
+        def self.<strong>jaro_winkler</strong>(s1 : String, s2 : String, scaling_factor = <span class="n">0.1</span>)
+
+        <a class="method-permalink" href="#jaro_winkler%28s1%3AString%2Cs2%3AString%2Cscaling_factor%3D0.1%29-class-method">#</a>
+      </div>
+      
+        <div class="doc"><p>Similar to regular Jaro, but gives a higher score for matching from the beginning
+of the string. Only change the scaling factor if you're intimate with the algorithm.</p>
+
+<pre><code class='language-crystal'><span class="t">StringMetrics</span>.jaro_winkler(<span class="s">&quot;MARTHA&quot;</span>, <span class="s">&quot;MARHTA&quot;</span>).round(<span class="n">2</span>) <span class="o">==</span> <span class="n">0.96</span></code></pre></div>
+      
+      <br/>
+      <div>
+        
+          [<a href="https://github.com/mlobl/string-metrics/blob/c7cf5d71b4b6d37fc657381a7242553208354ade/src/string-metrics.cr#L178" target="_blank">View source</a>]
+        
+      </div>
+    </div>
+  
+    <div class="entry-detail" id="levenshtein(s1:String,s2:String):Int-class-method">
+      <div class="signature">
+        
+        def self.<strong>levenshtein</strong>(s1 : String, s2 : String) : Int
+
+        <a class="method-permalink" href="#levenshtein%28s1%3AString%2Cs2%3AString%29%3AInt-class-method">#</a>
+      </div>
+      
+        <div class="doc"><p>Returns the min edit distance between two strings. If the strings are exactly the same it will return 0,
+but if they differ it will return the minimum number of insertions, deletions, or substitutions to make them exactly the same.</p>
+
+<pre><code class='language-crystal'><span class="t">StringMetrics</span>.levenshtein(<span class="s">&quot;Car&quot;</span>, <span class="s">&quot;Char&quot;</span>) <span class="o">==</span> <span class="n">1</span></code></pre>
+
+<p>More detail can be found <a href="https://en.wikipedia.org/wiki/Levenshtein_distance" target="_blank">here</a>.</p>
+
+<p>Ported from <a href="https://en.wikibooks.org/wiki/Algorithm_Implementation/Strings/Levenshtein_distance#Python" target="_blank">here</a></p></div>
+      
+      <br/>
+      <div>
+        
+          [<a href="https://github.com/mlobl/string-metrics/blob/c7cf5d71b4b6d37fc657381a7242553208354ade/src/string-metrics.cr#L13" target="_blank">View source</a>]
+        
+      </div>
+    </div>
+  
+
+
+
+
+
+
+</div>
+
+</body>
+</html>
diff --git a/css/style.css b/css/style.css
new file mode 100644
index 0000000..2994e37
--- /dev/null
+++ b/css/style.css
@@ -0,0 +1,432 @@
+html, body {
+  position: relative;
+  margin: 0;
+  padding: 0;
+  width: 100%;
+  height: 100%;
+  overflow: hidden;
+}
+
+body {
+  font-family: "Avenir", "Tahoma", "Lucida Sans", "Lucida Grande", Verdana, Arial, sans-serif;
+  color: #333;
+}
+
+a {
+  color: #263F6C;
+}
+
+a:visited {
+  color: #112750;
+}
+
+h1, h2, h3, h4, h5, h6 {
+  margin: 35px 0 25px;
+  color: #444444;
+}
+
+h1.type-name {
+  color: #47266E;
+  margin: 20px 0 30px;
+  background-color: #F8F8F8;
+  padding: 10px 12px;
+  border: 1px solid #EBEBEB;
+  border-radius: 2px;
+}
+
+h2 {
+  border-bottom: 1px solid #E6E6E6;
+  padding-bottom: 5px;
+}
+
+#types-list, #main-content {
+  position: absolute;
+  top: 0;
+  bottom: 0;
+  overflow: auto;
+}
+
+#types-list {
+  left: 0;
+  width: 20%;
+  background-color: #2E1052;
+  padding: 0 0 30px;
+  box-shadow: inset -3px 0 4px rgba(0,0,0,.35);
+}
+
+#types-list #search-box {
+  padding: 8px 9px;
+}
+
+#types-list input {
+  display: block;
+  box-sizing: border-box;
+  margin: 0;
+  padding: 5px;
+  font: inherit;
+  font-family: inherit;
+  line-height: 1.2;
+  width: 100%;
+  border: 0;
+  outline: 0;
+  border-radius: 2px;
+  box-shadow: 0px 3px 5px rgba(0,0,0,.25);
+  transition: box-shadow .12s;
+}
+
+#types-list input:focus {
+  box-shadow: 0px 5px 6px rgba(0,0,0,.5);
+}
+
+#types-list input::-webkit-input-placeholder { /* Chrome/Opera/Safari */
+  color: #C8C8C8;
+  font-size: 14px;
+  text-indent: 2px;
+}
+
+#types-list input::-moz-placeholder { /* Firefox 19+ */
+  color: #C8C8C8;
+  font-size: 14px;
+  text-indent: 2px;
+}
+
+#types-list input:-ms-input-placeholder { /* IE 10+ */
+  color: #C8C8C8;
+  font-size: 14px;
+  text-indent: 2px;
+}
+
+#types-list input:-moz-placeholder { /* Firefox 18- */
+  color: #C8C8C8;
+  font-size: 14px;
+  text-indent: 2px;
+}
+
+#types-list ul {
+  margin: 0;
+  padding: 0;
+  list-style: none outside;
+}
+
+#types-list li {
+  display: block;
+  position: relative;
+}
+
+#types-list li.hide {
+  display: none;
+}
+
+#types-list a {
+  display: block;
+  padding: 5px 15px 5px 30px;
+  text-decoration: none;
+  color: #F8F4FD;
+  transition: color .14s;
+}
+
+#types-list a:focus {
+  outline: 1px solid #D1B7F1;
+}
+
+#types-list .current > a,
+#types-list a:hover {
+  color: #866BA6;
+}
+
+#types-list li ul {
+  overflow: hidden;
+  height: 0;
+  max-height: 0;
+  transition: 1s ease-in-out;
+}
+
+
+#types-list li.parent {
+  padding-left: 30px;
+}
+
+#types-list li.parent::before {
+  box-sizing: border-box;
+  content: "▼";
+  display: block;
+  width: 30px;
+  height: 30px;
+  position: absolute;
+  top: 0;
+  left: 0;
+  text-align: center;
+  color: white;
+  font-size: 8px;
+  line-height: 30px;
+  transform: rotateZ(-90deg);
+  cursor: pointer;
+  transition: .2s linear;
+}
+
+
+#types-list li.parent > a {
+  padding-left: 0;
+}
+
+#types-list li.parent.open::before {
+  transform: rotateZ(0);
+}
+
+#types-list li.open > ul {
+  height: auto;
+  max-height: 1000em;
+}
+
+#main-content {
+  padding: 0 30px 30px 30px;
+  left: 20%;
+  right: 0;
+}
+
+.kind {
+  font-size: 60%;
+  color: #866BA6;
+}
+
+.superclass-hierarchy {
+  margin: -15px 0 30px 0;
+  padding: 0;
+  list-style: none outside;
+  font-size: 80%;
+}
+
+.superclass-hierarchy .superclass {
+  display: inline-block;
+  margin: 0 7px 0 0;
+  padding: 0;
+}
+
+.superclass-hierarchy .superclass + .superclass::before {
+  content: "<";
+  margin-right: 7px;
+}
+
+.other-types-list li {
+  display: inline-block;
+}
+
+.other-types-list,
+.list-summary {
+  margin: 0 0 30px 0;
+  padding: 0;
+  list-style: none outside;
+}
+
+.entry-const {
+  font-family: Consolas, 'Courier New', Courier, Monaco, monospace;
+}
+
+.entry-summary {
+  padding-bottom: 4px;
+}
+
+.superclass-hierarchy .superclass a,
+.other-type a,
+.entry-summary .signature {
+  padding: 4px 8px;
+  margin-bottom: 4px;
+  display: inline-block;
+  background-color: #f8f8f8;
+  color: #47266E;
+  border: 1px solid #f0f0f0;
+  text-decoration: none;
+  border-radius: 3px;
+  font-family: Consolas, 'Courier New', Courier, Monaco, monospace;
+  transition: background .15s, border-color .15s;
+}
+
+.superclass-hierarchy .superclass a:hover,
+.other-type a:hover,
+.entry-summary .signature:hover {
+  background: #D5CAE3;
+  border-color: #624288;
+}
+
+.entry-summary .summary {
+  padding-left: 32px;
+}
+
+.entry-summary .summary p {
+  margin: 12px 0 16px;
+}
+
+.entry-summary a {
+  text-decoration: none;
+}
+
+.entry-detail {
+  padding: 30px 0;
+}
+
+.entry-detail .signature {
+  position: relative;
+  padding: 5px 15px;
+  margin-bottom: 10px;
+  display: block;
+  border-radius: 5px;
+  background-color: #f8f8f8;
+  color: #47266E;
+  border: 1px solid #f0f0f0;
+  font-family: Consolas, 'Courier New', Courier, Monaco, monospace;
+  transition: .2s ease-in-out;
+}
+
+.entry-detail:target .signature {
+  background-color: #D5CAE3;
+  border: 1px solid #624288;
+}
+
+.entry-detail .signature .method-permalink {
+  position: absolute;
+  top: 0;
+  left: -35px;
+  padding: 5px 15px;
+  text-decoration: none;
+  font-weight: bold;
+  color: #624288;
+  opacity: .4;
+  transition: opacity .2s;
+}
+
+.entry-detail .signature .method-permalink:hover {
+  opacity: 1;
+}
+
+.entry-detail:target .signature .method-permalink {
+  opacity: 1;
+}
+
+.methods-inherited {
+  padding-right: 10%;
+  line-height: 1.5em;
+}
+
+.methods-inherited h3 {
+  margin-bottom: 4px;
+}
+
+.methods-inherited a {
+  display: inline-block;
+  text-decoration: none;
+  color: #47266E;
+}
+
+.methods-inherited a:hover {
+  text-decoration: underline;
+  color: #6C518B;
+}
+
+.methods-inherited .tooltip>span {
+  background: #D5CAE3;
+  padding: 4px 8px;
+  border-radius: 3px;
+  margin: -4px -8px;
+}
+
+.methods-inherited .tooltip * {
+    color: #47266E;
+}
+
+pre {
+  padding: 10px 20px;
+  margin-top: 4px;
+  border-radius: 3px;
+  line-height: 1.45;
+  overflow: auto;
+  color: #333;
+  background: #fdfdfd;
+  font-size: 14px;
+  border: 1px solid #eee;
+}
+
+code {
+  font-family: Consolas, 'Courier New', Courier, Monaco, monospace;
+}
+
+span.flag {
+  padding: 2px 4px 1px;
+  border-radius: 3px;
+  margin-right: 3px;
+  font-size: 11px;
+  border: 1px solid transparent;
+}
+
+span.flag.orange {
+  background-color: #EE8737;
+  color: #FCEBDD;
+  border-color: #EB7317;
+}
+
+span.flag.yellow {
+  background-color: #E4B91C;
+  color: #FCF8E8;
+  border-color: #B69115;
+}
+
+span.flag.green {
+  background-color: #469C14;
+  color: #E2F9D3;
+  border-color: #34700E;
+}
+
+span.flag.red {
+  background-color: #BF1919;
+  color: #F9ECEC;
+  border-color: #822C2C;
+}
+
+span.flag.purple {
+  background-color: #2E1052;
+  color: #ECE1F9;
+  border-color: #1F0B37;
+}
+
+.tooltip>span {
+  position: absolute;
+  opacity: 0;
+  display: none;
+  pointer-events: none;
+}
+
+.tooltip:hover>span {
+  display: inline-block;
+  opacity: 1;
+}
+
+.c {
+  color: #969896;
+}
+
+.n {
+  color: #0086b3;
+}
+
+.t {
+  color: #0086b3;
+}
+
+.s {
+  color: #183691;
+}
+
+.i {
+  color: #7f5030;
+}
+
+.k {
+  color: #a71d5d;
+}
+
+.o {
+  color: #a71d5d;
+}
+
+.m {
+  color: #795da3;
+}
diff --git a/index.html b/index.html
new file mode 100644
index 0000000..6f30ae2
--- /dev/null
+++ b/index.html
@@ -0,0 +1,68 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+  <meta charset="utf-8" />
+  <meta id="repository-name" content="github.com/mlobl/string-metrics">
+  <link href="css/style.css" rel="stylesheet" type="text/css" />
+  <script type="text/javascript" src="js/doc.js"></script>
+  <title>README - github.com/mlobl/string-metrics</title>
+</head>
+<body>
+
+<div id="types-list">
+  <div id="search-box">
+    <input type="search" id="search-input" placeholder="Search...">
+  </div>
+
+  <ul>
+    <li class="current"><a href="index.html">README</a></li>
+  </ul>
+
+  <ul>
+  
+  <li class=" " data-id="github.com/mlobl/string-metrics/StringMetrics" data-name="stringmetrics">
+      <a href="StringMetrics.html">StringMetrics</a>
+      
+    </li>
+  
+</ul>
+
+</div>
+
+<div id="main-content">
+<h1>string-metrics</h1>
+
+<p><a href="https://travis-ci.org/mlobl/string-metrics" target="_blank"><img src="https://travis-ci.org/mlobl/string-metrics.svg?branch=master" alt="Build Status"/></a></p>
+
+<p>String metric algorithms for Crystal:</p>
+
+<ul><li><a href="https://en.wikipedia.org/wiki/Levenshtein_distance" target="_blank">Levenshtein distance</a></li><li><a href="https://en.wikipedia.org/wiki/Hamming_distance" target="_blank">Hamming distance</a></li><li><a href="https://en.wikipedia.org/wiki/Damerau%E2%80%93Levenshtein_distance" target="_blank">Damerau–Levenshtein distance</a></li><li><a href="https://en.wikipedia.org/wiki/Jaro%E2%80%93Winkler_distance" target="_blank">Jaro(-Winkler) Distance</a></li></ul>
+
+<h2>Installation</h2>
+
+<p>Add this to your application's <code>shard.yml</code>:</p>
+
+<pre><code class='language-yaml'>dependencies:
+  string-metrics:
+    github: mlobl/string-metrics</code></pre>
+
+<h2>Usage</h2>
+
+<pre><code class='language-crystal'><span class="k">require</span> <span class="s">&quot;string-metrics&quot;</span>
+
+<span class="t">StringMetrics</span>.damerau_levenshtein(<span class="s">&quot;char&quot;</span>, <span class="s">&quot;hcar&quot;</span>) <span class="o">==</span> <span class="n">1</span>
+<span class="t">StringMetrics</span>.hamming(<span class="s">&quot;Micro&quot;</span>, <span class="s">&quot;Macro&quot;</span>) <span class="o">==</span> <span class="n">1</span>
+<span class="t">StringMetrics</span>.jaro(<span class="s">&quot;MARTHA&quot;</span>, <span class="s">&quot;MARHTA&quot;</span>).round(<span class="n">2</span>) <span class="o">==</span> <span class="n">0.94</span>
+<span class="t">StringMetrics</span>.jaro_winkler(<span class="s">&quot;MARTHA&quot;</span>, <span class="s">&quot;MARHTA&quot;</span>).round(<span class="n">2</span>) <span class="o">==</span> <span class="n">0.96</span>
+<span class="t">StringMetrics</span>.levenshtein(<span class="s">&quot;Car&quot;</span>, <span class="s">&quot;Char&quot;</span>) <span class="o">==</span> <span class="n">1</span></code></pre>
+
+<h2>Contributing</h2>
+
+<ol><li>Fork it ( https://github.com/mlobl/string-metrics/fork )</li><li>Create your feature branch (git checkout -b my-new-feature)</li><li>Commit your changes (git commit -am 'Add some feature')</li><li>Push to the branch (git push origin my-new-feature)</li><li>Create a new Pull Request</li></ol>
+
+<h2>Contributors</h2>
+
+<ul><li><a href="https://github.com/mlobl" target="_blank">mlobl</a> Meyer Lobl - creator, maintainer</li></ul>
+</div>
+</body>
+</html>
diff --git a/index.json b/index.json
new file mode 100644
index 0000000..573c060
--- /dev/null
+++ b/index.json
@@ -0,0 +1 @@
+{"repository_name":"github.com/mlobl/string-metrics","body":"# string-metrics\n\n[![Build Status](https://travis-ci.org/mlobl/string-metrics.svg?branch=master)](https://travis-ci.org/mlobl/string-metrics)\n\n\nString metric algorithms for Crystal:\n* [Levenshtein distance](https://en.wikipedia.org/wiki/Levenshtein_distance)\n* [Hamming distance](https://en.wikipedia.org/wiki/Hamming_distance)\n* [Damerau–Levenshtein distance](https://en.wikipedia.org/wiki/Damerau%E2%80%93Levenshtein_distance)\n* [Jaro(-Winkler) Distance](https://en.wikipedia.org/wiki/Jaro%E2%80%93Winkler_distance)\n\n\n## Installation\n\nAdd this to your application's `shard.yml`:\n\n```yaml\ndependencies:\n  string-metrics:\n    github: mlobl/string-metrics\n```\n\n## Usage\n\n```crystal\nrequire \"string-metrics\"\n\nStringMetrics.damerau_levenshtein(\"char\", \"hcar\") == 1\nStringMetrics.hamming(\"Micro\", \"Macro\") == 1\nStringMetrics.jaro(\"MARTHA\", \"MARHTA\").round(2) == 0.94\nStringMetrics.jaro_winkler(\"MARTHA\", \"MARHTA\").round(2) == 0.96\nStringMetrics.levenshtein(\"Car\", \"Char\") == 1\n```\n\n\n## Contributing\n\n1. Fork it ( https://github.com/mlobl/string-metrics/fork )\n2. Create your feature branch (git checkout -b my-new-feature)\n3. Commit your changes (git commit -am 'Add some feature')\n4. Push to the branch (git push origin my-new-feature)\n5. Create a new Pull Request\n\n## Contributors\n\n- [mlobl](https://github.com/mlobl) Meyer Lobl - creator, maintainer\n","program":{"html_id":"github.com/mlobl/string-metrics/toplevel","path":"toplevel.html","kind":"module","full_name":"Top Level Namespace","name":"Top Level Namespace","abstract":false,"superclass":null,"ancestors":[],"locations":[],"repository_name":"github.com/mlobl/string-metrics","program":true,"enum":false,"alias":false,"aliased":"","const":false,"constants":[],"included_modules":[],"extended_modules":[],"subclasses":[],"including_types":[],"namespace":null,"doc":null,"summary":null,"class_methods":[],"constructors":[],"instance_methods":[],"macros":[],"types":[{"html_id":"github.com/mlobl/string-metrics/StringMetrics","path":"StringMetrics.html","kind":"module","full_name":"StringMetrics","name":"StringMetrics","abstract":false,"superclass":null,"ancestors":[],"locations":[{"filename":"string-metrics/version.cr","line_number":1,"url":"https://github.com/mlobl/string-metrics/blob/c7cf5d71b4b6d37fc657381a7242553208354ade/src/string-metrics/version.cr"},{"filename":"string-metrics.cr","line_number":4,"url":"https://github.com/mlobl/string-metrics/blob/c7cf5d71b4b6d37fc657381a7242553208354ade/src/string-metrics.cr"}],"repository_name":"github.com/mlobl/string-metrics","program":false,"enum":false,"alias":false,"aliased":"","const":false,"constants":[{"name":"VERSION","value":"\"0.1.0\"","doc":null,"summary":null}],"included_modules":[],"extended_modules":[],"subclasses":[],"including_types":[],"namespace":null,"doc":"A module containing a collection of well known string metric algorithms","summary":"<p>A module containing a collection of well known string metric algorithms</p>","class_methods":[{"id":"damerau_levenshtein(s1:String,s2:String):Int-class-method","html_id":"damerau_levenshtein(s1:String,s2:String):Int-class-method","name":"damerau_levenshtein","doc":"A variation of the Levenshtein distance, this counts transpositions as a single edit.\n```crystal\nStringMetrics.damerau_levenshtein(\"char\", \"hcar\") == 1\n```\nas opposed to a distance of 2 from levenshtein on it's own\n\nPorted from [here](https://github.com/jamesturk/jellyfish/blob/master/jellyfish/_jellyfish.py)","summary":"<p>A variation of the Levenshtein distance, this counts transpositions as a single edit.</p>","abstract":false,"args":[{"name":"s1","doc":null,"default_value":"","external_name":"s1","restriction":"String"},{"name":"s2","doc":null,"default_value":"","external_name":"s2","restriction":"String"}],"args_string":"(s1 : String, s2 : String) : Int","source_link":"https://github.com/mlobl/string-metrics/blob/c7cf5d71b4b6d37fc657381a7242553208354ade/src/string-metrics.cr#L59","source_link":"https://github.com/mlobl/string-metrics/blob/c7cf5d71b4b6d37fc657381a7242553208354ade/src/string-metrics.cr#L59","def":{"name":"damerau_levenshtein","args":[{"name":"s1","doc":null,"default_value":"","external_name":"s1","restriction":"String"},{"name":"s2","doc":null,"default_value":"","external_name":"s2","restriction":"String"}],"double_splat":null,"splat_index":null,"yields":null,"block_arg":null,"return_type":"Int","visibility":"Public","body":"infinite = s1.size + s2.size\nda = Hash(Char, Int32).new(default_value = 0)\nscore = (0...(s1.size + 2)).to_a.map do |i|\n  [0] * (s2.size + 2)\nend\nscore[0][0] = infinite\n(0...(s1.size + 1)).each do |i|\n  score[i + 1][0] = infinite\n  score[i + 1][1] = i\nend\n(0...(s2.size + 1)).each do |i|\n  score[0][i + 1] = infinite\n  score[1][i + 1] = i\nend\ns1_chars = s1.chars\ns2_chars = s2.chars\n(1..s1.size).each do |i|\n  db = 0\n  (1..s2.size).each do |j|\n    i1 = da[s2_chars[j - 1]]\n    j1 = db\n    cost = 1\n    if s1_chars[i - 1] == s2_chars[j - 1]\n      cost = 0\n      db = j\n    end\n    score[i + 1][j + 1] = ({score[i][j] + cost, score[i + 1][j] + 1, score[i][j + 1] + 1, ((score[i1][j1] + ((i - i1) - 1)) + 1) + ((j - j1) - 1)}).min\n  end\n  da[s1_chars[i - 1]] = i\nend\nscore[s1.size + 1][s2.size + 1]\n"}},{"id":"hamming(s1:String,s2:String):Int-class-method","html_id":"hamming(s1:String,s2:String):Int-class-method","name":"hamming","doc":"Returns the number of substitutions that exist between two strings of equal length.\nWill raise an ArgumentError if both parameters aren't of the same length\n```crystal\nStringMetrics.hamming(\"Micro\", \"Macro\") == 1\n```","summary":"<p>Returns the number of substitutions that exist between two strings of equal length.</p>","abstract":false,"args":[{"name":"s1","doc":null,"default_value":"","external_name":"s1","restriction":"String"},{"name":"s2","doc":null,"default_value":"","external_name":"s2","restriction":"String"}],"args_string":"(s1 : String, s2 : String) : Int","source_link":"https://github.com/mlobl/string-metrics/blob/c7cf5d71b4b6d37fc657381a7242553208354ade/src/string-metrics.cr#L47","source_link":"https://github.com/mlobl/string-metrics/blob/c7cf5d71b4b6d37fc657381a7242553208354ade/src/string-metrics.cr#L47","def":{"name":"hamming","args":[{"name":"s1","doc":null,"default_value":"","external_name":"s1","restriction":"String"},{"name":"s2","doc":null,"default_value":"","external_name":"s2","restriction":"String"}],"double_splat":null,"splat_index":null,"yields":null,"block_arg":null,"return_type":"Int","visibility":"Public","body":"if s1.size != s2.size\n  raise(ArgumentError.new(\"input lengths are not equal\"))\nend\n(0...s2.size).sum do |i|\n  (  s1[i] != s2[i]) ? 1 : 0\nend\n"}},{"id":"jaro(s1:String,s2:String)-class-method","html_id":"jaro(s1:String,s2:String)-class-method","name":"jaro","doc":"A measure of similarity between two strings based on matching characters.\nReturns 0 if there is no similarity while 1 is an exact match\n```crystal\nStringMetrics.jaro(\"MARTHA\", \"MARHTA\").round(2) == 0.94\n```","summary":"<p>A measure of similarity between two strings based on matching characters.</p>","abstract":false,"args":[{"name":"s1","doc":null,"default_value":"","external_name":"s1","restriction":"String"},{"name":"s2","doc":null,"default_value":"","external_name":"s2","restriction":"String"}],"args_string":"(s1 : String, s2 : String)","source_link":"https://github.com/mlobl/string-metrics/blob/c7cf5d71b4b6d37fc657381a7242553208354ade/src/string-metrics.cr#L169","source_link":"https://github.com/mlobl/string-metrics/blob/c7cf5d71b4b6d37fc657381a7242553208354ade/src/string-metrics.cr#L169","def":{"name":"jaro","args":[{"name":"s1","doc":null,"default_value":"","external_name":"s1","restriction":"String"},{"name":"s2","doc":null,"default_value":"","external_name":"s2","restriction":"String"}],"double_splat":null,"splat_index":null,"yields":null,"block_arg":null,"return_type":"","visibility":"Public","body":"reused_jaro_winkler(s1, s2, false)"}},{"id":"jaro_winkler(s1:String,s2:String,scaling_factor=0.1)-class-method","html_id":"jaro_winkler(s1:String,s2:String,scaling_factor=0.1)-class-method","name":"jaro_winkler","doc":"Similar to regular Jaro, but gives a higher score for matching from the beginning\nof the string. Only change the scaling factor if you're intimate with the algorithm.\n```crystal\nStringMetrics.jaro_winkler(\"MARTHA\", \"MARHTA\").round(2) == 0.96\n```","summary":"<p>Similar to regular Jaro, but gives a higher score for matching from the beginning of the string.</p>","abstract":false,"args":[{"name":"s1","doc":null,"default_value":"","external_name":"s1","restriction":"String"},{"name":"s2","doc":null,"default_value":"","external_name":"s2","restriction":"String"},{"name":"scaling_factor","doc":null,"default_value":"0.1","external_name":"scaling_factor","restriction":""}],"args_string":"(s1 : String, s2 : String, scaling_factor = <span class=\"n\">0.1</span>)","source_link":"https://github.com/mlobl/string-metrics/blob/c7cf5d71b4b6d37fc657381a7242553208354ade/src/string-metrics.cr#L178","source_link":"https://github.com/mlobl/string-metrics/blob/c7cf5d71b4b6d37fc657381a7242553208354ade/src/string-metrics.cr#L178","def":{"name":"jaro_winkler","args":[{"name":"s1","doc":null,"default_value":"","external_name":"s1","restriction":"String"},{"name":"s2","doc":null,"default_value":"","external_name":"s2","restriction":"String"},{"name":"scaling_factor","doc":null,"default_value":"0.1","external_name":"scaling_factor","restriction":""}],"double_splat":null,"splat_index":null,"yields":null,"block_arg":null,"return_type":"","visibility":"Public","body":"reused_jaro_winkler(s1, s2, scaling_factor: scaling_factor)"}},{"id":"levenshtein(s1:String,s2:String):Int-class-method","html_id":"levenshtein(s1:String,s2:String):Int-class-method","name":"levenshtein","doc":"Returns the min edit distance between two strings. If the strings are exactly the same it will return 0,\nbut if they differ it will return the minimum number of insertions, deletions, or substitutions to make them exactly the same.\n```crystal\nStringMetrics.levenshtein(\"Car\", \"Char\") == 1\n```\nMore detail can be found [here](https://en.wikipedia.org/wiki/Levenshtein_distance).\n\nPorted from [here](https://en.wikibooks.org/wiki/Algorithm_Implementation/Strings/Levenshtein_distance#Python)","summary":"<p>Returns the min edit distance between two strings.</p>","abstract":false,"args":[{"name":"s1","doc":null,"default_value":"","external_name":"s1","restriction":"String"},{"name":"s2","doc":null,"default_value":"","external_name":"s2","restriction":"String"}],"args_string":"(s1 : String, s2 : String) : Int","source_link":"https://github.com/mlobl/string-metrics/blob/c7cf5d71b4b6d37fc657381a7242553208354ade/src/string-metrics.cr#L13","source_link":"https://github.com/mlobl/string-metrics/blob/c7cf5d71b4b6d37fc657381a7242553208354ade/src/string-metrics.cr#L13","def":{"name":"levenshtein","args":[{"name":"s1","doc":null,"default_value":"","external_name":"s1","restriction":"String"},{"name":"s2","doc":null,"default_value":"","external_name":"s2","restriction":"String"}],"double_splat":null,"splat_index":null,"yields":null,"block_arg":null,"return_type":"Int","visibility":"Public","body":"if s1.size < s2.size\n  return levenshtein(s2, s1)\nend\nif s2.size == 0\n  return s1.size\nend\nprevious_row = (0..s2.size).to_a\ns1_chars = s1.chars\ns2_chars = s2.chars\ncache = [[0] * (s2.size + 1), [0] * (s2.size + 1)]\ns1_chars.each_with_index do |c1, i|\n  current_row = cache[i % 2]\n  current_row[0] = i + 1\n  s2_chars.each_with_index do |c2, j|\n    insertions = (previous_row.unsafe_at(j + 1)) + 1\n    deletions = (current_row.unsafe_at(j)) + 1\n    substitutions = previous_row.unsafe_at(j)\n    if c1 != c2\n      substitutions = substitutions + 1\n    end\n    min = insertions\n    if deletions < min\n      min = deletions\n    end\n    if substitutions < min\n      min = substitutions\n    end\n    current_row[j + 1] = min\n  end\n  previous_row = current_row\nend\nprevious_row.last\n"}}],"constructors":[],"instance_methods":[],"macros":[],"types":[]}]}}
\ No newline at end of file
diff --git a/js/doc.js b/js/doc.js
new file mode 100644
index 0000000..c7ee038
--- /dev/null
+++ b/js/doc.js
@@ -0,0 +1,111 @@
+document.addEventListener('DOMContentLoaded', function() {
+  var sessionStorage;
+  try {
+    sessionStorage = window.sessionStorage;
+  } catch (e) { }
+  if(!sessionStorage) {
+    sessionStorage = {
+      setItem: function() {},
+      getItem: function() {},
+      removeItem: function() {}
+    };
+  }
+
+  var repositoryName = document.getElementById('repository-name').getAttribute('content');
+  var typesList = document.getElementById('types-list');
+  var searchInput = document.getElementById('search-input');
+  var parents = document.querySelectorAll('#types-list li.parent');
+
+  for(var i = 0; i < parents.length; i++) {
+    var _parent = parents[i];
+    _parent.addEventListener('click', function(e) {
+      e.stopPropagation();
+
+      if(e.target.tagName.toLowerCase() == 'li') {
+        if(e.target.className.match(/open/)) {
+          sessionStorage.removeItem(e.target.getAttribute('data-id'));
+          e.target.className = e.target.className.replace(/ +open/g, '');
+        } else {
+          sessionStorage.setItem(e.target.getAttribute('data-id'), '1');
+          if(e.target.className.indexOf('open') == -1) {
+            e.target.className += ' open';
+          }
+        }
+      }
+    });
+
+    if(sessionStorage.getItem(_parent.getAttribute('data-id')) == '1') {
+      _parent.className += ' open';
+    }
+  };
+
+  var childMatch = function(type, regexp){
+    var types = type.querySelectorAll("ul li");
+    for (var j = 0; j < types.length; j ++) {
+      var t = types[j];
+      if(regexp.exec(t.getAttribute('data-name'))){ return true; };
+    };
+    return false;
+  };
+
+  var searchTimeout;
+  var performSearch = function() {
+    clearTimeout(searchTimeout);
+    searchTimeout = setTimeout(function() {
+      var text = searchInput.value;
+      var types = document.querySelectorAll('#types-list li');
+      var words = text.toLowerCase().split(/\s+/).filter(function(word) {
+        return word.length > 0;
+      });
+      var regexp = new RegExp(words.join('|'));
+
+      for(var i = 0; i < types.length; i++) {
+        var type = types[i];
+        if(words.length == 0 || regexp.exec(type.getAttribute('data-name')) || childMatch(type, regexp)) {
+          type.className = type.className.replace(/ +hide/g, '');
+          var is_parent     =   new RegExp("parent").exec(type.className);
+          var is_not_opened = !(new RegExp("open").exec(type.className));
+          if(childMatch(type,regexp) && is_parent && is_not_opened){
+            type.className += " open";
+          };
+        } else {
+          if(type.className.indexOf('hide') == -1) {
+            type.className += ' hide';
+          };
+        };
+        if(words.length == 0){
+          type.className = type.className.replace(/ +open/g, '');
+        };
+      }
+    }, 200);
+  };
+  if (searchInput.value.length > 0) {
+    performSearch();
+  }
+  searchInput.addEventListener('keyup', performSearch);
+  searchInput.addEventListener('input', performSearch);
+
+  typesList.onscroll = function() {
+    var y = typesList.scrollTop;
+    sessionStorage.setItem(repositoryName + '::types-list:scrollTop', y);
+  };
+
+  var initialY = parseInt(sessionStorage.getItem(repositoryName + '::types-list:scrollTop') + "", 10);
+  if(initialY > 0) {
+    typesList.scrollTop = initialY;
+  }
+
+  var scrollToEntryFromLocationHash = function() {
+    var hash = window.location.hash;
+    if (hash) {
+      var targetAnchor = unescape(hash.substr(1));
+      var targetEl = document.querySelectorAll('.entry-detail[id="' + targetAnchor + '"]');
+
+      if (targetEl && targetEl.length > 0) {
+        targetEl[0].offsetParent.scrollTop = targetEl[0].offsetTop;
+      }
+    }
+  };
+  window.addEventListener("hashchange", scrollToEntryFromLocationHash, false);
+  scrollToEntryFromLocationHash();
+});
