aboutsummaryrefslogtreecommitdiff
path: root/src/guff/blog-handler.cr
blob: 988eab51d068daefe6d5e398eedbf140095ffd78 (plain)
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
require "./handler"

module Guff
  class BlogHandler < Handler
    ROUTES = [{
      list: false,
      blog: true,
      re: %r{
        ^/

        # match YYYY/MM/DD/SLUG.html
        (?<year>\d{4})
        /
        (?<month>\d{2})
        /
        (?<day>\d{2})
        /
        (?<slug>[a-z0-9._-]+)
        \.html

        $
      }x,
    }, {
      list: true,
      blog: true,
      re: %r{
        ^/

        # match YYYY/MM/DD
        (?<year>\d{4})
        /
        (?<month>\d{2})
        /
        (?<day>\d{2})
        /?

        $
      }x,
    }, {
      list: true,
      blog: true,
      re: %r{
        ^/

        # match YYYY/MM
        (?<year>\d{4})
        /
        (?<month>\d{2})
        /?

        $
      }x,
    }, {
      list: true,
      blog: true,
      re: %r{
        ^/

        # match YYYY
        (?<year>\d{4})
        /?

        $
      }x,
    }, {
      list: false,
      blog: false,
      re: %r{
        ^/

        # match slug
        (?<slug>[a-z0-9._-]+)
        \.html

        $
      }x,
    }, {
      list: true,
      blog: true,
      re: %r{
        # match index
        ^/$
      }x,
    }]

    def call(context : HTTP::Server::Context)
      path = context.request.path || ""

      call_next(context) unless ROUTES.reduce(false) do |matched, route|
        unless matched
          if md = (route[:re] as Regex).match(path)
            # matched route
            matched = true

            context.response.puts "blog: route = %s, md = %s" % [
              route.to_s,
              md.to_s
            ]
          end
        end

        matched
      end
    end
  end
end