Refbase update_2021-01-28_15_58
This commit is contained in:
314
includes/classes/org/bibliophile/MINIMALRTF.php
Normal file
314
includes/classes/org/bibliophile/MINIMALRTF.php
Normal file
@@ -0,0 +1,314 @@
|
||||
<?php
|
||||
/*
|
||||
MINIMALRTF - A minimal set of RTF coding methods to produce Rich Text Format documents on the fly.
|
||||
v1.5
|
||||
|
||||
Released through http://bibliophile.sourceforge.net under the GPL licence.
|
||||
Do whatever you like with this -- some credit to the author(s) would be appreciated.
|
||||
|
||||
If you make improvements, please consider contacting the administrators at bibliophile.sourceforge.net so that your improvements can be added to the release package.
|
||||
|
||||
Mark Grimshaw 2006
|
||||
http://bibliophile.sourceforge.net
|
||||
*/
|
||||
|
||||
// COMMAND LINE TESTS:
|
||||
// For a quick command-line test (php -f MINIMALRTF.php) after installation, uncomment the following:
|
||||
/**************************************************
|
||||
$centred = "This is some centred text.";
|
||||
$full = "This is some full justified and italicized text.";
|
||||
$weird = "Indented UNICODE: ¿ßŽŒ‰fl™ŁÞߨ€∑≠◊∝∞∅Ωπ¿";
|
||||
$largeText = "Here's some large text (font size 20)";
|
||||
$urlText = "Here's a URL: ";
|
||||
$url = "http://bibliophile.sourceforge.net";
|
||||
$urlDisplayText = "Bibliophile's home page!";
|
||||
$emailText = "Here's an email: ";
|
||||
$email = "billgates@microsoft.com";
|
||||
$emailDisplayText = "I love SPAM";
|
||||
$colouredText = "This text is red text";
|
||||
$backToBlackText = "This text is black text again";
|
||||
$rtf = new MINIMALRTF();
|
||||
$string = $rtf->openRtf();
|
||||
$rtf->createFontBlock(0, "Arial");
|
||||
$rtf->createFontBlock(1, "Times New Roman");
|
||||
$string .= $rtf->setFontBlock();
|
||||
$string .= $rtf->justify("centre");
|
||||
$string .= $rtf->textBlock(0, 12, $centred);
|
||||
$string .= $rtf->justify("full");
|
||||
$string .= $rtf->paragraph();
|
||||
$string .= $rtf->textBlock(1, 12, $rtf->italics($full));
|
||||
$string .= $rtf->justify("full", 2, 2);
|
||||
$string .= $rtf->paragraph();
|
||||
// Depending on your character set, you may need to encode $weird as UTF-8 first using PHP's inbuilt utf8_encode() function:
|
||||
// $weird = $rtf->utf8_2_unicode(utf8_encode($weird));
|
||||
$weird = $rtf->utf8_2_unicode($weird);
|
||||
$string .= $rtf->textBlock(1, 12, $weird);
|
||||
$string .= $rtf->justify("full");
|
||||
$string .= $rtf->paragraph();
|
||||
$string .= $rtf->textBlock(1, 20, $largeText);
|
||||
$string .= $rtf->paragraph();
|
||||
$string .= $rtf->textBlock(1, 12, $urlText . $rtf->urlText($url, $urlDisplayText));
|
||||
$string .= $rtf->paragraph();
|
||||
$string .= $rtf->textBlock(1, 12, $emailText . $rtf->emailText($email, $emailDisplayText));
|
||||
$string .= $rtf->paragraph();
|
||||
$string .= $rtf->setFontColour('red');
|
||||
$string .= $rtf->textBlock(1, 12, $colouredText);
|
||||
$string .= $rtf->paragraph();
|
||||
$string .= $rtf->setFontColour(); // i.e. set it back to black
|
||||
$string .= $rtf->textBlock(1, 12, $backToBlackText);
|
||||
$string .= $rtf->closeRtf();
|
||||
|
||||
// Copy and paste the commandline output to a text editor, save with a .rtf extension and load in a word processor.
|
||||
print $string . "\n\n";
|
||||
|
||||
**************************************************/
|
||||
|
||||
class MINIMALRTF
|
||||
{
|
||||
/**
|
||||
* Constructor method called by user.
|
||||
*/
|
||||
function MINIMALRTF()
|
||||
{
|
||||
/**
|
||||
* some defaults
|
||||
*/
|
||||
$this->justify = array(
|
||||
"centre" => "qc",
|
||||
"left" => "ql",
|
||||
"right" => "qr",
|
||||
"full" => "qj",
|
||||
);
|
||||
$this->colourTable = array(
|
||||
'black' => "\\red0\\green0\\blue0;",
|
||||
'maroon' => "\\red128\\green0\\blue0;",
|
||||
'green' => "\\red0\\green128\\blue0;",
|
||||
'olive' => "\\red128\\green128\\blue0;",
|
||||
'navy' => "\\red0\\green0\\blue128;",
|
||||
'purple' => "\\red128\\green0\\blue128;",
|
||||
'teal' => "\\red0\\green128\\blue128;",
|
||||
'gray' => "\\red128\\green128\\blue128;",
|
||||
'silver' => "\\red192\\green192\\blue192;",
|
||||
'red' => "\\red255\\green0\\blue0;",
|
||||
'lime' => "\\red0\\green255\\blue0;",
|
||||
'yellow' => "\\red255\\green255\\blue0;",
|
||||
'blue' => "\\red0\\green0\\blue255;",
|
||||
'fuchsia' => "\\red255\\green0\\blue255;",
|
||||
'aqua' => "\\red0\\green255\\blue255;",
|
||||
'white' => "\\red255\\green255\\blue255;",
|
||||
);
|
||||
}
|
||||
/**
|
||||
* Create the RTF opening tag and the colorTable
|
||||
* @return string
|
||||
*/
|
||||
function openRtf()
|
||||
{
|
||||
$text = "{\\rtf1\\ansi\\ansicpg1252\n\n";
|
||||
$text .= "{\\colortbl;";
|
||||
$index = 1;
|
||||
foreach($this->colourTable as $colour => $colourCode)
|
||||
{
|
||||
$text .= $colourCode;
|
||||
$this->colours[$colour] = "\\s1\\cf$index";
|
||||
++$index;
|
||||
}
|
||||
$text .= "}\n\n";
|
||||
unset($this->colourTable);
|
||||
return $text . "\n\n";
|
||||
}
|
||||
/**
|
||||
* Create the RTF closing tag
|
||||
* @return string
|
||||
*/
|
||||
function closeRtf()
|
||||
{
|
||||
return "\n}\n\n";
|
||||
}
|
||||
/**
|
||||
* Convert input text to bold text
|
||||
* @parameter string $input - text to be converted
|
||||
*/
|
||||
function bold($input = "")
|
||||
{
|
||||
return "{\b $input}";
|
||||
}
|
||||
/**
|
||||
* Convert input text to italics text
|
||||
* @parameter string $input - text to be converted
|
||||
*/
|
||||
function italics($input = "")
|
||||
{
|
||||
return "{\i $input}";
|
||||
}
|
||||
/**
|
||||
* Convert input text to underline text
|
||||
* @parameter string $input - text to be converted
|
||||
*/
|
||||
function underline($input = "")
|
||||
{
|
||||
return "{\ul $input}";
|
||||
}
|
||||
/**
|
||||
* Convert input text to superscript text
|
||||
* @parameter string $input - text to be converted
|
||||
*/
|
||||
function superscript($input = "")
|
||||
{
|
||||
return "{\super $input}";
|
||||
}
|
||||
/**
|
||||
* Convert input text to subscript text
|
||||
* @parameter string $input - text to be converted
|
||||
*/
|
||||
function subscript($input = "")
|
||||
{
|
||||
return "{\sub $input}";
|
||||
}
|
||||
/**
|
||||
* Set font size for each paragraph
|
||||
* @parameter integer $fontBlock - number of this fontblock
|
||||
* @parameter string $font - required font
|
||||
*/
|
||||
function createFontBlock($fontBlock = FALSE, $font = FALSE)
|
||||
{
|
||||
if(($fontBlock === FALSE) || ($font === FALSE))
|
||||
return FALSE;
|
||||
$this->fontBlocks[] = "{\\f$fontBlock\\fcharset0 $font;}\n";
|
||||
return TRUE;
|
||||
}
|
||||
/**
|
||||
* Set font blocks
|
||||
* @return string fontblock string
|
||||
*/
|
||||
function setFontBlock()
|
||||
{
|
||||
if(!isset($this->fontBlocks))
|
||||
return FALSE;
|
||||
$string = "{\\fonttbl\n";
|
||||
foreach($this->fontBlocks as $fontBlock)
|
||||
$string .= $fontBlock;
|
||||
$string .= "}\n\n";
|
||||
return $string;
|
||||
}
|
||||
/**
|
||||
* Justify and indent
|
||||
* Each TAB is equivalent to 720 units of indent
|
||||
* @parameter string $justify - either "centre", "left", "right" or "full"
|
||||
* @parameter integer $indentL - no. TABs to indent from the left
|
||||
* @parameter integer $indentR - no. TABs to indent from the right
|
||||
* @parameter integer $indentF - no. TABs to indent first line
|
||||
*/
|
||||
function justify($justify = "full", $indentL = 0, $indentR = 0, $indentF = 0)
|
||||
{
|
||||
if(!array_key_exists($justify, $this->justify))
|
||||
$justifyC = "qj";
|
||||
else
|
||||
$justifyC = $this->justify[$justify];
|
||||
$indentL *= 720;
|
||||
$indentR *= 720;
|
||||
$indentF *= 720;
|
||||
return "\\$justifyC\\li$indentL\\ri$indentR\\fi$indentF\n";
|
||||
}
|
||||
/**
|
||||
* Create empty paragraph
|
||||
* Font Size is twice what is shown in a word processor
|
||||
* @return string
|
||||
*/
|
||||
function paragraph($fontBlock = 0, $fontSize = 12)
|
||||
{
|
||||
$fontSize *= 2;
|
||||
return "{\\f$fontBlock\\fs$fontSize \\par}\n";
|
||||
}
|
||||
/**
|
||||
* Create text block
|
||||
* @parameter string $input - input string
|
||||
* @return string
|
||||
*/
|
||||
function textBlock($fontBlock = FALSE, $fontSize = FALSE, $input = FALSE)
|
||||
{
|
||||
if(($fontBlock === FALSE) || ($fontSize === FALSE) || ($input === FALSE))
|
||||
return FALSE;
|
||||
$fontSize *= 2;
|
||||
return "{\\f$fontBlock\\fs$fontSize $input\\par}\n";
|
||||
}
|
||||
/**
|
||||
* Create email link
|
||||
* @parameter string $email - email address
|
||||
* @return string
|
||||
*/
|
||||
function emailText($email, $displayText = FALSE)
|
||||
{
|
||||
if(!$displayText)
|
||||
$displayText = $email;
|
||||
return "{\\field{\\fldinst { HYPERLINK \"mailto:$email\" }}{\\fldrslt {\\cs1\\ul\\cf13 $displayText}}}";
|
||||
}
|
||||
/**
|
||||
* Create URL link
|
||||
* @parameter string $url - URL
|
||||
* @return string
|
||||
*/
|
||||
function urlText($url, $displayText = FALSE)
|
||||
{
|
||||
if(!$displayText)
|
||||
$displayText = $url;
|
||||
return "{\\field{\\fldinst { HYPERLINK \"$url\" }}{\\fldrslt {\\cs1\\ul\\cf13 $displayText}}}";
|
||||
}
|
||||
/**
|
||||
* Set font color
|
||||
* @parameter string - colour
|
||||
* @return string
|
||||
*/
|
||||
function setFontColour($colour = 'black')
|
||||
{
|
||||
if(!array_key_exists($colour, $this->colours))
|
||||
$colour = $this->colours['black'];
|
||||
else
|
||||
$colour = $this->colours[$colour];
|
||||
return "\n$colour\n";
|
||||
}
|
||||
/**
|
||||
* UTF-8 to unicode
|
||||
* returns an array of unicode character codes
|
||||
* Code adapted from opensource PHP code by Scott Reynen at:
|
||||
* http://www.randomchaos.com/document.php?source=php_and_unicode
|
||||
*
|
||||
* @parameter string $string UTF-8 encoded string
|
||||
* @return string unicode character code
|
||||
*/
|
||||
function utf8_2_unicode($string)
|
||||
{
|
||||
$unicode = array();
|
||||
$values = array();
|
||||
$lookingFor = 1;
|
||||
for($i = 0; $i < strlen($string); $i++)
|
||||
{
|
||||
$thisValue = ord($string[$i]);
|
||||
if($thisValue < 128)
|
||||
$unicode[] = $string[$i];
|
||||
else
|
||||
{
|
||||
if(count($values) == 0)
|
||||
$lookingFor = ($thisValue < 224) ? 2 : 3;
|
||||
$values[] = $thisValue;
|
||||
if(count($values) == $lookingFor)
|
||||
{
|
||||
$number = ($lookingFor == 3) ?
|
||||
(($values[0] % 16) * 4096) + (($values[1] % 64) * 64) + ($values[2] % 64) :
|
||||
(($values[0] % 32) * 64) + ($values[1] % 64);
|
||||
// $unicode[] = '\u' . $number . " ?";
|
||||
// A better unicode function?
|
||||
$decModulus = $number % 256;
|
||||
$modulus = dechex($number % 256);
|
||||
if($decModulus < 16)
|
||||
$modulus = '0' . $modulus;
|
||||
$unicode[] = '\u' . $number . "\'$modulus";
|
||||
$values = array();
|
||||
$lookingFor = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
return join('', $unicode);
|
||||
}
|
||||
}
|
||||
?>
|
Reference in New Issue
Block a user