*/ class Post extends MarkdownParser { /** * {@inheritdoc} */ //protected $id_class_attr_catch_re = '\{((?'.'>[ ]*[#.a-z][-_:a-zA-Z0-9="\'\/\*-]+){1,})[ ]*\}'; protected $id_class_attr_catch_re = '\{([^\}]+)\}'; /** * {@inheritdoc} */ public function transformMarkdown($text) { $html = parent::transformMarkdown($text); $html = str_replace(' role="doc-endnote"', '', $html); return $html; } /** * {@inheritdoc} */ protected function doExtraAttributes($tag_name, $attr, $defaultIdValue = null, $classes = array()) { if (empty($attr) && !$defaultIdValue && empty($classes)) { return ''; } // Split on components preg_match_all('/[#.a-z][-_:a-zA-Z0-9]+/', $attr, $matches); $elements = $matches[0]; // Handle classes and IDs (only first ID taken into account) $attributes = array(); $id = false; foreach ($elements as $element) { if ($element{0} == '.') { $classes[] = substr($element, 1); } elseif ($element{0} == '#') { if ($id === false) { $id = substr($element, 1); } } } preg_match_all('/[#.]{0}([a-z-]+)=([:a-zA-Z0-9]+)/', $attr, $matches, PREG_SET_ORDER); foreach ($matches as $match) { $attributes[] = sprintf('%s="%s"', $match[1], htmlspecialchars($match[2])); } preg_match_all('/[#.]{0}([a-z-]+)=(["\']{1})(.+)\2/isUu', $attr, $matches, PREG_SET_ORDER); foreach ($matches as $match) { $attributes[] = sprintf('%s="%s"', $match[1], htmlspecialchars($match[3])); } if (!$id) { $id = $defaultIdValue; } // Compose attributes as string $attr_str = ''; if (!empty($id)) { $attr_str .= ' id="'.$this->encodeAttribute($id).'"'; } if (!empty($classes)) { $attr_str .= ' class="'.implode(' ', $classes).'"'; } if (!$this->no_markup && !empty($attributes)) { $attr_str .= ' '.implode(' ', $attributes); } return $attr_str; } protected function _doFencedCodeBlocks_callback($matches) { $classname = &$matches[2]; $attrs = &$matches[3]; $codeblock = $matches[4]; if ($this->code_block_content_func) { $codeblock = call_user_func($this->code_block_content_func, $codeblock, $classname); } else { $codeblock = htmlspecialchars($codeblock, ENT_NOQUOTES); } $codeblock = str_replace( ['<mark>', '</mark>'], ['', ''], $codeblock ); $codeblock = preg_replace_callback('/^\n+/', array($this, '_doFencedCodeBlocks_newlines'), $codeblock); $classes = array(); if ($classname != '') { if ($classname{0} == '.') { $classname = substr($classname, 1); } $classes[] = $this->code_class_prefix.$classname; } $attr_str = $this->doExtraAttributes($this->code_attr_on_pre ? 'pre' : 'code', $attrs, null, $classes); $pre_attr_str = $this->code_attr_on_pre ? $attr_str : ''; $code_attr_str = $this->code_attr_on_pre ? '' : $attr_str; $codeblock = "$codeblock"; return "\n\n".$this->hashBlock($codeblock)."\n\n"; } }