898 lines
40 KiB
PHP
898 lines
40 KiB
PHP
<?php
|
||
/**
|
||
* This file contains all general functions of teachpress bibtex core
|
||
*
|
||
* @package teachpress\core\bibtex
|
||
* @license http://www.gnu.org/licenses/gpl-2.0.html GPLv2 or later
|
||
* @since 2.0.0
|
||
*/
|
||
|
||
/**
|
||
* teachPress BibTeX class
|
||
*
|
||
* @package teachpress\core\bibtex
|
||
* @since 3.0.0
|
||
*/
|
||
class TP_Bibtex {
|
||
|
||
/**
|
||
* This maps escaped bibtex codes to their corresponding characters. This mapping
|
||
* was derived from Matthias Steffens' and Christian Spitzlay's, from the module
|
||
* bibtexParse, created by Mark Grimshaw and Guillaume Gardey.
|
||
* http://bibliophile.sourceforge.net
|
||
* https://git.drupalcode.org/project/biblio/-/blob/7.x-1.x/modules/bibtexParse/transtab_latex_unicode.inc.php
|
||
*
|
||
* The original implementation was more robust and used regular expressions, compensating
|
||
* for extra spaces in codes such as {\v t} (e.g. {\v t}).
|
||
*
|
||
* The replacements will be made in order, so it is best to put the longest
|
||
* sequences (keys) first, e.g. \\infty before \\i.
|
||
*/
|
||
public static $bibtex_char_mapping = array(
|
||
'---' => '—',
|
||
'--' => '–',
|
||
|
||
"\\texteuro" => "€",
|
||
"\\textcelsius" => "℃",
|
||
"\\textnumero" => "№",
|
||
"\\textcircledP" => "℗",
|
||
"\\textservicemark" => "℠",
|
||
"\\texttrademark" => "™",
|
||
"\\textohm" => "Ω",
|
||
"\\textestimated" => "℮",
|
||
"\\textleftarrow" => "←",
|
||
"\\textuparrow" => "↑",
|
||
"\\textrightarrow" => "→",
|
||
"\\textdownarrow" => "↓",
|
||
"$\\infty$" => "∞",
|
||
"\\textlangle" => "〈",
|
||
"\\textrangle" => "〉",
|
||
"\\textvisiblespace" => "␣",
|
||
"\\textopenbullet" => "◦",
|
||
"\\textflorin" => "ƒ",
|
||
"\\textasciicircum" => "ˆ",
|
||
"\\textacutedbl" => "˝",
|
||
"\\textendash" => "–",
|
||
"\\textemdash" => "—",
|
||
"\\textbardbl" => "‖",
|
||
"\\textunderscore" => "‗",
|
||
"\\textquoteleft" => "‘",
|
||
"\\textquoteright" => "’",
|
||
"\\quotesinglbase" => "‚",
|
||
"\\textquotedblleft" => "“",
|
||
"\\textquotedblright" => "”",
|
||
"\\quotedblbase" => "„",
|
||
"\\textdaggerdbl" => "‡",
|
||
"\\textdagger" => "†",
|
||
"\\textbullet" => "•",
|
||
"\\textellipsis" => "…",
|
||
"\\ldots" => "…",
|
||
"\\textperthousand" => "‰",
|
||
"\\guilsinglleft" => "‹",
|
||
"\\guilsinglright" => "›",
|
||
"\\textfractionsolidus" => "⁄",
|
||
"\\textdiv" => "÷",
|
||
"\\textexclamdown" => "¡",
|
||
"\\textcent" => "¢",
|
||
"\\textsterling" => "£",
|
||
"\\textyen" => "¥",
|
||
"\\textbrokenbar" => "¦",
|
||
"\\textsection" => "§",
|
||
"\\textasciidieresis" => "¨",
|
||
"\\textcopyright" => "©",
|
||
"\\copyright" => "©",
|
||
"\\textordfeminine" => "ª",
|
||
"\\guillemotleft" => "«",
|
||
"\\textlnot" => "¬",
|
||
"\\textregistered" => "®",
|
||
"\\textasciimacron" => "¯",
|
||
"\\textdegree" => "°",
|
||
"\\textpm" => "±",
|
||
"\\texttwosuperior" => "²",
|
||
"\\textthreesuperior" => "³",
|
||
"\\textasciiacute" => "´",
|
||
"\\textmu" => "µ",
|
||
"\\textparagraph" => "¶",
|
||
"\\textperiodcentered" => "·",
|
||
"\\textonesuperior" => "¹",
|
||
"\\textordmasculine" => "º",
|
||
"\\guillemotright" => "»",
|
||
"\\textonequarter" => "¼",
|
||
"\\textonehalf" => "½",
|
||
"\\textthreequarters" => "¾",
|
||
"\\textquestiondown" => "¿",
|
||
"\\texttimes" => "×",
|
||
"\\textgreater" => ">",
|
||
"\\textless" => "<",
|
||
|
||
"$\\alpha$" => "α",
|
||
"$\\beta$" => "β",
|
||
"$\\gamma$" => "γ",
|
||
"$\\delta$" => "δ",
|
||
"$\\epsilon$" => "ε",
|
||
"$\\zeta$" => "ζ",
|
||
"$\\eta$" => "η",
|
||
"$\\theta$" => "θ",
|
||
"$\\iota$" => "ι",
|
||
"$\\kappa$" => "κ",
|
||
"$\\lambda$" => "λ",
|
||
"$\\mu$" => "μ",
|
||
"$\\nu$" => "ν",
|
||
"$\\omicron$" => "o",
|
||
"$\\xi$" => "ξ",
|
||
"$\\pi$" => "π",
|
||
"$\\rho$" => "ρ",
|
||
"$\\sigma$" => "σ",
|
||
"$\\tau$" => "τ",
|
||
"$\\upsilon$" => "υ",
|
||
"$\\phi$" => "φ",
|
||
"$\\chi$" => "χ",
|
||
"$\\psi$" => "ψ",
|
||
"$\\omega$" => "ω",
|
||
"$\\Gamma$" => "Γ",
|
||
"$\\Delta$" => "Δ",
|
||
"$\\Theta$" => "Θ",
|
||
"$\\Lambda$" => "Λ",
|
||
"$\\Xi$" => "Ξ",
|
||
"$\\Pi$" => "Π",
|
||
"$\\Sigma$" => "Σ",
|
||
"$\\Upsilon$" => "Υ",
|
||
"$\\Ypsilon$" => "Υ",
|
||
"$\\Phi$" => "Φ",
|
||
"$\\Psi$" => "Ψ",
|
||
"$\\Omega$" => "Ω",
|
||
"$\\varepsilon$" => "ε",
|
||
"$\\varphi$" => "φ",
|
||
"$\\varsigma$" => "ς",
|
||
|
||
"\\AA" => "Å",
|
||
"\\aa" => "å",
|
||
"\\AE" => "Æ",
|
||
"\\ae" => "æ",
|
||
"\\DH" => "Ð",
|
||
"\\dh" => "ð",
|
||
"\\DJ" => "Đ",
|
||
"\\dj" => "đ",
|
||
"\\NG" => "Ŋ",
|
||
"\\ng" => "ŋ",
|
||
"\\O" => "Ø",
|
||
"\\o" => "ø",
|
||
"\\OE" => "Œ",
|
||
"\\oe" => "œ",
|
||
"\\pm" => "±",
|
||
"\\TH" => "Þ",
|
||
"\\th" => "þ",
|
||
"\\ss" => "ß",
|
||
|
||
"\\#" => '#',
|
||
"\\$" => '$',
|
||
"\\%" => '%',
|
||
"\\&" => '&',
|
||
|
||
"\\`A" => "À",
|
||
"\\'A" => "Á",
|
||
"\\^A" => "Â",
|
||
"\\~A" => "Ã",
|
||
"\\\"A" => "Ä",
|
||
"\\`E" => "È",
|
||
"\\'E" => "É",
|
||
"\\^E" => "Ê",
|
||
"\\\"E" => "Ë",
|
||
"\\`I" => "Ì",
|
||
"\\'I" => "Í",
|
||
"\\^I" => "Î",
|
||
"\\\"I" => "Ï",
|
||
"\\~N" => "Ñ",
|
||
"\\'N" => "Ń",
|
||
"\\'n" => "ń",
|
||
"\\`O" => "Ò",
|
||
"\\'O" => "Ó",
|
||
"\\^O" => "Ô",
|
||
"\\~O" => "Õ",
|
||
"\\\"O" => "Ö",
|
||
"\\`U" => "Ù",
|
||
"\\'U" => "Ú",
|
||
"\\^U" => "Û",
|
||
"\\\"U" => "Ü",
|
||
"\\'Y" => "Ý",
|
||
"\\`a" => "à",
|
||
"\\'a" => "á",
|
||
"\\^a" => "â",
|
||
"\\~a" => "ã",
|
||
"\\\"a" => "ä",
|
||
"\\`e" => "è",
|
||
"\\'e" => "é",
|
||
"\\^e" => "ê",
|
||
"\\\"e" => "ë",
|
||
"\\`i" => "ì",
|
||
"\\^i" => "î",
|
||
"\\\"\\i" => "ï",
|
||
"\\\"i" => "ï",
|
||
"\\~n" => "ñ",
|
||
"\\`o" => "ò",
|
||
"\\'o" => "ó",
|
||
"\\^o" => "ô",
|
||
"\\~o" => "õ",
|
||
"\\\"o" => "ö",
|
||
"\\=o" => "ō",
|
||
"\\`u" => "ù",
|
||
"\\'u" => "ú",
|
||
"\\^u" => "û",
|
||
"\\\"u" => "ü",
|
||
"\\'y" => "ý",
|
||
"\\\"y" => "ÿ",
|
||
"\\'C" => "Ć",
|
||
"\\'c" => "ć",
|
||
"\\.g" => "ġ",
|
||
"\\.I" => "İ",
|
||
"\\'\\i" => "í",
|
||
"\\'i" => "í",
|
||
"\\'L" => "Ĺ",
|
||
"\\'l" => "ĺ",
|
||
"\\'R" => "Ŕ",
|
||
"\\'r" => "ŕ",
|
||
"\\'S" => "Ś",
|
||
"\\'s" => "ś",
|
||
"\\S" => "§",
|
||
"\\\"Y" => "Ÿ",
|
||
"\\'Z" => "Ź",
|
||
"\\'z" => "ź",
|
||
"\\.Z" => "Ż",
|
||
"\\.z" => "ż",
|
||
"\\v L" => "Ľ",
|
||
"\\v l" => "ľ",
|
||
"\\r A" => "Å",
|
||
"\\c C" => "Ç",
|
||
"\\r a" => "å",
|
||
"\\c c" => "ç",
|
||
"\\u A" => "Ă",
|
||
"\\u a" => "ă",
|
||
"\\k A" => "Ą",
|
||
"\\k a" => "ą",
|
||
"\\v C" => "Č",
|
||
"\\v c" => "č",
|
||
"\\v D" => "Ď",
|
||
"\\v d" => "ď",
|
||
"\\k E" => "Ę",
|
||
"\\k e" => "ę",
|
||
"\\v E" => "Ě",
|
||
"\\v e" => "ě",
|
||
"\\u e" => "ĕ",
|
||
"\\u G" => "Ğ",
|
||
"\\u g" => "ğ",
|
||
"\\v N" => "Ň",
|
||
"\\v n" => "ň",
|
||
"\\H O" => "Ő",
|
||
"\\H o" => "ő",
|
||
"\\v R" => "Ř",
|
||
"\\v r" => "ř",
|
||
"\\c S" => "Ş",
|
||
"\\c s" => "ş",
|
||
"\\v S" => "Š",
|
||
"\\v s" => "š",
|
||
"\\c T" => "Ţ",
|
||
"\\c t" => "ţ",
|
||
"\\v T" => "Ť",
|
||
"\\v t" => "ť",
|
||
"\\r U" => "Ů",
|
||
"\\r u" => "ů",
|
||
"\\H U" => "Ű",
|
||
"\\H u" => "ű",
|
||
"\\v Z" => "Ž",
|
||
"\\v z" => "ž",
|
||
|
||
// later in the dict so that they don't match longer entries like "\\'\\i"
|
||
"\\i" => "ı",
|
||
"\\L" => "Ł",
|
||
"\\l" => "ł",
|
||
|
||
// for custom latex packages like ngerman
|
||
"\\glqq" => "„",
|
||
"\\grqq" => "“",
|
||
"\\flqq" => "«",
|
||
"\\frqq" => "»",
|
||
"\\flq" => "‹",
|
||
"\\frq" => "›",
|
||
"\\glq" => "‚",
|
||
"\\grq" => "‘",
|
||
"\\dq" => "",
|
||
|
||
// a few minor customizations...
|
||
"\\varepsilon" => "ε",
|
||
"\\varphi" => "φ",
|
||
"\\varsigma" => "ς",
|
||
);
|
||
|
||
/**
|
||
* Gets a single publication in bibtex format
|
||
* @param array $row
|
||
* @param array $all_tags optional
|
||
* @param boolean $convert_bibtex Flag for the utf-8 to TeX char convertion, Default is false
|
||
* @param boolean $private_comment Flag for adding private notes or not, Default is false
|
||
* @return string
|
||
* @since 3.0.0
|
||
*/
|
||
public static function get_single_publication_bibtex ($row, $all_tags = '', $convert_bibtex = false, $private_comment = false) {
|
||
$string = '';
|
||
$pub_fields = ['type', 'bibtex', 'title', 'author', 'editor', 'url', 'doi', 'isbn', 'date', 'urldate', 'booktitle', 'issuetitle', 'journal', 'volume', 'number', 'issue', 'pages', 'publisher', 'address', 'edition', 'chapter', 'institution', 'organization', 'school', 'series', 'crossref', 'abstract', 'howpublished', 'key', 'techtype', 'note'];
|
||
$isbn_label = ( $row['is_isbn'] == 1 ) ? 'isbn' : 'issn';
|
||
|
||
// initial string
|
||
if ( $row['type'] === 'presentation' ) {
|
||
$string = '@misc{' . stripslashes($row['bibtex']) . ',' . chr(13) . chr(10);
|
||
}
|
||
else {
|
||
$string = '@' . stripslashes($row['type']) . '{' . stripslashes($row['bibtex']) . ',' . chr(13) . chr(10);
|
||
}
|
||
|
||
// loop for all BibTeX fields
|
||
for ( $i = 2; $i < count($pub_fields); $i++ ) {
|
||
// go to the next if there is nothing
|
||
if ( !isset( $row[$pub_fields[$i]] ) || $row[$pub_fields[$i]] == '' || $row[$pub_fields[$i]] == '0000-00-00' ) {
|
||
continue;
|
||
}
|
||
|
||
$field_name = $pub_fields[$i];
|
||
$field_value = TP_HTML::convert_special_chars( stripslashes( $row[$pub_fields[$i]] ) );
|
||
|
||
// prepare the fields
|
||
// ISBN | ISSN
|
||
if ( $field_name === 'isbn' ) {
|
||
$string .= $isbn_label . ' = {' . $field_value . '},' . chr(13) . chr(10);
|
||
}
|
||
// year
|
||
elseif ( $field_name === 'date' ) {
|
||
$string .= 'year = {' . $row['year'] . '},' . chr(13) . chr(10);
|
||
$string .= TP_Bibtex::prepare_bibtex_line($field_value, $field_name);
|
||
}
|
||
// techtype
|
||
elseif ( $field_name=== 'techtype' ) {
|
||
$string .= 'type = {' . $field_value . '},' . chr(13) . chr(10);
|
||
}
|
||
// patent: use address as location
|
||
elseif ( $field_name=== 'address' && $row['type'] === 'patent' ) {
|
||
$string .= 'location = {' . $field_value . '},' . chr(13) . chr(10);
|
||
}
|
||
// abstract
|
||
elseif ( $field_name === 'abstract' || $field_name === 'title' ) {
|
||
$string .= TP_Bibtex::prepare_text($field_value, $field_name);
|
||
}
|
||
// normal case
|
||
else {
|
||
$string .= TP_Bibtex::prepare_bibtex_line($field_value, $field_name);
|
||
}
|
||
|
||
}
|
||
|
||
// Add month
|
||
if ( $row['type'] == 'booklet' ) {
|
||
$date = tp_datesplit( $row['date'] );
|
||
$string .= 'month = {' . $date[0][1] . '},' . chr(13) . chr(10);
|
||
}
|
||
|
||
// Add keywords
|
||
if ( $all_tags != '' ) {
|
||
$keywords = '';
|
||
foreach ( $all_tags as $all_tags ) {
|
||
$keywords .= $all_tags['name'] . ', ';
|
||
}
|
||
$string .= 'keywords = {' . substr($keywords, 0, -2) . '}';
|
||
}
|
||
else {
|
||
$string .= 'keywords = {}';
|
||
}
|
||
|
||
// Add private comment
|
||
if ( $private_comment === true ) {
|
||
$string .= ',' . chr(13) . chr(10);
|
||
$string .= 'annote = {' . TP_HTML::convert_special_chars( stripslashes($row['comment'])) . '}';
|
||
}
|
||
|
||
// Add teachPress/biblatex extensions
|
||
$string .= ',' . chr(13) . chr(10);
|
||
$string .= 'pubstate = {' . $row['status'] . '},' . chr(13) . chr(10);
|
||
$string .= 'tppubtype = {' . $row['type'] . '}' . chr(13) . chr(10);
|
||
$string .= '}' . chr(13) . chr(10);
|
||
|
||
// Convert utf-8 chars
|
||
if ( $convert_bibtex === true ) {
|
||
$string = self::convert_utf8_to_bibtex($string);
|
||
}
|
||
return $string;
|
||
}
|
||
|
||
/**
|
||
* Heuristics to check if the input is BibTeX. May be useful when handling
|
||
* potentially problematic content, i.e. automatically downloaded from URLs.
|
||
*
|
||
* @param string $input
|
||
* @return false iff $input is very probably not BibTeX format. False positives are
|
||
* possible.
|
||
* @ince 9.0.0
|
||
* @access public
|
||
*/
|
||
public static function looks_like_bibtex ($input) {
|
||
$lines = preg_split("/\r\n|\n|\r/", $input);
|
||
$result = $lines !== false;
|
||
|
||
if ($result) {
|
||
$lines = array_filter($lines, function ($l) {
|
||
$l = trim($l);
|
||
return strlen($l) > 0 && substr($l, 0, 1) != "%"; });
|
||
|
||
if ($result && count($lines) > 0) {
|
||
$first_char = substr(trim(reset($lines)), 0, 1);
|
||
$last_line = trim(end($lines));
|
||
$last_char = substr($last_line, strlen($last_line) - 1, 1);
|
||
|
||
$result = $first_char == "@" && $last_char == "}";
|
||
}
|
||
}
|
||
|
||
return $result;
|
||
}
|
||
|
||
/**
|
||
* Replaces some BibTeX special chars with the UTF-8 versions and secures the input.
|
||
* Before teachPress 5.0, this function was called replace_bibtex_chars()
|
||
*
|
||
* @param string $input
|
||
* @return string
|
||
* @since 3.0.0
|
||
* @access public
|
||
*/
|
||
public static function convert_bibtex_to_utf8 ($input) {
|
||
|
||
// return the input if there are no bibtex chars
|
||
if ( strpos( $input,'\\' ) === false && strpos($input,'{') === false ) { return $input; }
|
||
|
||
// Step 1: Chars which are based on a combination of chars, with escapes
|
||
$input = str_replace( array_keys(TP_Bibtex::$bibtex_char_mapping), array_values(TP_Bibtex::$bibtex_char_mapping), $input);
|
||
|
||
// Step 1b: Remove backslash
|
||
$input = str_replace( '\\', '', $input );
|
||
|
||
// Step 2: All other special chars
|
||
$array_1 = array('"{a}','"{A}','`{a}','`{A}',"'{a}","'{A}",'~{a}','~{A}','={a}','={A}','^{a}','^{A}','u{a}','u{A}','k{a}','k{A}','r{a}','r{A}','{aa}','{AA}',
|
||
'.{b}','.{B}',
|
||
"'{c}","'{C}",'v{c}','v{C}','c{c}','c{C}','.{c}','.{C}','^{c}','^{C}',
|
||
'v{d}','v{D}','.{d}','.{D}','d{d}','d{D}','B{d}','B{D}',
|
||
'"{e}','"{E}',"'{e}","'{E}",'`{e}','`{E}','^{e}','^{E}','u{e}','u{E}','v{e}','v{E}','={e}','={E}','k{e}','k{E}','.{e}','.{E}',
|
||
'.{f}','.{F}',
|
||
'u{g}','u{G}','c{g}','c{G}','.{g}','.{G}','^{g}','^{G}',
|
||
'.{h}','.{H}','d{h}','d{H}','^{h}','^{H}','B{h}','B{H}',
|
||
'"{i}','"{I}','~{i}','~{I}','`{i}','`{I}',"'{i}","'{I}",'^{i}','^{I}','u{i}','u{I}','={i}','={I}','k{i}','k{I}','.{i}','.{I}',
|
||
'^{j}','^{J}',
|
||
'c{k}','c{K}','d{k}','d{K}',
|
||
"'{l}","'{L}",'v{l}','v{L}','c{l}','c{L}','d{l}','d{L}',
|
||
'.{m}','.{M}','d{m}','d{M}',
|
||
"'{n}","'{N}",'~{n}','~{N}','v{n}','v{N}','c{n}','c{N}','.{n}','.{N}',
|
||
'"{o}','"{O}','`{o}','`{O}',"'{o}","'{O}",'~{o}','~{O}','^{o}','^{O}','u{o}','u{O}','.{o}','.{O}','={o}','={O}','H{o}','H{O}',
|
||
'.{p}','.{P}',
|
||
"'{r}","'{R}",'v{r}','v{R}','c{r}','c{R}','.{r}','.{R}','d{r}','d{R}',
|
||
"'{s}","'{S}",'v{s}','v{S}','c{s}','c{S}','.{s}','.{S}','d{s}','d{S}','^{s}','^{S}',
|
||
'v{t}','v{T}','c{t}','c{T}','.{t}','.{T}','d{t}','d{T}','B{t}','B{T}',
|
||
'"{u}','"{U}','`{u}','`{U}',"'{u}","'{U}",'^{u}','^{U}','d{u}','d{U}','~{u}','~{U}','u{u}','u{U}','={u}','={U}','k{u}','k{U}','r{u}','r{U}','H{u}','H{U}',
|
||
'd{v}','d{V}',
|
||
'^{w}','^{W}',
|
||
'"{y}','"{Y}',"'{y}","'{Y}",'^{y}','^{Y}',
|
||
"'{z}","'{Z}",'v{z}','v{Z}','.{z}','.{Z}');
|
||
$array_2 = array('ä','Ä','à','À','á','Á','ã','Ã','ā','Ā','â','Â','ă','Ă','ą','Ą','å','Å','å','Å',
|
||
'ḃ','Ḃ',
|
||
'ć','Ć','č','Č','ç','Ç','ċ','Ċ','ĉ','Ĉ',
|
||
'ď','Ď','ḋ','Ḋ','ḍ','Ḍ','đ','Đ',
|
||
'ë','Ë','é','É','è','È','ê','Ê','ĕ','Ĕ','ě','Ě','ē','Ē','ę','Ę','ė','Ė',
|
||
'ḟ','Ḟ',
|
||
'ğ','Ğ','ģ','Ģ','ġ','Ġ','ĝ','Ĝ',
|
||
'ḣ','Ḣ','ḥ','Ḥ','ĥ','Ĥ','ħ','Ħ',
|
||
'ï','Ï','ĩ','Ĩ','ì','Ì','í','Í','î','Î','ĭ','Ĭ','ī','Ī','į','Į','i','İ',
|
||
'ĵ','Ĵ',
|
||
'ķ','Ķ','ḳ','Ḳ',
|
||
'ĺ','Ĺ','ľ','Ľ','ļ','Ļ','ḷ','Ḷ',
|
||
'ṁ','Ṁ','ṃ','Ṃ',
|
||
'ń','Ń','ñ','Ñ','ň','Ň','ņ','Ņ','ṅ','Ṅ',
|
||
'ö','Ö','ò','Ò','ó','Ó','õ','Õ','ô','Ô','ŏ','Ŏ','ȯ','Ȯ','ō','Ō','ő','Ő',
|
||
'ṗ','Ṗ',
|
||
'ŕ','Ŕ','ř','Ř','ŗ','Ŗ','ṙ','Ṙ','ṛ','Ṛ',
|
||
'ś','Ś','š','Š','ş','Ş','ṡ','Ṡ','ṣ','Ṣ','ŝ','Ŝ',
|
||
'ť','Ť','ţ','Ţ','ṫ','Ṫ','ṭ','Ṭ','ŧ','Ŧ',
|
||
'ü','Ü','ù','Ù','ú','Ú','û','Û','ụ','Ụ','ũ','Ũ','ŭ','Ŭ','ū','Ū','ų','Ų','ů','Ů','ű','Ű',
|
||
'ṿ','Ṿ',
|
||
'ŵ','Ŵ',
|
||
'ÿ','Ÿ','ý','Ý','ŷ','Ŷ',
|
||
'ź','Ź','ž','Ž','ż','Ż');
|
||
$return = str_replace($array_1, $array_2, $input);
|
||
return htmlspecialchars($return, ENT_NOQUOTES);
|
||
}
|
||
|
||
/**
|
||
* Cleans the author names after bibtex to UTF-8 conversion
|
||
* @param string $input
|
||
* @return string
|
||
* @since 6.1.0
|
||
*/
|
||
public static function clean_author_names ($input) {
|
||
$array_a = array('{á}','{Á}','{ä}','{Ä}',
|
||
'{é}','[É}',
|
||
'{í}',
|
||
'{ó}','{Ó}','{ö}','{Ö}',
|
||
'{ü}','{Ü}','{ß}','{š}', '{ø}', '{Ø}', '{å}', '{Å}');
|
||
$array_b = array('á','Á','ä','Ä',
|
||
'é','É',
|
||
'í',
|
||
'ó','Ó','ö','Ö',
|
||
'ü','Ü','ß','š','ø', 'Ø', 'å', 'Å');
|
||
$ret = str_replace($array_a, $array_b, $input);
|
||
return $ret;
|
||
}
|
||
|
||
/**
|
||
* Replaces some UTF-8 chars with their BibTeX/LaTeX expression.
|
||
* @param string $input
|
||
* @return string
|
||
* @since 5.0.0
|
||
*/
|
||
public static function convert_utf8_to_bibtex ($input) {
|
||
$array_a = array('ä','Ä','à','À','á','Á','â','Â','ã','Ã','ą','Ą','ā','Ā','ă','Ă','å','Å',
|
||
'ḃ','Ḃ',
|
||
'ć','Ć','č','Č','ç','Ç','ċ','Ċ','ĉ','Ĉ',
|
||
'ď','Ď','ḋ','Ḋ','đ','Đ','ḍ','Ḍ',
|
||
'ë','Ë','é','É','è','È','ê','Ê','ė','Ė','ĕ','Ĕ','ě','Ě','ē','Ē','ę','Ę',
|
||
'ḟ','Ḟ',
|
||
'ğ','Ğ','ģ','Ģ','ġ','Ġ','ĝ','Ĝ',
|
||
'ḣ','Ḣ','ħ','Ħ','ḥ','Ḥ','ĥ','Ĥ',
|
||
'ï','Ï','ĩ','Ĩ','ì','Ì','í','Í','î','Î','ĭ','Ĭ','ī','Ī','į','Į','İ',
|
||
'ĵ','Ĵ',
|
||
'ķ','Ķ','ḳ','Ḳ',
|
||
'ĺ','Ĺ','ľ','Ľ','ļ','Ļ','ḷ','Ḷ',
|
||
'ṁ','Ṁ','ṃ','Ṃ',
|
||
'ń','Ń','ñ','Ñ','ň','Ň','ņ','Ņ','ṅ','Ṅ',
|
||
'ö','Ö','ò','Ò','ó','Ó','ô','Ô','õ','Õ','ŏ','Ŏ','ȯ','Ȯ','ō','Ō','ő','Ő',
|
||
'ṗ','Ṗ',
|
||
'ŕ','Ŕ','ř','Ř','ŗ','Ŗ','ṙ','Ṙ','ṛ','Ṛ',
|
||
'ś','Ś','š','Š','ş','Ş','ṡ','Ṡ','ṣ','Ṣ','ŝ','Ŝ',
|
||
'ť','Ť','ţ','Ţ','ṫ','Ṫ','ŧ','Ŧ','ṭ','Ṭ',
|
||
'ü','Ü','ù','Ù','ú','Ú','û','Û','ụ','Ụ','ũ','Ũ','ŭ','Ŭ','ū','Ū','ű','Ű','ů','Ů','ų','Ų',
|
||
'ṿ','Ṿ',
|
||
'ŵ','Ŵ',
|
||
'ÿ','Ÿ','ý','Ý','ŷ','Ŷ',
|
||
'ź','Ź','ž','Ž','ż','Ż',
|
||
'ß','&','Ø','ø','Ł','ł','Æ','æ','Œ','œ','o͡o','–','—');
|
||
|
||
$array_b = array('\"{a}', '\"{A}', '\`{a}', '\`{A}', "\'{a}", "\'{A}", '\^{a}', '\^{A}', '\~{a}', '\~{A}', '\k{a}', '\k{A}', '\={a}', '\={A}', '\u{a}', '\u{A}', 'r{a}', 'r{A}',
|
||
'\.{b}', '\.{B}',
|
||
"\'{c}", "\'{C}", '\v{c}', '\v{C}', '\c{c}', '\c{C}', '\.{c}', '\.{C}', '\^{c}', '\^{C}',
|
||
'\v{d}', '\v{D}', '\.{d}', '\.{D}', '{d}', '{D}', '\d{d}', '\d{D}',
|
||
'\"{e}', '\"{E}', "\'{e}", "\'{E}", "\`{e}", "\`{E}", '\^{e}', '\^{E}', '\.{e}', '\.{E}', '\u{e}', '\u{E}', 'v{e}', 'v{E}', '={e}', '={E}', '\k{e}', '\k{E}',
|
||
'\.{f}', '\.{F}',
|
||
'\u{g}', '\u{G}', '\c{g}', '\c{G}', '\.{g}', '\.{G}', '\^{g}', '\^{G}',
|
||
'\.{h}', '\.{H}', '{h}', '{H}', '\d{h}', '\d{H}', '\^{h}', '\^{H}',
|
||
'\"{i}', '\"{I}', '\~{i}', '\~{I}', '\`{i}', '\`{I}', "\'{i}", "\'{I}", '\^{i}', '\^{I}', '\u{i}', '\u{I}', '\={i}', '\={I}', '\k{i}', '\k{I}', '\.{I}',
|
||
'\^{j}', '\^{J}',
|
||
'\c{k}', '\c{K}', '\d{k}', '\d{K}',
|
||
"\'{l}", "\'{L}", '\v{l}', '\v{L}', '\c{l}', '\c{L}', '\d{l}', '\d{L}',
|
||
'\.{m}', '\.{M}', '\d{m}', '\d{M}',
|
||
"\'{n}", "\'{N}", '\~{n}', '\~{N}', 'v{n}', 'v{N}', '\c{n}', '\c{N}', '\.{n}', '\.{N}',
|
||
'\"{o}', '\"{O}', '\`{o}', '\`{O}', "\'{o}", "\'{O}", '\^{o}', '\^{O}', '\~{o}', '\~{O}', '\u{o}', '\u{O}', '\.{o}', '\.{O}', '\={o}' , '\={O}', '\H{o}', '\H{O}',
|
||
'\.{p}', '\.{P}',
|
||
"\'{r}", "\'{R}", '\v{r}', '\v{R}', '\c{r}', '\c{R}', '\.{r}', '\.{R}', '\d{r}', '\d{R}',
|
||
"\'{s}", "\'{S}", '\v{s}', '\v{S}', '\c{s}', '\c{S}', '\.{s}', '\.{S}', '\d{s}', '\d{S}', '\^{s}', '\^{S}',
|
||
'\v{t}', '\v{T}', '\c{t}', '\c{T}', '\.{t}', '\.{T}', '{t}', '{T}', '\d{t}', '\d{T}',
|
||
'\"{u}', '\"{U}', '\`{u}', '\`{U}', "\'{u}", "\'{U}", '\^{u}', '\^{U}', '\d{u}', '\d{U}', '\~{u}', '\~{U}', '\u{u}', '\u{U}', '\={u}', '\={U}', '\H{u}', '\H{U}', 'r{u}', 'r{U}', '\k{u}', '\k{U}',
|
||
'\d{v}', '\d{V}',
|
||
'\^{w}', '\^{W}',
|
||
'\"{y}', '\"{Y}', "\'{y}", "\'{Y}", '\^{y}', '\^{Y}',
|
||
"\'{z}", "\'{Z}", '\v{z}', '\v{Z}', '\.{z}', '\.{Z}',
|
||
'\ss', '\&','\O', '\o', '\L', '\l', '\AE', '\ae', '\OE', '\oe', '\t{oo}', '\textendash', '\textemdash'
|
||
);
|
||
$return = str_replace( $array_a , $array_b ,$input);
|
||
return $return;
|
||
}
|
||
|
||
/**
|
||
* Prepares a (html) input for bibtex and replace expressions for bold, italic, lists, etc. with their latex equivalents
|
||
* @param string $text The (html) input
|
||
* @param string $fieldname The bibtex field name
|
||
* @return string
|
||
* @since 4.2.0
|
||
*/
|
||
public static function prepare_text($text, $fieldname = 'abstract') {
|
||
if ( $text == '' ) {
|
||
return '';
|
||
}
|
||
|
||
$text = TP_HTML::prepare_title($text);
|
||
// Replace expressions
|
||
$search = array ('/<sub>/i', '/<sup>/i',
|
||
'/<i>/i', '/<b>/i', '/<em>/i', '/<u>/i',
|
||
'/<\/(sub|sup|i|b|em|u)>/i',
|
||
'/<(s|small|del)>/i',
|
||
'/<\/(s|small|del)>/i',
|
||
'/<ul>/i', '/<\/ul>/i',
|
||
'/<ol>/i', '/<\/ol>/i',
|
||
'/<li>/i', '/<\/li>/i');
|
||
$replace = array ('_{', '^{',
|
||
'\textit{', '\textbf{', '\emph{', '\underline{',
|
||
'}',
|
||
'',
|
||
'',
|
||
'\begin{itemize}', '\end{itemize}' . "\n",
|
||
'\begin{enumerate}', '\end{enumerate} . "\n"',
|
||
'\item ', '');
|
||
$text = preg_replace($search, $replace, $text);
|
||
return TP_Bibtex::prepare_bibtex_line($text, $fieldname, false);
|
||
}
|
||
|
||
/**
|
||
* Prepares a page number
|
||
* @access public
|
||
* @param string $input
|
||
* @return string
|
||
* @since 4.0.0
|
||
*/
|
||
public static function prepare_page_number ($input) {
|
||
if ( isset($input) ) {
|
||
return str_replace("--", "–", $input);
|
||
}
|
||
return '';
|
||
}
|
||
|
||
|
||
|
||
/**
|
||
* Prepares a single BibTeX line with the input from onde publication field
|
||
* @param string $input The value of the publication field
|
||
* @param string $fieldname The name of the publication field
|
||
* @param boolean $stripslashes Strip slashes (true) or not (false); default is true; since 4.2.0
|
||
* @return string
|
||
* @since 3.0.0
|
||
*/
|
||
public static function prepare_bibtex_line($input, $fieldname, $stripslashes = true) {
|
||
if ($input != '') {
|
||
$input = ( $stripslashes === true ) ? stripslashes($input) : $input;
|
||
return $fieldname . ' = {' . $input . '},' . chr(13) . chr(10);
|
||
}
|
||
return '';
|
||
}
|
||
|
||
/**
|
||
* Explodes an url string into array
|
||
* @param string $url_string
|
||
* @return array
|
||
* @since 4.3.5
|
||
*/
|
||
public static function explode_url ($url_string) {
|
||
$all_urls = explode(chr(13) . chr(10), $url_string);
|
||
$end = array();
|
||
foreach ($all_urls as $url) {
|
||
$parts = explode(', ',$url);
|
||
$parts[0] = trim( $parts[0] );
|
||
if ( !isset($parts[1]) ) {
|
||
$parts[1] = $parts[0];
|
||
}
|
||
$end[] = $parts;
|
||
}
|
||
return $end;
|
||
}
|
||
|
||
/**
|
||
* The function splits a author/editor name and returns the lastname or NULL if there is no name was found
|
||
* @param string $input A name of an author or editor
|
||
* @return string
|
||
* @since 5.0.0
|
||
*/
|
||
public static function get_lastname ($input) {
|
||
$creator = new BIBTEXCREATORPARSE();
|
||
$creatorArray = $creator->parse($input);
|
||
if ( isset( $creatorArray[0][2] ) ) {
|
||
return trim($creatorArray[0][2]);
|
||
}
|
||
return null;
|
||
}
|
||
|
||
/**
|
||
* Parses author names
|
||
* @param string $input The input string
|
||
* @param string $separator The separator between the authors (for the output)
|
||
* @param string $mode values: last, initials, old, short
|
||
* @param string $punctuation Punctuation after an initial (only used for short mode)
|
||
* @return string
|
||
* @since 3.0.0
|
||
*/
|
||
public static function parse_author ($input, $separator, $mode = '', $punctuation = '') {
|
||
if ( $mode === 'last' || $mode === 'initials' ) {
|
||
$all_authors = self::parse_author_default($input, $separator, $mode);
|
||
}
|
||
elseif ( $mode === 'short' ) {
|
||
$all_authors = self::parse_author_short($input, $separator, $punctuation);
|
||
}
|
||
elseif ( $mode === 'old' ) {
|
||
$all_authors = self::parse_author_deprecated($input, $separator);
|
||
}
|
||
else {
|
||
$all_authors = self::parse_author_simple($input, $separator);
|
||
}
|
||
return $all_authors;
|
||
}
|
||
|
||
/**
|
||
* This is the default parsing function for author names
|
||
*
|
||
* Some examples for the parsing:
|
||
* last: Adolf F. Weinhold and Ludwig van Beethoven --> Weinhold, Adolf; van Beethoven, Ludwig
|
||
* initials: Adolf F. Weinhold and Ludwig van Beethoven --> Weinhold, Adolf F; van Beethoven, Ludwig
|
||
*
|
||
* @param string $input The input string
|
||
* @param string $separator The separator between the authors (for the output)
|
||
* @param string $mode last o initials
|
||
* @return string
|
||
* @since 5.0.0
|
||
* @access public
|
||
* @uses BIBTEXCREATORPARSE() This class is a part of bibtexParse
|
||
*/
|
||
public static function parse_author_default ($input, $separator = ';', $mode = 'initials') {
|
||
$creator = new BIBTEXCREATORPARSE();
|
||
$creator->separateInitials = false;
|
||
$creatorArray = $creator->parse($input);
|
||
$all_authors = '';
|
||
$max = count($creatorArray);
|
||
for ( $i = 0; $i < $max; $i++ ) {
|
||
$one_author = '';
|
||
/*
|
||
* Set the author name together with the parsing result of bibtexParse
|
||
*
|
||
* $creatorArray[][0] => firstname
|
||
* $creatorArray[][1] => initials
|
||
* $creatorArray[][2] => surname
|
||
* $creatorArray[][3] => jr
|
||
* $creatorArray[][4] => von
|
||
*/
|
||
if ($creatorArray[$i][4] != '') { $one_author .= trim($creatorArray[$i][4]);}
|
||
if ($creatorArray[$i][3] != '') { $one_author = trim($creatorArray[$i][3]);}
|
||
if ($creatorArray[$i][2] != '') { $one_author .= ' ' .trim($creatorArray[$i][2]) . ',';}
|
||
if ($creatorArray[$i][0] != '') { $one_author .= ' ' .trim($creatorArray[$i][0]);}
|
||
if ( $mode == 'initials' && $creatorArray[$i][1] != '' ) {
|
||
$one_author .= ' ' .trim($creatorArray[$i][1]);
|
||
}
|
||
|
||
// Add author to the main result
|
||
$all_authors .= stripslashes($one_author);
|
||
if ( $i < count($creatorArray) -1 ) {
|
||
$all_authors .= $separator . ' ';
|
||
}
|
||
}
|
||
return $all_authors;
|
||
}
|
||
|
||
/**
|
||
* Parse author names to the short style
|
||
*
|
||
* Example:
|
||
* Adolf F. Weinhold and Ludwig van Beethoven --> Weinhold, A F; van Beethoven, L
|
||
*
|
||
* @param string $input The input string
|
||
* @param string $separator The separator between the authors (for the output)
|
||
* @param string $punctuation The optional punctuation after an initial
|
||
* @return string
|
||
* @since 8.0.0
|
||
* @access public
|
||
* @uses BIBTEXCREATORPARSE() This class is a part of bibtexParse
|
||
*/
|
||
public static function parse_author_short($input, $separator = ';', $punctuation = '') {
|
||
$all_authors = '';
|
||
$creator = new BIBTEXCREATORPARSE();
|
||
$creatorArray = $creator->parse($input);
|
||
$max = count($creatorArray);
|
||
for ( $i = 0; $i < $max; $i++ ) {
|
||
$one_author = '';
|
||
/*
|
||
* Set the author name together with the parsing result of bibtexParse
|
||
*
|
||
* $creatorArray[][0] => firstname
|
||
* $creatorArray[][1] => initials
|
||
* $creatorArray[][2] => surname
|
||
* $creatorArray[][3] => jr
|
||
* $creatorArray[][4] => von
|
||
*/
|
||
if ($creatorArray[$i][4] != '') { $one_author .= trim($creatorArray[$i][4]);}
|
||
if ($creatorArray[$i][2] != '') { $one_author .= ' ' .trim($creatorArray[$i][2]) . '';}
|
||
$initials = $creator->getInitials($creatorArray[$i][0], $punctuation);
|
||
$one_author .= ' ' . trim($initials);
|
||
|
||
// Add author to the main result
|
||
$all_authors .= stripslashes($one_author);
|
||
if ( $i < count($creatorArray) -1 ) {
|
||
$all_authors .= $separator . ' ';
|
||
}
|
||
}
|
||
return $all_authors;
|
||
}
|
||
|
||
/**
|
||
* This is the original (deprecated) parsing function for author names
|
||
*
|
||
* Some examples for the parsing:
|
||
* Adolf F. Weinhold and Ludwig van Beethoven --> Weinhold, Adolf F.; van Beethoven, Ludwig
|
||
*
|
||
* @param string $input The input string
|
||
* @param string $separator The separator between the authors (for the output)
|
||
* @return string
|
||
* @since 5.0.0
|
||
* @access public
|
||
*/
|
||
public static function parse_author_deprecated ($input, $separator = ';') {
|
||
$all_authors = '';
|
||
$one_author = '';
|
||
$array = explode(" and ",$input);
|
||
$lenth = count ($array);
|
||
for ( $i = 0; $i < $lenth; $i++ ) {
|
||
$array[$i] = trim($array[$i]);
|
||
$names = explode(" ",$array[$i]);
|
||
$lenth2 = count($names);
|
||
for ( $j = 0; $j < $lenth2 - 1; $j++ ) {
|
||
$one_author .= ' ' . trim( $names[$j] );
|
||
}
|
||
$one_author = trim( $names[$lenth2 - 1] ). ', ' . $one_author;
|
||
$all_authors = $all_authors . $one_author;
|
||
if ( $i < $lenth - 1 ) {
|
||
$all_authors .= $separator . ' ';
|
||
}
|
||
$one_author = '';
|
||
}
|
||
return $all_authors;
|
||
}
|
||
|
||
/**
|
||
* This is the simple parsing function which just replaces the "and" with ","
|
||
*
|
||
* Some examples for the parsing:
|
||
* Adolf F. Weinhold and Albert Einstein --> Adolf F. Weinhold, Albert Einstein
|
||
*
|
||
* @param string $input The input string
|
||
* @param string $separator The separator between the authors (for the output)
|
||
* @return string
|
||
* @since 5.0.0
|
||
* @acces public
|
||
*/
|
||
public static function parse_author_simple ($input, $separator = ',') {
|
||
$all_authors = str_replace( array(' and ', '{', '}'), array($separator . ' ', '', ''), $input );
|
||
return stripslashes($all_authors);
|
||
}
|
||
|
||
/**
|
||
* Checks if a string is encoded with UTF-8 or not
|
||
* from http://floern.com/webscripting/is-utf8-auf-utf-8-prüfen
|
||
*
|
||
* @param string $string
|
||
* @return boolean
|
||
* @since 4.2.0
|
||
*/
|
||
public static function is_utf8 ($string) {
|
||
$strlen = strlen($string);
|
||
for( $i = 0; $i < $strlen; $i++ ) {
|
||
$ord = ord($string[$i]);
|
||
if( $ord < 0x80 ) {
|
||
continue;
|
||
}
|
||
elseif( ($ord&0xE0) === 0xC0 && $ord > 0xC1 ) {
|
||
$n = 1;
|
||
}
|
||
elseif( ($ord&0xF0) === 0xE0 ) {
|
||
$n = 2;
|
||
}
|
||
elseif( ($ord&0xF8) === 0xF0 && $ord < 0xF5 ) {
|
||
$n = 3;
|
||
}
|
||
else {
|
||
return false;
|
||
}
|
||
for($c = 0; $c < $n; $c++) {
|
||
if( ++$i === $strlen || ( ord($string[$i])&0xC0 ) !== 0x80 ) {
|
||
return false;
|
||
}
|
||
}
|
||
}
|
||
return true;
|
||
}
|
||
}
|