跳转到主要内容

Wagtail的BibTeX参考文献

项目描述

Wagtail References Build Status

基于 BibTeX 的参考文献条目,作为 wagtail 片段

模板

如果您想提交带有模板的PR,我非常欢迎合作 :)

我正在逐渐改进 wagtail 管理模板,随着库的吸引力增加和用户增多,我会做得更好。 底线:如果您使用或喜欢它,请Star这个GitHub仓库,这样我知道它正在获得关注!

在前端显示参考文献

编写自己的模板/html

我使用 citation.js 来解析和显示 wagtail 管理中的 bibtex,它可以在模板中浏览器内使用(如下所示)

<!-- Using citation.js https://citation.js.org/api/tutorial-getting_started.html -->
<script src="https://cdn.jsdelivr.net.cn/npm/citation-js" type="text/javascript"></script>
<script type="text/javascript">
  const Cite = require('citation-js')
  function renderToDiv(inputBibtex, divId) {
      const citation = new Cite(inputBibtex)
      const outputHtml = citation.format('bibliography', {
        format: 'html',
        template: 'apa',
        lang: 'en-US'
      })
      outputDiv = document.getElementById(divId)
      outputDiv.innerHTML = outputHtml
  }
</script>

<h3><strong>Slug (citation key):</strong> {{ reference.slug }}</h3>
<h3><strong>Type:</strong> {{ reference.bibtype }}</h3>
<div id="{{ reference.slug }}"></div>
<script type="text/javascript"> renderToDiv("{{ reference.bibtex_string }}", "{{ reference.slug }}") </script>

使用 react(wagtail 无头模式)

在前端,我使用react(参见上文关于在无头模式下使用Wagtail的nanorant)。我现在在一个项目中使用react-citeproc以及biblatex-csl-converter,效果相当不错。您的组件将类似于以下

import React from 'react'
import { Bibliography } from 'react-citeproc'
import raw from 'raw.macro'

import { BibLatexParser, CSLExporter } from 'biblatex-csl-converter'

const style = raw('assets/csl/apa-style.csl')
const locale = raw('assets/csl/xml-locale.xml')

class Reference extends React.Component {
  constructor(props) {
    super(props)
    this.state = {
      bibtex: undefined,
      csl: undefined,
    }
  }

  static getDerivedStateFromProps(nextProps, prevState) {
    if (nextProps.bibtex !== prevState.bibtex) {
      const parser = new BibLatexParser(nextProps.detail.bibtex, { processUnexpected: false, processUnknown: false })
      const csl = new CSLExporter(parser.output).parse()
      return {
        bibtex: nextProps.detail.bibtex,
        csl,
      }
    }
    return null
  }

  render() {
    return (
      <div className={classes.bibliography}>
        <Bibliography
          style={style}
          locale={locale}
          items={this.state.csl}
        />
      </div>
    )
  }
}

export default Reference

路线图

我想包含以下内容

  • 一个更好的代码片段编辑器,可能使用JSON编辑组件,并允许用户在tex和json之间切换
  • 一个ListSerializer,可以将多个引用序列化为bibjson集合
  • HTML渲染器和视图集

需求

Wagtail References已在Django 2.1或更高版本以及Wagtail 2.3或更高版本上进行了测试。

支持的版本

Python:3.6

Django:2.1

Wagtail:2.3

入门指南

通过pip安装

pip install wagtail_references

添加到INSTALLED_APPS

INSTALLED_APPS = [
    ...
    'wagtail_references',
    ...
]

运行迁移

python manage.py migrate wagtail_references

引用模型

只有一个数据库模型Reference,它在Wagtail中注册为代码片段,使其可搜索和选择。

别名

该模型有一个(必需,唯一)的别名字段,当添加引用时会自动从bibtex内容中设置。

例如,如果您有以下bibtex条目

@article{Clark2017a,
author = {Clark, Thomas H. E. and Lueck, Rolf G. and Hay, Alex E. and Davey, Thomas and Stern, Peter and Horwitz, Rachel},
journal = {Proc. of the 12th European Wave and Tidal Energy Conference},
pages = {7},
title = {{InSTREAM : Measurement , Characterisation and Simulation of Turbulence from Test Tank to Ocean .}},
year = {2017}
}

别名将自动设置为clark-lueck-hay-davey-stern-horwitz-2017,并附加-2-3等以保持唯一性。

bibtex条目的引用键将更新以对应

@article{clark-lueck-hay-davey-stern-horwitz-2017,
author = ... etc etc ...
}

唯一性在表单验证和数据库级别强制执行。在创建引用后可以手动编辑别名。

bibtex和bibjson

引用模型包含一个bibtex字段(包含bibtex字符串,原始)和一个bibjson字段。我知道这会重复数据。但我宁愿这样做,也不愿意每次想要以不同形式序列化数据时都重新解析数据。我可以选择将其缓存,但我不知道大家有多少内存,也不希望如果管理了大量引用而弄乱您的缓存)。这是一个判断。用例和替代解决方案?提交一个问题。

如果使用POSTGRES,则bibjson以原生JSON格式存储,否则以字符串格式存储(感谢django-jsonfield)。

Django设置

以下设置可以在您的SETTINGS.py中定义

  • WAGTAILREFERENCES_CONVERT_BIBTEX(默认:False)在保存新记录之前,记录将被统一到严格的latex格式。这强制转换为Unicode,例如,添加括号以强制大写。
  • WAGTAILREFERENCES_ENABLE_UNICODE(默认:True)如果启用,则将类似于"C{\"o}ze"的项目转换为它们的Unicode等效项。如果您在使用LaTeX渲染引擎中的条目,则这不是必需的。如果您使用它们来渲染HTML(您很可能这样做,毕竞这是一个网络内容管理系统),您可能需要这样做。
  • WAGTAILREFERENCES_COLLECTION_NAME(默认:None)为以bibjson格式渲染的记录应用默认集合名称。

示例

为了您和我们的测试目的,有一些示例是非常有用的,因此我在examples.py文件中准备了一些,它包含一系列不同的bibtex引用。

如果您遇到尴尬的引用或无法验证的引用,请将它们发布到github问题,以便我可以帮助诊断并添加它们以进行测试。

谢谢

感谢internaut提供bibtex-json转换器。他们的代码未许可,所以除了说谢谢之外,我不知道如何给它致谢!

由以下支持