mirror of
https://github.com/renbaoshuo/S2OJ.git
synced 2024-11-13 00:18:42 +00:00
feat(web): mention a user in markdown
This commit is contained in:
parent
f574fe0055
commit
8a7930e18c
@ -193,7 +193,7 @@ class HTML {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static function parsedown() {
|
public static function parsedown() {
|
||||||
return new ParsedownMath([
|
return new UOJMarkdown([
|
||||||
'math' => [
|
'math' => [
|
||||||
'enabled' => true,
|
'enabled' => true,
|
||||||
'matchSingleDollar' => true
|
'matchSingleDollar' => true
|
||||||
|
@ -108,15 +108,7 @@ class UOJBlogEditor {
|
|||||||
|
|
||||||
if ($this->show_editor) {
|
if ($this->show_editor) {
|
||||||
if ($this->type == 'blog') {
|
if ($this->type == 'blog') {
|
||||||
$content_md = $_POST[$this->name . '_content_md'];
|
$this->post_data['content'] = $parsedown->text($this->post_data['content_md']);
|
||||||
$dom = new DOMDocument;
|
|
||||||
$dom->loadHTML(mb_convert_encoding($parsedown->text($this->post_data['content_md']), 'HTML-ENTITIES', 'UTF-8'));
|
|
||||||
$elements = $dom->getElementsByTagName('table');
|
|
||||||
foreach ($elements as $element) {
|
|
||||||
$element->setAttribute('class',
|
|
||||||
$element->getAttribute('class') . ' table table-bordered');
|
|
||||||
}
|
|
||||||
$this->post_data['content'] = $dom->saveHTML();
|
|
||||||
|
|
||||||
if (preg_match('/^.*<!--.*readmore.*-->.*$/m', $this->post_data['content'], $matches, PREG_OFFSET_CAPTURE)) {
|
if (preg_match('/^.*<!--.*readmore.*-->.*$/m', $this->post_data['content'], $matches, PREG_OFFSET_CAPTURE)) {
|
||||||
$content_less = substr($this->post_data['content'], 0, $matches[0][1]);
|
$content_less = substr($this->post_data['content'], 0, $matches[0][1]);
|
||||||
|
78
web/app/models/UOJMarkdown.php
Normal file
78
web/app/models/UOJMarkdown.php
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
<?php
|
||||||
|
class UOJMarkdown extends ParsedownMath {
|
||||||
|
public function __construct($options = '') {
|
||||||
|
if (method_exists(get_parent_class(),"__construct")) {
|
||||||
|
parent::__construct($options);
|
||||||
|
}
|
||||||
|
|
||||||
|
// https://gist.github.com/ShNURoK42/b5ce8baa570975db487c
|
||||||
|
$this->InlineTypes['@'][] = 'UserMention';
|
||||||
|
$this->inlineMarkerList .= '@';
|
||||||
|
}
|
||||||
|
|
||||||
|
// https://github.com/taufik-nurrohman/parsedown-extra-plugin/blob/1653418c5a9cf5277cd28b0b23ba2d95d18e9bc4/ParsedownExtraPlugin.php#L340-L345
|
||||||
|
protected function doGetAttributes($Element) {
|
||||||
|
if (isset($Element['attributes'])) {
|
||||||
|
return (array) $Element['attributes'];
|
||||||
|
}
|
||||||
|
return array();
|
||||||
|
}
|
||||||
|
|
||||||
|
// https://github.com/taufik-nurrohman/parsedown-extra-plugin/blob/1653418c5a9cf5277cd28b0b23ba2d95d18e9bc4/ParsedownExtraPlugin.php#L347-L358
|
||||||
|
protected function doGetContent($Element) {
|
||||||
|
if (isset($Element['text'])) {
|
||||||
|
return $Element['text'];
|
||||||
|
}
|
||||||
|
if (isset($Element['rawHtml'])) {
|
||||||
|
return $Element['rawHtml'];
|
||||||
|
}
|
||||||
|
if (isset($Element['handler']['argument'])) {
|
||||||
|
return implode("\n", (array) $Element['handler']['argument']);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// https://github.com/taufik-nurrohman/parsedown-extra-plugin/blob/1653418c5a9cf5277cd28b0b23ba2d95d18e9bc4/ParsedownExtraPlugin.php#L369-L378
|
||||||
|
protected function doSetAttributes(&$Element, $From, $Args = array()) {
|
||||||
|
$Attributes = $this->doGetAttributes($Element);
|
||||||
|
$Content = $this->doGetContent($Element);
|
||||||
|
if (is_callable($From)) {
|
||||||
|
$Args = array_merge(array($Content, $Attributes, &$Element), $Args);
|
||||||
|
$Element['attributes'] = array_replace($Attributes, (array) call_user_func_array($From, $Args));
|
||||||
|
} else {
|
||||||
|
$Element['attributes'] = array_replace($Attributes, (array) $From);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add classes to <table>
|
||||||
|
protected function blockTableComplete($Block) {
|
||||||
|
$this->doSetAttributes($Block['element'], ['class' => 'table table-bordered']);
|
||||||
|
|
||||||
|
return $Block;
|
||||||
|
}
|
||||||
|
|
||||||
|
// https://gist.github.com/ShNURoK42/b5ce8baa570975db487c
|
||||||
|
protected function inlineUserMention($Excerpt) {
|
||||||
|
if (preg_match('/^@([^\s]+)/', $Excerpt['text'], $matches)) {
|
||||||
|
if (validateUsername($matches[1]) && ($user = queryUser($matches[1]))) {
|
||||||
|
return [
|
||||||
|
'extent' => strlen($matches[0]),
|
||||||
|
'element' => [
|
||||||
|
'name' => 'a',
|
||||||
|
'text' => '@' . $user['username'],
|
||||||
|
'attributes' => [
|
||||||
|
'href' => '/user/' . $user['username'],
|
||||||
|
'class' => 'uoj-username',
|
||||||
|
'data-realname' => $user['realname'],
|
||||||
|
],
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
return [
|
||||||
|
'extent' => strlen($matches[0]),
|
||||||
|
'markup' => $matches[0],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user