diff options
Diffstat (limited to 'platform/www/lib/plugins/refnotes/note.php')
-rw-r--r-- | platform/www/lib/plugins/refnotes/note.php | 336 |
1 files changed, 336 insertions, 0 deletions
diff --git a/platform/www/lib/plugins/refnotes/note.php b/platform/www/lib/plugins/refnotes/note.php new file mode 100644 index 0000000..8379168 --- /dev/null +++ b/platform/www/lib/plugins/refnotes/note.php @@ -0,0 +1,336 @@ +<?php + +/** + * Plugin RefNotes: Note + * + * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) + * @author Mykola Ostrovskyy <dwpforge@gmail.com> + */ + +//////////////////////////////////////////////////////////////////////////////////////////////////// +class refnotes_note_block_iterator extends FilterIterator { + + private $note; + private $limit; + private $count; + + /** + * Constructor + */ + public function __construct($note, $limit) { + $this->note = new ArrayObject($note); + $this->limit = $this->getBlockLimit($limit); + $this->count = 0; + + parent::__construct($this->note->getIterator()); + } + + /** + * + */ + function accept() { + $result = $this->current()->isValid(); + + if ($result) { + ++$this->count; + } + + return $result; + } + + /** + * + */ + function valid() { + return parent::valid() && (($this->limit == 0) || ($this->count <= $this->limit)); + } + + /** + * + */ + private function getBlockLimit($limit) { + if (preg_match('/(\/?)(\d+)/', $limit, $match) == 1) { + if ($match[1] != '') { + $devider = intval($match[2]); + $result = ceil($this->getValidCount() / $devider); + } + else { + $result = intval($match[2]); + } + } + else { + $result = 0; + } + + return $result; + } + + /** + * + */ + private function getValidCount() { + $result = 0; + + foreach ($this->note as $note) { + if ($note->isValid()) { + ++$result; + } + } + + return $result; + } +} + +//////////////////////////////////////////////////////////////////////////////////////////////////// +class refnotes_note_mock { + + /** + * + */ + public function getScope() { + return new refnotes_scope_mock(); + } + + /** + * + */ + public function setText($text) { + } + + /** + * + */ + public function addReference($reference) { + } +} + +//////////////////////////////////////////////////////////////////////////////////////////////////// +class refnotes_note extends refnotes_refnote { + + protected $scope; + protected $namespaceName; + protected $id; + protected $name; + protected $inline; + protected $reference; + protected $text; + protected $processed; + + /** + * + */ + public static function getNamePattern($type) { + if (($type == 'full-extended') || ($type == 'extended')) { + $result = ($type == 'full-extended') ? refnotes_namespace::getNamePattern('optional') : ''; + $result .= '[[:alpha:]\d][\w.&\(\)\[\]{}+-]*'; + } + else { + $result = '[[:alpha:]]\w*'; + } + + return $result; + } + + /** + * Constructor + */ + public function __construct($scope, $namespaceName, $name) { + parent::__construct(); + + $this->scope = $scope; + $this->namespaceName = $namespaceName; + $this->id = -1; + $this->name = $name; + $this->inline = false; + $this->reference = array(); + $this->text = ''; + $this->processed = false; + } + + /** + * + */ + private function initId() { + $this->id = $this->scope->getNoteId(); + + if ($this->name == '') { + $this->name = '#' . $this->id; + } + } + + /** + * + */ + public function getId() { + return $this->id; + } + + /** + * + */ + public function getName() { + return $this->name; + } + + /** + * + */ + public function getNamespaceName() { + return $this->namespaceName; + } + + /** + * + */ + public function getScope() { + return $this->scope; + } + + /** + * + */ + public function setText($text) { + if ($this->text == '' || !$this->inline) { + $this->text = $text; + } + } + + /** + * + */ + public function getText() { + return $this->text; + } + + /** + * + */ + public function addReference($reference) { + if ($this->id == -1 && !$this->inline) { + $this->inline = $reference->isInline(); + + if (!$this->inline) { + $this->initId(); + } + } + + if ($reference->isBackReferenced()) { + $this->reference[] = $reference; + $this->processed = false; + } + } + + /** + * Checks if the note should be processed + */ + public function isValid() { + return !$this->processed && !empty($this->reference) && $this->text != ''; + } +} + +//////////////////////////////////////////////////////////////////////////////////////////////////// +class refnotes_renderer_note extends refnotes_note { + + /** + * + */ + public function getMinReferenceId() { + $result = -1; + + /* References are added in ascending order, so the first valid id should be minimal. */ + foreach ($this->reference as $reference) { + if ($reference->getId() != -1) { + $result = $reference->getId(); + break; + } + } + + return $result; + } + + /** + * + */ + public function getAnchorName() { + $result = 'refnotes'; + $result .= $this->scope->getName(); + $result .= ':note' . $this->id; + + return $result; + } + + /** + * + */ + public function render($mode) { + $doc = $this->scope->getRenderer()->renderNote($mode, $this, $this->reference); + + $this->reference = array(); + $this->processed = true; + + return $doc; + } +} + +//////////////////////////////////////////////////////////////////////////////////////////////////// +class refnotes_action_note extends refnotes_note { + + /** + * Constructor + */ + public function __construct($scope, $namespaceName, $name) { + parent::__construct($scope, $namespaceName, $name); + + $this->loadDatabaseDefinition(); + + $this->inline = $this->getAttribute('inline', false); + } + + /** + * + */ + private function loadDatabaseDefinition() { + $name = $this->namespaceName . $this->name; + $note = refnotes_reference_database::getInstance()->findNote($name); + + if ($note != NULL) { + $this->attributes = $note->getAttributes(); + $this->data = $note->getData(); + } + } + + /** + * + */ + public function addReference($reference) { + parent::addReference($reference); + + $exclude = $this->scope->getRenderer()->getReferencePrivateDataSet(); + $data = array_diff_key($reference->getData(), array_flip($exclude)); + $this->data = array_merge($this->data, $data); + } + + /** + * Checks if the note should be processed. Simple notes are also reported as valid so that + * scope limits will produce note blocks identical to ones during rendering. + */ + public function isValid() { + return !$this->processed && !empty($this->reference) && ($this->text != '' || $this->hasData()); + } + + /** + * Inject reference database data into references so that they can be properly rendered. + * Inject note text into the first reference. + */ + public function rewriteReferences() { + if ($this->text == '' && $this->hasData()) { + foreach ($this->reference as $reference) { + $reference->rewrite($this->attributes, $this->data); + } + + $this->reference[0]->setNoteText($this->scope->getRenderer()->renderNoteText($this)); + } + + $this->processed = true; + } +} |