svg.escobar.life

A simple SVG markup editor for the web

Main.elm (2049B)

      1 module Main exposing (main)
      2 
      3 import View exposing (view)
      4 import Types exposing (..)
      5 import Browser exposing (document)
      6 import Http
      7 import File exposing (File)
      8 import File.Download as Download
      9 import File.Select as Select
     10 import Regex
     11 import Task
     12 
     13 
     14 main : Program () Model Msg
     15 main =
     16   document
     17     { init = \_ -> (init, loadContent)
     18     , update = update
     19     , view = view
     20     , subscriptions = \_ -> Sub.none
     21     }
     22 
     23 update : Msg -> Model -> (Model, Cmd Msg)
     24 update msg model =
     25   case msg of
     26     Update image ->
     27       ({ model | image = image }, Cmd.none)
     28 
     29     Load res ->
     30       (load model res, Cmd.none)
     31 
     32     Validation val ->
     33       ({ model | status = val }, Cmd.none)
     34 
     35     ToggleDarkMode ->
     36       ({ model | darkModeOn = not model.darkModeOn }, Cmd.none)
     37 
     38     Download ->
     39       (model, Download.string model.fileName "image/svg+xml" model.image)
     40 
     41     Upload upl ->
     42       upload model upl
     43 
     44     Scroll scroll ->
     45       ({model | editorScroll = scroll}, Cmd.none)
     46 
     47 load : Model -> Result Http.Error String -> Model
     48 load model res =
     49   case res of
     50     Ok svg ->
     51       { model | image = svg, load = Loaded }
     52 
     53     Err _ ->
     54       { model | load = Loaded }
     55 
     56 upload : Model -> Upload -> (Model, Cmd Msg)
     57 upload model upl =
     58     case upl of
     59       Requested  ->
     60         (model, Select.file [ "image/svg+xml" ] (Selected >> Upload))
     61 
     62       Selected file ->
     63         ( { model | fileName = File.name file }
     64         , Task.perform Update (File.toString file)
     65         )
     66 
     67 init : Model
     68 init =
     69   let
     70       re = "!|#|\\$|%|&|'|\\(|\\)|\\*|\\+|,|\\/|:|;|=|\\?|@|\\[|\\]"
     71   in
     72     { image = emptySvg
     73     , status = Valid
     74     , darkModeOn = False
     75     , uriEncoder = Maybe.withDefault Regex.never (Regex.fromString re)
     76     , fileName = "example.svg"
     77     , editorScroll = (0, 0)
     78     , load = Loading
     79     }
     80 
     81 loadContent : Cmd Msg
     82 loadContent =
     83   Http.get
     84     { url = "assets/example.svg"
     85     , expect = Http.expectString Load
     86     }
     87 
     88 emptySvg : String
     89 emptySvg = "<svg> . . . </svg>"
     90