summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/biblatex-contrib/biblatex-gb7714-2015/biblatex_check.py
diff options
context:
space:
mode:
Diffstat (limited to 'macros/latex/contrib/biblatex-contrib/biblatex-gb7714-2015/biblatex_check.py')
-rw-r--r--macros/latex/contrib/biblatex-contrib/biblatex-gb7714-2015/biblatex_check.py590
1 files changed, 0 insertions, 590 deletions
diff --git a/macros/latex/contrib/biblatex-contrib/biblatex-gb7714-2015/biblatex_check.py b/macros/latex/contrib/biblatex-contrib/biblatex-gb7714-2015/biblatex_check.py
deleted file mode 100644
index 7493f8878c..0000000000
--- a/macros/latex/contrib/biblatex-contrib/biblatex-gb7714-2015/biblatex_check.py
+++ /dev/null
@@ -1,590 +0,0 @@
-#!/usr/bin/env python
-
-"""
-BibLaTeX check on missing fields and consistent name conventions,
-especially developed for requirements in Computer Science.
-"""
-
-__author__ = "Pez Cuckow"
-__version__ = "0.1.4"
-__credits__ = ["Pez Cuckow", "BibTex Check 0.2.0 by Fabian Beck"]
-__license__ = "MIT"
-__email__ = "email<at>pezcuckow.com"
-
-####################################################################
-# Properties (please change according to your needs)
-####################################################################
-
-# links
-citeulikeUsername = "" # if no username is profided, no CiteULike links appear
-citeulikeHref = "http://www.citeulike.org/user/" + \
- citeulikeUsername + "/article/"
-
-libraries = [("Scholar", "http://scholar.google.de/scholar?hl=en&q="),
- ("Google", "https://www.google.com/search?q="),
- ("DBLP", "http://dblp.org/search/index.php#query="),
- ("IEEE", "http://ieeexplore.ieee.org/search/searchresult.jsp?queryText="),
- ("ACM", "http://dl.acm.org/results.cfm?query="),
- ]
-
-
-# fields that are required for a specific type of entry
-requiredFields = {"article": ["author", "title", "journaltitle/journal", "year/date"],
- "book": ["author", "title", "year/date"],
- "mvbook": "book",
- "inbook": ["author", "title", "booktitle", "year/date"],
- "bookinbook": "inbook",
- "suppbook": "inbook",
- "booklet": ["author/editor", "title", "year/date"],
- "collection": ["editor", "title", "year/date"],
- "mvcollection": "collection",
- "incollection": ["author", "title", "booktitle", "year/date"],
- "suppcollection": "incollection",
- "manual": ["author/editor", "title", "year/date"],
- "misc": ["author/editor", "title", "year/date"],
- "online": ["author/editor", "title", "year/date", "url"],
- "patent": ["author", "title", "number", "year/date"],
- "periodical": ["editor", "title", "year/date"],
- "suppperiodical": "article",
- "proceedings": ["title", "year/date"],
- "mvproceedings": "proceedings",
- "inproceedings": ["author", "title", "booktitle", "year/date"],
- "reference": "collection",
- "mvreference": "collection",
- "inreference": "incollection",
- "report": ["author", "title", "type", "institution", "year/date"],
- "thesis": ["author", "title", "type", "institution", "year/date"],
- "unpublished": ["author", "title", "year/date"],
-
- # semi aliases (differing fields)
- "mastersthesis": ["author", "title", "institution", "year/date"],
- "techreport": ["author", "title", "institution", "year/date"],
-
- # other aliases
- "conference": "inproceedings",
- "electronic": "online",
- "phdthesis": "mastersthesis",
- "www": "online",
- "school": "mastersthesis"
- }
-
-####################################################################
-#import os
-import string
-import re
-import sys
-from optparse import OptionParser
-
-# Parse options
-usage = sys.argv[
- 0] + " [-b|--bib=<input.bib>] [-a|--aux=<input.aux>] [-o|--output=<output.html>] [-v|--view] [-h|--help]"
-
-parser = OptionParser(usage)
-
-parser.add_option("-b", "--bib", dest="bibFile",
- help="Bib File", metavar="input.bib", default="input.bib")
-
-parser.add_option("-a", "--aux", dest="auxFile",
- help="Aux File", metavar="input.aux", default="references.aux")
-
-parser.add_option("-o", "--output", dest="htmlOutput",
- help="HTML Output File", metavar="output.html")
-
-parser.add_option("-v", "--view", dest="view", action="store_true",
- help="Open in Browser")
-
-parser.add_option("-N", "--no-console", dest="no_console", action="store_true",
- help="Do not print problems to console")
-
-(options, args) = parser.parse_args()
-
-# Backporting Python 3 open(encoding="utf-8") to Python 2
-# based on http://stackoverflow.com/questions/10971033/backporting-python-3-openencoding-utf-8-to-python-2
-
-if sys.version_info[0] > 2:
- # py3k
- pass
-else:
- # py2
- import codecs
- import warnings
- reload(sys)
- sys.setdefaultencoding('utf8')
- def open(file, mode='r', buffering=-1, encoding=None,
- errors=None, newline=None, closefd=True, opener=None):
- if newline is not None:
- warnings.warn('newline is not supported in py2')
- if not closefd:
- warnings.warn('closefd is not supported in py2')
- if opener is not None:
- warnings.warn('opener is not supported in py2')
- return codecs.open(filename=file, mode=mode, encoding=encoding,
- errors=errors, buffering=buffering)
-
-### End Backport ###
-
-print("INFO: Reading references from '" + options.bibFile + "'")
-try:
- fIn = open(options.bibFile, 'r', encoding="utf8")
-except IOError as e:
- print("ERROR: Input bib file '" + options.bibFile +
- "' doesn't exist or is not readable")
- sys.exit(-1)
-
-if options.no_console:
- print("INFO: Will surpress problems on console")
-
-if options.htmlOutput:
- print("INFO: Will output HTML to '" + options.htmlOutput + "'"
- + (" and auto open in the default web browser" if options.view else ""))
-else:#output a default file if -o option is not provided
- options.htmlOutput=options.bibFile.repalce('.bib','.html')
-
-# Filter by reference ID's that are used
-usedIds = set()
-if options.auxFile:
- print("INFO: Filtering by references found in '" + options.auxFile + "'")
- try:
- fInAux = open(options.auxFile, 'r', encoding="utf8")
- for line in fInAux:
- if line.startswith("\\citation"):
- ids = line.split("{")[1].rstrip("} \n").split(", ")
- for id in ids:
- if (id != ""):
- usedIds.add(id)
- fInAux.close()
- except IOError as e:
- print ("WARNING: Aux file '" + options.auxFile +
- "' doesn't exist -> not restricting entries")
-
-
-# Go through and check all references
-completeEntry = ""
-currentId = ""
-ids = []
-currentType = ""
-currentArticleId = ""
-currentTitle = ""
-fields = []
-problems = []
-subproblems = []
-
-counterMissingFields = 0
-counterFlawedNames = 0
-counterWrongTypes = 0
-counterNonUniqueId = 0
-counterWrongFieldNames = 0
-
-removePunctuationMap = dict((ord(char), None) for char in string.punctuation)
-
-for line in fIn:
- line = line.strip("\n")
- if line.startswith("@"):
- if currentId in usedIds or not usedIds:
- for fieldName, requiredFieldsType in requiredFields.items():
- if fieldName == currentType.lower():
- # alises use a string to point at another set of fields
- currentRequiredFields = requiredFieldsType
- while isinstance(currentRequiredFields, str):
- currentRequiredFields = requiredFields[currentRequiredFields] # resolve alias
-
- for requiredFieldsString in currentRequiredFields:
- # support for author/editor syntax
- typeFields = requiredFieldsString.split('/')
-
- # at least one the required fields is not found
- if set(typeFields).isdisjoint(fields):
- subproblems.append(
- "missing field '" + requiredFieldsString + "'")
- counterMissingFields += 1
- else:
- subproblems = []
-
- if currentId in usedIds or (currentId and not usedIds):
- cleanedTitle = currentTitle.translate(removePunctuationMap)
- problem = "<div id='" + currentId + \
- "' class='problem severe" + str(len(subproblems)) + "'>"
- problem += "<h2>" + currentId + " (" + currentType + ")</h2> "
- problem += "<div class='links'>"
- if citeulikeUsername:
- problem += "<a href='" + citeulikeHref + \
- currentArticleId + "' target='_blank'>CiteULike</a> |"
-
- list = []
- for name, site in libraries:
- list.append(
- " <a href='" + site + cleanedTitle + "' target='_blank'>" + name + "</a>")
- problem += " | ".join(list)
-
- problem += "</div>"
- problem += "<div class='reference'>" + currentTitle
- problem += "</div>"
- problem += "<ul>"
- for subproblem in subproblems:
- problem += "<li>" + subproblem + "</li>"
- if not options.no_console:
- print("PROBLEM: " + currentId + " - " + subproblem)
- problem += "</ul>"
- problem += "<form class='problem_control'><label>checked</label><input type='checkbox' class='checked'/></form>"
- problem += "<div class='bibtex_toggle'>Current BibLaTex Entry</div>"
- problem += "<div class='bibtex'>" + completeEntry + "</div>"
- problem += "</div>"
- problems.append(problem)
- fields = []
- subproblems = []
- currentId = line.split("{")[1].rstrip(",\n")
- if currentId in ids:
- subproblems.append("non-unique id: '" + currentId + "'")
- counterNonUniqueId += 1
- else:
- ids.append(currentId)
- currentType = line.split("{")[0].strip("@ ")
- completeEntry = line + "<br />"
- else:
- if line != "":
- completeEntry += line + "<br />"
- if currentId in usedIds or not usedIds:
- if "=" in line:
- # biblatex is not case sensitive
- field = line.split("=")[0].strip().lower()
- fields.append(field)
- value = line.split("=")[1].strip("{} ,\n")
- if field == "author":
- currentAuthor = filter(
- lambda x: not (x in "\\\"{}"), value.split(" and ")[0])
- if field == "citeulike-article-id":
- currentArticleId = value
- if field == "title":
- currentTitle = re.sub(r'\}|\{', r'', value)
-
- ###############################################################
- # Checks (please (de)activate/extend to your needs)
- ###############################################################
-
- # check if type 'proceedings' might be 'inproceedings'
- if currentType == "proceedings" and field == "pages":
- subproblems.append(
- "wrong type: maybe should be 'inproceedings' because entry has page numbers")
- counterWrongTypes += 1
-
- # check if abbreviations are used in journal titles
- if currentType == "article" and (field == "journal" or field == "journaltitle"):
-
- if "." in line:
- subproblems.append(
- "flawed name: abbreviated journal title '" + value + "'")
- counterFlawedNames += 1
-
- # check booktitle format; expected format "ICBAB '13: Proceeding of the 13th International Conference on Bla and Blubb"
- # if currentType == "inproceedings" and field == "booktitle":
- # if ":" not in line or ("Proceedings" not in line and "Companion" not in line) or "." in line or " '" not in line or "workshop" in line or "conference" in line or "symposium" in line:
- #subproblems.append("flawed name: inconsistent formatting of booktitle '"+value+"'")
- #counterFlawedNames += 1
-
- # check if title is capitalized (heuristic)
- # if field == "title":
- # for word in currentTitle.split(" "):
- #word = word.strip(":")
- # if len(word) > 7 and word[0].islower() and not "-" in word and not "_" in word and not "[" in word:
- #subproblems.append("flawed name: non-capitalized title '"+currentTitle+"'")
- #counterFlawedNames += 1
- # break
-
- ###############################################################
-
-fIn.close()
-
-
-problemCount = counterMissingFields + counterFlawedNames + counterWrongFieldNames + counterWrongTypes + counterNonUniqueId
-
-# Write out our HTML file
-if options.htmlOutput:
- html = open(options.htmlOutput, 'w', encoding="utf8")
- html.write("""<!doctype html>
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
-<title>BibLatex Check</title>
-<style>
-body {
- font-family: Calibri, Arial, Sans;
- padding: 10px;
- width: 1030px;
- margin: 10px auto;
- border-top: 1px solid black;
-}
-
-#title {
- width: 720px;
- border-bottom: 1px solid black;
-}
-
-#title h1 {
- margin: 10px 0px;
-}
-
-#title h1 a {
- color: black;
- text-decoration: none;
-}
-
-#control {
- clear: both;
-}
-
-#search {
- float: left;
-}
-
-#search input {
- width: 300px;
- font-size: 14pt;
-}
-
-#mode {
- text-align: right;
-}
-
-#mode label:first-child {
- font-weight: bold;
-}
-
-#mode input {
- margin-left: 20px;
-}
-
-.info {
- margin-top: 10px;
- padding: 10px;
- background: #FAFADD;
- width: 250px;
- float: right;
- box-shadow: 1px 1px 1px 1px #ccc;
- clear: both;
-}
-
-.info h2 {
- font-size: 12pt;
- padding: 0px;
- margin: 0px;
-}
-
-.problem {
- margin-top: 10px;
- margin-bottom: 10px;
- padding: 10px;
- background: #FFBBAA;
- counter-increment: problem;
- width: 700px;
- border: 1px solid #993333;
- border-left: 5px solid #993333;
- box-shadow: 1px 1px 1px 1px #ccc;
- float: left;
-}
-
-.active {
- box-shadow: 5px 5px 3px 3px #ccc;
- position: relative;
- top: -2px;
-}
-
-.severe0 {
- background: #FAFAFA;
- border: 1px solid black;
- border-left: 5px solid black;
-}
-
-.severe1 {
- background: #FFEEDD;
-}
-
-.severe2 {
- background: #FFDDCC;
-}
-
-.severe3 {
- background: #FFCCBB;
-}
-
-.problem_checked {
- border: 1px solid #339933;
- border-left: 5px solid #339933;
-}
-
-.problem h2:before {
- content: counter(problem) ". "; color: gray;
-}
-
-.problem h2 {
- font-size: 12pt;
- padding: 0px;
- margin: 0px;
-}
-
-.problem .links {
- float: right;
- position:relative;
- top: -22px;
-}
-
-.problem .links a {
- color: #3333CC;
-}
-
-.problem .links a:visited {
- color: #666666;
-}
-
-.problem .reference {
- clear: both;
- font-size: 9pt;
- margin-left: 20px;
- font-style:italic;
- font-weight:bold;
-}
-
-.problem ul {
- clear: both;
-}
-
-.problem .problem_control {
- float: right;
- margin: 0px;
- padding: 0px;
-}
-
-.problem .bibtex_toggle{
- text-decoration: underline;
- font-size: 9pt;
- cursor: pointer;
- padding-top: 5px;
-}
-
-.problem .bibtex {
- margin-top: 5px;
- font-family: Monospace;
- font-size: 8pt;
- display: none;
- border: 1px solid black;
- background-color: #FFFFFF;
- padding: 5px;
-}
-</style>
-<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.5/jquery.min.js"></script>
-<script>
-
-function isInProblemMode() {
- return $('#mode_problems:checked').val() == 'problems'
-}
-
-function update() {
- $('.problem').hide();
- $('.problem[id*='+$('#search input').val()+']').show();
- $('.problem .checked').each(function () {
- if ($(this).attr('checked')) {
- $(this).parents('.problem').addClass('problem_checked');
- } else {
- $(this).parents('.problem').removeClass('problem_checked');
- }
- });
- if (isInProblemMode()) {
- $('.severe0').hide();
- $('.problem_checked').hide();
- }
-}
-
-$(document).ready(function(){
-
- $(".bibtex_toggle").click(function(event){
- event.preventDefault();
- $(this).next().slideToggle();
- });
-
- $('#search input').live('input', function() {
- update();
- });
-
- $('#mode input').change(function() {
- update();
- });
-
- $("#uncheck_button").click(function(){
- $('.problem .checked').attr('checked',false);
- localStorage.clear();
- update();
- });
-
- $('.problem a').mousedown(function(event) {
- $('.problem').removeClass('active');
- $(this).parents('.problem').addClass('active');
- });
-
- $('.problem .checked').change(function(event) {
- var problem = $(this).parents('.problem');
- problem.toggleClass('problem_checked');
- var checked = problem.hasClass('problem_checked');
- localStorage.setItem(problem.attr('id'),checked);
- if (checked && isInProblemMode()) {
- problem.slideUp();
- }
- });
-
- $('.problem .checked').each(function () {
- $(this).attr('checked',localStorage.getItem($(this).parents('.problem').attr('id'))=='true');
- });
- update();
-});
-
-</script>
-</head>
-<body>
-<div id="title">
-<h1><a href='http://github.com/pezmc/BibLatex-Check'>BibLaTeX Check</a></h1>
-<div id="control">
-<form id="search"><input placeholder="search entry ID ..."/></form>
-<form id="mode">
-<label>show entries:</label>
-<input type = "radio"
- name = "mode"
- id = "mode_problems"
- value = "problems"
- checked = "checked" />
- <label for = "mode_problems">problems</label>
- <input type = "radio"
- name = "mode"
- id = "mode_all"
- value = "all" />
- <label for = "mode_all">all</label>
-<input type="button" value="uncheck all" id="uncheck_button"></button>
-</form>
-<br style="clear: both; " />
-</div>
-</div>
-""")
- html.write("<div class='info'><h2>Info</h2><ul>")
- html.write("<li>bib file: " + options.bibFile + "</li>")
- html.write("<li>aux file: " + options.auxFile + "</li>")
- html.write("<li># entries: " + str(len(problems)) + "</li>")
- html.write("<li># problems: " + str(problemCount) + "</li><ul>")
- html.write("<li># missing fields: " + str(counterMissingFields) + "</li>")
- html.write("<li># flawed names: " + str(counterFlawedNames) + "</li>")
- html.write("<li># wrong types: " + str(counterWrongTypes) + "</li>")
- html.write("<li># non-unique id: " + str(counterNonUniqueId) + "</li>")
- html.write("<li># wrong field: " + str(counterWrongFieldNames) + "</li>")
- html.write("</ul></ul></div>")
-
- problems.sort()
- for problem in problems:
- html.write(problem)
- html.write("</body></html>")
- html.close()
-
- if options.view:
- import webbrowser
- webbrowser.open(html.name)
-
- print("SUCCESS: Report {} has been generated".format(options.htmlOutput))
-
-if problemCount > 0:
- print("WARNING: Found {} problems.".format(problemCount))
- sys.exit(-1)