Menu

Control_file_schema

Philip Kime Philipp Lehman
namespace bcf = "https://sourceforge.net/projects/biblatex"

start =
  element bcf:controlfile {
    # This is usually the same as the biblatex version string but not necessarily.
    # Sometimes the BCF format version doesn't change between biblatex releases
    attribute version { xsd:string {minLength="1"}},

    # "Global" Biber options. It's not clear what a non-global biber option
    # would be but just in case, we have the option ...
    element bcf:options {
      attribute component { "biber" },
      attribute type { "global" },
      bblencoding,
      bibencoding,
      debug,
      mincrossrefs,
      sortcase,
      sortlocale?,
      sortupper
    },

    # Global BibLaTeX options. That is, options that apply to all
    # entrytypes (unless a more specifically scoped option is specified)
    element bcf:options {
      attribute component { "biblatex" },
      attribute type { "global" },
      alphaothers,
      labelalpha,
      labelnamespec,
      labelyear,
      labelyearspec,
      maxalphanames,
      maxbibnames,
      maxcitenames,
      maxitems,
      minalphanames,
      minbibnames,
      mincitenames,
      minitems,
      singletitle,
      sortalphaothers?,
      sortlos,
      uniquelist,
      uniquename,
      useauthor,
      useeditor,
      useprefix,
      usetranslator
    },

    # Per-entrytype BibLaTeX options
    element bcf:options {
      attribute component { "biblatex" },
      attribute type { xsd:NCName },
      alphaothers?,
      labelalpha?,
      labelnamespec?,
      labelyear?,
      labelyearspec?,
      maxalphanames?,
      maxbibnames?,
      maxcitenames?,
      maxitems?,
      minalphanames?,
      minbibnames?,
      mincitenames?,
      minitems?,
      singletitle?,
      skipbib?,
      skiplab?,
      skiplos?,
      sortalphaothers?,
      uniquelist?,
      uniquename?,
      useauthor?,
      useeditor?,
      useprefix?,
      usetranslator?
    }*,

    # Display modes for biblatexml
    element bcf:displaymodes {
      attribute type { xsd:NCName }?,
      element bcf:displaymode {
        element bcf:dtarget { "*" | xsd:string {minLength="1"}}+,
        element bcf:dmode {
          attribute order { xsd:integer },
          ("original" | "uniform" | "romanised"  | "translated")
        }+
      }+
    }+,


    # field/entrytype mapping
    element bcf:sourcemap {
      element bcf:maps {
        attribute datatype { "bibtex" | "biblatexml" | "ris" | "zoterordfxml" | "endnotexml" },
        attribute map_overwrite { "0" | "1" },
        map+
      }+
    }?,

    # labelalpha template specification
    element bcf:labelalphatemplate {
      attribute type { xsd:string }?, # per-type?
      element bcf:labelelement {
        attribute order { xsd:integer },
        element bcf:labelpart {          
          attribute final { "0" | "1" }?,
          attribute substring_width { xsd:integer | "v" | "vf" | "l" }?,
          attribute substring_fixed_threshold { xsd:integer }?,
          attribute substring_width_max { xsd:integer }?,
          attribute substring_side { "left" | "right" }?,
          attribute substring_compound { "0" | "1" }?,
          attribute ifnamecount { xsd:integer }?,
          attribute namecount { xsd:integer }?,
          xsd:string
        }+
      }+
    }*,

    # Cross-reference inheritance specifications
    element bcf:inheritance {
      # Defaults
      element bcf:defaults {
        # Whether to inherit all fields
        attribute inherit_all { "true" | "false" },
        # Should we overwrite the target field if it exists?
        attribute override_target { "true" | "false" },
        # Default inherit_all and override_target settings for entrytype source/target pairs
        element bcf:type_pair {
          attribute source { "*" | xsd:string {minLength="1"}},
          attribute target { "*" | xsd:string {minLength="1"}},
          attribute inherit_all { "true" | "false" }?,
          attribute override_target { "true" | "false" }?,
          empty
        }*
      },
      # An inheritance specification
      element bcf:inherit {
        # applies to these pairs of source/target entrytypes
        element bcf:type_pair {
          attribute source { "*" | xsd:string {minLength="1"}},
          attribute target { "*" | xsd:string {minLength="1"}},
          empty
        }+,
        # and here are the field specifications
        element bcf:field {
          (
            # either a "skip this field" specification
            # so we can say inherit all except certain fields OR ...
            (attribute source { xsd:string },
              attribute skip { "true" | "false" }) |
            # ... a source and target field with an optional override attribute
            (attribute source { xsd:string {minLength="1"}},
              attribute target { xsd:string {minLength="1"}},
              attribute override_target { "true" | "false" }?)
          ),
          empty
        }+
      }*
    },

    # Global sorting specification
    sorting,
    # Structure specification
    element bcf:structure {
      # Valid datetypes
      element bcf:datetypes {
        element bcf:datetype { xsd:NCName }+
      },
      # Valid entrytypes
      element bcf:entrytypes {
        element bcf:entrytype { xsd:NCName }+
      },
      # Entrytype and field alias specifications
      element bcf:aliases {
        element bcf:alias {
          (
            (
              # entrytype alias specification
              attribute type { "entrytype" },
              # alias name
              element bcf:name { xsd:NCName },
              # canonical name
              element bcf:realname { xsd:NCName },
              # Any other fields that need setting when resolving the alias
              # for example when "phdthesis" -> "thesis", we also need to set
              # "type" = "phdthesis"
              element bcf:field {
                attribute name { xsd:NCName },
                xsd:NCName
              }* ) |
            (
              # field alias specification
              attribute type { "field" },
              # alias name
              element bcf:name { xsd:NCName },
              # canonical name
              element bcf:realname { xsd:NCName }
            )
          )
        }+
      }?,
      # BibLaTeX field types. Biber uses this to determine how to output various types
      # to the .bbl
      element bcf:fields {
        element bcf:field {
          # fieldtype is "field" or "list"
          attribute fieldtype { "field" | "list" },
          # datatype of field content
          attribute datatype { "literal" | "datepart" | "name" | "key" | "entrykey" | "date" | "verbatim" | "integer" | "range" | "special" },
          # Are we allowed to output a null field value to the .bbl for this field?
          attribute nullok { "true" }?,
          # Should this field be skipped and not output to the .bbl?
          attribute skip_output { "true" }?,
          xsd:NCName
        }+
      },
      # Allowable fields for entrytypes
      # Only one specification per entrytype: even though it might be nice to have several 
      # so that one could share information, this would be hard to manage and confusing as it
      # not be visible in one place which fields were valid for an entrytype.
      element bcf:entryfields {
        (element bcf:entrytype { "ALL" } |
         element bcf:entrytype { xsd:NCName }+),
        (element bcf:field { "ALL" } |
         element bcf:field { xsd:NCName }+)
      }+,
      # Constraints on field (co-)existence and format
      element bcf:constraints {
        # Set of entrytypes that this constraint applies to
        # An entrytype can be specified in multiple constraints
        #
        # Special entrytype "ALL" can be used to cover, well, all entrytypes ...
        (element bcf:entrytype { "ALL" } |
         element bcf:entrytype { xsd:NCName }+),    
        # A constraint specification
        element bcf:constraint {
          (
            # Conditional constraints have an antecedent and consequent
            # both of which have a quantifier. This allows you to enforce
            # constraints like:
            #
            # if field a,b,c are all present then one of x,y,z must be
            # if one of field a,b,c are present then none of x,y,z must be
            # etc.
            (attribute type { "conditional" },
              element bcf:antecedent {
                attribute quant { "all" | "one" | "none"},
                element bcf:field { xsd:NCName }+
              },
              element bcf:consequent {
                attribute quant { "all" | "one" | "none"},
                element bcf:field { xsd:NCName }+
              }
            ) |
            # Datatype and format constraints
            (attribute type { "data" },
              # datespec is a BibLaTeX date range specification
              # range* attributes are for limiting integer type range
              attribute datatype { "integer" | "datespec" }?,
              attribute rangemin { xsd:int }?,
              attribute rangemax { xsd:int }?,                                      
              element bcf:field { xsd:NCName }+
            ) |
            # Mandatoriness constraints which say which fields must appear
            (attribute type { "mandatory" },
              (element bcf:field { xsd:NCName } |
                # An XOR set of fields so you can enforce:
                #
                # One (but not more) of fields a,b,c must exist
                element bcf:fieldxor {
                  element bcf:field {
                    attribute coerce { "true" }?,
                    xsd:NCName
                  }+
                } |
                # An OR set of fields so you can enforce:
                #
                # One (possibly more of fields a,b,c must exist
                element bcf:fieldor {
                  element bcf:field { xsd:NCName }+
                }
                )+
              )
            )
          }*
        }+
      }?,
      # Section specifications
      secspec+
    }

