Current section
3 Versions
Jump to
Current section
3 Versions
Compare versions
4
files changed
+50
additions
-39
deletions
| @@ -0,0 +1,13 @@ | |
| 1 | + Changelog |
| 2 | + ========= |
| 3 | + |
| 4 | + 0.2.0 |
| 5 | + ----- |
| 6 | + |
| 7 | + * Fix compilation warning on Elixir 1.3 |
| 8 | + * Require Elixir ~> 1.3 |
| 9 | + |
| 10 | + 0.1.0 |
| 11 | + ----- |
| 12 | + |
| 13 | + First release |
| @@ -1,11 +1,11 @@ | |
| 1 1 | {<<"app">>,<<"exdatauri">>}. |
| 2 2 | {<<"build_tools">>,[<<"mix">>]}. |
| 3 | - {<<"contributors">>,[<<"Luper Rouch">>]}. |
| 4 3 | {<<"description">>,<<"A RFC 2397 URI parser for Elixir">>}. |
| 5 | - {<<"elixir">>,<<"~> 1.0">>}. |
| 6 | - {<<"files">>,[<<"lib/exdatauri.ex">>,<<"mix.exs">>,<<"README.md">>]}. |
| 4 | + {<<"elixir">>,<<"~> 1.3">>}. |
| 5 | + {<<"files">>, |
| 6 | + [<<"lib/exdatauri.ex">>,<<"mix.exs">>,<<"README.md">>,<<"CHANGELOG.md">>]}. |
| 7 7 | {<<"licenses">>,[<<"MIT">>]}. |
| 8 8 | {<<"links">>,[{<<"Github">>,<<"https://github.com/flupke/exdatauri">>}]}. |
| 9 9 | {<<"name">>,<<"exdatauri">>}. |
| 10 10 | {<<"requirements">>,[]}. |
| 11 | - {<<"version">>,<<"0.1.0">>}. |
| 11 | + {<<"version">>,<<"0.2.0">>}. |
| @@ -30,41 +30,36 @@ defmodule ExDataURI do | |
| 30 30 | charset \\ nil, |
| 31 31 | payload_encoding \\ :base64, |
| 32 32 | input_charset \\ "utf8") do |
| 33 | - error = nil |
| 33 | + with {:ok, payload, charset_meta} <- convert_charset(payload, input_charset, charset), |
| 34 | + {:ok, payload, payload_meta} <- encode_payload(payload, payload_encoding) do |
| 35 | + {:ok, "data:#{mediatype}#{charset_meta}#{payload_meta},#{payload}"} |
| 36 | + end |
| 37 | + end |
| 34 38 | |
| 39 | + defp convert_charset(payload, input_charset, charset) do |
| 35 40 | case charset do |
| 36 41 | nil -> |
| 37 | - charset_meta = "" |
| 42 | + {:ok, payload, ""} |
| 38 43 | ^input_charset -> |
| 39 | - charset_meta = ";charset=#{charset}" |
| 44 | + {:ok, payload, ";charset=#{charset}"} |
| 40 45 | charset -> |
| 41 46 | case :iconverl.conv(charset, input_charset, payload) do |
| 42 | - {:ok, payload} -> |
| 43 | - payload = payload |
| 44 | - charset_meta = ";charset=#{charset}" |
| 47 | + {:ok, converted_payload} -> |
| 48 | + {:ok, converted_payload, ";charset=#{charset}"} |
| 45 49 | {:error, reason} -> |
| 46 | - error = {:error, "failed encoding payload from #{inspect input_charset} to #{inspect charset}: #{inspect reason}"} |
| 50 | + {:error, "failed encoding payload from #{inspect input_charset} to #{inspect charset}: #{inspect reason}"} |
| 47 51 | end |
| 48 52 | end |
| 53 | + end |
| 49 54 | |
| 50 | - unless error do |
| 51 | - case payload_encoding do |
| 52 | - :base64 -> |
| 53 | - payload_meta = ";base64" |
| 54 | - payload = Base.encode64(payload) |
| 55 | - :urlenc -> |
| 56 | - payload_meta = "" |
| 57 | - payload = URI.encode(payload) |
| 58 | - _unknonw_enc -> |
| 59 | - error = {:error, "unknown payload encoding: #{inspect payload_encoding}"} |
| 60 | - end |
| 61 | - end |
| 62 | - |
| 63 | - case error do |
| 64 | - nil -> |
| 65 | - {:ok, "data:#{mediatype}#{charset_meta}#{payload_meta},#{payload}"} |
| 66 | - error -> |
| 67 | - error |
| 55 | + defp encode_payload(payload, payload_encoding) do |
| 56 | + case payload_encoding do |
| 57 | + :base64 -> |
| 58 | + {:ok, Base.encode64(payload), ";base64"} |
| 59 | + :urlenc -> |
| 60 | + {:ok, URI.encode(payload), ""} |
| 61 | + _unknonw_enc -> |
| 62 | + {:error, "unknown payload encoding: #{inspect payload_encoding}"} |
| 68 63 | end |
| 69 64 | end |
| 70 65 | |
| @@ -73,7 +68,7 @@ defmodule ExDataURI do | |
| 73 68 | |
| 74 69 | Return values: |
| 75 70 | * `{:ok, mediatype, data}` - where `mediatype` is the one given in the |
| 76 | - metadata, or "text/plain" if it's omitted; |
| 71 | + metadata, or `"text/plain"` if it's omitted; |
| 77 72 | * `{:error, reason}` |
| 78 73 | """ |
| 79 74 | @spec parse(String.t) :: {:ok | :error, String.t} |
| @@ -103,20 +98,23 @@ defmodule ExDataURI do | |
| 103 98 | Only parse metadata of an RFC 2397 URI. |
| 104 99 | |
| 105 100 | Return values: |
| 106 | - * `{:ok, mediatype, charset, payload_encoding}` |
| 101 | + * `{:ok, mediatype, charset, payload_encoding}` - where `mediatype` is the |
| 102 | + MIME type (`"text/plain"` by default), `charset` the encoding of the |
| 103 | + payload or `nil`, and `payload_encoding` is one of `:urlenc` or `:base64` |
| 107 104 | * `{:error, reason}` |
| 108 105 | """ |
| 106 | + @spec parse_metadata(String.t) :: {:ok, String.t, String.t | nil, :atom} | {:error, String.t} |
| 109 107 | def parse_metadata("data:" <> rest) do |
| 110 108 | [metadata, _payload] = String.split(rest, ",", parts: 2) |
| 111 109 | parse_metadata(metadata) |
| 112 110 | end |
| 113 111 | def parse_metadata(metadata) do |
| 114 | - if String.ends_with?(metadata, ";base64") do |
| 115 | - metadata = String.slice(metadata, 0..-8) |
| 116 | - payload_encoding = :base64 |
| 117 | - else |
| 118 | - payload_encoding = :urlenc |
| 119 | - end |
| 112 | + {metadata, payload_encoding} = |
| 113 | + if String.ends_with?(metadata, ";base64") do |
| 114 | + {String.slice(metadata, 0..-8), :base64} |
| 115 | + else |
| 116 | + {metadata, :urlenc} |
| 117 | + end |
| 120 118 | case parse_mediatype(metadata) do |
| 121 119 | {:ok, mediatype, charset} -> |
| 122 120 | {:ok, mediatype, charset, payload_encoding} |
| @@ -4,9 +4,9 @@ defmodule ExDataURI.Mixfile do | |
| 4 4 | def project do |
| 5 5 | [ |
| 6 6 | app: :exdatauri, |
| 7 | - version: "0.1.0", |
| 7 | + version: "0.2.0", |
| 8 8 | description: "A RFC 2397 URI parser for Elixir", |
| 9 | - elixir: "~> 1.0", |
| 9 | + elixir: "~> 1.3", |
| 10 10 | build_embedded: Mix.env == :prod, |
| 11 11 | start_permanent: Mix.env == :prod, |
| 12 12 | deps: deps, |