summaryrefslogtreecommitdiff
path: root/platform/www/lib/plugins/refnotes/reference.php
diff options
context:
space:
mode:
Diffstat (limited to 'platform/www/lib/plugins/refnotes/reference.php')
-rw-r--r--platform/www/lib/plugins/refnotes/reference.php192
1 files changed, 192 insertions, 0 deletions
diff --git a/platform/www/lib/plugins/refnotes/reference.php b/platform/www/lib/plugins/refnotes/reference.php
new file mode 100644
index 0000000..6a5f82a
--- /dev/null
+++ b/platform/www/lib/plugins/refnotes/reference.php
@@ -0,0 +1,192 @@
+<?php
+
+/**
+ * Plugin RefNotes: Reference
+ *
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Mykola Ostrovskyy <dwpforge@gmail.com>
+ */
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+class refnotes_parser_reference extends refnotes_refnote {
+
+ /**
+ * Constructor
+ */
+ public function __construct($name, $data) {
+ list($namespace, $name) = refnotes_namespace::parseName($name);
+
+ if (preg_match('/(?:@@FNT|#)(\d+)/', $name, $match) == 1) {
+ $name = intval($match[1]);
+ }
+
+ parent::__construct(array('ns' => $namespace, 'name' => $name));
+
+ if ($data != '') {
+ $this->parseStructuredData($data);
+ }
+ }
+
+ /**
+ *
+ */
+ private function parseStructuredData($data) {
+ if (preg_match('/^\s*\|/', $data) == 1) {
+ preg_match_all('/\|\s*([-\w]+)\s*=\s*([^|]+)/', $data, $match, PREG_SET_ORDER);
+
+ foreach ($match as $m) {
+ $this->data[$m[1]] = preg_replace('/\s+/', ' ', trim($m[2]));
+ }
+ }
+ else {
+ preg_match_all('/([-\w]+)\s*:\s*(.+?)\s*?(?:(?<!\\\\);|\n|$)/', $data, $match, PREG_SET_ORDER);
+
+ foreach ($match as $m) {
+ $this->data[$m[1]] = str_replace('\\;', ';', $m[2]);
+ }
+ }
+ }
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+class refnotes_reference extends refnotes_refnote {
+
+ protected $inline;
+ protected $hidden;
+ protected $note;
+ protected $id;
+
+ /**
+ * Constructor
+ */
+ public function __construct($note, $attributes, $data) {
+ parent::__construct($attributes, $data);
+
+ $this->inline = $this->getAttribute('inline', false);
+ $this->hidden = $this->getAttribute('hidden', false);
+ $this->note = $note;
+ $this->id = -1;
+
+ if ($this->isBackReferenced()) {
+ $this->id = $this->note->getScope()->getReferenceId();
+ }
+ }
+
+ /**
+ *
+ */
+ public function getId() {
+ return $this->id;
+ }
+
+ /**
+ *
+ */
+ public function getNote() {
+ return $this->note;
+ }
+
+ /**
+ *
+ */
+ public function isInline() {
+ return $this->inline;
+ }
+
+ /**
+ *
+ */
+ public function isBackReferenced() {
+ return !$this->inline && !$this->hidden;
+ }
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+class refnotes_renderer_reference extends refnotes_reference {
+
+ /**
+ *
+ */
+ public function getAnchorName() {
+ $result = 'refnotes';
+ $result .= $this->note->getScope()->getName();
+ $result .= ':ref' . $this->id;
+
+ return $result;
+ }
+
+ /**
+ *
+ */
+ public function render($mode) {
+ $doc = '';
+
+ if (!$this->hidden) {
+ $doc = $this->note->getScope()->getRenderer()->renderReference($mode, $this);
+ }
+
+ return $doc;
+ }
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+class refnotes_action_reference extends refnotes_reference {
+
+ private $call;
+
+ /**
+ * Constructor
+ */
+ public function __construct($note, $attributes, $data, $call) {
+ parent::__construct($note, $attributes, $data);
+
+ $this->call = $call;
+ }
+
+ /**
+ *
+ */
+ private function updateAttributes($attributes) {
+ static $key = array('inline', 'use-reference-base', 'use-reference-font-weight', 'use-reference-font-style', 'use-reference-format', 'source');
+
+ foreach ($key as $k) {
+ if (array_key_exists($k, $attributes)) {
+ $this->attributes[$k] = $attributes[$k];
+ }
+ }
+ }
+
+ /**
+ *
+ */
+ private function updateData($data) {
+ $include = $this->note->getScope()->getRenderer()->getReferenceSharedDataSet();
+ $data = array_intersect_key($data, array_flip($include));
+ $this->data = array_merge($data, $this->data);
+ }
+
+ /**
+ *
+ */
+ public function rewrite($attributes, $data) {
+ $this->updateAttributes($attributes);
+ $this->updateData($data);
+
+ $this->call->setPluginData(1, $this->attributes);
+
+ if ($this->hasData()) {
+ $this->call->setPluginData(2, $this->data);
+ }
+ }
+
+ /**
+ *
+ */
+ public function setNoteText($text) {
+ if ($text != '') {
+ $calls = refnotes_parser_core::getInstance()->getInstructions($text);
+
+ $this->call->insertBefore(new refnotes_nest_instruction($calls));
+ }
+ }
+}