summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/biblatex-contrib/biblatex-gb7714-2015/biblatex-map.py
diff options
context:
space:
mode:
Diffstat (limited to 'macros/latex/contrib/biblatex-contrib/biblatex-gb7714-2015/biblatex-map.py')
-rw-r--r--macros/latex/contrib/biblatex-contrib/biblatex-gb7714-2015/biblatex-map.py2059
1 files changed, 0 insertions, 2059 deletions
diff --git a/macros/latex/contrib/biblatex-contrib/biblatex-gb7714-2015/biblatex-map.py b/macros/latex/contrib/biblatex-contrib/biblatex-gb7714-2015/biblatex-map.py
deleted file mode 100644
index ff6a76fbd7..0000000000
--- a/macros/latex/contrib/biblatex-contrib/biblatex-gb7714-2015/biblatex-map.py
+++ /dev/null
@@ -1,2059 +0,0 @@
-#!/usr/bin/env python
-
-"""
-A python script to modify bib data and
-to display references with specific bibliography standard
-
-two key features:
-
-两大核心功能
-1. bib文件抽取,bib文件内容的自定义修改
-2. 格式化文献表输出,包括json,bib,text,html,bbl文件,其中bbl文件可以在tex源代码中直接使用,利用natbib宏包可以实现不同的标注样式。
-
-
-"""
-
-__author__ = "Hu zhenzhen"
-__version__ = "1.0"
-__license__ = "MIT"
-__email__ = "hzzmail@163.com"
-
-import string
-import re
-import sys
-import datetime
-import copy
-import json
-import operator
-
-
-
-#
-# 为数据map设置参数
-# 选项的逻辑与biblatex基本一致,
-# 差别包括:overwrite选项可以放到step步中表示
-#[]=maps
-#[[],[]]=map in maps
-#[[[]],[]]=step in map in mpas
-#[[[{optionkey: }]],[]]=step in map in mpas
-#注意python正则表达方式与perl的略有不同,比如unicode表示
-#python用\xHH,\uHHHH,\UHHHHHHHH表示,而perl直接用\x{HHHH}表示。
-sourcemaps=[#maps
- [#map1:将ELECTRONIC类型转换为online类型
- [{"typesource":"ELECTRONIC","typetarget":"online"}]#step1
- ],
- [#map2:将source域转换为url域
- [{"fieldsource":"source","fieldtarget":"url"}]#step1
- ],
- [#map3:将urldate域的信息“yyyy-m-d”转换为“yyyy-mm-dd”,注意正则表达式直接写不用在外面套""
- [{"fieldsource":"urldate","match":r'(\d\d\d\d)\-(\d)\-(\d)',"replace":r'\1-0\2-0\3'}]#step1
- ],
- [#map4:将urldate域的信息“yyyy-m-d”转换为“yyyy-mm-dd”,注意正则表达式直接写不用在外面套""
- [{"fieldsource":"date","match":r'(\d\d\d\d)\-(\d)\-(\d)',"replace":r'\1-0\2-0\3',"overwrite":True}]#step1
- ],
- [#map5:将refdate域转换为urldate域
- [{"fieldsource":"refdate","fieldtarget":"urldate"}]#step1
- ],
- [#map6:对于newspaper类型,设置note为news
- [{"pertype":"newspaper"}],#step1
- [{"fieldset":"note","fieldvalue":"news","overwrite":True}]#step2
- ],
- [#map7:设置edition域等于version
- [{"fieldsource":"version","final":True}],#step1
- [{"fieldset":"edition","origfieldval":True}]#step2
- ],
- [#map8:设置entrykey域设置给keywords
- [{"fieldsource":"entrykey"}],#step1
- [{"fieldset":"keywords","origfieldval":True}]#step2
- ],
- [#map9:对于存在note域的情况,将其值添加到keywords
- [{"fieldsource":"note","final":True}],#step1
- [{"fieldset":"keywords","origfieldval":True,"overwrite":True,"append":True}]#step2
- ],
- [#map10:根据标题的字符编码范围确定标题的语言类型
- [{"fieldsource":"title","match":r'[\u2FF0-\u9FA5]',"final":True}],#step1
- [{"fieldset":"userd","fieldvalue":"chinese"}]#step2
- ],
-]
-
-#重设新的任务处理
-sourcemaps=[
- [#map1:设置entrykey域设置给keywords
- [{"fieldsource":"entrykey"}],#step1
- [{"fieldset":"keywords","origfieldval":True,"overwrite":True}]#step2
- ],
-]
-
-
-#重设新的任务
-sourcemaps=[
- [#map1:取消note域
- [{"fieldsource":"note","final":True}],#step1
- [{"fieldset":"note","null":True,"overwrite":True}]#step2
- ],
- [#map2:取消abstract域
- [{"fieldsource":"abstract","final":True}],#step1
- [{"fieldset":"abstract","null":True,"overwrite":True}]#step2
- ],
- [#map3:取消keywords域
- [{"fieldsource":"keywords","final":True}],#step1
- [{"fieldset":"keywords","null":True,"overwrite":True}]#step2
- ],
- [#map4:取消keywords-plus域
- [{"fieldsource":"keywords-plus","final":True}],#step1
- [{"fieldset":"keywords-plus","null":True,"overwrite":True}]#step2
- ],
- [#map5:取消affiliation域
- [{"fieldsource":"affiliation","final":True}],#step1
- [{"fieldset":"affiliation","null":True,"overwrite":True}]#step2
- ],
- [#map6:取消funding-acknowledgement域
- [{"fieldsource":"funding-acknowledgement","final":True}],#step1
- [{"fieldset":"funding-acknowledgement","null":True,"overwrite":True}]#step2
- ],
- [#map7:取消funding-text域
- [{"fieldsource":"funding-text","final":True}],#step1
- [{"fieldset":"funding-text","null":True,"overwrite":True}]#step2
- ],
- ]
-
-#重设不处理
-sourcemaps=[]
-
-
-##------------------------------------------
-## 参考文献表的制定格式设置,比如GB/T 7714-2015
-##
-
-#全局选项
-formatoptions={
-"style":'authoryear',#写bbl信息的设置选项,authoryear,'numeric'
-"nameformat":'uppercase',#姓名处理选项:uppercase,lowercase,given-family,family-given,pinyin
-"giveninits":'space',#使用名的缩写,space表示名见用空格分隔,dotspace用点加空格,dot用点,terse无分隔,false不使用缩写
-"maxbibnames":3,#
-"minbibnames":3,#
-"morenames":True,#
-"maxbibitems":1,#
-"minbibitems":1,#
-"moreitems":False,#
-"date":'year',#'日期处理选项':year,iso,等
-"urldate":'iso',#'日期处理选项':year,iso,等
-}
-
-#本地化字符串
-localstrings={
-'andothers':{'english':'et al.','chinese':'等'},
-'and':{'english':' and ','chinese':'和'},
-'edition':{'english':'th ed','chinese':'版'},#th ed. 中的点不要,为方便标点处理
-'in':{'english':'in: ','chinese':'见: '},
-'nolocation':{'english':'[S.l.]','chinese':'[出版地不详]'},
-'nopublisher':{'english':'[s.n.]','chinese':'[出版者不详]'},
-'bytranslator':{'english':'trans by','chinese':'译'},
-}
-
-#标点
-localpuncts={
-'multinamedelim':', ',
-'finalnamedelim':', ',
-'andothorsdelim':', ',
-'finalitemdelim':', ',
-'multiitemdelim':', ',
-}
-
-#替换字符串
-replacestrings={
-'[出版地不详]: [出版者不详]':'[出版地不详 : 出版者不详]',
-'[S.l.]: [s.n.]':'[S.l. : s.n.]',
-'..':'.',
-}
-
-#类型和载体字符串
-typestrings={
-'book':'[M]',
-'inbook':'[M]',
-'standard':'[S]',
-'periodical':'[J]',
-'article':'[J]',
-'newspaper':'[N]',
-'patent':'[P]',
-'online':'[EB]',
-'www':'[EB]',
-'electronic':'[EB]',
-'proceedings':'[C]',
-'inproceedings':'[C]',
-'conference':'[C]',
-'collection':'[G]',
-'incollection':'[G]',
-'thesis':'[D]',
-'mastersthsis':'[D]',
-'phdthesis':'[D]',
-'report':'[R]',
-'techreport':'[R]',
-'manual':'[A]',
-'archive/manual':'[A]',
-'database':'[DB]',
-'dataset':'[DS]',
-'software':'[CP]',
-'map':'[CM]',
-'unpublished':'[Z]',
-'misc':'[Z]',
-}
-
-#数据类型
-datatypeinfo={
-'namelist':['author','editor','translator','bookauthor'],
-'literallist':['location','address','publisher','institution','organization','school','language','keywords'],
-'literalfield':['title','journaltitle','journal','booktitle','subtitle','titleaddon','edition','version','url',
- 'volume','number','endvolume','endnumber','type','note','labelnumber'],
-'datefield':['date','year','urldate','enddate','origdate','eventdate'],
-'rangefield':['pages']
-}
-
-#条目的著录格式
-bibliographystyle={
-"book":[
-#{"fieldsource":["labelnumber"],'prestring':"[","posstring":"]","pospunct":" "},
-{"fieldsource":['author','editor','translator'],'options':{'nameformat':'uppercase'}},
-{"fieldsource":['title'],'caseformat':'sentencecase','prepunct':". ",'prepunctifnolastfield':'','posstring':r"\typestring"},
-{"fieldsource":['translator'],'options':{'nameformat':'uppercase'},'prepunct':". ",'posstring':r', \bibstring{bytranslator}'},
-{"fieldsource":['edition'],'numerformat':'arabic','prepunct':". ","posstringifnumber":r'\bibstring{edition}'},
-{"fieldsource":['location','address'],'prepunct':". ",'replstring':r"\bibstring{nolocation}"},
-{"fieldsource":['publisher'],'prepunct':": ",'replstring':r"\bibstring{nopublisher}",'prepunctifnolastfield':'. '},
-{"fieldsource":['date','year'],'prepunct':", "},
-{"fieldsource":['pages'],'prepunct':": "},
-{"fieldsource":['urldate'],'prestring':"[","posstring":"]"},
-{"fieldsource":['url'],'prepunct':". ",'prestring':r'\url{','posstring':'}'},
-{"fieldsource":['doi'],'prepunct':". "},
-{"fieldsource":['endpunct'],'replstring':"."}
-],
-"article":[
-#{"fieldsource":["labelnumber"],'prestring':"[","posstring":"]","pospunct":" "},
-{"fieldsource":['author','editor','translator'],'options':{'nameformat':'uppercase'}},
-{"fieldsource":['title'],'caseformat':'sentencecase','prepunct':". ",'prepunctifnolastfield':'','posstring':r"\typestring"},
-{"fieldsource":['journaltitle','journal'],'prepunct':". "},
-{"fieldsource":['year','date'],'prepunct':", "},
-{"fieldsource":['volume'],'prepunct':", "},
-{"fieldsource":['number'],'prestring':"(",'posstring':")"},
-{"fieldsource":['pages'],'prepunct':": "},
-{"fieldsource":['urldate'],'prestring':"[","posstring":"]"},
-{"fieldsource":['url'],'prepunct':". "},
-{"fieldsource":['doi'],'prepunct':". "},
-{"fieldsource":['endpunct'],'replstring':"."}
-],
-"newspaper":[
-#{"fieldsource":["labelnumber"],'prestring':"[","posstring":"]","pospunct":" "},
-{"fieldsource":['author','editor','translator'],'options':{'nameformat':'uppercase'}},
-{"fieldsource":['title'],'caseformat':'sentencecase','prepunct':". ",'prepunctifnolastfield':'','posstring':r"\typestring"},
-{"fieldsource":['journaltitle','journal'],'prepunct':". "},
-{"fieldsource":['date','year'],'prepunct':", ",'options':{'date':'iso'}},
-{"fieldsource":['number'],'prestring':"(",'posstring':")"},
-{"fieldsource":['pages'],'prepunct':": "},
-{"fieldsource":['urldate'],'prestring':"[","posstring":"]"},
-{"fieldsource":['url'],'prepunct':". "},
-{"fieldsource":['doi'],'prepunct':". "},
-{"fieldsource":['endpunct'],'replstring':"."}
-],
-"inbook":[
-#{"fieldsource":["labelnumber"],'prestring':"[","posstring":"]","pospunct":" "},
-{"fieldsource":['author','translator'],'options':{'nameformat':'uppercase'}},
-{"fieldsource":['title'],'caseformat':'sentencecase','prepunct':". ",'prepunctifnolastfield':'','posstring':r"\typestring"},
-{"fieldsource":['in'],'replstring':"//",'omitifnofield':['bookauthor','editor','booktitle']},
-{"fieldsource":['bookauthor','editor'],'options':{'nameformat':'uppercase'}},
-{"fieldsource":['booktitle'],'caseformat':'sentencecase','prepunct':". ",'prepunctifnolastfield':''},
-{"fieldsource":['edition'],'numerformat':'arabic','prepunct':". ","posstring":r'\bibstring{edition}'},
-{"fieldsource":['location','address'],'prepunct':". ",'replstring':r"\bibstring{nolocation}"},
-{"fieldsource":['publisher'],'prepunct':": ",'replstring':r"\bibstring{nopublisher}",'prepunctifnolastfield':'. '},
-{"fieldsource":['date','year'],'prepunct':", "},
-{"fieldsource":['pages'],'prepunct':": "},
-{"fieldsource":['urldate'],'prestring':"[","posstring":"]"},
-{"fieldsource":['url'],'prepunct':". "},
-{"fieldsource":['doi'],'prepunct':". "},
-{"fieldsource":['endpunct'],'replstring':"."}
-],
-"inproceedings":"inbook",
-"incollection":"inbook",
-"standard":"inbook",
-"proceedings":"book",
-"collection":"book",
-"patent":[
-#{"fieldsource":["labelnumber"],'prestring':"[","posstring":"]","pospunct":" "},
-{"fieldsource":['author'],'options':{'nameformat':'uppercase'}},
-{"fieldsource":['title'],'caseformat':'sentencecase','prepunct':". ",'prepunctifnolastfield':'','posstring':r"\typestring"},
-{"fieldsource":['number'],'prepunct':": "},
-{"fieldsource":['date','year'],'prepunct':", "},
-{"fieldsource":['urldate'],'prestring':"[","posstring":"]"},
-{"fieldsource":['url'],'prepunct':". "},
-{"fieldsource":['doi'],'prepunct':". "},
-{"fieldsource":['endpunct'],'replstring':"."}
-],
-"online":[
-#{"fieldsource":["labelnumber"],'prestring':"[","posstring":"]","pospunct":" "},
-{"fieldsource":['author','editor','translator'],'options':{'nameformat':'uppercase'}},
-{"fieldsource":['title'],'caseformat':'sentencecase','prepunct':". ",'prepunctifnolastfield':'','posstring':r"\typestring"},
-{"fieldsource":['organization','instiution'],'prepunct':". "},
-{"fieldsource":['date','year'],'prepunct':", ",'prepunctifnolastfield':'. ','omitifnofield':['enddate','eventdate']},
-{"fieldsource":['pages'],'prepunct':": "},
-{"fieldsource":['date','enddate','eventdate'],'prepunct':". ",'options':{"date":"iso",'eventdate':'iso'},'prestring':"(","posstring":")"},
-{"fieldsource":['urldate'],'prestring':"[","posstring":"]",'prepunctifnolastfield':'. '},
-{"fieldsource":['url'],'prepunct':". ",'prepunctifnolastfield':''},
-{"fieldsource":['doi'],'prepunct':". "},
-{"fieldsource":['endpunct'],'replstring':"."}
-],
-"www":"online",
-"electronic":"online",
-"report":[
-#{"fieldsource":["labelnumber"],'prestring':"[","posstring":"]","pospunct":" "},
-{"fieldsource":['author','editor','translator'],'options':{'nameformat':'uppercase'}},
-{"fieldsource":['title'],'caseformat':'sentencecase','prepunct':". ",'prepunctifnolastfield':'','posstring':r"\typestring"},
-{"fieldsource":['translator'],'options':{'nameformat':'uppercase'},'prepunct':". "},
-{"fieldsource":['type'],'prepunct':". "},
-{"fieldsource":['number'],'prepunct':"",'prepunctifnolastfield':'. '},
-{"fieldsource":['version'],'prepunct':". "},
-{"fieldsource":['location','address'],'prepunct':". ",'replstring':r"\bibstring{nolocation}"},
-{"fieldsource":['institution','publisher'],'prepunct':": ",'replstring':r"\bibstring{nopublisher}",'prepunctifnolastfield':'. '},
-{"fieldsource":['date','year'],'prepunct':", ",'omitifnofield':['location','address','institution','publisher'],'omitiffield':['url']},
-{"fieldsource":['date','year'],'prepunct':". ",'prestring':'(','posstring':')','omitiffield':['location','address','institution','publisher']},
-{"fieldsource":['pages'],'prepunct':": "},
-{"fieldsource":['urldate'],'prestring':"[","posstring":"]"},
-{"fieldsource":['url'],'prepunct':". "},
-{"fieldsource":['doi'],'prepunct':". "},
-{"fieldsource":['endpunct'],'replstring':"."}
-],
-"techreport":"report",
-"periodical":[
-#{"fieldsource":["labelnumber"],'prestring':"[","posstring":"]","pospunct":" "},
-{"fieldsource":['editor','author'],'options':{'nameformat':'uppercase'}},
-{"fieldsource":['title'],'caseformat':'sentencecase','prepunct':". ",'prepunctifnolastfield':'','posstring':r"\typestring"},
-{"fieldsource":['year','date'],'prepunct':", "},
-{"fieldsource":['volume'],'prepunct':", "},
-{"fieldsource":['number'],'prestring':"(",'posstring':")-"},
-{"fieldsource":['endyear','enddate'],'prepunct':", "},
-{"fieldsource":['endvolume'],'prepunct':", "},
-{"fieldsource":['endnumber'],'prestring':"(",'posstring':")"},
-{"fieldsource":['location','address'],'prepunct':". ",'replstring':r"\bibstring{nolocation}"},
-{"fieldsource":['institution','publisher'],'prepunct':": ",'replstring':r"\bibstring{nopublisher}",'prepunctifnolastfield':'. '},
-{"fieldsource":['year','date'],'prepunct':", ",'posstring':'-'},
-{"fieldsource":['pages'],'prepunct':": "},
-{"fieldsource":['urldate'],'prestring':"[","posstring":"]"},
-{"fieldsource":['url'],'prepunct':". "},
-{"fieldsource":['doi'],'prepunct':". "},
-{"fieldsource":['endpunct'],'replstring':"."}
-],
-#omitifnofield:必须所有的域都不存在才为true
-#omitiffield:只要存在一个域就为true
-"thesis":[
-#{"fieldsource":["labelnumber"],'prestring':"[","posstring":"]","pospunct":" "},
-{"fieldsource":['author','editor','translator'],'options':{'nameformat':'uppercase'}},
-{"fieldsource":['title'],'caseformat':'sentencecase','prepunct':". ",'prepunctifnolastfield':'','posstring':r"\typestring"},
-{"fieldsource":['translator'],'options':{'nameformat':'uppercase'},'prepunct':". "},
-{"fieldsource":['location','address'],'prepunct':". "},
-{"fieldsource":['institution','publisher','school'],'prepunct':": ",'prepunctifnolastfield':'. '},
-{"fieldsource":['date','year'],'prepunct':", ",'omitifnofield':['location','address','institution','publisher'],'omitiffield':['url']},
-{"fieldsource":['date','year'],'prepunct':". ",'prestring':'(','posstring':')','omitiffield':['location','address','institution','publisher']},
-{"fieldsource":['pages'],'prepunct':": "},
-{"fieldsource":['urldate'],'prestring':"[","posstring":"]"},
-{"fieldsource":['url'],'prepunct':". ",'prestring':r'\url{','posstring':'}'},
-{"fieldsource":['doi'],'prepunct':". "},
-{"fieldsource":['endpunct'],'replstring':"."}
-],
-"manual":"thesis",
-"unpublished":"thesis",
-"database":"thesis",
-"dataset":"thesis",
-"software":"thesis",
-"map":"thesis",
-"archive":"thesis",
-"misc":[
-#{"fieldsource":["labelnumber"],'prestring':"[","posstring":"]","pospunct":" "},
-{"fieldsource":['author','editor','translator'],'options':{'nameformat':'uppercase'}},
-{"fieldsource":['title'],'caseformat':'sentencecase','prepunct':". ",'prepunctifnolastfield':'','posstring':r"\typestring"},
-{"fieldsource":['howpublished'],'prepunct':". "},
-{"fieldsource":['location','address'],'prepunct':". "},
-{"fieldsource":['institution','publisher'],'prepunct':": ",'prepunctifnolastfield':'. '},
-{"fieldsource":['date','year'],'prepunct':", "},
-{"fieldsource":['pages'],'prepunct':": "},
-{"fieldsource":['urldate'],'prestring':"[","posstring":"]"},
-{"fieldsource":['url'],'prepunct':". "},
-{"fieldsource":['doi'],'prepunct':". "},
-{"fieldsource":['endpunct'],'replstring':"."}
-],
-"phdthesis":"thesis",
-"mastersthesis":"thesis",
-}
-
-
-#
-#
-#打印格式化后的全部文献条目文本
-def printbibliography():
-
- bibliographyentries=bibliographytext.split('\n')
-
- #md文件输出,直接用write写
- mdoutfile="newformatted"+inputbibfile.replace('.bib','.md')
- fout = open(mdoutfile, 'w', encoding="utf8")
- print("INFO: writing cited references to '" + mdoutfile + "'")
-
- biblabelnumber=0
- for prtbibentry in bibliographyentries:
- if len(prtbibentry)>0:
- biblabelnumber=biblabelnumber+1
- fout.write('['+str(biblabelnumber)+'] '+prtbibentry+'\n')
- fout.close()
-
- #html文件输出,直接用write写
- mdoutfile="newformatted"+inputbibfile.replace('.bib','.html')
- fout = open(mdoutfile, 'w', encoding="utf8")
- print("INFO: writing cited references to '" + mdoutfile + "'")
- fout.write('<html><head><title>references</title></head>')
- fout.write('<body bgcolor="lightgray"><div align="top"><center>')
- fout.write('<font color="blue">')
- fout.write('<table border="0" cellPadding="10" cellSpacing="5" height="400" width="70%">')
- fout.write('<tr><td height="1" width="566" align="center" colspan="1" bgcolor="teal"></td></tr>')
-
- biblabelnumber=0
- for prtbibentry in bibliographyentries:
- if len(prtbibentry)>0:
- biblabelnumber=biblabelnumber+1
- fout.write('<tr> <td width="480" height="15" colspan="6"><font color="blue">')
- fout.write('<span style="font-family: 宋体; font-size: 14">')
- fout.write('['+str(biblabelnumber)+'] '+prtbibentry)
- fout.write('</span></font></td> </tr>')
-
- fout.write('<tr><td height="1" width="566" align="center" colspan="1" bgcolor="teal"></td></tr>')
- fout.write('</table></div></body></html>')
- fout.close()
-
- if auxfile:
- bblfile=auxfile.replace('.aux','.bbl')
- else:
- bblfile=inputbibfile.replace('.bib','.bbl')
- bbloutfile=bblfile
- fout = open(bbloutfile, 'w', encoding="utf8")
- print("INFO: writing cited references to '" + bbloutfile + "'")
-
- fout.write(r'\begin{thebibliography}{'+str(len(bibentries))+'}\n')
-
- biblabelnumber=0
- for prtbibentry in bibliographyentries:
- if len(prtbibentry)>0:
- biblabelnumber=biblabelnumber+1
-
- entrysn=0
- for bibentry in bibentries:
- entrysn=entrysn+1
- if entrysn==biblabelnumber:
- entrykeystr=bibentry['entrykey']
- entryciteauthor=formatlabelauthor(bibentry)
- entryciteyear=formatlabelyear(bibentry)
- entrycitelabel=entryciteauthor[0]+'('+entryciteyear+')'+entryciteauthor[1]
- #Baker et~al.(1995)Baker and Jackson
- break
- if formatoptions['style']=='authoryear':
- fout.write(r'\bibitem['+entrycitelabel+']{'+entrykeystr+'}'+prtbibentry+'\n')
- else:
- fout.write(r'\bibitem['+str(biblabelnumber)+']{'+entrykeystr+'}'+prtbibentry+'\n')
-
- fout.write(r'\end{thebibliography}')
- fout.close()
-
-
-
-#
-#authoryear样式提供标注标签的作者信息
-#
-def formatlabelauthor(bibentry):
-
- if 'author' in bibentry:
- namelist=bibentry['author']
- elif 'editor' in bibentry:
- namelist=bibentry['editor']
- elif 'translator' in bibentry:
- namelist=bibentry['translator']
- else:
- namelist='Anon'
-
- return [namelist,namelist]
-
-#
-#authoryear样式提供标注标签的年份信息
-#
-def formatlabelyear(bibentry):
-
- if 'year' in bibentry:
- yearlist=bibentry['year']
- elif 'eventyear' in bibentry:
- yearlist=bibentry['eventyear']
- elif 'origyear' in bibentry:
- yearlist=bibentry['origyear']
- elif 'urlyear' in bibentry:
- yearlist=bibentry['urlyear']
- else:
- yearlist='N.D.'
-
- return yearlist
-
-#
-#
-#格式化全部文献条目文本
-def formatallbibliography():
- labelnumber=0
- global bibliographytext
- bibliographytext=''
- for bibentry in bibentries:
- labelnumber=labelnumber+1
- bibentry['labelnumber']=labelnumber
- bibentrytext=''
- bibentrytext=formatbibentry(bibentry)
- bibliographytext=bibliographytext+bibentrytext+'\n'
-
- print('\nreferecences')
- print(bibliographytext)
-
-#
-#
-#格式化一个文献条目文本
-def formatbibentry(bibentry):
-
- print('--------------new entry---------')
- print('\nbibentry:',bibentry)
- #bibentrytext='entry:'
-
- #
- # 由于volume和number域可能存在范围的特殊情况,首先做特殊处理
- #
- if 'volume' in bibentry:
- if '-' in bibentry['volume']:
- multivolume=bibentry['volume'].split("-")
- bibentry['volume']=multivolume[0]
- bibentry['endvolume']=multivolume[1]
- if 'number' in bibentry:
- if '-' in bibentry['number']:
- multinumber=bibentry['number'].split("-")
- bibentry['number']=multinumber[0]
- bibentry['endnumber']=multinumber[1]
-
- #四种日期域也做范围解析
- if 'date' in bibentry:
- if '/' in bibentry['date']:
- datestring=bibentry['date'].split('/')
- bibentry['date']=datestring[0]
- bibentry['enddate']=datestring[1]
-
- if 'urldate' in bibentry:
- if '/' in bibentry['urldate']:
- datestring=bibentry['urldate'].split('/')
- bibentry['urldate']=datestring[0]
- bibentry['endurldate']=datestring[1]
-
- if 'eventdate' in bibentry:
- if '/' in bibentry['eventdate']:
- datestring=bibentry['eventdate'].split('/')
- bibentry['eventdate']=datestring[0]
- bibentry['endeventdate']=datestring[1]
-
- if 'origdate' in bibentry:
- if '/' in bibentry['origdate']:
- datestring=bibentry['origdate'].split('/')
- bibentry['origdate']=datestring[0]
- bibentry['endorigdate']=datestring[1]
-
- #
- #接着处理所有域到一个条目文本
- #
- bibentrytext=''
-
- if bibentry['entrytype'] in bibliographystyle:
- print('INFO: format style of entrytype',bibentry['entrytype'],'is defined.')
- if isinstance(bibliographystyle[bibentry['entrytype']],str):
- formattype=bibliographystyle[bibentry['entrytype']]
- else:
- formattype=bibentry['entrytype']
-
- lastfield=True #前一域存在
-
- for fieldinfo in bibliographystyle[formattype]:
-
- rtnfield=formatfield(bibentry,fieldinfo,lastfield)
- fieldtext=rtnfield[0]
- lastfield=rtnfield[1]
-
- bibentrytext=bibentrytext+fieldtext
-
- #对替换字符串做处理
- #包括对重复的标点做处理比如:..变为.
- for k,v in replacestrings.items():
- print(k,v)
- #m=re.search(k,bibentrytext)
- #print(m)
- #bibentrytext=re.sub(k,v,bibentrytext)
- #利用正则反而不行,直接用字符串替换
- bibentrytext=bibentrytext.replace(k,v)
-
- print(bibentrytext)
- return bibentrytext
-
-
-
-#
-#
-#格式化文献条目的域
-#不同类型的域不同处理
-#分5类:姓名列表,文本列表,文本域,日期域,范围域
-#其中姓名列表,文本列表,日期域,日期域,范围域,都需要进行特殊的解析
-#而volume,number如果需要特殊解析则在文件域的格式处理时增加新的处理逻辑。
-def formatfield(bibentry,fieldinfo,lastfield):
-
- print('fieldinfo:',fieldinfo)
- #首先把域的内容先解析处理
- fieldcontents=''
-
- fieldsource=None
-
- #首先判断域是否忽略
- fieldomit=False
-
- if 'omitifnofield' in fieldinfo and 'omitiffield' in fieldinfo:
-
- fieldomita=True#假设忽略的条件满足
- for field in fieldinfo['omitifnofield']:#只要需要不存在的域有一个存在,那么条件就不满足
- if field in bibentry:
- fieldomita=False
- break
-
- fieldomitb=False#假设忽略的条件不满足
- for field in fieldinfo['omitiffield']:#只要需要存在的域中有一个存在,那么条件就满足
- if field not in bibentry:
- fieldomitb=True
- break
-
- fieldomit=fieldomita and fieldomitb
-
- elif 'omitifnofield' in fieldinfo:
-
- fieldomit=True#假设忽略的条件满足
- for field in fieldinfo['omitifnofield']:#只要需要不存在的域有一个存在,那么条件就不满足
- if field in bibentry:
- fieldomit=False
- break
-
- elif 'omitiffield' in fieldinfo:
-
- fieldomit=False#假设忽略的条件不满足
- for field in fieldinfo['omitiffield']:#只要需要存在的域中有一个存在,那么条件就满足
- if field not in bibentry:
- fieldomit=True
- break
-
- print(fieldomit)
-
-
- #如果不忽略该域那么:
- if not fieldomit:
-
- #当域为姓名列表域时:
- if fieldinfo['fieldsource'][0] in datatypeinfo['namelist']:
- #print('0',fieldinfo['fieldsource'][0])
- #print('author' in bibentry)
- for field in fieldinfo['fieldsource']:#
- #print(fieldinfo['fieldsource'])
- #print('namelist:',field)
- if field in bibentry:#当域存在域条目中时,确定要处理的域
- fieldsource=field
- break
- if fieldsource:
- #传递条目给出的一些控制选项
- if 'options' in fieldinfo:
- options=fieldinfo['options']
- else:
- options={}
- fieldcontents=namelistparser(bibentry,fieldsource,options)
-
-
- #当域为文本列表域时:
- elif fieldinfo['fieldsource'][0] in datatypeinfo['literallist']:
-
- for field in fieldinfo['fieldsource']:#
- if field in bibentry:#当域存在域条目中时,确定要处理的域
- fieldsource=field
- break
- if fieldsource:
- fieldcontents=literallistparser(bibentry,fieldsource)
-
- #当域为文本域时:
- elif fieldinfo['fieldsource'][0] in datatypeinfo['literalfield']:
-
- for field in fieldinfo['fieldsource']:#
- if field in bibentry:#当域存在域条目中时,确定要处理的域
- fieldsource=field
- break
- if fieldsource:
- fieldcontents=literalfieldparser(bibentry,fieldsource)
-
-
- #当域为日期域时:
- elif fieldinfo['fieldsource'][0] in datatypeinfo['datefield']:
-
- for field in fieldinfo['fieldsource']:#
- if field in bibentry:#当域存在域条目中时,确定要处理的域
- fieldsource=field
- break
- if fieldsource:
- #传递条目给出的一些控制选项
- if 'options' in fieldinfo:
- options=fieldinfo['options']
- else:
- options={}
- fieldcontents=datefieldparser(bibentry,fieldsource,options)
-
-
- #当域为范围域时:
- elif fieldinfo['fieldsource'][0] in datatypeinfo['rangefield']:
-
- for field in fieldinfo['fieldsource']:#
- if field in bibentry:#当域存在域条目中时,确定要处理的域
- fieldsource=field
- break
- if fieldsource:
- fieldcontents=rangefieldparser(bibentry,fieldsource)
-
- if not fieldsource:
- if 'replstring' in fieldinfo and fieldinfo['replstring']:
- print('replstring')
- fieldsource=True
- fieldcontents=fieldinfo['replstring']
-
-
- #接着做进一步的格式化,包括标点,格式,字体等
- fieldtext=''
-
- print(fieldsource)
- if fieldsource:
- if lastfield:#当前一个著录项存在,则正常输出
- if 'prepunct' in fieldinfo:
- fieldtext=fieldtext+fieldinfo['prepunct']
- else:#当前一个著录项不存在,则首先输出'prepunctifnolastfield'
- if 'prepunctifnolastfield' in fieldinfo:
- fieldtext=fieldtext+fieldinfo['prepunctifnolastfield']
- elif 'prepunct' in fieldinfo:
- fieldtext=fieldtext+fieldinfo['prepunct']
-
- if 'prestring' in fieldinfo:
- fieldtext=fieldtext+fieldinfo['prestring']
-
- if 'fieldformat' in fieldinfo:
- fieldtext=fieldtext+'{'+fieldinfo['fieldformat']+'{'+fieldcontents+'}}'
- else:
- fieldtext=fieldtext+str(fieldcontents)
-
- if 'posstring' in fieldinfo:
- fieldtext=fieldtext+fieldinfo['posstring']
-
- if 'posstringifnumber' in fieldinfo:
- try:
- numtemp=int(fieldcontents)
- if isinstance(numtemp,int):
- fieldtext=fieldtext+fieldinfo['posstringifnumber']
- except:
- print('info:waring the field value can not convert to integer')
-
- if 'pospunct' in fieldinfo:
- fieldtext=fieldtext+fieldinfo['pospunct']
-
- #更新lastfiled
- lastfield=True
- else:
- lastfield=False
-
-
- #自定义标点的处理
- print('fieldtext:',fieldtext)
- while r'\printdelim' in fieldtext:
-
- m = re.search(r'\\printdelim{([^\}]*)}',fieldtext)#注意贪婪算法的影响,所以要排除\}字符
- print('m.group(1):',m.group(1))
- fieldtext=re.sub(r'\\printdelim{[^\}]*}',localpuncts[m.group(1)],fieldtext,count=1)
- print('fieldtext:',fieldtext)
-
-
- #本地化字符串的处理
- print('fieldtext:',fieldtext)
- while r'\bibstring' in fieldtext:
-
- language=languagejudgement(bibentry,fieldinfo,fieldsource)
- m = re.search(r'\\bibstring{([^\}]*)}',fieldtext)#注意\字符的匹配,即便是在r''中也需要用\\表示
- fieldtext=re.sub(r'\\bibstring{[^\}]*}',localstrings[m.group(1)][language],fieldtext,count=1)
- print('fieldtext:',fieldtext)
- #下面这句不行因为,在字典取值是,不支持\1这样的正则表达式
- #fieldtext=re.sub(r'\\bibstring{(.*)}',localstrings[r'\1'][language],fieldtext,count=1)
-
- #标题的类型和载体标识符的处理
- if r'\typestring' in fieldtext:#当需要处理类型和载体时
- if bibentry['entrytype'] in typestrings:#当条目对应的类型存在时
- print(r'\typestring in',fieldtext)
- typestring=typestrings[bibentry['entrytype']]
- if 'url' in bibentry:
- typestring=typestring.replace(']','/OL]')
- elif 'medium' in bibentry:
- rplctypestring=bibentry['medium']+']'
- typestring=typestring.replace(']',rplctypestring)
- else:#当条目对应的类型不存在时,当做其它类型处理
- typestring='[Z]'
-
- print(typestring)
- fieldtext=fieldtext.replace(r'\typestring',typestring)
-
- return [fieldtext,lastfield]
-
-
-
-
-
-#
-#根据作者域或者标题域确定条目的语言
-#
-def languagejudgement(bibentry,fieldinfo,fieldsource):
-
- if fieldsource in datatypeinfo['namelist']:#当域是作者类时,利用作者域本身信息做判断
-
- language=fieldlanguage(bibentry[fieldsource])
-
- else:#其它情况,利用title域做判断
- if 'title' in bibentry:
- language=fieldlanguage(bibentry['title'])
- elif 'author' in bibentry:
- language=fieldlanguage(bibentry['author'])
- else:
- language='english'
-
- return language
-
-
-#
-#根据域值所在的字符范围确定域的语言
-#
-def fieldlanguage(fieldvalueinfo):
-
- if re.match(r'[\u2FF0-\u9FA5]', fieldvalueinfo):
- language='chinese'
- elif re.match(r'[\u3040-\u30FF\u31F0}-\u31FF]', fieldvalueinfo):
- language='japanese'
- elif re.match(r'[\u1100-\u11FF\u3130-\u318F\uAC00-\uD7AF]', fieldvalueinfo):
- language='korean'
- elif re.match(r'[\u0400-\u052F]', fieldvalueinfo):
- language='russian'
- elif re.match(r'[\u0100-\u017F]', fieldvalueinfo):
- language='french'
- else:
- language='english'
-
- return language
-
-
-#
-#
-#对存在{}做保护的字符串进行分割
-def safetysplit(strtosplt,seps):
-
- #首先查找{}保护的所有字符串
- s1=re.findall('\{.*?\}',strtosplt)
-
- #接着确定保护字符串中是否存在分割用字符串
- sepinbrace=False
- for s1a in s1:
- for sep in seps:
- if sep in s1a:
- sepinbrace=True
- break
- if sepinbrace:
- break
- #print(sepinbrace)
-
- #若保护字符串中存在分割字符串那么做特殊处理
- a=strtosplt
- if sepinbrace:
-
- #保护字符串用特殊字符串代替,特殊字符串与分割字符串没有任何关联
- strsn=0
- for stra1 in s1:
- strsn=strsn+1
- a=a.replace(stra1,'$'+str(strsn)+'$')
- #print(a)
-
- #处理原字符串为只需要一个分隔字符串就能分隔
- if len(seps)>1:
- for i in range(1,len(seps)):
- a=a.replace(seps[i],seps[0])
- #print(a)
-
- #接着做分割
- names=a.split(seps[0])
- #print(names)
-
- #对分割后的字符串做还原,即把特殊字符串还原回保护字符串
- namesnew=[]
- for name in names:
- strsn=0
- for stra1 in s1:
- strsn=strsn+1
- name=name.replace('$'+str(strsn)+'$',stra1)
- #print(name)
- namesnew.append(name.strip().lstrip())
-
- else:
- #处理原字符串为只需要一个分隔字符串就能分隔
- if len(seps)>1:
- for i in range(1,len(seps)):
- a=a.replace(seps[i],seps[0])
- #print(a)
-
- #直接分割
- names=a.split(seps[0])
- namesnew=[]
- for name in names:
- namesnew.append(name.strip().lstrip())
-
- #print(namesnew)
- return namesnew
-
-#
-#
-#姓名列表解析
-#增加条目给出的选项
-def namelistparser(bibentry,fieldsource,options):
- fieldcontents=bibentry[fieldsource]
-
- #首先做针对{}保护的处理
- #{}有可能保护一部分,有可能保护全部
- #首先判断{}是否存在,若存在,那么可以确定需要做保护处理,否则用常规处理
- #当然这些事情可以在一个函数中处理
-
- #首先姓名列表进行分解,包括用' and '和' AND '做分解
- #利用safetysplit函数实现安全的分解
- seps=[' and ',' AND ']
- fieldcontents=fieldcontents.lstrip().strip()
- fieldauthors=safetysplit(fieldcontents,seps)
-
- print('fieldauthors:',fieldauthors)
- #接着从各个姓名得到更详细的分解信息
- fieldnames=[]
- for name in fieldauthors:
- if name.lower() == 'others':
- nameinfo={'morename':True}
- else:
- if fieldlanguage(name)=='chinese':#当中文姓名中存在逗号先去除
- if ', ' in name:
- name=name.replace(', ','')
- else:
- pass
- nameinfo=singlenameparser(name)
- fieldnames.append(nameinfo)
-
- #最后根据全局和局部选项进行格式化
- nameformattedstr=''
-
- #根据'maxbibnames'和'minbibnames'截短
- if 'maxbibnames' in options:#首先使用条目中的选项
- if len(fieldnames)>options['maxbibnames']:
- fieldnamestrunc=fieldnames[:options['minbibnames']]
- nameinfo={'morename':True}
- fieldnamestrunc.append(nameinfo)
- else:
- fieldnamestrunc=fieldnames
- elif 'maxbibnames' in formatoptions:#接着使用全局选项
- if len(fieldnames)>formatoptions['maxbibnames']:
- fieldnamestrunc=fieldnames[:formatoptions['minbibnames']]
- nameinfo={'morename':True}
- fieldnamestrunc.append(nameinfo)
- else:
- fieldnamestrunc=fieldnames
- else:
- fieldnamestrunc=fieldnames
-
- #当条目选择中存在'nameformat'
- if 'nameformat' in options:
- option={'nameformat':options['nameformat']}
- else:
- option={}
-
- print('fieldnamestrunc:',fieldnamestrunc)
- nameliststop=len(fieldnamestrunc)
- nameliststart=1
- namelistcount=0
- for nameinfo in fieldnamestrunc:
- namelistcount=namelistcount+1
- if 'morename' in nameinfo:
- if formatoptions['morenames']:#只有设置morenames为true是才输出other的相关信息
- nameformattedstr=nameformattedstr+r'\printdelim{andothorsdelim}\bibstring{andothers}'
- else:
- if namelistcount==nameliststop and namelistcount>1:#当没有others时最后一个姓名前加的标点
- nameformattedstr=nameformattedstr+r'\printdelim{finalnamedelim}'+singlenameformat(nameinfo,option)
- elif namelistcount==nameliststart:
- nameformattedstr=singlenameformat(nameinfo,option)
- else:
- nameformattedstr=nameformattedstr+r'\printdelim{multinamedelim}'+singlenameformat(nameinfo,option)
-
- return nameformattedstr
-
-
-#
-#
-#单个姓名格式化
-def singlenameformat(nameinfo,option):
-
- singlenamefmtstr=''
-
-
- if 'nameformat' in option:#首先使用条目给出的选项
- nameformat=option['nameformat']
- elif 'nameformat' in formatoptions:#接着使用全局的选项
- nameformat=formatoptions['nameformat']
- else:#最后使用默认的选项
- nameformat='uppercase'
-
-
- #根据单个姓名格式化选项来实现具体的格式
- if nameformat=='uppercase':
-
- if nameinfo['family'].startswith('{'):
- singlenamefmtstr=nameinfo['family']
- else:
- singlenamefmtstr=nameinfo['family'].upper()
-
- #根据选项确定使用名的缩写
- if formatoptions["giveninits"]=='space':#space表示名见用空格分隔,
- if 'given' in nameinfo:
- singlenamefmtstr=singlenamefmtstr+' '+nameinfo['giveni'].upper()
- if 'middle' in nameinfo:
- singlenamefmtstr=singlenamefmtstr+' '+nameinfo['middlei'].upper()
- elif formatoptions["giveninits"]=='dotspace':#dotspace用点加空格,
- if 'given' in nameinfo:
- singlenamefmtstr=singlenamefmtstr+' '+nameinfo['giveni'].upper()
- if 'middle' in nameinfo:
- singlenamefmtstr=singlenamefmtstr+'. '+nameinfo['middlei'].upper()+'.'
- elif formatoptions["giveninits"]=='dot':#dot用点,
- if 'given' in nameinfo:
- singlenamefmtstr=singlenamefmtstr+' '+nameinfo['giveni'].upper()
- if 'middle' in nameinfo:
- singlenamefmtstr=singlenamefmtstr+'.'+nameinfo['middlei'].upper()+'.'
- elif formatoptions["giveninits"]=='terse':#terse无分隔,
- if 'given' in nameinfo:
- singlenamefmtstr=singlenamefmtstr+' '+nameinfo['giveni'].upper()
- if 'middle' in nameinfo:
- singlenamefmtstr=singlenamefmtstr+nameinfo['middlei'].upper()
- elif formatoptions["giveninits"]=='false':#false不使用缩写
- if 'given' in nameinfo:
- singlenamefmtstr=singlenamefmtstr+' '+nameinfo['given'].upper()
- if 'middle' in nameinfo:
- singlenamefmtstr=singlenamefmtstr+' '+nameinfo['middle'].upper()
-
-
- elif nameformat=='lowercase':
- pass
- elif nameformat=='given-family':
- pass
- elif nameformat=='family-given':
- pass
- elif nameformat=='pinyin':
- pass
- else:
- pass
-
- return singlenamefmtstr
-
-
-#
-#
-#单个姓名解析
-def singlenameparser(name):
-
- singlename=name
-
- print('name:',name)
-
- #字典用于存储所有的姓名成分信息
- namepartsinfo={}
-
- nameparts=safetysplit(singlename,[','])
-
- if len(nameparts)==3:#两个逗号的情况,表示存在family和suffix
-
- prefixfamily=safetysplit(nameparts[0].lstrip().strip(),[' '])
- if len(prefixfamily)>1:
- namepartsinfo['prefix']=prefixfamily[0].lstrip().strip()
- namepartsinfo['family']=prefixfamily[1].lstrip().strip()
- else:
- namepartsinfo['family']=prefixfamily[0].lstrip().strip()
-
- namepartsinfo['suffix']=nameparts[1].lstrip().strip()
-
-
- givenmiddle=safetysplit(nameparts[2].lstrip().strip(),[' '])
- if len(givenmiddle)>1:
- namepartsinfo['given']=givenmiddle[0].lstrip().strip()
- namepartsinfo['middle']=givenmiddle[1].lstrip().strip()
- else:
- namepartsinfo['given']=givenmiddle[0].lstrip().strip()
-
- elif len(nameparts)==2:
-
- prefixfamily=safetysplit(nameparts[0].lstrip().strip(),[' '])
- if len(prefixfamily)>1:
- namepartsinfo['prefix']=prefixfamily[0].lstrip().strip()
- namepartsinfo['family']=prefixfamily[1].lstrip().strip()
- else:
- namepartsinfo['family']=prefixfamily[0].lstrip().strip()
-
-
- givenmiddle=safetysplit(nameparts[1].lstrip().strip(),[' '])
- if len(givenmiddle)>1:
- namepartsinfo['given']=givenmiddle[0].lstrip().strip()
- namepartsinfo['middle']=givenmiddle[1].lstrip().strip()
- else:
- namepartsinfo['given']=givenmiddle[0].lstrip().strip()
-
- else:
- givenmiddlefamily=safetysplit(nameparts[0].lstrip().strip(),[' '])
- if len(givenmiddlefamily)==3:
- namepartsinfo['given']=givenmiddlefamily[0].lstrip().strip()
- namepartsinfo['middle']=givenmiddlefamily[1].lstrip().strip()
- namepartsinfo['family']=givenmiddlefamily[2].lstrip().strip()
- elif len(givenmiddlefamily)==2:
- namepartsinfo['given']=givenmiddlefamily[0].lstrip().strip()
- namepartsinfo['family']=givenmiddlefamily[1].lstrip().strip()
- elif len(givenmiddlefamily)==1:
- namepartsinfo['family']=givenmiddlefamily[0].lstrip().strip()
-
-
- print('nameparts:',namepartsinfo)
-
- if 'family' in namepartsinfo:
- if namepartsinfo['family'].startswith('{'):
- namepartsinfo['familyi']=namepartsinfo['family']
- else:
- namepartsinfo['familyi']=namepartsinfo['family'][0].upper()
-
- if 'given' in namepartsinfo:
- #print(namepartsinfo['given'])
- if namepartsinfo['given'].startswith('{'):
- namepartsinfo['giveni']=namepartsinfo['given']
- else:
- namepartsinfo['giveni']=namepartsinfo['given'][0].upper()
-
- if 'middle' in namepartsinfo:
- if namepartsinfo['middle'].startswith('{'):
- namepartsinfo['middle']=namepartsinfo['middle']
- else:
- namepartsinfo['middlei']=namepartsinfo['middle'][0].upper()
-
- return namepartsinfo
-
-#
-#
-#文本列表解析
-def literallistparser(bibentry,fieldsource):
- fieldcontents=bibentry[fieldsource]
-
-
- #首先从文本列表分解出各个项,包括用' and '和' AND '做分解
- #利用safetysplit函数实现安全的分解
- seps=[' and ',' AND ']
- fieldcontents=fieldcontents.lstrip().strip()
- fielditems=safetysplit(fieldcontents,seps)
-
- print('fielditems:',fielditems)
-
- #根据'maxbibitems'和'minbibitems'截短
- fielditemstrunc=[]
-
- if len(fielditems)>formatoptions['maxbibitems']:
- fielditemstrunc=fielditems[:formatoptions['minbibitems']]
- fielditemstrunc.append('others')
- else:
- fielditemstrunc=fielditems
-
- #重设一下others的大小写,因为可能输入的时大写的
- if fielditems[-1].lower() == 'others':
- fielditems[-1]='others'
-
- #最后根据全局和局部选项进行格式化
- itemliststop=len(fielditemstrunc)
- itemliststart=1
- itemlistcount=0
- itemformattedstr=''
- for iteminfo in fielditemstrunc:
- itemlistcount=itemlistcount+1
- if iteminfo == 'others':
- if formatoptions['moreitems']:#只有设置moreitems为true是才输出other的相关信息
- itemformattedstr=itemformattedstr+r'\printdelim{andothorsdelim}\bibstring{andothers}'
- else:
- if itemlistcount==itemliststop and itemlistcount>1:#当没有others时最后一个项前加标点
- itemformattedstr=itemformattedstr+r'\printdelim{finalitemdelim}'+iteminfo
- elif itemlistcount==itemliststart:
- itemformattedstr=iteminfo
- else:
- itemformattedstr=itemformattedstr+r'\printdelim{multiitemdelim}'+iteminfo
-
- return itemformattedstr
-
-#
-#
-#文本域解析
-def literalfieldparser(bibentry,fieldsource):
- fieldcontents=bibentry[fieldsource]
-
- return fieldcontents
-
-#
-#
-#日期域解析
-#条目设置的选项options:
-def datefieldparser(bibentry,fieldsource,options):
- fieldcontents=bibentry[fieldsource]
-
- #首先从日期域,解析日期类型:
- dateparts={}
- if fieldsource=='year':
- datestring=bibentry[fieldsource]
- datetype=''
- else:
- datetype=fieldsource.replace('date','')
- datestring=bibentry[fieldsource]
-
-
- #日期的年月日解析
- #日期一般很少用{}进行保护,当保护的时候通常是整个进行包括,所以通常{}会出现在域的起始和末尾
- #所以当出现{字符时通常不用再做解析
- if '{' in datestring:
- datepartinfo=[datestring]
- else:
- datepartinfo=datestring.split('-')
-
- if len(datepartinfo)==3:
- dateparts[datetype+'year']=datepartinfo[0].strip().lstrip()
- dateparts[datetype+'month']=datepartinfo[1].strip().lstrip()
- dateparts[datetype+'day']=datepartinfo[2].strip().lstrip()
- elif len(datepartinfo)==2:
- dateparts[datetype+'year']=datepartinfo[0].strip().lstrip()
- dateparts[datetype+'month']=datepartinfo[1].strip().lstrip()
- else:
- dateparts[datetype+'year']=datepartinfo[0].strip().lstrip()
-
- print(dateparts)
-
- #判断解析的年月日是不是整数,若不是则表示日期不可解析
- datecanbeparse=True
- for k,v in dateparts.items():
- try:
- datepartisint=isinstance(int(v),int)
- except:
- print('INFO: WARNING'+fieldsource+'can not be parsed')
- datecanbeparse=False
- break
-
-
- #然后根据全局选项进行格式化:
- #如果解析的年月日不是整数,那么对于date域则忽略,对于year域则直接输出
- if datecanbeparse:
- if datetype+'date' in options:#首先使用条目给出的选项
- fieldcontents=singledateformat(dateparts,datetype,options[datetype+'date'])
- elif datetype+'date' in formatoptions:#接着使用全局给出的选项
- fieldcontents=singledateformat(dateparts,datetype,formatoptions[datetype+'date'])
- else:#否则使用默认选项
- fieldcontents=singledateformat(dateparts,datetype,'default')
- else:
- if fieldsource=='year':
- fieldcontents=bibentry[fieldsource]
- else:
- fieldcontents=''
-
- return fieldcontents
-
-
-#
-#
-# 根据日期的设置选项格式化单个日期
-def singledateformat(dateparts,datetype,formatoption):
- if formatoption=='year':
- dateformatstr=dateparts[datetype+'year']
- elif formatoption=='iso':
- dateformatstr=dateparts[datetype+'year']
- if len(dateparts[datetype+'month'])<2:
- dateformatstr=dateformatstr+'-0'+dateparts[datetype+'month']
- else:
- dateformatstr=dateformatstr+'-'+dateparts[datetype+'month']
- if len(dateparts[datetype+'day'])<2:
- dateformatstr=dateformatstr+'-0'+dateparts[datetype+'day']
- else:
- dateformatstr=dateformatstr+'-'+dateparts[datetype+'day']
- elif formatoption=='ymd':
- dateformatstr=dateparts[datetype+'year']
- dateformatstr=dateformatstr+'-'+dateparts[datetype+'month']
- dateformatstr=dateformatstr+'-'+dateparts[datetype+'day']
- elif formatoption=='default':
- dateformatstr=dateparts[datetype+'year']
- else:
- pass
-
- return dateformatstr
-
-
-
-
-
-#
-#
-#范围域解析
-def rangefieldparser(bibentry,fieldsource):
- fieldcontents=bibentry[fieldsource]
-
- return fieldcontents
-
-
-#
-#
-#打开bib文件
-def readfilecontents(bibFile):
- print("INFO: Reading references from '" + bibFile + "'")
- try:
- fIn = open(bibFile, 'r', encoding="utf8")
- global bibfilecontents
- bibfilecontents=fIn.readlines()
- fIn.close()
-
- global usedIds
- usedIds = set()
- if auxfile:
- fInAux = open(auxfile, 'r', encoding="utf8")
- for line in fInAux:
- if line.startswith("\\citation") or line.startswith("\\abx@aux@cite"):
- ids = line.split("{")[1].rstrip("} \n").split(", ")
- for id in ids:
- if (id != ""):
- usedIds.add(id)
- fInAux.close()
- print('references:',usedIds)
-
- except IOError:
- print("ERROR: Input bib file '" + bibFile +
- "' doesn't exist or is not readable")
- sys.exit(-1)
-
-#
-#打印bib文件内容
-def printfilecontents():
- for line in bibfilecontents:
- print(line)
-
-
-
-#
-#输出修改后的bib文件
-def writefilenewbib(bibFile):
-
- print(datetime.datetime.now().isoformat(timespec='seconds'))
-
- #json文件输出,用dump方法
- jsonoutfile="new"+bibFile.replace('.bib','.json')
- print("INFO: writing all references to '" + jsonoutfile + "'")
- fout = open(jsonoutfile, 'w', encoding="utf8")
- json.dump(bibentries, fout)
- fout.close()
-
- #json文件输出,直接用write写
- jsonoutfile="new"+bibFile.replace('.bib','cited.json')
- fout = open(jsonoutfile, 'w', encoding="utf8")
- print("INFO: writing cited references to '" + jsonoutfile + "'")
- fout.write('[\n')
- for bibentry in bibentries:
- if bibentry["entrykey"] in usedIds or not usedIds:
- fout.write(repr(bibentry)+',\n')
- fout.write(']\n')
- fout.close()
-
- #bib文件输出
- biboutfile="new"+bibFile
-
- try:
- fout = open(biboutfile, 'w', encoding="utf8")
- fout.write("%% \n")
- fout.write("%% bib file modified by biblatex-map.py\n")
-
- fout.write("%% "+datetime.datetime.now().isoformat(timespec='seconds')+"\n")
- fout.write("%% \n\n\n")
-
- for bibcomment in bibcomments:
- for k,v in bibcomment.items():
- if k=="entrytype":
- fout.write('@'+bibcomment["entrytype"]+'{')
- else:
- fout.write(str(v))
- fout.write('}\n\n')
-
- for bibstring in bibstrings:
- for k,v in bibstring.items():
- if k=="entrytype":
- fout.write('@'+bibstring["entrytype"]+'{')
- else:
- fout.write(str(v))
- fout.write('}\n\n')
-
- writebibentrycounter=0
- if auxfile:
- print("INFO: writing cited references in aux to '" + biboutfile + "'")
-
- for bibentry in bibentries:
- if bibentry["entrykey"] in usedIds:
- writebibentrycounter=writebibentrycounter+1
- fout.write('@'+bibentry["entrytype"]+'{'+bibentry["entrykey"]+',\n')
- for k,v in bibentry.items():
- if k=="entrytype" or k=="entrykey" or v=='""' or v==None or k=='entrysn':
- pass
- else:
- fout.write('\t'+str(k)+' = {'+str(v)+'},\n')
- fout.write('}\n\n')
- else:
- print("INFO: writing all references to '" + biboutfile + "'")
- for bibentry in bibentries:
- writebibentrycounter=writebibentrycounter+1
- fout.write('@'+bibentry["entrytype"]+'{'+bibentry["entrykey"]+',\n')
- for k,v in bibentry.items():
- if k=="entrytype" or k=="entrykey" or v=='""' or k=='entrysn' or v==None:
- pass
- else:
- fout.write('\t'+k+' = {'+v+'},\n')
- fout.write('}\n\n')
-
- fout.close()
- print("INFO: " + str(writebibentrycounter) + " references writed")
- except IOError:
- print("ERROR: Input bib file '" + bibFile +
- "' doesn't exist or is not readable")
- sys.exit(-1)
-
-
-
-
-#
-#将条目解析放到bibentries列表中
-#每个条目是一个dict字典
-def bibentryparsing():
- global bibentries
- global bibcomments
- global bibstrings
- bibentries=[]#用于记录所有条目
- bibentry={}#用于记录当前条目
-
- bibcomments=[]#用于记录所有@comment条目
- bibcomment={}#用于记录当前@comment条目
-
- bibstrings=[]#用于记录所有@stirng条目
- bibstring={}#用于记录当前@stirng条目
-
- entrysn=0 #用于标记条目序号
- bibentrycounter=0##用于标记条目总数
- commentsn=0 #用于标记@comment条目序号
- bibcommentcounter=0#用于标记@comment条目总数
- stringsn=0 #用于标记@stirng条目序号
- bibstringcounter=0#用于标记@stirng条目总数
-
- entrystated=False #用于标记条目开始
- fieldvalended=True #用于标记域的值当前行是否已经结束
- fieldvalue="" #用于记录当前域的值
- counterbracket=0 #用于追踪{}符号
- counterquotes=0 #用于追踪“”符号
- enclosebracket=True #用于记录是用{}还是用“”做为域的值的包围符号
- enclosenone=False #用于记录域的值无包围符号的情况
-
- for line in bibfilecontents:#遍历所有行
- #print(line)
-
- if line.startswith("@") and not "@comment" in line.lower() and not "@string" in line.lower():#判断条目开始行
- entrysn=entrysn+1
- entrystated=True #新条目开始
- print('entrysn=',entrysn)
- entrynow=line.lstrip('@').split(sep='{', maxsplit=1)
- #print(entrynow)
- entrytype=entrynow[0]
- bibentry['entrytype']=entrytype.lower()#条目类型小写,方便比较
- entrykey=entrynow[1].split(sep=',', maxsplit=1)[0]
- bibentry['entrykey']=entrykey
- bibentry['entrysn']=entrysn
- elif entrystated: #只有新条目开始了才有意义
-
- if fieldvalended: #当前行不是前面的未结束域的值
- if '=' in line and not line.lstrip().startswith("}"):
- #排除以'}'开头的行后根据=号判断条目域信息行,不可能出现=号无法判断信息行的问题,
- #因为是域值中存在=的特殊情况已经在未结束逻辑处理
- entryline=line.lstrip()
- entrynow=entryline.split(sep='=', maxsplit=1)
- #print(entrynow)
- entryfield=entrynow[0].strip().lstrip().lower()#域名小写,方便比较
- entryfieldline=entrynow[1].lstrip()
-
- if entryfieldline.startswith("{"):
- enclosebracket=True
- elif entryfieldline.startswith('"'):
- enclosebracket=False
- else:#当没有符号包围是设置enclosenone以便特殊处理
- enclosenone=True
-
- fieldvalcontinued=True #临时标记,用于记录域值是否还未结束,先假设未结束
- for chari in entryfieldline.strip():#遍历域值中的每个字符
- fieldvalue=fieldvalue+chari
- if chari =='{':#对{符号进行追踪
- counterbracket=counterbracket+1
- elif chari =='}':#对}符号进行追踪
- counterbracket=counterbracket-1
- if enclosebracket:
- if counterbracket==0:#当}与域开始的{配对,那么说明域值已经结束
- bibentry[entryfield]=fieldvalue[1:-1]#利用strip可能会消多次,因此用list的方式处理
- fieldvalue=""
- counterbracket=0
- counterquotes=0
- fieldvalended=True
- fieldvalcontinued=False
- break #直接跳出循环
- elif chari =='"':
- counterquotes=counterquotes+1
- if not enclosebracket:
- if operator.mod(counterquotes,2)==0:
- bibentry[entryfield]=fieldvalue[1:-1]
- fieldvalue=""
- counterbracket=0
- counterquotes=0
- fieldvalended=True
- fieldvalcontinued=False
- break
- elif chari ==',':#若域值没有包围符号那么遇到,号即为域值结束
- if enclosenone:
- bibentry[entryfield]=fieldvalue[:-1]
- fieldvalue=""
- counterbracket=0
- counterquotes=0
- fieldvalended=True
- fieldvalcontinued=False
- enclosenone=False
-
- #测试:输出看是否正确
- #if entryfield=='abstract':
- # print('val=',fieldvalue)
- # print('counterbracket=',counterbracket)
-
- if fieldvalcontinued:
- fieldvalended=False
-
- elif '}' in line:#条目结束行
-
- #global bibentryglobal
- #bibentryglobal=copy.deepcopy(bibentry)
- #print('entry:',bibentryglobal)
- #bibentries.append(bibentryglobal)
- print('entry:',bibentry)
- bibentries.append(bibentry)
- bibentry={}
- entrystated=False
-
- else: #当前行是前面的未结束域的值,因此直接往前面的域值添加即可
- fieldvalcontinued=True
-
- entryfieldline=line
-
- if enclosenone:#当域没有包围符号时,接续的行可能是用逗号结束的域,也可能没有逗号,而用}直接结束条目信息
- for chari in entryfieldline.strip():
- fieldvalue=fieldvalue+chari
- if chari ==',':
- bibentry[entryfield]=fieldvalue[:-1]
- fieldvalue=""
- counterbracket=0
- counterquotes=0
- fieldvalended=True
- fieldvalcontinued=False
- enclosenone=False
- elif chari =='}':
- bibentry[entryfield]=fieldvalue[:-1]
- fieldvalue=""
- counterbracket=0
- counterquotes=0
- fieldvalended=True
- fieldvalcontinued=False
- enclosenone=False
- print('entry:',bibentry)
- bibentries.append(bibentry)
- bibentry={}
- entrystated=False
-
- else:
- for chari in entryfieldline.strip():
- fieldvalue=fieldvalue+chari
- if chari =='{':
- counterbracket=counterbracket+1
- elif chari =='}':
- counterbracket=counterbracket-1
- if enclosebracket:
- if counterbracket==0:
- bibentry[entryfield]=fieldvalue[1:-1]
- fieldvalue=""
- counterbracket=0
- counterquotes=0
- fieldvalended=True
- fieldvalcontinued=False
- break
- elif chari =='"':
- counterquotes=counterquotes+1
- if not enclosebracket:
- if mod(counterquotes,2)==0:
- bibentry[entryfield]=fieldvalue[1:-1]
- fieldvalue=""
- counterbracket=0
- counterquotes=0
- fieldvalended=True
- fieldvalcontinued=False
- break
-
-
- if fieldvalcontinued:
- fieldvalended=False
- elif line.startswith("@") and "@comment" in line.lower():#@comment的起始
- commentsn=commentsn+1
- entrynow=line.lstrip('@').split(sep='{', maxsplit=1)
- entrytype=entrynow[0]
- bibcomment['entrytype']=entrytype.lower()#条目类型小写,方便比较
- entrycontents=entrynow[1].strip()[:-1]
- bibcomment['entrycontents']=entrycontents
- print(bibcomment)
- bibcomments.append(bibcomment)
- bibcomment={}
-
- elif line.startswith("@") and "@string" in line.lower():#@string的起始
- stringsn=stringsn+1
- entrynow=line.lstrip('@').split(sep='{', maxsplit=1)
- entrytype=entrynow[0]
- bibstring['entrytype']=entrytype.lower()#条目类型小写,方便比较
- entrycontents=entrynow[1].strip()[:-1]
- bibstring['entrycontents']=entrycontents
- print(bibstring)
- bibstrings.append(bibstring)
- bibstring={}
-
-
- bibentrycounter=len(bibentries)
- bibcommentcounter=len(bibcomments)
- bibstringcounter=len(bibstrings)
- print('entrysn=',entrysn,' commentsn=',commentsn,' stringsn=',stringsn)
- print('entryct=',bibentrycounter,' commentct=',bibcommentcounter,' stringct=',bibstringcounter)
-
- if not bibentrycounter==entrysn or not bibcommentcounter==commentsn or not bibstringcounter==stringsn:
- try:
- raise BibParsingError('bib file parsing went wrong!')
- except BibParsingError as e:
- raise BibParsingError(e.message)
- print('entrytotal=',bibentrycounter)
-
- #输出解析后的bib文件信息
- #for bibentryi in bibentries:
- #print(bibentryi)
-
-
-#
-#打印bibentries列表中的所有条目
-def printbibentries():
- for bibentryi in bibentries:
- print(bibentryi)
-
-
-#
-#自定义异常类
-class BibParsingError(Exception):
- def __init__(self,message):
- Exception.__init__(self)
- self.message=message
-
-#
-# 执行数据映射操作
-# 还有很多选项没有实现,20190209
-# 实现的选项中也需要和未实现的选项进行数据传递
-def execsourcemap():
- for map in sourcemaps:#every map in maps,每个map逐步开始
- for bibentry in bibentries:#每个映射都需要遍历所有条目,对每个条目做map
-
- mapcontinue=1#大于0表示正常,继续当前条目的map
- typesrcinfo={}#用于记录typesource相关处理结果
- fieldsrcinfo={}#用于记录fieldsource相关处理的结果
- constraintinfo={}#用于记录类型等限制信息记录
- constraintinfo['pertype']=[]
- constraintinfo['pernottype']=[]
-
- #print("map info=",map)
- for step in map:#every step in map
- if mapcontinue>0:#对前面已经final完成的情况做限制
- for keyvals in step:#key-vals in step
- for k,v in keyvals.items():#step 是有迹可循的,每个step总是存在一些东西,找到这些做其中的逻辑即可
- #print(k,v)
-
- if k=="typesource":#条目类型设置
- mapcontinue=maptypesource(keyvals,bibentry,typesrcinfo)#coef is dict
-
- elif k=="fieldsource":#域查找或设置
- mapcontinue=mapfieldsource(keyvals,bibentry,fieldsrcinfo,constraintinfo)#
- #print("fieldsource step:",fieldsrcinfo)
-
- elif k=="fieldset":#域设置
- mapcontinue=mapfieldset(keyvals,bibentry,typesrcinfo,fieldsrcinfo,constraintinfo)#
-
- elif k=="pertype": #类型限制
- mapcontinue=mappertype(keyvals,constraintinfo)
-
- elif k=="pernottype":#类型限制
- mapcontinue=mappernottype(keyvals,constraintinfo)
-
- elif k=="notfield":#域限制
- mapcontinue=mapnotfield(keyvals,bibentry,fieldsrcinfo,constraintinfo)#
- else:
- pass
-
-
-#
-#域限制,若域确定不存在则终止map
-def mapnotfield(keyvals,bibentry,fieldsrcinfo,constraintinfo):
-
- setcontinue=True
- print(setcontinue)
- if len(constraintinfo['pertype'])>0:
- if bibentry['entrytype'] not in constraintinfo['pertype']:#
- setcontinue=False
- if len(constraintinfo['pernottype'])>0:
- if bibentry['entrytype'] in constraintinfo['pernottype']:#
- setcontinue=False
- print(setcontinue)
-
-
- print("constraints:notfield")
- if setcontinue:
- for k,v in keyvals.items():
- #print(k,v)
- if k=='notfield':
- notfield=v.lower()
- elif k=='final':
- fieldfinal=v
- else:
- pass
-
- if notfield not in bibentry:#当notfield不存在,则判断为true,若存在final则终止,否则继续
- if fieldfinal:
- return 0
- else:
- return 1
- else:
- return 1
-
- else:
- return 0
-
-
-
- #
-#条目类型限制,将类型限制信息放入字典
-def mappertype(keyvals,constraintinfo):
-
- print("constraints:pertype")
- for k,v in keyvals.items():
- #print(k,v)
- if k=='pertype':
- pertype=v.lower()#因为大小写区分,所以全部小写方便比较
- else:
- pass
- print('pertype=',pertype)
-
- constraintinfo['pertype'].append(pertype)
- return 1
-
-#
-#条目类型限制,将类型限制信息放入字典
-def mappernottype(keyvals,constraintinfo):
-
- print("constraints:pernottype")
- for k,v in keyvals.items():
- #print(k,v)
- if k=='pernottype':
- pernottype=v.lower()#因为大小写区分,所以全部小写方便比较
- else:
- pass
- print('pertype=',pertype)
-
- constraintinfo['pernottype'].append(pernottype)
- return 1
-
-
-#
-#条目类型转换
-def maptypesource(keyvals,bibentry,typesrcinfo):
- retrunval=1
- for k,v in keyvals.items():
- #print(k,v)
- if k=='typesource':
- typesource=v.lower()
- elif k=='typetarget':
- typetarget=v.lower()
- elif k=='final':
- retrunval=0
- else:
- pass
-
- typesrcinfo
- if typetarget:
- if bibentry['entrytype']==typesource:
- bibentry['entrytype']=typetarget
- typesrcinfo['typesource']=typesource
- return 1
- else:
- return retrunval #存在final时,且不匹配则终止map
- else:
- if bibentry['entrytype']==typesource:
- typesrcinfo['typesource']=typesource
- else:
- typesrcinfo['typesource']=None
- return retrunval
-#
-#
-# 域信息设置
-def mapfieldset(keyvals,bibentry,typesrcinfo,fieldsrcinfo,constraintinfo):
- overwrite=False
- append=False
-
- setcontinue=True
- print(setcontinue)
- if len(constraintinfo['pertype'])>0:
- if bibentry['entrytype'] not in constraintinfo['pertype']:#
- setcontinue=False
- if len(constraintinfo['pernottype'])>0:
- if bibentry['entrytype'] in constraintinfo['pernottype']:#
- setcontinue=False
- print(setcontinue)
-
- if setcontinue:
-
- for k,v in keyvals.items():
- #print(k,v)
- if k=='fieldset':
- fieldset=v.lower()
- elif k=='fieldvalue':
- fieldvalue=v
- elif k=='origfieldval':
- fieldvalue=fieldsrcinfo[fieldsrcinfo['fieldsource']]
- print(fieldvalue)
- elif k=='origentrytype':
- fieldvalue=typesrcinfo['typesource']
- print(fieldvalue)
- elif k=='origfield':
- fieldvalue=fieldsrcinfo['fieldsource']
- print(fieldvalue)
- elif k=='null':
- fieldvalue=None
- print(fieldvalue)
- elif k=='append':
- append=v
- elif k=='overwrite':
- overwrite=v
- else:
- pass
-
-
- print("fieldset=",fieldset)
- if overwrite:
- if append:
- oldvalue=bibentry[fieldset]
- newvalue=oldvalue+","+fieldvalue
- bibentry[fieldset]=newvalue
- else:
- bibentry[fieldset]=fieldvalue
- else:
- if fieldset in bibentry:
- pass
- else:
- bibentry[fieldset]=fieldvalue
- return 1
-
- else:
- return 1
-
-#
-#域名转换或判断域是否存在或match
-def mapfieldsource(keyvals,bibentry,fieldsrcinfo,constraintinfo):
- mapfieldtype=0 #域名map的类型设置
- fieldmatch=''#匹配模式默认为空
- fieldmatchi=''#匹配模式默认为空
-
-
- setcontinue=True
- print(setcontinue)
- if len(constraintinfo['pertype'])>0:
- if bibentry['entrytype'] not in constraintinfo['pertype']:#
- setcontinue=False
- if len(constraintinfo['pernottype'])>0:
- if bibentry['entrytype'] in constraintinfo['pernottype']:#
- setcontinue=False
- print(setcontinue)
-
-
- overwrite=False
- for k,v in keyvals.items():
- #print(k,v)
- if k=='fieldsource':
- fieldsource=v.lower()
- elif k=='fieldtarget':
- fieldtarget=v.lower()
- mapfieldtype=1 #域map类型1,直接做域名转换
- elif k=='replace':
- fieldreplace=v
- mapfieldtype=2 #域map类型2,直接做域信息转换
- elif k=='final':
- fieldfinal=v #final要么选项不给出,要么选项给出为true
- if fieldfinal:#当为true时则做终止判断
- mapfieldtype=3 #域map类型3,做final判断可以终止map
- elif k=='overwrite':#
- overwrite=v
- elif k=='match':#不区分大小写的match
- fieldmatch=v
- elif k=='matchi':#区分大小写的match
- fieldmatchi=v
- elif k=='notmatch':#不区分大小写的notmatch,下面这两个选项的逻辑没有实现
- fieldnotmatch=v
- elif k=='notmatchi':#区分大小写的notmatch
- fieldnotmatch=v
- else:
- pass
-
-
- if setcontinue:
-
- #返回字典的第一项是fieldsource信息
- fieldsrcinfo['fieldsource']=fieldsource
-
- if mapfieldtype==0:#第0中情况即,不做信息转换,也不终止map,仅返回一些信息
-
- if fieldsource in bibentry:
- if fieldmatch:
- m = re.match(fieldmatch, bibentry[fieldsource])
- if m:
- fieldsrcinfo[fieldsource]=[bibentry[fieldsource],fieldmatch]
- else:
- fieldsrcinfo[fieldsource]=[None] #正则不匹配,则返回为None
-
- elif fieldmatchi:
- m = re.match(fieldmatchi, bibentry[fieldsource])
- if m:
- fieldsrcinfo[fieldsource]=[bibentry[fieldsource],fieldmatchi]
- else:
- fieldsrcinfo[fieldsource]=[None] #正则不匹配,则返回为None
-
- else:
- fieldsrcinfo[fieldsource]=bibentry[fieldsource]#将域的值记录下来,用于下一step
-
- else:
- fieldsrcinfo[fieldsource]=[None] #域不存在则返回为None
- return 1
-
-
- elif mapfieldtype==1:#第1中情况即,做域名转换
- print('fieldsource=',fieldsource,'fieldtarget=',fieldtarget)
- if fieldsource in bibentry:
- bibentry[fieldtarget]=bibentry[fieldsource]
- del bibentry[fieldsource]
- fieldsrcinfo[fieldsource]=bibentry[fieldtarget]
- else:
- fieldsrcinfo[fieldsource]=[None]
- return 1
-
-
- elif mapfieldtype==2:#域map类型2,直接做域信息转换,真正操作需要overwrite选项支持
- print('fieldsource=',fieldsource)
- print('fieldmatch=',fieldmatch)
- print('fieldreplace=',fieldreplace)
- if overwrite:
- if fieldsource in bibentry:
- if fieldmatch:
- #strafrpl=re.sub(r'(\d\d\d\d)\-(\d)\-(\d)',r'\1-0\2-0\3','2015-1-3')
- #strafrpl=re.sub(r'(\d\d\d\d)\-(\d)\-(\d)',r'\1-0\2-0\3',bibentry[fieldsource])
- strafrpl=re.sub(fieldmatch,fieldreplace,bibentry[fieldsource]) #执行替换
- print('strafterreplace=',strafrpl)
- bibentry[fieldsource]=strafrpl
- elif fieldmatchi:
- strafrpl=re.sub(fieldmatchi, fieldreplace,bibentry[fieldsource])
- bibentry[fieldsource]=strafrpl
- else:
- fieldsrcinfo[fieldsource]=[None]
- else:
- fieldsrcinfo[fieldsource]=[None]
- else:
- fieldsrcinfo[fieldsource]=[None]
- return 1
-
-
- elif mapfieldtype==3:#域map类型3,当没有匹配则终止map
- if fieldsource in bibentry:
- if fieldmatch:
- m = re.match(fieldmatch, bibentry[fieldsource])
- if m:
- fieldsrcinfo[fieldsource]=[bibentry[fieldsource],fieldmatch]
- return 1
- else:
- return 0
-
- elif fieldmatchi:
- if m:
- fieldsrcinfo[fieldsource]=[bibentry[fieldsource],fieldmatchi]
- return 1
- else:
- return 0
-
- else:
- fieldsrcinfo[fieldsource]=bibentry[fieldsource]#将域的值记录下来,用于下一step
- return 1
-
- else:
- return 0
-
- else:
- fieldsrcinfo[fieldsource]=[None]
- return 1
-
-
-
-
-
-#运行脚本测试
-if __name__=="__main__":
-
- #设置需要修改的bib文件
- #inputbibfile='example.bib'
- #inputbibfile='biblatex-map-test.bib'
- inputbibfile='eg-thesis.bib'
-
- #auxfile="opt-gbpub-true.aux"
- #set the aux file
- #this is not necessary
- auxfile=''
- #auxfile="opt-gbpub-true.aux"
-
- readfilecontents(inputbibfile)
-
- #printfilecontents()
-
- bibentryparsing()
-
- #printbibentries()
-
- execsourcemap()
-
- #printbibentries()
-
- writefilenewbib(inputbibfile)
-
- #print(bibentries[0])
-
- #print(formatbibentry(bibentries[0]))
-
- formatallbibliography()
- printbibliography()
- \ No newline at end of file