3 Generic module providing useful primitives for quoting
5 Author: Raphael Pinson <raphael.pinson@camptocamp.com>
8 This file is licenced under the LGPL v2+, like the rest of Augeas.
11 This is a generic module which doesn't apply to files directly.
12 You can use its definitions to build lenses that require quoted values.
13 It provides several levels of definitions, allowing to define more or less fine-grained quoted values:
15 - the quote separators are separators that are useful to define quoted values;
16 - the quoting functions are useful wrappers to easily enclose a lens in various kinds of quotes (single, double, any, optional or not);
17 - the quoted values definitions are common quoted patterns. They use the quoting functions in order to provide useful shortcuts for commonly met needs. In particular, the <quote_spaces> (and similar) function force values that contain spaces to be quoted, but allow values without spaces to be unquoted.
20 The <Test_Quote> file contains various examples and tests.
25 (* Group: QUOTE SEPARATORS *)
29 let dquote = Util.del_str "\""
31 (* Variable: dquote_opt
32 An optional double quote, default to double *)
33 let dquote_opt = del /"?/ "\""
35 (* Variable: dquote_opt_nil
36 An optional double quote, default to nothing *)
37 let dquote_opt_nil = del /"?/ ""
41 let squote = Util.del_str "'"
43 (* Variable: squote_opt
44 An optional single quote, default to single *)
45 let squote_opt = del /'?/ "'"
47 (* Variable: squote_opt_nil
48 An optional single quote, default to nothing *)
49 let squote_opt_nil = del /'?/ ""
52 A quote, either double or single, default to double *)
53 let quote = del /["']/ "\""
55 (* Variable: quote_opt
56 An optional quote, either double or single, default to double *)
57 let quote_opt = del /["']?/ "\""
59 (* Variable: quote_opt_nil
60 An optional quote, either double or single, default to nothing *)
61 let quote_opt_nil = del /["']?/ ""
64 (* Group: QUOTING FUNCTIONS *)
68 Enclose a lens in <dquote>s
71 body:lens - the lens to be enclosed
73 let do_dquote (body:lens) =
74 square dquote body dquote
78 Enclose a lens in optional <dquote>s,
79 use <dquote>s by default.
82 body:lens - the lens to be enclosed
84 let do_dquote_opt (body:lens) =
85 square dquote_opt body dquote_opt
88 View: do_dquote_opt_nil
89 Enclose a lens in optional <dquote>s,
93 body:lens - the lens to be enclosed
95 let do_dquote_opt_nil (body:lens) =
96 square dquote_opt_nil body dquote_opt_nil
100 Enclose a lens in <squote>s
103 body:lens - the lens to be enclosed
105 let do_squote (body:lens) =
106 square squote body squote
110 Enclose a lens in optional <squote>s,
111 use <squote>s by default.
114 body:lens - the lens to be enclosed
116 let do_squote_opt (body:lens) =
117 square squote_opt body squote_opt
120 View: do_squote_opt_nil
121 Enclose a lens in optional <squote>s,
122 default to no quotes.
125 body:lens - the lens to be enclosed
127 let do_squote_opt_nil (body:lens) =
128 square squote_opt_nil body squote_opt_nil
132 Enclose a lens in <quote>s.
135 body:lens - the lens to be enclosed
137 let do_quote (body:lens) =
138 square quote body quote
142 Enclose a lens in options <quote>s.
145 body:lens - the lens to be enclosed
147 let do_quote_opt (body:lens) =
148 square quote_opt body quote_opt
152 Enclose a lens in options <quote>s,
153 default to no quotes.
156 body:lens - the lens to be enclosed
158 let do_quote_opt_nil (body:lens) =
159 square quote_opt_nil body quote_opt_nil
162 (* Group: QUOTED VALUES *)
165 A double-quoted value *)
167 let body = store /[^\n]*/
170 (* Variable: double_opt_re
171 The regexp to store when value
172 is optionally double-quoted *)
173 let double_opt_re = /[^\n\t "]([^\n"]*[^\n\t "])?/
176 An optionaly double-quoted value
177 Double quotes are not allowed in value
178 Value cannot begin or end with spaces *)
180 let body = store double_opt_re
181 in do_dquote_opt body
184 A single-quoted value *)
186 let body = store /[^\n]*/
189 (* Variable: single_opt_re
190 The regexp to store when value
191 is optionally single-quoted *)
192 let single_opt_re = /[^\n\t ']([^\n']*[^\n\t '])?/
195 An optionaly single-quoted value
196 Single quotes are not allowed in value
197 Value cannot begin or end with spaces *)
199 let body = store single_opt_re
200 in do_squote_opt body
205 let body = store /[^\n]*/
208 (* Variable: any_opt_re
209 The regexp to store when value
210 is optionally single- or double-quoted *)
211 let any_opt_re = /[^\n\t "']([^\n"']*[^\n\t "'])?/
214 An optionaly quoted value
215 Double or single quotes are not allowed in value
216 Value cannot begin or end with spaces *)
218 let body = store any_opt_re
223 Make quotes mandatory if value contains spaces,
224 and optional if value doesn't contain spaces.
227 lns:lens - the lens to be enclosed
229 let quote_spaces (lns:lens) =
230 (* bare has no spaces, and is optionally quoted *)
231 let bare = Quote.do_quote_opt (store /[^"' \t\n]+/)
232 (* quoted has at least one space, and must be quoted *)
233 in let quoted = Quote.do_quote (store /[^"'\n]*[ \t]+[^"'\n]*/)
234 in [ lns . bare ] | [ lns . quoted ]
238 Make double quotes mandatory if value contains spaces,
239 and optional if value doesn't contain spaces.
242 lns:lens - the lens to be enclosed
244 let dquote_spaces (lns:lens) =
245 (* bare has no spaces, and is optionally quoted *)
246 let bare = Quote.do_dquote_opt (store /[^" \t\n]+/)
247 (* quoted has at least one space, and must be quoted *)
248 in let quoted = Quote.do_dquote (store /[^"\n]*[ \t]+[^"\n]*/)
249 in [ lns . bare ] | [ lns . quoted ]
253 Make single quotes mandatory if value contains spaces,
254 and optional if value doesn't contain spaces.
257 lns:lens - the lens to be enclosed
259 let squote_spaces (lns:lens) =
260 (* bare has no spaces, and is optionally quoted *)
261 let bare = Quote.do_squote_opt (store /[^' \t\n]+/)
262 (* quoted has at least one space, and must be quoted *)
263 in let quoted = Quote.do_squote (store /[^'\n]*[ \t]+[^'\n]*/)
264 in [ lns . bare ] | [ lns . quoted ]