com.hfg.citation.Chicago Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of com_hfg Show documentation
Show all versions of com_hfg Show documentation
com.hfg xml, html, svg, and bioinformatics utility library
package com.hfg.citation;
import java.net.MalformedURLException;
import java.net.URL;
import com.hfg.css.CSS;
import com.hfg.exception.ProgrammingException;
import com.hfg.html.HTMLTag;
import com.hfg.html.Span;
import com.hfg.util.StringBuilderPlus;
import com.hfg.util.StringUtil;
import com.hfg.util.collection.CollectionUtil;
import com.hfg.xml.msofficexml.docx.wordprocessingml.WmlParagraph;
import com.hfg.xml.msofficexml.docx.wordprocessingml.WmlXMLTag;
//------------------------------------------------------------------------------
/**
Chicago Manual of Style (CMS) citation style.
Example:
Taylor, J. Alex, and Richard S. Johnson. “Sequence Database Searches Via de Novo Peptide Sequencing
by Tandem Mass Spectrometry.” Rapid Communications in Mass Spectrometry 11, no. 9 (1997): 1067–75.
doi:10.1002/(sici)1097-0231(19970615)11:9<1067::aid-rcm953>3.0.co;2-l.
@author J. Alex Taylor, hairyfatguy.com
*/
//------------------------------------------------------------------------------
// com.hfg XML/HTML Coding Library
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
// J. Alex Taylor, President, Founder, CEO, COO, CFO, OOPS hairyfatguy.com
// [email protected]
//------------------------------------------------------------------------------
public class Chicago implements CitationFormat
{
//##########################################################################
// PUBLIC METHODS
//##########################################################################
//---------------------------------------------------------------------------
@Override
public String generateAsString(Citation inCitation)
{
String formattedCitation;
switch (inCitation.getType())
{
case journal:
formattedCitation = generateJournalCitationAsString(inCitation);
break;
case software:
formattedCitation = generateSoftwareCitationAsString(inCitation);
break;
default:
throw new ProgrammingException("No support for " + inCitation.getType() + " citations yet!");
}
return formattedCitation;
}
//---------------------------------------------------------------------------
@Override
public HTMLTag generateAsHTML(Citation inCitation)
{
HTMLTag tag;
switch (inCitation.getType())
{
case journal:
tag = generateJournalCitationAsHTML(inCitation);
break;
case software:
tag = generateSoftwareCitationAsHTML(inCitation);
break;
default:
throw new ProgrammingException("No support for " + inCitation.getType() + " citations yet!");
}
return tag;
}
//---------------------------------------------------------------------------
@Override
public WmlParagraph generateAsDocx(Citation inCitation, WmlXMLTag inParentTag)
{
WmlParagraph p;
switch (inCitation.getType())
{
case journal:
p = generateJournalCitationAsDocx(inCitation, inParentTag);
break;
case software:
p = generateSoftwareCitationAsDocx(inCitation, inParentTag);
break;
default:
throw new ProgrammingException("No support for " + inCitation.getType() + " citations yet!");
}
return p;
}
//##########################################################################
// PRIVATE METHODS
//##########################################################################
//---------------------------------------------------------------------------
private String generateAuthorListForBibliography(Citation inCitation)
{
StringBuilderPlus authorList = null;
if (CollectionUtil.hasValues(inCitation.getAuthors()))
{
authorList = new StringBuilderPlus().setDelimiter(", ");
for (int i = 1; i <= inCitation.getAuthors().size(); i++)
{
Author author = inCitation.getAuthors().get(i - 1);
if (1 == i)
{
// First Author
authorList.append(author.getLastName());
authorList.delimitedAppend(author.getFirstName());
if (1 == author.getFirstName().length())
{
authorList.append(".");
}
Character middleInitial = author.getMiddleInitial();
if (middleInitial != null)
{
authorList.append(" " + middleInitial + ".");
}
}
else if (inCitation.getAuthors().size() == i)
{
// Last author
authorList.delimitedAppend("and ");
authorList.append(author.getFirstName());
if (1 == author.getFirstName().length())
{
authorList.append(".");
}
Character middleInitial = author.getMiddleInitial();
if (middleInitial != null)
{
authorList.append(" " + middleInitial + ".");
}
authorList.append(" " + author.getLastName());
}
else
{
authorList.delimitedAppend(author.getFirstName());
if (1 == author.getFirstName().length())
{
authorList.append(".");
}
Character middleInitial = author.getMiddleInitial();
if (middleInitial != null)
{
authorList.append(" " + middleInitial + ".");
}
authorList.append(" " + author.getLastName());
}
}
}
return authorList != null ? authorList.toString() : null;
}
//---------------------------------------------------------------------------
private String generateJournalCitationAsString(Citation inCitation)
{
return StringUtil.stripHTMLTags(generateJournalCitationAsHTML(inCitation).toHTML());
}
//---------------------------------------------------------------------------
private HTMLTag generateJournalCitationAsHTML(Citation inCitation)
{
Span tag = new Span();
String authorList = generateAuthorListForBibliography(inCitation);
if (StringUtil.isSet(authorList))
{
tag.addContent(authorList);
}
if (StringUtil.isSet(inCitation.getTitle()))
{
tag.addContent(" \"" + inCitation.getTitle() + ",\"");
}
if (inCitation.getJournal() != null)
{
String journalString = inCitation.getJournal().getAbbrev();
if (null == journalString)
{
journalString = inCitation.getJournal().getTitle();
}
tag.addContent(" ");
tag.addSpan(journalString).addStyle(CSS.ITALIC);
tag.addContent(", ");
}
if (StringUtil.isSet(inCitation.getVolume()))
{
tag.addContent(" " + inCitation.getVolume());
}
if (StringUtil.isSet(inCitation.getIssue()))
{
tag.addContent(", no. " + inCitation.getIssue());
}
if (inCitation.getYear() != null)
{
tag.addContent(" (" + inCitation.getYear() + ")");
}
if (StringUtil.isSet(inCitation.getPages()))
{
tag.addContent(": " + inCitation.getPages() + ".");
}
if (StringUtil.isSet(inCitation.getDOI()))
{
tag.addContent(" ");
if (!inCitation.getDOI().startsWith("doi"))
{
tag.addContent("doi:");
}
tag.addContent(inCitation.getDOI());
}
if (StringUtil.isSet(inCitation.getURL()))
{
tag.addContent(" ");
tag.addLink(inCitation.getURL(), inCitation.getURL());
}
return tag;
}
//---------------------------------------------------------------------------
private WmlParagraph generateJournalCitationAsDocx(Citation inCitation, WmlXMLTag inParentTag)
{
WmlParagraph p = new WmlParagraph(inParentTag.getParentDoc());
inParentTag.addSubtag(p);
String authorList = generateAuthorListForBibliography(inCitation);
if (StringUtil.isSet(authorList))
{
p.addTextRun(authorList);
}
if (StringUtil.isSet(inCitation.getTitle()))
{
p.addTextRun(" \"" + inCitation.getTitle() + ",\"");
}
if (inCitation.getJournal() != null)
{
String journalString = inCitation.getJournal().getAbbrev();
if (null == journalString)
{
journalString = inCitation.getJournal().getTitle();
}
p.addTextRun(" ");
p.addTextRun(journalString).getProperties().setItalics();
p.addTextRun(", ");
}
if (StringUtil.isSet(inCitation.getVolume()))
{
p.addTextRun(" " + inCitation.getVolume());
}
if (StringUtil.isSet(inCitation.getIssue()))
{
p.addTextRun(", no. " + inCitation.getIssue());
}
if (inCitation.getYear() != null)
{
p.addTextRun(" (" + inCitation.getYear() + ")");
}
if (StringUtil.isSet(inCitation.getPages()))
{
p.addTextRun(": " + inCitation.getPages() + ".");
}
if (StringUtil.isSet(inCitation.getDOI()))
{
p.addTextRun(" ");
if (!inCitation.getDOI().startsWith("doi"))
{
p.addTextRun("doi:");
}
p.addTextRun(inCitation.getDOI());
}
if (StringUtil.isSet(inCitation.getURL()))
{
p.addTextRun(" ");
try
{
p.addHyperlink(new URL(inCitation.getURL()), inCitation.getURL());
}
catch (MalformedURLException e)
{
throw new RuntimeException(e);
}
}
return p;
}
//---------------------------------------------------------------------------
private String generateSoftwareCitationAsString(Citation inCitation)
{
return StringUtil.stripHTMLTags(generateSoftwareCitationAsHTML(inCitation).toHTML());
}
//---------------------------------------------------------------------------
private HTMLTag generateSoftwareCitationAsHTML(Citation inCitation)
{
Span tag = new Span();
String authorList = generateAuthorListForBibliography(inCitation);
if (StringUtil.isSet(authorList))
{
tag.addContent(authorList + ".");
}
if (StringUtil.isSet(inCitation.getTitle()))
{
tag.addSpan(inCitation.getTitle()).addStyle(CSS.ITALIC);
if (StringUtil.isSet(inCitation.getVersion()))
{
tag.addContent(" (version " + inCitation.getVersion() + ")");
}
tag.addContent(" [Computer software].");
}
if (StringUtil.isSet(inCitation.getPlaceOfPublication()))
{
tag.addContent(" " + inCitation.getPlaceOfPublication() + ":");
}
if (StringUtil.isSet(inCitation.getPublisher()))
{
tag.addContent(" " + inCitation.getPublisher()
+ (inCitation.getPublisher().endsWith(".") ? "" : "."));
}
if (inCitation.getYear() != null)
{
tag.addContent(", " + inCitation.getYear() + ".");
}
return tag;
}
//---------------------------------------------------------------------------
private WmlParagraph generateSoftwareCitationAsDocx(Citation inCitation, WmlXMLTag inParentTag)
{
WmlParagraph p = new WmlParagraph(inParentTag.getParentDoc());
inParentTag.addSubtag(p);
String authorList = generateAuthorListForBibliography(inCitation);
if (StringUtil.isSet(authorList))
{
p.addTextRun(authorList + ".");
}
if (StringUtil.isSet(inCitation.getTitle()))
{
p.addTextRun(inCitation.getTitle()).getProperties().setItalics();
if (StringUtil.isSet(inCitation.getVersion()))
{
p.addTextRun(" (version " + inCitation.getVersion() + ")");
}
p.addTextRun(" [Computer software].");
}
if (StringUtil.isSet(inCitation.getPlaceOfPublication()))
{
p.addTextRun(" " + inCitation.getPlaceOfPublication() + ":");
}
if (StringUtil.isSet(inCitation.getPublisher()))
{
p.addTextRun(" " + inCitation.getPublisher()
+ (inCitation.getPublisher().endsWith(".") ? "" : "."));
}
if (inCitation.getYear() != null)
{
p.addTextRun(", " + inCitation.getYear() + ".");
}
return p;
}
}