Packages
floki
0.30.0
0.38.4
0.38.3
0.38.2
0.38.1
0.38.0
0.37.1
0.37.0
0.36.3
0.36.2
0.36.1
0.36.0
0.35.4
0.35.3
0.35.2
0.35.1
0.35.0
0.34.3
0.34.2
0.34.1
0.34.0
0.33.1
0.33.0
0.32.1
0.32.0
0.31.0
0.30.1
0.30.0
0.29.0
0.28.0
0.27.0
0.26.0
0.25.0
0.24.0
0.23.1
0.23.0
0.22.0
0.21.0
0.20.4
0.20.3
0.20.2
0.20.1
0.20.0
0.19.3
0.19.2
0.19.1
0.19.0
0.18.1
0.18.0
0.17.2
0.17.1
0.17.0
0.16.0
0.15.0
0.14.0
0.13.2
0.13.1
0.13.0
0.12.1
0.12.0
0.11.0
0.10.1
0.10.0
0.9.0
0.8.1
0.8.0
0.7.2
0.7.1
0.7.0
0.6.1
0.6.0
0.5.0
0.4.1
0.4.0
0.3.3
0.3.2
0.3.1
0.3.0
0.2.1
0.2.0
0.1.1
0.1.0
0.0.5
0.0.4
0.0.3
0.0.2
0.0.1
Floki is a simple HTML parser that enables search for nodes using CSS selectors.
Current section
Files
Jump to
Current section
Files
lib/floki/selector/functional.ex
defmodule Floki.Selector.Functional do
@moduledoc false
# Represents a functional notation for a selector
defstruct [:stream, :a, :b]
@regex ~r/^\s*(?<a>[-+]?[0-9]*[n])\s*(?<b>[+-]\s*[0-9]+)?\s*$/
def parse(expr) when is_list(expr) do
parse(to_string(expr))
end
def parse(expr) do
expr = String.downcase(expr)
case Regex.named_captures(@regex, expr) do
nil -> :invalid
%{"a" => a, "b" => b} -> {:ok, build(a, b)}
end
end
defp build(a, ""), do: build(a, "0")
defp build(a, b) do
a = parse_num(a)
b = parse_num(b)
stream =
Stream.map(0..100_000, fn x ->
a * x + b
end)
%__MODULE__{stream: stream, a: a, b: b}
end
defp parse_num(n_str) do
n_str
|> String.replace(" ", "")
|> String.trim("n")
|> case do
"-" -> -1
"" -> 1
n -> String.to_integer(n)
end
end
defimpl String.Chars do
def to_string(functional) do
"#{functional.a}x+#{functional.b}"
end
end
end