lib/asciidoctor-bibliography/options.rb in asciidoctor-bibliography-0.5.1 vs lib/asciidoctor-bibliography/options.rb in asciidoctor-bibliography-0.6.0

- old
+ new

@@ -12,10 +12,12 @@ "bibliography-style" => "apa", "bibliography-hyperlinks" => "true", "bibliography-order" => "alphabetical", # TODO: deprecate "bibliography-tex-style" => "authoryear", "bibliography-sort" => nil, + "bibliography-prepend-empty" => "true", + "bibliography-passthrough" => "false", }.freeze def initialize merge DEFAULTS end @@ -36,55 +38,55 @@ parse(tmp_reader, tmp_document, header_only: true). attributes end def style - # Error throwing delegated to CSL library. Seems to have nice messages. + # First we check whether an internal style exists to qualify its path. + if self["bibliography-style"] + filepath = File.join AsciidoctorBibliography.csl_styles_root, + self["bibliography-style"] + ".csl" + self["bibliography-style"] = filepath if File.exist? filepath + end + # Then error throwing is delegated to CSL library. self["bibliography-style"] || DEFAULTS["bibliography-style"] end def locale value = self["bibliography-locale"] || DEFAULTS["bibliography-locale"] - unless CSL::Locale.list.include? value - raise Errors::Options::Invalid, <<~MESSAGE - Option :bibliography-locale: has an invalid value (#{value}). - Allowed values are #{CSL::Locale.list.inspect}. - MESSAGE - end + raise_invalid <<~MESSAGE unless CSL::Locale.list.include? value + Option :bibliography-locale: has an invalid value (#{value}). + Allowed values are #{CSL::Locale.list.inspect}. + MESSAGE value end def hyperlinks? value = self["bibliography-hyperlinks"] || DEFAULTS["bibliography-hyperlinks"] - unless %w[true false].include? value - raise Errors::Options::Invalid, <<~MESSAGE - Option :bibliography-hyperlinks: has an invalid value (#{value}). - Allowed values are 'true' and 'false'. - MESSAGE - end + raise_invalid <<~MESSAGE unless %w[true false].include? value + Option :bibliography-hyperlinks: has an invalid value (#{value}). + Allowed values are 'true' and 'false'. + MESSAGE value == "true" end def database value = self["bibliography-database"] || DEFAULTS["bibliography-database"] - if value.nil? - raise Errors::Options::Missing, <<~MESSAGE - Option :bibliography-database: is mandatory. - A bibliographic database is required. - MESSAGE - end + raise Errors::Options::Missing, <<~MESSAGE if value.nil? + Option :bibliography-database: is mandatory. + A bibliographic database is required. + MESSAGE value end def sort begin value = YAML.safe_load self["bibliography-sort"].to_s rescue Psych::SyntaxError => psych_error - raise Errors::Options::Invalid, <<~MESSAGE + raise_invalid <<~MESSAGE Option :bibliography-sort: is not a valid YAML string: \"#{psych_error}\". MESSAGE end value = validate_parsed_sort_type! value @@ -92,36 +94,67 @@ value end def tex_style value = self["bibliography-tex-style"] || DEFAULTS["bibliography-tex-style"] - unless %w[authoryear numeric].include? value - raise Errors::Options::Invalid, <<~MESSAGE - Option :bibliography-tex-style: has an invalid value (#{value}). - Allowed values are 'authoryear' (default) and 'numeric'. - MESSAGE - end + raise_invalid <<~MESSAGE unless %w[authoryear numeric].include? value + Option :bibliography-tex-style: has an invalid value (#{value}). + Allowed values are 'authoryear' (default) and 'numeric'. + MESSAGE value end + def passthrough?(context) + # NOTE: allowed contexts are :citation and :reference + value = self["bibliography-passthrough"] || DEFAULTS["bibliography-passthrough"] + raise_invalid <<~MESSAGE unless %w[true citations references false].include? value + Option :bibliography-passthrough: has an invalid value (#{value}). + Allowed values are 'true', 'citations', 'references' and 'false'. + MESSAGE + + evaluate_ext_boolean_value_vs_context value: value, context: context + end + + def prepend_empty?(context) + # NOTE: allowed contexts are :citation and :reference + value = self["bibliography-prepend-empty"] || DEFAULTS["bibliography-prepend-empty"] + raise_invalid <<~MESSAGE unless %w[true citations references false].include? value + Option :bibliography-prepend-empty: has an invalid value (#{value}). + Allowed values are 'true', 'citations', 'references' and 'false'. + MESSAGE + + evaluate_ext_boolean_value_vs_context value: value, context: context + end + private + def evaluate_ext_boolean_value_vs_context(value:, context:) + return true if value.to_s == "true" + return false if value.to_s == "false" + return context.to_s == "citation" if value.to_s == "citations" + return context.to_s == "reference" if value.to_s == "references" + end + + def raise_invalid(message) + raise Errors::Options::Invalid, message + end + def validate_parsed_sort_type!(value) return value if value.nil? return value if value.is_a?(Array) && value.all? { |v| v.is_a? Hash } return [value] if value.is_a? Hash - raise Errors::Options::Invalid, <<~MESSAGE + raise_invalid <<~MESSAGE Option :bibliography-sort: has an invalid value (#{value}). Please refer to manual for more info. MESSAGE end def validate_parsed_sort_contents!(array) # TODO: should we restrict these? Double check the CSL spec. allowed_keys = %w[variable macro sort names-min names-use-first names-use-last] return array unless array.any? { |hash| (hash.keys - allowed_keys).any? } - raise Errors::Options::Invalid, <<~MESSAGE + raise_invalid <<~MESSAGE Option :bibliography-sort: has a value containing invalid keys (#{array}). Allowed keys are #{allowed_keys.inspect}. Please refer to manual for more info. MESSAGE end