/
Main.elm
131 lines (107 loc) · 3.47 KB
/
Main.elm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
module Main exposing (main)
import Html exposing (Html, div, input, node, pre, text)
import Html.Events exposing (onInput)
import Html.Attributes exposing (placeholder, style)
import Http
import Regex
main : Program Never Model Msg
main =
Html.program
{ init = Model "" Nothing [] ! [loadWordbook]
, view = view
, update = update
, subscriptions = \_ -> Sub.none
}
--------------------------------------------------------------------------------
-- MODEL --
-----------
type alias Model =
{ query : String
, content : Maybe String
, wordbook : List String
}
loadWordbook : Cmd Msg
loadWordbook =
let url = "./vortaro.text"
request = Http.getString url
in Http.send Load request
--------------------------------------------------------------------------------
-- UPDATE --
------------
type Msg
= Query String
| Load (Result Http.Error String)
type KnownErrors
= NoWordbook
| HttpError Http.Error
update : Msg -> Model -> (Model, Cmd Msg)
update msg model =
case msg of
Query query ->
case model.wordbook of
[] -> { model
| query = query
, content = showErrorMessage NoWordbook |> Just
} ! []
wordbook -> { model
| query = query
, content = find query wordbook
} ! []
Load (Ok data) ->
{model | wordbook = String.split "\n" data} ! []
Load (Err err) ->
{model | content = HttpError err |> showErrorMessage |> Just} ! []
find : String -> List String -> Maybe String
find query wordbook =
if String.length query > 1
then
let rquery = Regex.regex query
filter_ = Regex.contains rquery
sep = Regex.regex "\\t::"
in
wordbook
|> List.filter filter_
|> String.join "\n\n"
|> Regex.replace Regex.All sep (\_ -> "\n")
|> Just
else Nothing
showErrorMessage : KnownErrors -> String
showErrorMessage errorType =
case errorType of
HttpError (Http.BadPayload message _) -> message
HttpError (Http.BadStatus res) -> res.status.message
HttpError (Http.BadUrl message) -> message
HttpError Http.NetworkError -> "rede indisponível"
HttpError Http.Timeout -> "requisição expirou"
NoWordbook -> "dicionário não carregado"
--------------------------------------------------------------------------------
-- VIEW --
----------
view : Model -> Html Msg
view model =
div []
[ input [placeholder "Serĉu", onInput Query] []
, display model.content
]
display : Maybe String -> Html msg
display content =
let preStyle =
style
[ ("background-color", "white")
, ("word-break", "break-word")
, ("word-wrap", "break-word")
, ("white-space", "pre-wrap")
, ("white-space", "-moz-pre-wrap")
, ("white-space", "-o-pre-wrap")
, ("white-space", "-pre-wrap")
, ("overflow-x", "hidden")
, ("overflow-y", "scroll")
, ("border-style", "inset")
, ("border-width", "medium")
, ("height", "25em")
, ("width", "128ex")
]
render = pre [preStyle]
in case content of
Just value -> render [text value]
Nothing -> render [text ""]