You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
67 lines
1.8 KiB
67 lines
1.8 KiB
(*
|
|
* Copyright (c) 2016 - present Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*)
|
|
|
|
(** Escape a string for use in a CSV or XML file: replace reserved
|
|
characters with escape sequences *)
|
|
|
|
(** apply a map function for escape sequences *)
|
|
let escape_map map_fun s =
|
|
let len = String.length s in
|
|
let buf = Buffer.create len in
|
|
for i = 0 to len - 1 do
|
|
let c = String.unsafe_get s i in
|
|
match map_fun c with
|
|
| None -> Buffer.add_char buf c
|
|
| Some s' -> Buffer.add_string buf s'
|
|
done;
|
|
Buffer.contents buf
|
|
|
|
let escape_csv s =
|
|
let map = function
|
|
| '"' -> Some "\"\""
|
|
| c when Char.code c > 127 -> Some "?" (* non-ascii character: escape *)
|
|
| _ -> None in
|
|
escape_map map s
|
|
|
|
let escape_xml s =
|
|
let map = function
|
|
| '"' -> (* on next line to avoid bad indentation *)
|
|
Some """
|
|
| '>' -> Some ">"
|
|
| '<' -> Some "<"
|
|
| '&' -> Some "&"
|
|
| '%' -> Some "%"
|
|
| c when Char.code c > 127 -> (* non-ascii character: escape *)
|
|
Some ("&#" ^ string_of_int (Char.code c) ^ ";")
|
|
| _ -> None in
|
|
escape_map map s
|
|
|
|
let escape_dotty s =
|
|
let map = function
|
|
| '"' -> Some "\\\""
|
|
| '\\' -> Some "\\\\"
|
|
| _ -> None in
|
|
escape_map map s
|
|
|
|
let escape_path s =
|
|
let map = function
|
|
| c ->
|
|
if Char.escaped c = Filename.dir_sep
|
|
then Some "_"
|
|
else None in
|
|
escape_map map s
|
|
|
|
(* Python 2 sucks at utf8 so do not write unicode file names to disk
|
|
as Python may need to see them *)
|
|
let escape_filename s =
|
|
let map = function
|
|
| c when Char.code c > 127 -> Some "?" (* non-ascii character: escape *)
|
|
| _ -> None in
|
|
escape_map map s
|