utilities.rb 2.94 KB
Newer Older
Sylvester Keil's avatar
Sylvester Keil committed
1
module Jekyll
2
  class Scholar
3

4 5 6 7
    # Utility methods used by several Scholar plugins. The methods in this
    # module may depend on the presence of #config, #bibtex_file, and
    # #site readers
    module Utilities
8

9
      attr_reader :bibtex_file, :config, :site
10

11 12 13
      def bibtex_options
        @bibtex_options ||= { :filter => :latex }
      end
14

15 16 17
      def bibtex_path
        @bibtex_path ||= extend_path(bibtex_file)
      end
18

19 20
      def bibliography
        @bibliography ||= BibTeX.open(bibtex_path, bibtex_options)
21 22
      end

23 24 25 26
      def entries
        b = bibliography[config['query']]

        unless config['sort_by'] == 'none'
27
          b = b.sort_by { |e| e[config['sort_by']].to_s }
28 29
          b.reverse! if config['order'] =~ /^(desc|reverse)/i
        end
30

31 32
        b
      end
33

34 35 36 37
      def extend_path(name)
        if name.nil? || name.empty?
          name = config['bibliography']
        end
38

39 40 41 42
        p = File.join(config['source'], name)
        p << '.bib' unless File.exists?(p)
        p
      end
43

44 45 46
      def generate_details?
        site.layouts.key?(File.basename(config['details_layout'], '.html'))
      end
47

48 49
      def details_file_for(entry)
        name = entry.key.to_s.dup
50

51
        name.gsub!(/[:\s]+/, '_')
52

53 54
        [name, 'html'].join('.')
      end
55

Sylvester Keil's avatar
Sylvester Keil committed
56
      def details_link_for(entry, base = base_url)
57
        File.join(base, details_path, details_file_for(entry))
Sylvester Keil's avatar
Sylvester Keil committed
58
      end
59

Sylvester Keil's avatar
Sylvester Keil committed
60
      def base_url
61
        @base_url ||= site.config['baseurl'] || site.config['base_url'] || ''
62
      end
63

64 65 66
      def details_path
        config['details_dir']
      end
67

Sylvester Keil's avatar
Sylvester Keil committed
68 69 70 71 72 73
      def cite(key)
        entry = bibliography[key]

        if bibliography.key?(key)
          citation = CiteProc.process entry.to_citeproc, :style => config['style'],
            :locale => config['locale'], :format => 'html', :mode => :citation
74

Sylvester Keil's avatar
Sylvester Keil committed
75 76 77 78
          link_to "##{entry.key}", citation.join
        else
          "(missing reference)"
        end
79 80
      rescue
        "(#{key})"
Sylvester Keil's avatar
Sylvester Keil committed
81
      end
Hiren Patel's avatar
Hiren Patel committed
82
      
83
      def cite_details(key, text)
Hiren Patel's avatar
Hiren Patel committed
84 85 86
        entry = bibliography[key]
      
        if bibliography.key?(key)
87
          link_to details_link_for(entry), text
Hiren Patel's avatar
Hiren Patel committed
88 89
        else
          "(missing reference)"
Hiren Patel's avatar
Hiren Patel committed
90 91
        end
      end
92

Sylvester Keil's avatar
Sylvester Keil committed
93 94 95 96 97 98
      def content_tag(name, content_or_attributes, attributes = {})
        if content_or_attributes.is_a?(Hash)
          content, attributes = nil, content_or_attributes
        else
          content = content_or_attributes
        end
99

Sylvester Keil's avatar
Sylvester Keil committed
100
        attributes = attributes.map { |k,v| %Q(#{k}="#{v}") }
101

Sylvester Keil's avatar
Sylvester Keil committed
102 103 104 105 106 107
        if content.nil?
          "<#{[name, attributes].flatten.compact.join(' ')}/>"
        else
          "<#{[name, attributes].flatten.compact.join(' ')}>#{content}</#{name}>"
        end
      end
108

Sylvester Keil's avatar
Sylvester Keil committed
109 110 111
      def link_to(href, content, attributes = {})
        content_tag :a, content || href, attributes.merge(:href => href)
      end
112

Sylvester Keil's avatar
Sylvester Keil committed
113 114 115 116
      def set_context_to(context)
        @site = context.registers[:site]
        config.merge!(site.config['scholar'] || {})
      end
117

118
    end
119

120
  end
Hiren Patel's avatar
Hiren Patel committed
121
end