Packages
nldoc_validation
4.0.17
4.0.42
4.0.41
4.0.40
4.0.39
4.0.38
4.0.37
4.0.36
4.0.35
4.0.34
4.0.33
4.0.32
4.0.31
4.0.30
4.0.29
4.0.28
4.0.27
4.0.26
4.0.25
4.0.24
4.0.23
4.0.22
4.0.21
4.0.20
4.0.19
4.0.18
4.0.17
4.0.16
4.0.15
4.0.14
4.0.12
4.0.11
4.0.10
4.0.9
4.0.8
4.0.7
4.0.6
4.0.5
4.0.4
4.0.3
4.0.2
4.0.1
4.0.0
3.0.0
2.3.17
2.3.16
2.3.15
2.3.14
2.3.13
2.3.12
2.3.11
2.3.10
2.3.9
2.3.8
2.3.7
2.3.6
2.3.5
2.3.4
2.3.3
2.3.2
2.3.1
2.3.0
2.2.0
2.1.0
2.0.6
2.0.5
2.0.4
2.0.3
2.0.2
2.0.1
2.0.0
1.0.2
1.0.1
1.0.0
WCAG validator for the NLdoc specification.
Current section
Files
Jump to
Current section
Files
lib/nldoc/validation.ex
defmodule NLdoc.Validation do
@moduledoc """
NLdoc Validation is a library that provides accessibility validation for NLdoc documents.
TODO: proper description
"""
alias NLdoc.Spec.Validation.Finding
alias NLdoc.Validation.State
@rules [
NLdoc.Validation.Rules.DefinitionListHasDefinitionTerm,
NLdoc.Validation.Rules.DefinitionTermHasDefinitionDetails,
NLdoc.Validation.Rules.EmptyDefinitionDetails,
NLdoc.Validation.Rules.EmptyDefinitionTerm,
NLdoc.Validation.Rules.EmptyHeading,
NLdoc.Validation.Rules.EmptyTableHeader,
NLdoc.Validation.Rules.HeadingLevelValid,
NLdoc.Validation.Rules.HeadingOrder,
NLdoc.Validation.Rules.ImageMustHaveAlt,
NLdoc.Validation.Rules.LinkName,
NLdoc.Validation.Rules.NoUnderline,
NLdoc.Validation.Rules.PAsHeading,
NLdoc.Validation.Rules.PageHasHeadingOne,
NLdoc.Validation.Rules.PageHasMultipleHeadingOne,
NLdoc.Validation.Rules.PageStartsWithHeadingOne,
NLdoc.Validation.Rules.StyleBoldInHeading,
NLdoc.Validation.Rules.StyleItalicInHeading,
NLdoc.Validation.Rules.TableNeedsMultipleRows
]
# Mapping from resource types to their applicable rules
@rules_by_type Enum.reduce(@rules, %{}, fn rule, acc ->
Enum.reduce(rule.validates(), acc, fn type, acc ->
Map.update(acc, type, [rule], &[rule | &1])
end)
end)
@spec validate(NLdoc.Spec.object() | [NLdoc.Spec.object()]) :: [Finding.t()]
@spec validate(NLdoc.Spec.object() | [NLdoc.Spec.object()], State.t()) :: State.t()
def validate(resource),
do: resource |> validate(%State{}) |> State.get(:findings)
def validate(resources, state = %State{}) when is_list(resources),
do: resources |> Enum.reduce(state, fn resource, state -> resource |> validate(state) end)
def validate(resource = %{children: children}, state = %State{}),
do: children |> validate(resource |> validate_resource(state))
def validate(resource, state = %State{}),
do: resource |> validate_resource(state)
for {type, rules} <- @rules_by_type do
defp validate_resource(resource = %{__struct__: unquote(type)}, state = %State{}),
do:
unquote(rules) |> Enum.reduce(state, fn rule, state -> rule.validate(resource, state) end)
end
defp validate_resource(_, state),
do: state
end