render.ex (1702B)
1 defmodule Absinthe.Utils.Render do 2 @moduledoc false 3 4 import Inspect.Algebra 5 6 def join(docs, joiner) do 7 fold_doc(docs, fn doc, acc -> 8 concat([doc, concat(List.wrap(joiner)), acc]) 9 end) 10 end 11 12 def render_string_value(string, indent \\ 2) do 13 string 14 |> String.trim() 15 |> String.split("\n") 16 |> case do 17 [string_line] -> 18 concat([~s("), escape_string(string_line), ~s(")]) 19 20 string_lines -> 21 concat( 22 nest( 23 block_string([~s(""")] ++ string_lines), 24 indent, 25 :always 26 ), 27 concat(line(), ~s(""")) 28 ) 29 end 30 end 31 32 @escaped_chars [?", ?\\, ?/, ?\b, ?\f, ?\n, ?\r, ?\t] 33 34 defp escape_string(string) do 35 escape_string(string, []) 36 end 37 38 defp escape_string(<<char, rest::binary>>, acc) when char in @escaped_chars do 39 escape_string(rest, [acc | escape_char(char)]) 40 end 41 42 defp escape_string(<<char::utf8, rest::binary>>, acc) do 43 escape_string(rest, [acc | <<char::utf8>>]) 44 end 45 46 defp escape_string(<<>>, acc) do 47 to_string(acc) 48 end 49 50 defp escape_char(?"), do: [?\\, ?"] 51 defp escape_char(?\\), do: [?\\, ?\\] 52 defp escape_char(?/), do: [?\\, ?/] 53 defp escape_char(?\b), do: [?\\, ?b] 54 defp escape_char(?\f), do: [?\\, ?f] 55 defp escape_char(?\n), do: [?\\, ?n] 56 defp escape_char(?\r), do: [?\\, ?r] 57 defp escape_char(?\t), do: [?\\, ?t] 58 59 defp block_string([string]) do 60 string(string) 61 end 62 63 defp block_string([string | rest]) do 64 string 65 |> string() 66 |> concat(block_string_line(rest)) 67 |> concat(block_string(rest)) 68 end 69 70 defp block_string_line(["", _ | _]), do: nest(line(), :reset) 71 defp block_string_line(_), do: line() 72 end