Packages

A small package for creating 2D markup.

Current section

3 Versions

Jump to

Compare versions

4 files changed
+80 additions
-19 deletions
  @@ -12,10 +12,35 @@ by adding `markex` to your list of dependencies in `mix.exs`:
12 12 ```elixir
13 13 def deps do
14 14 [
15 - {:markex, "~> 1.0.0"}
15 + {:markex, "~> 1.1.0"}
16 16 ]
17 17 end
18 18 ```
19 19
20 + ## Usage
21 +
22 + ```elixir
23 + import Markex.Element.Operators
24 + alias Markex.Element
25 +
26 + text = Element.new("some text")
27 + space = Element.new(" ")
28 + hor_bar = Element.new("@", 11, 1)
29 + vert_bar = Element.new("@", 1, 5)
30 +
31 +
32 + vert_bar <|> (hor_bar <~> space <~> text <~> space <~> hor_bar) <|> vert_bar
33 + |> Element.to_string()
34 + |> IO.puts()
35 +
36 + # Result:
37 + # @@@@@@@@@@@@@
38 + # @ @
39 + # @ some text @
40 + # @ @
41 + # @@@@@@@@@@@@@
42 +
43 + ```
44 +
20 45 [Documentation on hex](https://hexdocs.pm/markex/readme.html).
  @@ -10,4 +10,4 @@
10 10 {<<"links">>,[{<<"GitHub">>,<<"https://github.com/wmean-spec/markex">>}]}.
11 11 {<<"name">>,<<"markex">>}.
12 12 {<<"requirements">>,[]}.
13 - {<<"version">>,<<"1.0.0">>}.
13 + {<<"version">>,<<"1.1.0">>}.
  @@ -123,9 +123,10 @@ defmodule Markex.Element do
123 123 " # "
124 124 ]
125 125 """
126 - @doc since: "1.0.0"
127 - @spec wider(element, pos_integer()) :: element
128 - def wider(element, n) do
126 + @doc since: "1.1.0"
127 + @spec wider(element, pos_integer(), :center | :left | :right) :: element
128 + def wider(element, n, align \\ :center)
129 + def wider(element, n, :center) do
129 130 add_space = n - width(element)
130 131 left = Integer.floor_div(add_space, 2)
131 132
  @@ -134,6 +135,16 @@ defmodule Markex.Element do
134 135 |> Enum.map(&String.pad_trailing(&1, n))
135 136 end
136 137
138 + def wider(element, n, :left) do
139 + element
140 + |> Enum.map(&String.pad_trailing(&1, n))
141 + end
142 +
143 + def wider(element, n, :right) do
144 + element
145 + |> Enum.map(&String.pad_leading(&1, n))
146 + end
147 +
137 148 @doc """
138 149 Adds space to the top and bottom of the `element` so that the height matches `n`
139 150
  @@ -148,9 +159,10 @@ defmodule Markex.Element do
148 159 " "
149 160 ]
150 161 """
151 - @doc since: "1.0.0"
152 - @spec higher(element, pos_integer()) :: element
153 - def higher(element, n) do
162 + @doc since: "1.1.0"
163 + @spec higher(element, pos_integer(), :center | :top | :bottom) :: element
164 + def higher(element, n, align \\ :center)
165 + def higher(element, n, :center) do
154 166 add_space = n - height(element)
155 167 up = Integer.floor_div(add_space, 2)
156 168 down = add_space - up
  @@ -162,9 +174,30 @@ defmodule Markex.Element do
162 174 |> Enum.concat(List.duplicate(blank, down))
163 175 end
164 176
177 + def higher(element, n, :top) do
178 + add_space = n - height(element)
179 +
180 + blank = String.duplicate(" ", width(element))
181 +
182 + element
183 + |> Enum.concat(List.duplicate(blank, add_space))
184 + end
185 +
186 + def higher(element, n, :bottom) do
187 + add_space = n - height(element)
188 +
189 + blank = String.duplicate(" ", width(element))
190 +
191 + List.duplicate(blank, add_space)
192 + |> Enum.concat(element)
193 + end
194 +
165 195 @doc """
166 196 Positions `this` on top of `that`, makes the elements wider as needed
167 197
198 + The `align` argument can be used to position the elements correctly relative
199 + to each other and can be `:center`, `:left`, or `:right`.
200 +
168 201 See also `Markex.Element.Operators.<~>/2` and `Markex.Element.wider/2`.
169 202
170 203 ## Examples
  @@ -176,18 +209,21 @@ defmodule Markex.Element do
176 209 "$$$"
177 210 ]
178 211 """
179 - @doc since: "1.0.0"
180 - @spec over(element, element) :: element
181 - def over(this, that) do
212 + @doc since: "1.1.0"
213 + @spec over(element, element, :center | :left | :right) :: element
214 + def over(this, that, align \\ :center) do
182 215 w = max(width(this), width(that))
183 - this = wider(this, w)
184 - that = wider(that, w)
216 + this = wider(this, w, align)
217 + that = wider(that, w, align)
185 218 Enum.concat(this, that)
186 219 end
187 220
188 221 @doc """
189 222 Positions `this` to the left of `that`, makes the elements higher if needed
190 223
224 + The `align` argument can be used to position the elements correctly relative
225 + to each other and can be `:center`, `:top`, or `:bottom`.
226 +
191 227 See also `Markex.Element.Operators.<|>/2` and `Markex.Element.higher/2`.
192 228
193 229 ## Examples
  @@ -198,12 +234,12 @@ defmodule Markex.Element do
198 234 " $$"
199 235 ]
200 236 """
201 - @doc since: "1.0.0"
202 - @spec beside(element, element) :: element
203 - def beside(this, that) do
237 + @doc since: "1.1.0"
238 + @spec beside(element, element, :center | :top | :bottom) :: element
239 + def beside(this, that, align \\ :center) do
204 240 h = max(height(this), height(that))
205 - this = higher(this, h)
206 - that = higher(that, h)
241 + this = higher(this, h, align)
242 + that = higher(that, h, align)
207 243
208 244 Enum.zip(this, that)
209 245 |> Enum.map(fn {l1, l2} -> l1 <> l2 end)
  @@ -4,7 +4,7 @@ defmodule Markex.MixProject do
4 4 def project do
5 5 [
6 6 app: :markex,
7 - version: "1.0.0",
7 + version: "1.1.0",
8 8 elixir: "~> 1.12",
9 9 start_permanent: Mix.env() == :prod,
10 10 deps: deps(),