sorting = 
  element bcf:sorting {
    # presort default strings for different entry types
    element bcf:presort {
      attribute type { xsd:NCName }?,
      text
    }+,
    # excludes of certain fields for sorting for specified types
    element bcf:sortexclusion {
      attribute type { text },
      element bcf:exclusion { xsd:NCName }+
    }*,
    sort+
  }

sort =
  # sort specification
  element bcf:sort {
    # order of this specification in the set of all sort specifications
    attribute order { xsd:integer },
    # Should we stop generating sorting information after this item?
    attribute final { xsd:integer }?,
    # Sort ascending or descending
    attribute sort_direction { "ascending" | "descending" }?,
    # Sort case sensitive or not?
    attribute sortcase { "0" | "1" }?,
    # Sort upper before lower?
    attribute sortupper { "0" | "1" }?,
    # A sort item specification - a field or pseudo-field to get sort information from
    element bcf:sortitem {
      # order of this item in the set of all other item specifications
      attribute order { xsd:integer },
      # Just use a part of the item information for sorting?
      attribute substring_side { "left" | "right" }?,
      attribute substring_width { xsd:integer }?,
      # Pad the item information when sorting with it?
      attribute pad_side { "left" | "right" }?,
      attribute pad_width { xsd:integer }?,
      attribute pad_char { xsd:string { minLength = "1" maxLength = "1" } }?,
      text
    }+
  }+

