Module: Jekyll::Scholar::Utilities
- Included in:
- BibTeXConverter, BibTeXTag, BibliographyCountTag, BibliographyTag, CiteDetailsTag, CiteTag, Details, DetailsGenerator, QuoteTag, ReferenceTag
- Defined in:
- lib/jekyll/scholar/utilities.rb
Overview
Utility methods used by several Scholar plugins. The methods in this module may depend on the presence of #config, #bibtex_files, and #site readers
Instance Attribute Summary collapse
-
#config ⇒ Object
readonly
Returns the value of attribute config.
-
#context ⇒ Object
readonly
Returns the value of attribute context.
-
#max ⇒ Object
readonly
Returns the value of attribute max.
-
#offset ⇒ Object
readonly
Returns the value of attribute offset.
-
#prefix ⇒ Object
readonly
Returns the value of attribute prefix.
-
#site ⇒ Object
readonly
Returns the value of attribute site.
-
#text ⇒ Object
readonly
Returns the value of attribute text.
Instance Method Summary collapse
- #allow_locale_overrides? ⇒ Boolean
- #base_url ⇒ Object
- #bibliography ⇒ Object
- #bibliography_list_tag ⇒ Object
- #bibliography_tag(entry, index) ⇒ Object
- #bibliography_template ⇒ Object
-
#bibtex_file ⇒ Object
:nodoc: backwards compatibility.
- #bibtex_files ⇒ Object
- #bibtex_filters ⇒ Object
- #bibtex_options ⇒ Object
-
#bibtex_path ⇒ Object
:nodoc: backwards compatibility.
- #bibtex_paths ⇒ Object
- #citation_item_for(entry, citation_number = nil) ⇒ Object
- #citation_number(key) ⇒ Object
- #cite(keys) ⇒ Object
- #cite_details(key, text) ⇒ Object
- #cited_entries ⇒ Object
- #cited_keys ⇒ Object
- #cited_only? ⇒ Boolean
- #cited_references ⇒ Object
- #content_tag(name, content_or_attributes, attributes = {}) ⇒ Object
- #details_link_for(entry, base = base_url) ⇒ Object
- #details_path ⇒ Object
- #entries ⇒ Object
- #extend_path(name) ⇒ Object
- #generate_details? ⇒ Boolean
- #group(ungrouped) ⇒ Object
- #group? ⇒ Boolean
- #group_by ⇒ Object
- #group_compare(key, v1, v2) ⇒ Object
- #group_keys ⇒ Object
- #group_name(key, value) ⇒ Object
- #group_order ⇒ Object
- #group_order=(value) ⇒ Object
- #group_tags ⇒ Object
- #group_value(key, item) ⇒ Object
- #grouper(items, keys, order) ⇒ Object
- #interpolate(string) ⇒ Object
- #join_strings? ⇒ Boolean
- #keys ⇒ Object
- #labels ⇒ Object
- #limit_entries? ⇒ Boolean
- #link_target_for(key) ⇒ Object
- #link_to(href, content, attributes = {}) ⇒ Object
- #liquid_template ⇒ Object
- #liquidify(entry) ⇒ Object
- #load_repository ⇒ Object
- #load_style(uri) ⇒ Object
- #locales(lang) ⇒ Object
- #locators ⇒ Object
- #match_fields ⇒ Object
- #missing_reference ⇒ Object
- #month_names ⇒ Object
- #optparse(arguments) ⇒ Object
- #query ⇒ Object
- #reference_data(entry, index = nil) ⇒ Object
- #reference_tag(entry, index = nil) ⇒ Object
- #reference_tagname ⇒ Object
- #relative ⇒ Object
- #remove_duplicates? ⇒ Boolean
- #render_bibliography(entry, index = nil) ⇒ Object
- #render_citation(items) ⇒ Object
- #renderer(force = false) ⇒ Object
- #replace_strings? ⇒ Boolean
- #repository ⇒ Object
- #repository? ⇒ Boolean
- #repository_file_delimiter ⇒ Object
- #repository_link_for(entry, base = base_url) ⇒ Object
- #repository_links_for(entry, base = base_url) ⇒ Object
- #repository_path ⇒ Object
- #scholar_source ⇒ Object
- #set_context_to(context) ⇒ Object
- #skip_sort? ⇒ Boolean
- #sort(unsorted) ⇒ Object
- #sort_keys ⇒ Object
- #sort_order ⇒ Object
- #split_arguments(arguments) ⇒ Object
- #style ⇒ Object
- #styles(style) ⇒ Object
- #suppress_author? ⇒ Boolean
- #type_aliases ⇒ Object
- #type_names ⇒ Object
- #type_order ⇒ Object
- #update_dependency_tree ⇒ Object
Instance Attribute Details
#config ⇒ Object (readonly)
Returns the value of attribute config.
18 19 20 |
# File 'lib/jekyll/scholar/utilities.rb', line 18 def config @config end |
#context ⇒ Object (readonly)
Returns the value of attribute context.
18 19 20 |
# File 'lib/jekyll/scholar/utilities.rb', line 18 def context @context end |
#max ⇒ Object (readonly)
Returns the value of attribute max.
18 19 20 |
# File 'lib/jekyll/scholar/utilities.rb', line 18 def max @max end |
#offset ⇒ Object (readonly)
Returns the value of attribute offset.
18 19 20 |
# File 'lib/jekyll/scholar/utilities.rb', line 18 def offset @offset end |
#prefix ⇒ Object (readonly)
Returns the value of attribute prefix.
18 19 20 |
# File 'lib/jekyll/scholar/utilities.rb', line 18 def prefix @prefix end |
#site ⇒ Object (readonly)
Returns the value of attribute site.
18 19 20 |
# File 'lib/jekyll/scholar/utilities.rb', line 18 def site @site end |
#text ⇒ Object (readonly)
Returns the value of attribute text.
18 19 20 |
# File 'lib/jekyll/scholar/utilities.rb', line 18 def text @text end |
Instance Method Details
#allow_locale_overrides? ⇒ Boolean
124 125 126 |
# File 'lib/jekyll/scholar/utilities.rb', line 124 def allow_locale_overrides? !!config['allow_locale_overrides'] end |
#base_url ⇒ Object
628 629 630 |
# File 'lib/jekyll/scholar/utilities.rb', line 628 def base_url @base_url ||= site.config['baseurl'] || site.config['base_url'] || '' end |
#bibliography ⇒ Object
176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 |
# File 'lib/jekyll/scholar/utilities.rb', line 176 def bibliography unless @bibliography @bibliography = BibTeX::Bibliography.parse( bibtex_paths.reduce('') { |s, p| s << IO.read(p) }, ) @bibliography.replace_strings if replace_strings? @bibliography.join if join_strings? && replace_strings? end # Remove duplicate entries @bibliography.uniq!(*match_fields) if remove_duplicates? @bibliography end |
#bibliography_list_tag ⇒ Object
116 117 118 119 120 121 122 |
# File 'lib/jekyll/scholar/utilities.rb', line 116 def bibliography_list_tag if @bibliography_list_tag.nil? config['bibliography_list_tag'] else @bibliography_list_tag end end |
#bibliography_tag(entry, index) ⇒ Object
496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 |
# File 'lib/jekyll/scholar/utilities.rb', line 496 def bibliography_tag(entry, index) return missing_reference unless entry tmp = liquid_template.render( reference_data(entry,index) .merge(site.site_payload) .merge({ 'index' => index, 'details' => details_link_for(entry) }), { :registers => { :site => site }, :filters => [Jekyll::Filters] } ) # process the generated reference with Liquid, to get the same behaviour as # when it is used on a page Liquid::Template.parse(tmp).render( site.site_payload, { :registers => { :site => site }, :filters => [Jekyll::Filters] } ) end |
#bibliography_template ⇒ Object
476 477 478 |
# File 'lib/jekyll/scholar/utilities.rb', line 476 def bibliography_template @bibliography_template || config['bibliography_template'] end |
#bibtex_file ⇒ Object
:nodoc: backwards compatibility
151 152 153 |
# File 'lib/jekyll/scholar/utilities.rb', line 151 def bibtex_file bibtex_files[0] end |
#bibtex_files ⇒ Object
141 142 143 144 145 146 147 148 |
# File 'lib/jekyll/scholar/utilities.rb', line 141 def bibtex_files if config['bibliography'].include? '*' @bibtex_files ||= Dir.glob(File.join(config["source"], config['bibliography'])).collect do |f| Pathname(f).relative_path_from(Pathname(config['source'])).to_s end end @bibtex_files ||= [config['bibliography']] end |
#bibtex_filters ⇒ Object
160 161 162 |
# File 'lib/jekyll/scholar/utilities.rb', line 160 def bibtex_filters config['bibtex_filters'] ||= [] end |
#bibtex_options ⇒ Object
155 156 157 158 |
# File 'lib/jekyll/scholar/utilities.rb', line 155 def @bibtex_options ||= (config['bibtex_options'] || {}).symbolize_keys end |
#bibtex_path ⇒ Object
:nodoc: backwards compatibility
172 173 174 |
# File 'lib/jekyll/scholar/utilities.rb', line 172 def bibtex_path bibtex_paths[0] end |
#bibtex_paths ⇒ Object
164 165 166 167 168 169 |
# File 'lib/jekyll/scholar/utilities.rb', line 164 def bibtex_paths @bibtex_paths ||= bibtex_files.map { |file| interpolated_file = interpolate file extend_path interpolated_file } end |
#citation_item_for(entry, citation_number = nil) ⇒ Object
671 672 673 674 675 676 677 |
# File 'lib/jekyll/scholar/utilities.rb', line 671 def citation_item_for(entry, citation_number = nil) CiteProc::CitationItem.new id: entry.id do |c| c.data = CiteProc::Item.new entry.to_citeproc c.data[:'citation-number'] = citation_number c.data.suppress! 'author' if end end |
#citation_number(key) ⇒ Object
683 684 685 |
# File 'lib/jekyll/scholar/utilities.rb', line 683 def citation_number(key) (context['citation_numbers'] ||= {})[key] ||= cited_keys.length end |
#cite(keys) ⇒ Object
691 692 693 694 695 696 697 698 699 700 701 702 |
# File 'lib/jekyll/scholar/utilities.rb', line 691 def cite(keys) items = keys.map do |key| if bibliography.key?(key) entry = bibliography[key] entry = entry.convert(*bibtex_filters) unless bibtex_filters.empty? else return missing_reference end end link_to link_target_for(keys[0]), render_citation(items), {class: config['cite_class']} end |
#cite_details(key, text) ⇒ Object
704 705 706 707 708 709 710 |
# File 'lib/jekyll/scholar/utilities.rb', line 704 def cite_details(key, text) if bibliography.key?(key) link_to details_link_for(bibliography[key]), text || config['details_link'] else missing_reference end end |
#cited_entries ⇒ Object
798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 |
# File 'lib/jekyll/scholar/utilities.rb', line 798 def cited_entries items = entries if cited_only? items = if skip_sort? cited_references.uniq.map do |key| items.detect { |e| e.key == key } end else entries.select do |e| cited_references.include? e.key end end # See #90 cited_keys.clear end items end |
#cited_keys ⇒ Object
679 680 681 |
# File 'lib/jekyll/scholar/utilities.rb', line 679 def cited_keys context['cited'] = context.environments.first['page']['cited'] ||= [] end |
#cited_only? ⇒ Boolean
419 420 421 |
# File 'lib/jekyll/scholar/utilities.rb', line 419 def cited_only? !!@cited end |
#cited_references ⇒ Object
732 733 734 |
# File 'lib/jekyll/scholar/utilities.rb', line 732 def cited_references context && cited_keys end |
#content_tag(name, content_or_attributes, attributes = {}) ⇒ Object
712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 |
# File 'lib/jekyll/scholar/utilities.rb', line 712 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 attributes = attributes.map { |k,v| %Q(#{k}="#{v}") } if content.nil? "<#{[name, attributes].flatten.compact.join(' ')}/>" else "<#{[name, attributes].flatten.compact.join(' ')}>#{content}</#{name}>" end end |
#details_link_for(entry, base = base_url) ⇒ Object
594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 |
# File 'lib/jekyll/scholar/utilities.rb', line 594 def details_link_for(entry, base = base_url) # Expand the details_permalink template into the complete URL for this entry. # First generate placeholders for all items in the bibtex entry url_placeholders = {} entry.fields.each_pair do |k, v| value = v.to_s.dup value = Jekyll::Utils::slugify(value, :mode => 'pretty') unless k == :doi url_placeholders[k] = value end # Maintain the same URLs are previous versions of jekyll-scholar by replicating the way that it # processed the key. url_placeholders[:key] = entry.key.to_s.gsub(/[:\s]+/, '_') url_placeholders[:details_dir] = details_path # Autodetect the appropriate file extension based upon the site config, using the same rules as # previous versions of jekyll-scholar. Uses can override these settings by defining a details_permalink # without the :extension field. if (site.config['permalink'] == 'pretty') || (site.config['permalink'].end_with? '/') url_placeholders[:extension] = '/' else url_placeholders[:extension] = '.html' end # Overwrite the 'doi' key with the citation key if the DOI field is empty or missing if !entry.has_field?('doi') || entry.doi.empty? url_placeholders[:doi] = url_placeholders[:key] end # generate the URL URL.new( :template => config['details_permalink'], :placeholders => url_placeholders ).to_s end |
#details_path ⇒ Object
632 633 634 |
# File 'lib/jekyll/scholar/utilities.rb', line 632 def details_path config['details_dir'] end |
#entries ⇒ Object
196 197 198 |
# File 'lib/jekyll/scholar/utilities.rb', line 196 def entries sort bibliography[query || config['query']].select { |x| x.instance_of? BibTeX::Entry} end |
#extend_path(name) ⇒ Object
427 428 429 430 431 432 433 434 435 436 437 438 439 |
# File 'lib/jekyll/scholar/utilities.rb', line 427 def extend_path(name) if name.nil? || name.empty? name = config['bibliography'] end # Return as is if it is an absolute path # Improve by using Pathname from stdlib? return name if name.start_with?('/') && File.exists?(name) name = File.join scholar_source, name name << '.bib' if File.extname(name).empty? && !File.exists?(name) name end |
#generate_details? ⇒ Boolean
571 572 573 |
# File 'lib/jekyll/scholar/utilities.rb', line 571 def generate_details? site.layouts.key?(File.basename(config['details_layout'], '.html')) end |
#group(ungrouped) ⇒ Object
257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 |
# File 'lib/jekyll/scholar/utilities.rb', line 257 def group(ungrouped) def grouper(items, keys, order) groups = items.group_by do |item| group_value(keys.first, item) end if keys.count == 1 groups else groups.merge(groups) do |key, items| grouper(items, keys.drop(1), order.drop(1)) end end end grouper(ungrouped, group_keys, group_order) end |
#group? ⇒ Boolean
253 254 255 |
# File 'lib/jekyll/scholar/utilities.rb', line 253 def group? group_by != 'none' end |
#group_by ⇒ Object
249 250 251 |
# File 'lib/jekyll/scholar/utilities.rb', line 249 def group_by @group_by = interpolate(@group_by) || config['group_by'] end |
#group_compare(key, v1, v2) ⇒ Object
296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 |
# File 'lib/jekyll/scholar/utilities.rb', line 296 def group_compare(key,v1,v2) case key when 'type' o1 = type_order.find_index(v1) o2 = type_order.find_index(v2) if o1.nil? && o2.nil? 0 elsif o1.nil? 1 elsif o2.nil? -1 else o1 <=> o2 end else v1 <=> v2 end end |
#group_keys ⇒ Object
276 277 278 279 280 281 282 283 |
# File 'lib/jekyll/scholar/utilities.rb', line 276 def group_keys return @group_keys unless @group_keys.nil? @group_keys = Array(group_by) .map { |key| key.to_s.split(/\s*,\s*/) } .flatten .map { |key| key == 'month' ? 'month_numeric' : key } end |
#group_name(key, value) ⇒ Object
339 340 341 342 343 344 345 346 347 348 |
# File 'lib/jekyll/scholar/utilities.rb', line 339 def group_name(key,value) case key when 'type' type_names[value] || value.to_s when 'month_numeric' month_names[value] || "(unknown)" else value.to_s end end |
#group_order ⇒ Object
285 286 287 288 |
# File 'lib/jekyll/scholar/utilities.rb', line 285 def group_order self.group_order = config['group_order'] if @group_order.nil? @group_order end |
#group_order=(value) ⇒ Object
290 291 292 293 294 |
# File 'lib/jekyll/scholar/utilities.rb', line 290 def group_order=(value) @group_order = Array(value) .map { |key| key.to_s.split(/\s*,\s*/) } .flatten end |
#group_tags ⇒ Object
331 332 333 334 335 336 337 |
# File 'lib/jekyll/scholar/utilities.rb', line 331 def return @group_tags unless @group_tags.nil? @group_tags = Array(config['bibliography_group_tag']) .map { |key| key.to_s.split(/\s*,\s*/) } .flatten end |
#group_value(key, item) ⇒ Object
315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 |
# File 'lib/jekyll/scholar/utilities.rb', line 315 def group_value(key,item) case key when 'type' type_aliases[item.type.to_s] || item.type.to_s else value = item[key] if value.numeric? value.to_i elsif value.date? value.to_date else value.to_s end end end |
#grouper(items, keys, order) ⇒ Object
258 259 260 261 262 263 264 265 266 267 268 269 270 |
# File 'lib/jekyll/scholar/utilities.rb', line 258 def grouper(items, keys, order) groups = items.group_by do |item| group_value(keys.first, item) end if keys.count == 1 groups else groups.merge(groups) do |key, items| grouper(items, keys.drop(1), order.drop(1)) end end end |
#interpolate(string) ⇒ Object
745 746 747 748 749 750 751 |
# File 'lib/jekyll/scholar/utilities.rb', line 745 def interpolate(string) return unless string string.gsub(/{{\s*([\w\.]+)\s*}}/) do |match| context[$1] || match end end |
#join_strings? ⇒ Boolean
415 416 417 |
# File 'lib/jekyll/scholar/utilities.rb', line 415 def join_strings? config['join_strings'] end |
#keys ⇒ Object
736 737 738 739 740 741 742 743 |
# File 'lib/jekyll/scholar/utilities.rb', line 736 def keys # De-reference keys (in case they are variables) # We need to do this every time, to support for loops, # where the context can change for each invocation. Array(@keys).map do |key| context[key] || key end end |
#labels ⇒ Object
137 138 139 |
# File 'lib/jekyll/scholar/utilities.rb', line 137 def labels @labels ||= [] end |
#limit_entries? ⇒ Boolean
208 209 210 |
# File 'lib/jekyll/scholar/utilities.rb', line 208 def limit_entries? !offset.nil? || !max.nil? end |
#link_target_for(key) ⇒ Object
687 688 689 |
# File 'lib/jekyll/scholar/utilities.rb', line 687 def link_target_for(key) "#{relative}##{[prefix, key].compact.join('-')}" end |
#link_to(href, content, attributes = {}) ⇒ Object
728 729 730 |
# File 'lib/jekyll/scholar/utilities.rb', line 728 def link_to(href, content, attributes = {}) content_tag :a, content || href, attributes.merge(:href => href) end |
#liquid_template ⇒ Object
480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 |
# File 'lib/jekyll/scholar/utilities.rb', line 480 def liquid_template return @liquid_template if @liquid_template Liquid::Template.register_filter(Jekyll::Filters) tmp = bibliography_template case when tmp.nil?, tmp.empty? tmp = '{{reference}}' when site.layouts.key?(tmp) tmp = site.layouts[tmp].content end @liquid_template = Liquid::Template.parse(tmp) end |
#liquidify(entry) ⇒ Object
533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 |
# File 'lib/jekyll/scholar/utilities.rb', line 533 def liquidify(entry) e = {} e['key'] = entry.key e['type'] = entry.type.to_s if entry.field_names(config['bibtex_skip_fields']).empty? e['bibtex'] = entry.to_s({ quotes: config['bibtex_quotes'] }) else tmp = entry.dup config['bibtex_skip_fields'].each do |name| tmp.delete name if tmp.field?(name) end e['bibtex'] = tmp.to_s({ quotes: config['bibtex_quotes'] }) end entry.fields.each do |key, value| value = value.convert(*bibtex_filters) unless bibtex_filters.empty? e[key.to_s] = value.to_s if value.is_a?(BibTeX::Names) e["#{key}_array"] = arr = [] value.each.with_index do |name, idx| parts = {} name.each_pair do |k, v| e["#{key}_#{idx}_#{k}"] = v.to_s parts[k.to_s] = v.to_s end arr << parts end end end e end |
#load_repository ⇒ Object
384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 |
# File 'lib/jekyll/scholar/utilities.rb', line 384 def load_repository repo = Hash.new { |h,k| h[k] = {} } return repo unless repository? # ensure that the base directory format is literally # the same as the entries that are in the directory base = Dir[site.source][0] Dir[File.join(site.source, repository_path, '**/*')].each do |path| parts = Pathname(path).relative_path_from(Pathname(File.join(base, repository_path))) parts = parts.to_path.split(repository_file_delimiter, 2) repo[parts[0]][parts[1]] = Pathname(path).relative_path_from(Pathname(base)) end repo end |
#load_style(uri) ⇒ Object
759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 |
# File 'lib/jekyll/scholar/utilities.rb', line 759 def load_style(uri) begin style = CSL::Style.load uri rescue CSL::ParseError => error # Try to resolve local style paths # relative to Jekyll's source directory site_relative_style = File.join(site.source, uri) raise error unless File.exist?(site_relative_style) style = CSL::Style.load site_relative_style end if style.independent? style else style.independent_parent end end |
#locales(lang) ⇒ Object
782 783 784 |
# File 'lib/jekyll/scholar/utilities.rb', line 782 def locales(lang) LOCALES[lang] ||= CSL::Locale.load(lang) end |
#locators ⇒ Object
133 134 135 |
# File 'lib/jekyll/scholar/utilities.rb', line 133 def locators @locators ||= [] end |
#match_fields ⇒ Object
129 130 131 |
# File 'lib/jekyll/scholar/utilities.rb', line 129 def match_fields @match_fields ||= [] end |
#missing_reference ⇒ Object
468 469 470 |
# File 'lib/jekyll/scholar/utilities.rb', line 468 def missing_reference config['missing_reference'] end |
#month_names ⇒ Object
362 363 364 365 366 |
# File 'lib/jekyll/scholar/utilities.rb', line 362 def month_names return @month_names unless @month_names.nil? @month_names = config['month_names'].nil? ? Date::MONTHNAMES : config['month_names'].unshift(nil) end |
#optparse(arguments) ⇒ Object
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 |
# File 'lib/jekyll/scholar/utilities.rb', line 31 def optparse(arguments) return if arguments.nil? || arguments.empty? parser = OptionParser.new do |opts| opts.on('-c', '--cited') do |cited| @cited = true end opts.on('-C', '--cited_in_order') do |cited| @cited, @skip_sort = true, true end opts.on('-r', '--remove_duplicates [MATCH_FIELDS]') do |match_field| @remove_duplicates = true @match_fields = match_field.split(/,\s+/) if not match_field.nil? end opts.on('-A', '--suppress_author') do |cited| @suppress_author = true end opts.on('-f', '--file FILE') do |file| @bibtex_files ||= [] @bibtex_files << file end opts.on('-q', '--query QUERY') do |query| @query = query end opts.on('-h', '--bibliography_list_tag TAG') do |tag| @bibliography_list_tag = tag end opts.on('-p', '--prefix PREFIX') do |prefix| @prefix = prefix end opts.on('-t', '--text TEXT') do |text| @text = text end opts.on('-l', '--locator LOCATOR') do |locator| locators << locator end opts.on('-L', '--label LABEL') do |label| labels << label end opts.on('-o', '--offset OFFSET') do |offset| @offset = offset.to_i end opts.on('-m', '--max MAX') do |max| @max = max.to_i end opts.on('-s', '--style STYLE') do |style| @style = style end opts.on('-g', '--group_by GROUP') do |group_by| @group_by = group_by end opts.on('-G', '--group_order ORDER') do |group_order| self.group_order = group_order end opts.on('-O', '--type_order ORDER') do |type_order| @group_by = type_order end opts.on('-T', '--template TEMPLATE') do |template| @bibliography_template = template end end argv = arguments.split(/(\B-[cCfhqptTsgGOlLomAr]|\B--(?:cited(_in_order)?|bibliography_list_tag|file|query|prefix|text|style|group_(?:by|order)|type_order|template|locator|label|offset|max|suppress_author|remove_duplicates|))/) parser.parse argv.map(&:strip).reject(&:empty?) end |
#query ⇒ Object
192 193 194 |
# File 'lib/jekyll/scholar/utilities.rb', line 192 def query interpolate @query end |
#reference_data(entry, index = nil) ⇒ Object
522 523 524 525 526 527 528 529 530 531 |
# File 'lib/jekyll/scholar/utilities.rb', line 522 def reference_data(entry, index = nil) { 'entry' => liquidify(entry), 'reference' => reference_tag(entry, index), 'key' => entry.key, 'type' => entry.type.to_s, 'link' => repository_link_for(entry), 'links' => repository_links_for(entry) } end |
#reference_tag(entry, index = nil) ⇒ Object
454 455 456 457 458 459 460 461 462 |
# File 'lib/jekyll/scholar/utilities.rb', line 454 def reference_tag(entry, index = nil) return missing_reference unless entry entry = entry.convert(*bibtex_filters) unless bibtex_filters.empty? reference = render_bibliography entry, index content_tag reference_tagname, reference, :id => [prefix, entry.key].compact.join('-') end |
#reference_tagname ⇒ Object
472 473 474 |
# File 'lib/jekyll/scholar/utilities.rb', line 472 def reference_tagname config['reference_tagname'] || :span end |
#relative ⇒ Object
450 451 452 |
# File 'lib/jekyll/scholar/utilities.rb', line 450 def relative config['relative'] end |
#remove_duplicates? ⇒ Boolean
368 369 370 |
# File 'lib/jekyll/scholar/utilities.rb', line 368 def remove_duplicates? @remove_duplicates || config['remove_duplicates'] end |
#render_bibliography(entry, index = nil) ⇒ Object
656 657 658 659 660 661 662 663 664 665 666 667 668 669 |
# File 'lib/jekyll/scholar/utilities.rb', line 656 def render_bibliography(entry, index = nil) begin original_locale, renderer.locale = renderer.locale, locales(entry.language) rescue # Locale failed to load; just use original one! end if allow_locale_overrides? && entry['language'] != renderer.locale.language renderer.render citation_item_for(entry, index), styles(style).bibliography ensure renderer.locale = original_locale unless original_locale.nil? end |
#render_citation(items) ⇒ Object
643 644 645 646 647 648 649 650 651 652 653 654 |
# File 'lib/jekyll/scholar/utilities.rb', line 643 def render_citation(items) renderer.render items.zip(locators.zip(labels)).map { |entry, (locator, label)| cited_keys << entry.key cited_keys.uniq! item = citation_item_for entry, citation_number(entry.key) item.locator = locator item.label = label unless label.nil? item }, styles(style).citation end |
#renderer(force = false) ⇒ Object
636 637 638 639 640 641 |
# File 'lib/jekyll/scholar/utilities.rb', line 636 def renderer(force = false) return @renderer if @renderer && !force @renderer = CiteProc::Ruby::Renderer.new :format => 'html', :style => style, :locale => config['locale'] end |
#replace_strings? ⇒ Boolean
411 412 413 |
# File 'lib/jekyll/scholar/utilities.rb', line 411 def replace_strings? config['replace_strings'] end |
#repository ⇒ Object
380 381 382 |
# File 'lib/jekyll/scholar/utilities.rb', line 380 def repository @repository ||= load_repository end |
#repository? ⇒ Boolean
376 377 378 |
# File 'lib/jekyll/scholar/utilities.rb', line 376 def repository? !config['repository'].nil? && !config['repository'].empty? end |
#repository_file_delimiter ⇒ Object
407 408 409 |
# File 'lib/jekyll/scholar/utilities.rb', line 407 def repository_file_delimiter config['repository_file_delimiter'] end |
#repository_link_for(entry, base = base_url) ⇒ Object
575 576 577 578 579 580 581 582 583 584 |
# File 'lib/jekyll/scholar/utilities.rb', line 575 def repository_link_for(entry, base = base_url) name = entry.key.to_s.dup name.gsub!(/[:\s]+/, '_') links = repository[name] url = links['pdf'] || links['ps'] return unless url File.join(base, url) end |
#repository_links_for(entry, base = base_url) ⇒ Object
586 587 588 589 590 591 592 |
# File 'lib/jekyll/scholar/utilities.rb', line 586 def repository_links_for(entry, base = base_url) name = entry.key.to_s.dup name.gsub!(/[:\s]+/, '_') Hash[repository[name].map { |ext, url| [ext, File.join(base, url)] }] end |
#repository_path ⇒ Object
403 404 405 |
# File 'lib/jekyll/scholar/utilities.rb', line 403 def repository_path config['repository'] end |
#scholar_source ⇒ Object
441 442 443 444 445 446 447 448 |
# File 'lib/jekyll/scholar/utilities.rb', line 441 def scholar_source source = config['source'] # Improve by using Pathname from stdlib? return source if source.start_with?('/') && File.exists?(source) File.join site.source, source end |
#set_context_to(context) ⇒ Object
753 754 755 756 757 |
# File 'lib/jekyll/scholar/utilities.rb', line 753 def set_context_to(context) @context, @site, = context, context.registers[:site] config.merge!(site.config['scholar'] || {}) self end |
#skip_sort? ⇒ Boolean
423 424 425 |
# File 'lib/jekyll/scholar/utilities.rb', line 423 def skip_sort? @skip_sort || config['sort_by'] == 'none' end |
#sort(unsorted) ⇒ Object
212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 |
# File 'lib/jekyll/scholar/utilities.rb', line 212 def sort(unsorted) return unsorted if skip_sort? sorted = unsorted.sort do |e1, e2| sort_keys .map.with_index do |key, idx| v1 = e1[key].nil? ? BibTeX::Value.new : e1[key] v2 = e2[key].nil? ? BibTeX::Value.new : e2[key] if (sort_order[idx] || sort_order.last) =~ /^(desc|reverse)/i v2 <=> v1 else v1 <=> v2 end end .find { |c| c != 0 } || 0 end sorted end |
#sort_keys ⇒ Object
232 233 234 235 236 237 238 239 |
# File 'lib/jekyll/scholar/utilities.rb', line 232 def sort_keys return @sort_keys unless @sort_keys.nil? @sort_keys = Array(config['sort_by']) .map { |key| key.to_s.split(/\s*,\s*/) } .flatten .map { |key| key == 'month' ? 'month_numeric' : key } end |
#sort_order ⇒ Object
241 242 243 244 245 246 247 |
# File 'lib/jekyll/scholar/utilities.rb', line 241 def sort_order return @sort_order unless @sort_order.nil? @sort_order = Array(config['order']) .map { |key| key.to_s.split(/\s*,\s*/) } .flatten end |
#split_arguments(arguments) ⇒ Object
21 22 23 24 25 26 27 28 29 |
# File 'lib/jekyll/scholar/utilities.rb', line 21 def split_arguments(arguments) tokens = arguments.strip.split(/\s+/) args = tokens.take_while { |a| !a.start_with?('-') } opts = (tokens - args).join(' ') [args, opts] end |
#style ⇒ Object
464 465 466 |
# File 'lib/jekyll/scholar/utilities.rb', line 464 def style interpolate(@style)|| config['style'] end |
#styles(style) ⇒ Object
778 779 780 |
# File 'lib/jekyll/scholar/utilities.rb', line 778 def styles(style) STYLES[style] ||= load_style(style) end |
#suppress_author? ⇒ Boolean
372 373 374 |
# File 'lib/jekyll/scholar/utilities.rb', line 372 def !!@suppress_author end |
#type_aliases ⇒ Object
354 355 356 |
# File 'lib/jekyll/scholar/utilities.rb', line 354 def type_aliases @type_aliases ||= Scholar.defaults['type_aliases'].merge(config['type_aliases']) end |
#type_names ⇒ Object
358 359 360 |
# File 'lib/jekyll/scholar/utilities.rb', line 358 def type_names @type_names ||= Scholar.defaults['type_names'].merge(config['type_names']) end |
#type_order ⇒ Object
350 351 352 |
# File 'lib/jekyll/scholar/utilities.rb', line 350 def type_order @type_order ||= config['type_order'] end |
#update_dependency_tree ⇒ Object
786 787 788 789 790 791 792 793 794 795 796 |
# File 'lib/jekyll/scholar/utilities.rb', line 786 def update_dependency_tree # Add bibtex files to dependency tree if context.registers[:page] and context.registers[:page].key? "path" bibtex_paths.each do |bibtex_path| site.regenerator.add_dependency( site.in_source_dir(context.registers[:page]["path"]), bibtex_path ) end end end |