adam@1592: (* Copyright (c) 2011, Adam Chlipala adam@1592: * All rights reserved. adam@1592: * adam@1592: * Redistribution and use in source and binary forms, with or without adam@1592: * modification, are permitted provided that the following conditions are met: adam@1592: * adam@1592: * - Redistributions of source code must retain the above copyright notice, adam@1592: * this list of conditions and the following disclaimer. adam@1592: * - Redistributions in binary form must reproduce the above copyright notice, adam@1592: * this list of conditions and the following disclaimer in the documentation adam@1592: * and/or other materials provided with the distribution. adam@1592: * - The names of contributors may not be used to endorse or promote products adam@1592: * derived from this software without specific prior written permission. adam@1592: * adam@1592: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" adam@1592: * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE adam@1592: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE adam@1592: * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE adam@1592: * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR adam@1592: * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF adam@1592: * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS adam@1592: * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN adam@1592: * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) adam@1592: * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE adam@1592: * POSSIBILITY OF SUCH DAMAGE. adam@1592: *) adam@1592: adam@1592: (* Building SML code from XML entity tables *) adam@1592: adam@1592: fun main () = adam@1592: let adam@1592: fun doFile fname = adam@1592: let adam@1592: val inf = TextIO.openIn fname adam@1592: adam@1592: fun loop () = adam@1592: case TextIO.inputLine inf of adam@1592: NONE => TextIO.closeIn inf adam@1592: | SOME line => adam@1592: if String.isPrefix " Char.isSpace ch orelse ch = #">") line of adam@1592: " adam@1592: let adam@1592: val exp = if String.isPrefix "\"&#" exp andalso String.isSuffix ";\"" exp then adam@1592: let adam@1592: val middle = String.substring (exp, 3, size exp - 5) adam@1592: in adam@1592: if CharVector.all Char.isDigit middle then adam@1592: middle adam@1592: else if String.isPrefix "38;#" middle then adam@1592: String.extract (middle, 4, NONE) adam@1592: else adam@1592: raise Fail "Bad entity expression [1]" adam@1592: end adam@1592: else adam@1592: raise Fail "Bad entity expansion [2]" adam@1592: in adam@1592: print ("\t\t(\"" ^ ent ^ "\", " ^ exp ^ "),\n"); adam@1592: loop () adam@1592: end adam@1592: | _ => raise Fail "Bad ENTITY line" adam@1592: else adam@1592: loop () adam@1592: in adam@1592: loop () adam@1592: end adam@1592: in adam@1592: print "structure Entities = struct\n"; adam@1592: print "\tval all = [\n"; adam@1592: doFile "xml/xhtml-lat1.ent"; adam@1592: doFile "xml/xhtml-special.ent"; adam@1592: doFile "xml/xhtml-symbol.ent"; adam@1592: print "\t(\"\", 0)]\n"; adam@1592: print "end\n" adam@1592: end adam@1592: adam@1592: val () = main ()