# Section specification
secspec =
  # data sources
  element bcf:bibdata {
    # which sections the datafiles are for
    attribute section { xsd:integer },
    element bcf:datasource {
      attribute type { "file" },
      attribute datatype { "bibtex" | "biblatexml" | "ris" | "zoterordfxml" | "endnotexml" }?,
      xsd:anyURI
    }*
  }?,
  # citekeys or citekey sets in each section
  element bcf:section {
    attribute number { xsd:integer },
    element bcf:citekey {
      ( attribute type { "set" },
        attribute members { xsd:string {minLength="1"}},
        xsd:string {minLength="1"}) |
      xsd:string {minLength="1"}
    }*,
    element bcf:sectionlist {
      attribute label { xsd:string {minLength="1"}},
      attribute type { "entry" | "key" | "shorthand" },
      (filter | orfilter )*,
      element bcf:sorting {
        sort+
      }?
    }*
  }

orfilter = element bcf:orfilter {
             filter+
           }

filter = element bcf:filter {
           attribute type { "type" | "nottype" | "subtype" | "notsubtype"
                         | "keyword" | "notkeyword" | "field" | "notfield" },
           xsd:string {minLength="1"}
         }


# option definitions
useprefix =
  element bcf:option {
    attribute type { "singlevalued" },
    element bcf:key { "useprefix" },
    element bcf:value { "0" | "1" }
  }
