# This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, # USA. """ Pagure-flavored Markdown Author: Ralph Bean Pierre-Yves Chibon """ import re import flask import markdown.inlinepatterns import markdown.util import pagure import pagure.lib MENTION_RE = r'@(\w+)' EXPLICIT_FORK_ISSUE_RE = r'(\w+)/(\w+)#([0-9]+)' EXPLICIT_MAIN_ISSUE_RE = r'[^|\w](?]*>', r'\b(?:f|ht)tps?://[^)<>\s]+[^.,)<>\s]', ]) md.inlinePatterns['mention'] = MentionPattern(MENTION_RE) if pagure.APP.config.get('ENABLE_TICKETS', True): md.inlinePatterns['implicit_pr'] = \ ImplicitPRPattern(IMPLICIT_PR_RE) md.inlinePatterns['explicit_fork_issue'] = \ ExplicitForkIssuePattern(EXPLICIT_FORK_ISSUE_RE) md.inlinePatterns['explicit_main_issue'] = \ ExplicitMainIssuePattern(EXPLICIT_MAIN_ISSUE_RE) md.inlinePatterns['implicit_issue'] = \ ImplicitIssuePattern(IMPLICIT_ISSUE_RE) md.inlinePatterns['striked'] = StrikeThroughPattern( STRIKE_THROUGH_RE) md.registerExtension(self) def makeExtension(*arg, **kwargs): return PagureExtension(**kwargs) def _issue_exists(user, repo, idx): """ Utility method checking if a given issue exists. """ repo_obj = pagure.lib.get_project( pagure.SESSION, name=repo, user=user) if not repo_obj: return False issue_obj = pagure.lib.search_issues( pagure.SESSION, repo=repo_obj, issueid=idx) if not issue_obj: return False return issue_obj def _pr_exists(user, repo, idx): """ Utility method checking if a given PR exists. """ repo_obj = pagure.lib.get_project( pagure.SESSION, name=repo, user=user) if not repo_obj: return False pr_obj = pagure.lib.search_pull_requests( pagure.SESSION, project_id=repo_obj.id, requestid=idx) if not pr_obj: return False return pr_obj def _obj_anchor_tag(user, repo, obj, text): """ Utility method generating the link to an issue or a PR. """ if obj.isa == 'issue': url = flask.url_for( 'view_issue', username=user, repo=repo, issueid=obj.id) else: url = flask.url_for( 'request_pull', username=user, repo=repo, requestid=obj.id) element = markdown.util.etree.Element("a") element.set('href', url) element.set('title', obj.title) element.text = text return element