summaryrefslogtreecommitdiff
path: root/inc/functions.php
diff options
context:
space:
mode:
authorMichael Foster <savetheinternet@tinyboard.org>2013-07-31 18:59:54 -0400
committerMichael Foster <savetheinternet@tinyboard.org>2013-07-31 18:59:54 -0400
commit6d52c8b42813722c49890b6e4f776dc0dabf382c (patch)
tree5f8baf9a081d145baf4adf1cc4306e46a9fa69d2 /inc/functions.php
parent4891735c49ee7879d0f299d03ebfbe361f3cc73d (diff)
Markup modifiers. Fix issue #66 (public ban message lost when rebuilding post body)
Diffstat (limited to 'inc/functions.php')
-rw-r--r--inc/functions.php36
1 files changed, 35 insertions, 1 deletions
diff --git a/inc/functions.php b/inc/functions.php
index 7826d41b..e638f016 100644
--- a/inc/functions.php
+++ b/inc/functions.php
@@ -1456,13 +1456,43 @@ function markup(&$body, $track_cites = false) {
}
}
+ if (preg_match_all('@&lt;tinyboard ([\w\s]+)&gt;(.+)&lt;/tinyboard&gt;@', $body, $modifiers, PREG_SET_ORDER | PREG_OFFSET_CAPTURE)) {
+ $skip_chars = 0;
+ $body_tmp = $body;
+
+ foreach ($modifiers as $modifier) {
+ // preg_match_all is not multibyte-safe
+ foreach ($modifier as &$match) {
+ $match[1] = mb_strlen(substr($body_tmp, 0, $match[1]));
+ }
+
+ $modifier['type'] = $modifier[1][0];
+ $modifier['content'] = $modifier[2][0];
+
+ if ($modifier['type'] == 'ban message') {
+ // Public ban message
+ $replacement = sprintf($config['mod']['ban_message'], $modifier['content']);
+ } elseif (preg_match('/^escape /', $modifier['type'])) {
+ // Escaped (not a real modifier)
+ $replacement = '&lt;tinyboard ' . substr($modifier['type'], strlen('escape ')) . '&gt;' . $modifier['content'] . '&lt;/tinyboard&gt;';
+ } else {
+ // Unknown
+ $replacement = '';
+ }
+
+ $body = mb_substr_replace($body, $replacement, $modifier[0][1] + $skip_chars, mb_strlen($modifier[0][0]));
+ $skip_chars += mb_strlen($replacement) - mb_strlen($modifier[0][0]);
+
+ }
+ }
+
// replace tabs with 8 spaces
$body = str_replace("\t", ' ', $body);
$tracked_cites = array();
// Cites
- if (isset($board) && preg_match_all('/(^|\s)&gt;&gt;(\d+?)([\s,.)?]|$)/m', $body, $cites, PREG_SET_ORDER | PREG_OFFSET_CAPTURE)) {
+ if (isset($board) && preg_match_all('/(^|\s)&gt;&gt;(\d+?)([\s,.)?]|$)/m', $body, $cites, PREG_SET_ORDER | PREG_OFFSET_CAPTURE)) {
if (count($cites[0]) > $config['max_cites']) {
error($config['error']['toomanycites']);
}
@@ -1561,6 +1591,10 @@ function markup(&$body, $track_cites = false) {
return $tracked_cites;
}
+function escape_markup_modifiers($string) {
+ return preg_replace('@<tinyboard ([\w\s]+)>(.+)</tinyboard>@', '<tinyboard escape $1>$2</tinyboard>', $string);
+}
+
function utf8tohtml($utf8) {
return htmlspecialchars($utf8, ENT_NOQUOTES, 'UTF-8');
}