useauthor =
  element bcf:option {
    attribute type { "singlevalued" },
    element bcf:key { "useauthor" },
    element bcf:value { "0" | "1" }
  }
useeditor =
  element bcf:option {
    attribute type { "singlevalued" },
    element bcf:key { "useeditor" },
    element bcf:value { "0" | "1" }
  }
usetranslator =
  element bcf:option {
    attribute type { "singlevalued" },
    element bcf:key { "usetranslator" },
    element bcf:value { "0" | "1" }
  }
labelalpha =
  element bcf:option {
    attribute type { "singlevalued" },
    element bcf:key { "labelalpha" },
    element bcf:value { "0" | "1" }
  }
labelyear =
  element bcf:option {
    attribute type { "singlevalued" },
    element bcf:key { "labelyear" },
    element bcf:value { "0" | "1" }
  }
labelyearspec =
  element bcf:option {
    attribute type { "multivalued" },
    element bcf:key { "labelyearspec" },
    element bcf:value {
      attribute order { xsd:integer },
      xsd:NCName
    }+
  }
singletitle =
  element bcf:option {
    attribute type { "singlevalued" },
    element bcf:key { "singletitle" },
    element bcf:value { "0" | "1" }
  }
skipbib =
  element bcf:option {
    attribute type { "singlevalued" },
    element bcf:key { "skipbib" },
    element bcf:value { "0" | "1" }
  }
skiplab =
  element bcf:option {
    attribute type { "singlevalued" },
    element bcf:key { "skiplab" },
    element bcf:value { "0" | "1" }
  }
skiplos =
  element bcf:option {
    attribute type { "singlevalued" },
    element bcf:key { "skiplos" },
    element bcf:value { "0" | "1" }
  }
# 0 = do not provide uniquelist information
# 1 = disambiguate lists regardless of year
# 2 = disambiguate lists only when year is the same
uniquelist =
  element bcf:option {
    attribute type { "singlevalued" },
    element bcf:key { "uniquelist" },
    element bcf:value { "0" | "1" | "2" }
  }
# 0 = do not provide uniquename information
# 1 = disambiguate with initials, only up to maxcitenames/uniquelist
# 2 = disambiguate with full name or initials, only up to maxcitenames/uniquelist
# 3 = disambiguate with initials, ignore maxcitenames/uniquelist
# 4 = disambiguate with full name or initials, ignore maxcitenames/uniquelist
# 5 = disambiguate with initials, only between identical lists in different entries
# 6 = disambiguate with full name or initials, only between identical lists in different entries
uniquename =
  element bcf:option {
    attribute type { "singlevalued" },
    element bcf:key { "uniquename" },
    element bcf:value { "0" | "1" | "2" | "3" | "4" | "5" | "6" }
  }
maxitems =
  element bcf:option {
    attribute type { "singlevalued" },
    element bcf:key { "maxitems" },
    element bcf:value { xsd:integer }
  }
maxbibnames =
  element bcf:option {
    attribute type { "singlevalued" },
    element bcf:key { "maxbibnames" },
    element bcf:value { xsd:integer }
  }
maxalphanames =
  element bcf:option {
    attribute type { "singlevalued" },
    element bcf:key { "maxalphanames" },
    element bcf:value { xsd:integer }
  }
maxcitenames =
  element bcf:option {
    attribute type { "singlevalued" },
    element bcf:key { "maxcitenames" },
    element bcf:value { xsd:integer }
  }
minitems =
  element bcf:option {
    attribute type { "singlevalued" },
    element bcf:key { "minitems" },
    element bcf:value { xsd:integer }
  }
minbibnames =
  element bcf:option {
    attribute type { "singlevalued" },
    element bcf:key { "minbibnames" },
    element bcf:value { xsd:integer }
  }
