about summary refs log tree commit diff
path: root/pkgs/profpatsch/xdg-open/config.dhall
blob: 40a791af3efd648f230189e07811b49a4cc04cc9 (plain) (blame)
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
let Mime = List Text

let
    -- TODO use library like with shell commands
    Executable =
      Text

let Arg = < String : Text | Variable : Text >

let CommandTemplate =
      λ(templates : Type) → { exe : Executable, args : templates → List Arg }

let Command = CommandTemplate Arg

let mime =
      { text =
        { html = [ "text", "html" ]
        , xml = [ "text", "xml" ]
        , any = [ "text", "*" ]
        }
      , mail-address = [ "special", "mailaddress" ]
      , torrent = [ "application", "x-bittorrent" ]
      , irc = [ "x-scheme-handler", "irc" ]
      , file = [ "x-scheme-handler", "file" ]
      , image =
        { gif = [ "image", "gif" ]
        , svg = [ "image", "svg+xml" ]
        , any = [ "image", "*" ]
        }
      , pdf = [ "application", "pdf" ]
      , pgp-key = [ "application", "pgp-keys" ]
      , directory = [ "inode", "directory" ]
      , any = [ "*" ]
      }

let renderMime = λ(m : Mime) → 32

let UriMimeGlob = { desc : Text, glob : List Text, mime : Mime }

let uriMimeGlobs
    : List UriMimeGlob
    = [ { desc = "http link"
        , glob = [ "http://*", "https://*" ]
        , mime = mime.text.html
        }
      , { glob = [ "mailto:*" ]
        , desc = "mail address"
        , mime = mime.mail-address
        }
      , { glob = [ "magnet:*" ]
        , desc = "bittorrent magnet link"
        , mime = mime.torrent
        }
      , { desc = "irc channel", glob = [ "irc:*" ], mime = mime.irc }
      , { desc = "local file", glob = [ "file://*" ], mime = mime.file }
      ]

let MimeMatch = { match : Mime, cmd : Command }

let Special =
      { open-in-editor : Command
      , open-in-browser : Command
      , compose-mail-to : Command
      , exec-in-terminal-emulator : ∀(args : Command) → Command
      , dmenu-list-binaries-and-exec : Command
      }

let mimeMatcher =
      λ(pkgs : { package : Text, binary : Text } → Executable) →
      λ(special : Special) →
        let pkgSame =
              λ(packageAndBinaryName : Text) →
                pkgs
                  { package = packageAndBinaryName
                  , binary = packageAndBinaryName
                  }

        let oneArg =
              λ(exe : Executable) → { exe, args = λ(file : Arg) → [ file ] }

        let m = λ(match : Mime) → λ(cmd : Command) → { match, cmd }

        in    [ { match = mime.mail-address, cmd = special.compose-mail-to }
              , { match = mime.text.html, cmd = special.open-in-browser }
              , { match = mime.text.xml, cmd = special.open-in-browser }
              , { match = mime.text.any, cmd = special.open-in-editor }
              , { match = mime.image.gif, cmd = special.open-in-browser }
              , { match = mime.image.svg, cmd = oneArg (pkgSame "inkscape") }
              , { match = mime.image.any, cmd = oneArg (pkgSame "feh") }
              , { match = mime.pdf, cmd = oneArg (pkgSame "zathura") }
              , { match = mime.pgp-key
                , cmd =
                  { exe = pkgs { package = "gnupg", binary = "gpg" }
                  , args =
                      λ(file : Arg) →
                        [ Arg.String "--import"
                        , Arg.String "--import-options"
                        , Arg.String "show-only"
                        , file
                        ]
                  }
                }
              , { match = mime.directory
                , cmd =
                    special.exec-in-terminal-emulator
                      (oneArg (pkgSame "ranger"))
                }
              , { match = mime.any, cmd = special.dmenu-list-binaries-and-exec }
              ]
            : List MimeMatch

in  { mimeMatcher
    , uriMimeGlobs
    , UriMimeGlob
    , Executable
    , Command
    , MimeMatch
    , Special
    , Mime
    , Arg
    }