/
tinymce-editor.php
188 lines (186 loc) · 7.9 KB
/
tinymce-editor.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
<?php
namespace Grav\Plugin;
use Grav\Common\Page\Page;
use Grav\Common\Page\Markdown\Excerpts;
use Grav\Common\Plugin;
class TinyMCEEditorPlugin extends Plugin {
private $terminated = array("area", "base", "basefont", "bgsound", "br", "col", "command", "embed", "frame", "hr", "image", "img", "input", "isindex", "keygen", "link", "menuitem", "meta", "nextid", "param", "source", "track", "wbr");
private function fixNodes(\DOMNode $node) {
if($node->hasChildNodes()) {
foreach($node->childNodes as $child) {
$this->fixNodes($child);
}
} else if(!in_array(strtolower($node->nodeName), $this->terminated)) {
$node->appendChild(new \DOMText(""));
}
}
public static function getSubscribedEvents() {
return ["onAdminSave" => ["onAdminSave", 0], "onPluginsInitialized" => ["onPluginsInitialized", 0], "onTwigSiteVariables" => ["onTwigSiteVariables", 0], "onPageContentProcessed" => ["onPageContentProcessed", 0]];
}
public function onAdminSave($event) {
$page = $event["object"];
if($page instanceof Page && $page->getOriginal() instanceof Page && $page->folder() != $page->getOriginal()->folder() && $page->rawMarkdown() != "") {
$newdir = explode(".", $page->folder());
$newdir = $this->grav["uri"]->rootUrl() . $page->parent()->route() . "/" . end($newdir) . "/";
$dom = new \DOMDocument("1.0", "UTF-8");
@$dom->loadHTML(mb_convert_encoding($page->rawMarkdown(), "HTML-ENTITIES", "UTF-8"), LIBXML_PARSEHUGE);
foreach($page->getOriginal()->media()->all() as $key => $value) {
foreach($dom->getElementsByTagName("img") as $tag) {
$query = parse_url($tag->getAttribute("src"), PHP_URL_QUERY);
if($query != NULL) {
$query = "?" . $query;
}
if($tag->getAttribute("src") == $this->grav["uri"]->rootUrl() . $page->getOriginal()->route() . "/" . urlencode($key) . $query) {
$tag->setAttribute("src", $newdir . $key . $query);
}
}
foreach($dom->getElementsByTagName("audio") as $tag) {
$query = parse_url($tag->getAttribute("src"), PHP_URL_QUERY);
if($query != NULL) {
$query = "?" . $query;
}
if($tag->getAttribute("src") == $this->grav["uri"]->rootUrl() . $page->getOriginal()->route() . "/" . urlencode($key) . $query) {
$tag->setAttribute("src", $newdir . $key . $query);
}
}
foreach($dom->getElementsByTagName("source") as $tag) {
$query = parse_url($tag->getAttribute("src"), PHP_URL_QUERY);
if($query != NULL) {
$query = "?" . $query;
}
if($tag->getAttribute("src") == $this->grav["uri"]->rootUrl() . $page->getOriginal()->route() . "/" . urlencode($key) . $query) {
$tag->setAttribute("src", $newdir . $key . $query);
}
}
foreach($dom->getElementsByTagName("a") as $tag) {
$query = parse_url($tag->getAttribute("href"), PHP_URL_QUERY);
if($query != NULL) {
$query = "?" . $query;
}
if($tag->getAttribute("href") == $this->grav["uri"]->rootUrl() . $page->getOriginal()->route() . "/" . urlencode($key) . $query) {
$tag->setAttribute("href", $newdir . $key . $query);
}
}
}
$html = "";
foreach($dom->getElementsByTagname("body")[0]->childNodes as $node) {
$this->fixNodes($node);
$html .= $dom->saveXML($node);
}
$page->rawMarkdown($html);
}
}
public function onPluginsInitialized() {
if($this->isAdmin()) {
$this->enable(["onTwigTemplatePaths" => ["onTwigTemplatePaths", 999]]);
}
}
public function onTwigTemplatePaths() {
if(file_exists(__DIR__ . "/../../data/tinymce-editor/templates")) {
$this->grav["twig"]->twig_paths[] = __DIR__ . "/../../data/tinymce-editor/templates";
} else {
$this->grav["twig"]->twig_paths[] = __DIR__ . "/templates";
}
}
public function onTwigSiteVariables() {
if($this->isAdmin()) {
$page = $this->grav["admin"]->page();
$version = "tinymce";
if($this->config["plugins"]["tinymce-editor"]["apikey"] == "") {
if(file_exists(__DIR__ . "/../../data/tinymce-editor/js/" . $version)) {
$this->grav["assets"]->add("user://data/tinymce-editor/js/" . $version . "/tinymce.min.js");
} else {
$this->grav["assets"]->add("plugin://tinymce-editor/js/" . $version . "/tinymce.min.js");
}
} else {
$this->grav["assets"]->add("https://cloud.tinymce.com/4/tinymce.min.js?apiKey=" . urlencode($this->config["plugins"]["tinymce-editor"]["apikey"]));
}
if(file_exists(__DIR__ . "/../../data/tinymce-editor/css")) {
$this->grav["assets"]->add("user://data/tinymce-editor/css/editor.css");
} else {
$this->grav["assets"]->add("plugin://tinymce-editor/css/editor.css");
}
if($this->config["plugins"]["tinymce-editor"]["restrictions"]["blacklist"]) {
foreach($this->grav["pages"]->root()->collection($this->config["plugins"]["tinymce-editor"]["blacklist"], false) as $item) {
if($item == $page) {
return;
}
}
}
$whitelisted = true;
if($this->config["plugins"]["tinymce-editor"]["restrictions"]["whitelist"]) {
$whitelisted = false;
foreach($this->grav["pages"]->root()->collection($this->config["plugins"]["tinymce-editor"]["whitelist"], false) as $item) {
if($item == $page) {
$whitelisted = true;
break;
}
}
}
if($whitelisted) {
if(file_exists(__DIR__ . "/../../data/tinymce-editor/blueprints")) {
$this->grav["locator"]->addPath("blueprints", "", __DIR__ . "/../../data/tinymce-editor/blueprints");
} else {
$this->grav["locator"]->addPath("blueprints", "", __DIR__ . "/blueprints");
}
}
}
}
public function onPageContentProcessed($event) {
$page = $event["page"];
if(!$this->isAdmin() && $page->getRawContent() != "") {
$excerpts = new Excerpts($page);
$dom = new \DOMDocument("1.0", "UTF-8");
@$dom->loadHTML(mb_convert_encoding($page->getRawContent(), "HTML-ENTITIES", "UTF-8"), LIBXML_PARSEHUGE);
foreach($page->media()->all() as $key => $value) {
foreach($dom->getElementsByTagName("img") as $tag) {
$query = parse_url($tag->getAttribute("src"), PHP_URL_QUERY);
if($query != NULL) {
$query = "?" . $query;
}
if($tag->getAttribute("src") == urlencode($key) . $query) {
$excerpt = ["element" => ["attributes" => ["href" => $tag->getAttribute("src")]]];
$excerpt["element"]["attributes"]["src"] = $excerpts->processLinkExcerpt($excerpt)["element"]["attributes"]["href"];
$tag->setAttribute("src", $excerpts->processImageExcerpt($excerpt)["element"]["attributes"]["src"]);
}
}
foreach($dom->getElementsByTagName("audio") as $tag) {
$query = parse_url($tag->getAttribute("src"), PHP_URL_QUERY);
if($query != NULL) {
$query = "?" . $query;
}
if($tag->getAttribute("src") == urlencode($key) . $query) {
$excerpt = ["element" => ["attributes" => ["href" => $tag->getAttribute("src")]]];
$tag->setAttribute("src", $excerpts->processLinkExcerpt($excerpt)["element"]["attributes"]["href"]);
}
}
foreach($dom->getElementsByTagName("source") as $tag) {
$query = parse_url($tag->getAttribute("src"), PHP_URL_QUERY);
if($query != NULL) {
$query = "?" . $query;
}
if($tag->getAttribute("src") == urlencode($key) . $query) {
$excerpt = ["element" => ["attributes" => ["href" => $tag->getAttribute("src")]]];
$tag->setAttribute("src", $excerpts->processLinkExcerpt($excerpt)["element"]["attributes"]["href"]);
}
}
foreach($dom->getElementsByTagName("a") as $tag) {
$query = parse_url($tag->getAttribute("href"), PHP_URL_QUERY);
if($query != NULL) {
$query = "?" . $query;
}
if($tag->getAttribute("href") == urlencode($key) . $query) {
$excerpt = ["element" => ["attributes" => ["href" => $tag->getAttribute("href")]]];
$tag->setAttribute("href", $excerpts->processLinkExcerpt($excerpt)["element"]["attributes"]["href"]);
}
}
}
$html = "";
foreach($dom->getElementsByTagname("body")[0]->childNodes as $node) {
$this->fixNodes($node);
$html .= $dom->saveXML($node);
}
$page->setRawContent($html);
}
}
}