minalphanames =
  element bcf:option {
    attribute type { "singlevalued" },
    element bcf:key { "minalphanames" },
    element bcf:value { xsd:integer }
  }
mincitenames =
  element bcf:option {
    attribute type { "singlevalued" },
    element bcf:key { "mincitenames" },
    element bcf:value { xsd:integer }
  }
sortlos =
  element bcf:option {
    attribute type { "singlevalued" },
    element bcf:key { "sortlos" },
    element bcf:value { "0" | "1" }
  }
labelnamespec =
  element bcf:option {
    attribute type { "multivalued" },
    element bcf:key { "labelnamespec" },
    element bcf:value {
      attribute order { xsd:integer },
      xsd:NCName
    }+
  }
mincrossrefs =
  element bcf:option {
    attribute type { "singlevalued" },
    element bcf:key { "mincrossrefs" },
    element bcf:value { xsd:integer }
  }
debug =
  element bcf:option {
    attribute type { "singlevalued" },
    element bcf:key { "debug" },
    element bcf:value { "0" | "1" }
  }
wrapline =
  element bcf:option {
    attribute type { "singlevalued" },
    element bcf:key { "wrapline" },
    element bcf:value { xsd:integer }
  }  
bblencoding =
  element bcf:option {
    attribute type { "singlevalued" },
    element bcf:key { "bblencoding" },
    element bcf:value { xsd:NCName }
  }
bibencoding =
  element bcf:option {
    attribute type { "singlevalued" },
    element bcf:key { "bibencoding" },
    element bcf:value { xsd:NCName }
  }
sortcase =
  element bcf:option {
    attribute type { "singlevalued" },
    element bcf:key { "sortcase" },
    element bcf:value { "0" | "1" }
  }
alphaothers =
  element bcf:option {
    attribute type { "singlevalued" },
    element bcf:key { "alphaothers" },
    element bcf:value {
      xsd:normalizedString { pattern = "\S+" }
    }
  }
# This is xsd:language but also allows underscore separators
sortlocale = 
  element bcf:option {
    attribute type { "singlevalued" },
    element bcf:key { "sortlocale" },
    element bcf:value {
      xsd:normalizedString { pattern = "([a-zA-Z]{2}|[iI][\-_][a-zA-Z]+|[xX][\-_][a-zA-Z]{1,10})([\-_][a-zA-Z]{1,10})*"
      }
    }
  }
sortupper = 
  element bcf:option {
    attribute type { "singlevalued" },
    element bcf:key { "sortupper" },
    element bcf:value { "0" | "1" }
  }
sortalphaothers =
  element bcf:option {
    attribute type { "singlevalued" },
    element bcf:key { "sortalphaothers" },
    element bcf:value {
      xsd:normalizedString { pattern = "\S+" }
    }
  }

map =
  element bcf:map {
    attribute map_overwrite { "0" | "1" }?,
    element bcf:per_datasource { xsd:string {minLength="1"} }*,
    element bcf:per_type { xsd:string {minLength="1"} }*,
    element bcf:map_step {
      (
        (
          attribute map_type_source { xsd:string {minLength="1"} },
          attribute map_type_target { xsd:string {minLength="1"} }?,
          attribute map_final { "1" }?
        ) |
        (
          attribute map_field_source { xsd:string {minLength="1"} },
          attribute map_field_target { xsd:string {minLength="1"} }?,
          attribute map_final { "1" }?,
          attribute map_match { xsd:string {minLength="1"} }?,
          attribute map_replace { xsd:string {minLength="1"} }?
        ) |
        (
          attribute map_field_set { xsd:string {minLength="1"} },
          ( attribute map_null { "1" } |
            attribute map_origfield { "1" } |
            attribute map_origfieldval { "1" } |
            attribute map_origentrytype { "1" } |
            attribute map_field_value { xsd:string {minLength="1"} } )
        )
      ),
      empty
    }+
  }

Related

Wiki: Control_File
Wiki: Inheritance