diff --git a/scripts/sql-to-dot.sed b/scripts/sql-to-dot.sed
index 99b8b17..07b2989 100755
--- a/scripts/sql-to-dot.sed
+++ b/scripts/sql-to-dot.sed
@@ -1,39 +1,79 @@
-#! /bin/sed -f
+#! /bin/sed -nf
1i\
/** @page database Database Schema\
\
@dot\
digraph schema {
-# remove newlines
-:a;N;$!ba;s/\n/ /g
+# get everithing on one single line
+H;$!d;$x
+
+# remove all single-line comment lines
+s/\n--[^\n]*//g
+
# reduce spaces
-s, \+, ,g
+s,\t\| \+, ,g
+
+# remove multiline comments
+:f;s,\(.*\)/\*.*\*/[ \n]*;*,\1,g;tf
+
+# remove empty lines
+s,\n\+,\n,g
+
+# remove unknown commands
+s,\(;\|\n\) *\(DELIMITER\|USE\|DROP\|CREATE[ \n]\+DATABASE\)[ \n]\+[^;]*;\+,,ig
+
+# convert special characters within quotes
+:a;s/^\(\([^"]*"[^",]*"\)*[^"]*"[^"]*\),\([^"]*".*\)/\1\##COMMA##\3/g;ta
+:c;s/^\(\([^']*'[^',]*'\)*[^']*'[^']*\),\([^']*'.*\)/\1\##COMMA##\3/g;tc
+
+# backup everything to the buffer
+# then analyze only on one create table
+:i
+h
+s,.*\(create[ \n]\+table[^;]*;\).*,\1,ig
+
+# start html table node
+s|CREATE[ \n]\+TABLE[ \n]\+\(if[ \n]\+not[ \n]\+exists[ \n]\+\)\?`\?\(\w\+\)`\?| \2\n [shape=none, margin=0, label=<\n
\n \2 |
|ig
-s| *CREATE *TABLE *\(if *not *exists\)\? *`\?\([a-z]\+\)`\? *|\n \2\n [shape=none, margin=0, label=<\n \n \2 |
\n|ig
+# remove key definitions
+s/[),][\n ]*\(PRIMARY[ \n]\+\)\?KEY[ \n]\+[^(]*([^)]*)//gi
-s/varchar *( *\([0-9]\+\) *)/varchar[\1]/ig
+# move foreign keys as relation to the end
+:b;s/\(\w\+\)\([^;]*\)FOREIGN[\n ]\+KEY[ \n]*([ \n]*`\?\([a-z]\+\)`\?[ \n]*)[ \n]*REFERENCES[ \n]*`\?\([a-z]\+\)`\?[ \n]*([ \n]*`\?\([a-z]\+\)`\?[ \n]*)[ \n]*\([^,)]*\)\([,)].*\)/\1\2\7\n \1:\3 -> \4:\5 [label="\6"]##SEMICOLON##/ig;tb
-s/ *PRIMARY KEY *( *`\?\([a-z]\+\)`\? *) *[,)]//ig
+# create table rows
+s|[(,][ \n]*`\?\(\w\+\)`\?[ \n]\+\(\w\+\(([^)]\+)\)\?\)[ \n]*\([^,)]*\)[ \n]\+COMMENT[ \n]*["']\([^"']*\)["'][ \n]*|\n \1 | \2 | \4 | \5 |
|gi
+s|[(,][ \n]*`\?\(\w\+\)`\?[ \n]\+\(\w\+\(([^)]\+)\)\?\)[ \n]*\([^,)]*\)|\n \1 | \2 | \4 |
|g
-:b;s/\([a-z]\+\)\([^;]*\)FOREIGN KEY *( *`\?\([a-z]\+\)`\? *) *REFERENCES *`\?\([a-z]\+\)`\? *( *`\?\([a-z]\+\)`\? *) *\([^,)]*\)[,)]\(.*\)/\1\2\7\n \1:\3 -> \4:\5/ig;tb
+# add line breaks for long lines
+s|\(]*>[^<]\{30,40\}\)[ \n]\+\([^<]\{20,\} | \)|\1
\2|g
+#:d;s|\(
[^<]\{30,40\}\)[ \n]\+\([^<]\{20,\}\)|\1
\2|g;td
-:c;s|\n[(,] *`\?\([a-z]\+\)`\? *\([^ ]\+\)*\([^,)]*\) *COMMENT *[`"']\([^`"']*\)[`"'] *[,)]|\n \1 | \2 | \3 | \4 |
\n,|ig;tc
+# add table comment below
+:k;tk
+s|[ \n]*)[^)]*COMMENT[ \n]*=[ \n]*["']\?\([^"']*\)["']\?[^;]*|\n \1 |
|ig;th
+s|)[^);]*;|\n;|ig
+:h
-s| \+||g
-s| \+| | |g
-s|\( | ]*>[^<]\{30,40\}\) \+\([^<]\{20,\} | \)|\1
\2|g
-:d;s|\(
[^<]\{30,40\}\) \+\([^<]\{20,\}\)|\1
\2|g;td
+# cleanup comment below, add line breaksfor long lines
+s|\(]*>[^<]\{60,80\}\)[ \n]\+\([^<]\{30,\} | \)|\1
\2|g
+#:e;s|\(
[^<]\{60,80\}\)[ \n]\+\([^<]\{30,\}\)|\1
\2|g;te
-s| *COMMENT *= *["']\?\([^"']*\)["']\?|\n \1 |
|ig
+# close table
+s|;|\n
\n >];|ig
-s| \+||g
-s| \+| | |g
-s|\( | ]*>[^<]\{60,80\}\) \+\([^<]\{30,\} | \)|\1
\2|g
-:e;s|\(
[^<]\{60,80\}\) \+\([^<]\{30,\}\)|\1
\2|g;te
+# convert ##COMMA## to ,
+s|##COMMA##|,|g
+# convert ##SEMICOLON## to ;
+s,##SEMICOLON##,;,g
-s/\n,[^\n]*/\n/g
-s|;|\n
\n >];\n|ig
+# print one table
+p
+# get buffer back and remove the table that has just been analyzed
+x
+s,\(.*\)create[ \n]\+table[^;]*;\(.*\),\1\2,ig
+ti
$a\
}\