summaryrefslogtreecommitdiffstats
path: root/tcllib/modules/page/util_quote.tcl
diff options
context:
space:
mode:
Diffstat (limited to 'tcllib/modules/page/util_quote.tcl')
-rw-r--r--tcllib/modules/page/util_quote.tcl173
1 files changed, 173 insertions, 0 deletions
diff --git a/tcllib/modules/page/util_quote.tcl b/tcllib/modules/page/util_quote.tcl
new file mode 100644
index 0000000..6c7b65e
--- /dev/null
+++ b/tcllib/modules/page/util_quote.tcl
@@ -0,0 +1,173 @@
+# -*- tcl -*-
+#
+# Copyright (c) 2005 by Andreas Kupries <andreas_kupries@users.sourceforge.net>
+# Parser Generator / (Un)quoting characters.
+
+# ### ### ### ######### ######### #########
+## Requisites
+
+namespace eval ::page::util::quote {
+ namespace export unquote \
+ quote'tcl quote'tclstr quote'tclcom
+}
+
+# ### ### ### ######### ######### #########
+## API
+
+proc ::page::util::quote::unquote {ch} {
+ # A character, as stored in the grammar tree
+ # by the frontend is transformed into a proper
+ # Tcl character (internal representation).
+
+ switch -exact -- $ch {
+ "\\n" {return \n}
+ "\\t" {return \t}
+ "\\r" {return \r}
+ "\\[" {return \[}
+ "\\]" {return \]}
+ "\\'" {return '}
+ "\\\"" {return "\""}
+ "\\\\" {return \\}
+ }
+
+ if {[regexp {^\\([0-2][0-7][0-7])$} $ch -> ocode]} {
+ return [format %c $ocode]
+ } elseif {[regexp {^\\([0-7][0-7]?)$} $ch -> ocode]} {
+ return [format %c 0$ocode]
+ } elseif {[regexp {^\\u([0-9a-fA-F][0-9a-fA-F]?[0-9a-fA-F]?[0-9a-fA-F]?)$} $ch -> hcode]} {
+ return [format %c 0x$hcode]
+ }
+
+ return $ch
+}
+
+proc ::page::util::quote::quote'tcl {ch} {
+ # Converts a Tcl character (internal representation)
+ # into a string which is accepted by the Tcl parser,
+ # will regenerate the character in question and is
+ # 7bit ASCII. 'quoted' is a boolean flag and set if
+ # the returned representation is a \-quoted form.
+ # Because they have to be treated specially when
+ # creating a list containing the reperesentation.
+
+ # Special characters
+
+ switch -exact -- $ch {
+ "\n" {return "\\n"}
+ "\r" {return "\\r"}
+ "\t" {return "\\t"}
+ "\\" - "\;" -
+ " " - "\"" -
+ "(" - ")" -
+ "\{" - "\}" -
+ "\[" - "\]" {
+ # Quote space and all the brackets as well, using octal,
+ # for easy impure list-ness.
+
+ scan $ch %c chcode
+ return \\[format %o $chcode]
+ }
+ }
+
+ scan $ch %c chcode
+
+ # Control characters: Octal
+ if {[string is control -strict $ch]} {
+ return \\[format %o $chcode]
+ }
+
+ # Beyond 7-bit ASCII: Unicode
+
+ if {$chcode > 127} {
+ return \\u[format %04x $chcode]
+ }
+
+ # Regular character: Is its own representation.
+
+ return $ch
+}
+
+proc ::page::util::quote::quote'tclstr {ch} {
+ # Converts a Tcl character (internal representation)
+ # into a string which is accepted by the Tcl parser and will
+ # generate a human readable representation of the character in
+ # question, one which when puts to a channel describes the
+ # character without using any unprintable characters. It may use
+ # \-quoting. High utf characters are quoted to avoid problem with
+ # the still prevalent ascii terminals. It is assumed that the
+ # string will be used in a ""-quoted environment.
+
+ # Special characters
+
+ switch -exact -- $ch {
+ " " {return "<blank>"}
+ "\n" {return "\\\\n"}
+ "\r" {return "\\\\r"}
+ "\t" {return "\\\\t"}
+ "\"" - "\\" - "\;" -
+ "(" - ")" -
+ "\{" - "\}" -
+ "\[" - "\]" {
+ return \\$ch
+ }
+ }
+
+ scan $ch %c chcode
+
+ # Control characters: Octal
+ if {[string is control -strict $ch]} {
+ return \\\\[format %o $chcode]
+ }
+
+ # Beyond 7-bit ASCII: Unicode
+
+ if {$chcode > 127} {
+ return \\\\u[format %04x $chcode]
+ }
+
+ # Regular character: Is its own representation.
+
+ return $ch
+}
+
+proc ::page::util::quote::quote'tclcom {ch} {
+ # Converts a Tcl character (internal representation)
+ # into a string which is accepted by the Tcl parser when used
+ # within a Tcl comment.
+
+ # Special characters
+
+ switch -exact -- $ch {
+ " " {return "<blank>"}
+ "\n" {return "\\n"}
+ "\r" {return "\\r"}
+ "\t" {return "\\t"}
+ "\"" -
+ "\{" - "\}" -
+ "(" - ")" {
+ return \\$ch
+ }
+ }
+
+ scan $ch %c chcode
+
+ # Control characters: Octal
+ if {[string is control -strict $ch]} {
+ return \\[format %o $chcode]
+ }
+
+ # Beyond 7-bit ASCII: Unicode
+
+ if {$chcode > 127} {
+ return \\u[format %04x $chcode]
+ }
+
+ # Regular character: Is its own representation.
+
+ return $ch
+}
+
+# ### ### ### ######### ######### #########
+## Ready
+
+package provide page::util::quote 0.1