Module: Jekyll::ServerSideRedirects::Apache

Defined in:
lib/jekyll-server-side-redirects/servers/apache.rb

Class Method Summary collapse

Class Method Details

.generate_htaccess(redirects_data) ⇒ Object



14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# File 'lib/jekyll-server-side-redirects/servers/apache.rb', line 14

def self.generate_htaccess(redirects_data)
    file_path = ".htaccess"
    existing_redirects = []

    if File.exist?(file_path)
        existing_redirects = parse_existing_redirects(file_path)
    end

    all_redirects = (existing_redirects + redirects_data).uniq { |r| r['source'] }

    File.open(file_path, "w") do |file|
        file.puts "# .htaccess file generated by Jekyll Server-Side Redirects"
        file.puts ""

        all_redirects.each do |redirect|
            file.puts "Redirect #{redirect['type']} #{redirect['source']} #{redirect['destination']}"
        end
    end
end

.generate_redirects(site) ⇒ Object



4
5
6
7
8
9
10
11
12
# File 'lib/jekyll-server-side-redirects/servers/apache.rb', line 4

def self.generate_redirects(site)
    redirects_data = []

    redirects_data += process_redirects(site.pages)
    redirects_data += process_redirects(site.posts.docs)
    generate_htaccess(redirects_data)

    redirects_data
end

.parse_existing_redirects(file_path) ⇒ Object



34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# File 'lib/jekyll-server-side-redirects/servers/apache.rb', line 34

def self.parse_existing_redirects(file_path)
    redirects = []

    File.readlines(file_path).each do |line|
        next unless line.strip.start_with?("Redirect")

        if line =~ /^Redirect\s+(\d{3})\s+(\S+)\s+(\S+)/
            type, source, destination = $1.to_i, $2, $3
            redirects << {
                'source' => source,
                'destination' => destination,
                'type' => type
            }
        end
    end

    redirects
end

.process_redirects(data) ⇒ Object



53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
# File 'lib/jekyll-server-side-redirects/servers/apache.rb', line 53

def self.process_redirects(data)
    redirects = []
    data.each do |item|
        next unless item.data['redirect_from']

        redirect_from = item.data['redirect_from']
        redirect_from = [redirect_from] unless redirect_from.is_a?(Array)

        redirect_from.each do |source|
            redirects << {
                'source' => source,
                'destination' => item.permalink,
                'type' => item.data['redirect_type'] || 301 
            }
        end
    end
    redirects
end