一个用于解析 BibTeX 文件的 Swift 库。
准备您的输入,以字符串形式。例如:
let input = """
@Article{max20,
author={Max},
title={SwiftyBibtex},
journal={New Repositories},
year={2020},
note={A Swift library for parsing BibTeX files.}
}
@String{me="Max"}
@Preamble{"Maintained by " # me}
@Comment{TODO: Add more entries}
"""
do {
let result = try SwiftyBibtex.parse(input)
result.publications
} catch {
print("Error parsing input: \(error)")
}
let publication = publications[0]
publication.publicationType // PublicationType.article
publication.citationKey // "max20"
publication.fields // ["author": "Max", ...]
publication.rangeInFile // (1:0)...(12:0)
注意:fields 中的所有键都是小写的。
您可以将出版物转换为以下任何类型:
Article (文章)Book (书籍)Booklet (小册子)InBook (书籍中的章节)InCollection (文集中的文章)InProceedings (会议论文集中的文章)Manual (手册)MasterThesis (硕士论文)Misc (其他)PhdThesis (博士论文)Proceedings (会议论文集)TechReport (技术报告)Unpublished (未发表的文章)每种类型都有一组必需的和可选的字段,可以直接访问。 所有其他字段可以使用 fields 属性访问。
if let article = publication as? Article {
article.author // "Max"
article.title // "SwiftyBibtex"
article.journal // "New Repositories"
article.year // 2020
article.fields["note"] // Optional("A Swift library for parsing BibTeX files.")
}
let result = try SwiftyBibtex.parse(input)
result.preambles // ["Maintained by Max"]
result.comments // ["TODO: Add more entries"]
let result = try SwiftyBibtex.parse(input)
for warning in result.warnings {
print(warning.message)
}
for error in result.errors {
print(error.line)
print(error.charPositionInLine)
print(error.message)
}
警告和错误会自动记录到控制台。 您可以通过设置不同的日志记录级别来更改此行为。
let result = try SwiftyBibtex.parse(input, loggingLevel: .warn) // Log warnings and errors.
let result = try SwiftyBibtex.parse(input, loggingLevel: .error) // Log only errors.
let result = try SwiftyBibtex.parse(input, loggingLevel: .none) // Don't log anything.
警告由以下类型之一表示:
DuplicateCitationKeyWarning (重复的引用键警告)MismatchedDataTypeWarning (不匹配的数据类型警告)MissingRequiredFieldsWarning (缺少必需字段警告)UnrecognizedPublicationTypeWarning (无法识别的出版物类型警告)UnusedStringDefinitionWarning (未使用的字符串定义警告)错误由以下类型之一表示:
ExtraneousInputParserError (多余的输入解析器错误)MismatchedInputParserError (不匹配的输入解析器错误)MissingSymbolParserError (缺少符号解析器错误)NoViableAlternativeParserError (无可行替代方案解析器错误)StringDefinitionNotFoundParserError (未找到字符串定义解析器错误)TokenRecognitionParserError (令牌识别解析器错误)将警告或错误转换为这些类型之一,可以使您获得有关它的更多信息。
if let extraneousInputError = error as? ExtraneousInputParserError {
print(extraneousInputError.offendingSymbol)
print(extraneousInputError.expectedSymbols)
}
选择 File > Swift Packages > Add Package Dependency... 并输入以下URL
https://github.com/MaxHaertwig/SwiftyBibtex.git
打开 Package.swift 并将以下行添加到您Package的依赖项中
.package(name: "SwiftyBibtex", url: "https://github.com/MaxHaertwig/SwiftyBibtex.git", .upToNextMajor(from: "1.0.0"))
该库使用 ANTLR 生成其底层的 BibTeX 解析器。 词法分析器和解析器语法可以在 BibtexLexer.g4 和 BibtexParser.g4 中找到。 如果您决定更改其中一个语法文件,请确保运行 generate_bibtex_parser.sh 脚本以生成新的解析器。
ANTLR 运行时 (Antlr4) 作为包依赖项包含在内。
欢迎提供反馈、问题 和 Pull Requests。
SwiftyBibtex 在 MIT 许可证下可用。 有关更多信息,请参见 LICENSE。