mirror of
				https://github.com/zulip/zulip.git
				synced 2025-11-04 05:53:43 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			79 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			79 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
import re
 | 
						|
from typing import Any, List, Match
 | 
						|
 | 
						|
from markdown import Markdown
 | 
						|
from markdown.extensions import Extension
 | 
						|
from markdown.preprocessors import Preprocessor
 | 
						|
from typing_extensions import override
 | 
						|
 | 
						|
from zerver.lib.emoji import EMOTICON_CONVERSIONS, name_to_codepoint
 | 
						|
from zerver.lib.markdown.priorities import PREPROCESSOR_PRIORITIES
 | 
						|
 | 
						|
REGEXP = re.compile(r"\{emoticon_translations\}")
 | 
						|
 | 
						|
TABLE_HTML = """\
 | 
						|
<table>
 | 
						|
    <thead>
 | 
						|
        <tr>
 | 
						|
            <th>Emoticon</th>
 | 
						|
            <th>Emoji</th>
 | 
						|
        </tr>
 | 
						|
    </thead>
 | 
						|
    <tbody>
 | 
						|
        {body}
 | 
						|
    </tbody>
 | 
						|
</table>
 | 
						|
"""
 | 
						|
 | 
						|
ROW_HTML = """\
 | 
						|
<tr>
 | 
						|
    <td><code>{emoticon}</code></td>
 | 
						|
    <td>
 | 
						|
        <img
 | 
						|
            src="/static/generated/emoji/images-google-64/{codepoint}.png"
 | 
						|
            alt="{name}"
 | 
						|
            class="emoji-big">
 | 
						|
    </td>
 | 
						|
</tr>
 | 
						|
"""
 | 
						|
 | 
						|
 | 
						|
class EmoticonTranslationsHelpExtension(Extension):
 | 
						|
    @override
 | 
						|
    def extendMarkdown(self, md: Markdown) -> None:
 | 
						|
        """Add SettingHelpExtension to the Markdown instance."""
 | 
						|
        md.registerExtension(self)
 | 
						|
        md.preprocessors.register(
 | 
						|
            EmoticonTranslation(),
 | 
						|
            "emoticon_translations",
 | 
						|
            PREPROCESSOR_PRIORITIES["emoticon_translations"],
 | 
						|
        )
 | 
						|
 | 
						|
 | 
						|
class EmoticonTranslation(Preprocessor):
 | 
						|
    @override
 | 
						|
    def run(self, lines: List[str]) -> List[str]:
 | 
						|
        for loc, line in enumerate(lines):
 | 
						|
            match = REGEXP.search(line)
 | 
						|
            if match:
 | 
						|
                text = self.handleMatch(match)
 | 
						|
                lines = lines[:loc] + text + lines[loc + 1 :]
 | 
						|
                break
 | 
						|
        return lines
 | 
						|
 | 
						|
    def handleMatch(self, match: Match[str]) -> List[str]:
 | 
						|
        rows = [
 | 
						|
            ROW_HTML.format(
 | 
						|
                emoticon=emoticon,
 | 
						|
                name=name.strip(":"),
 | 
						|
                codepoint=name_to_codepoint[name.strip(":")],
 | 
						|
            )
 | 
						|
            for emoticon, name in EMOTICON_CONVERSIONS.items()
 | 
						|
        ]
 | 
						|
        body = "".join(rows).strip()
 | 
						|
        return TABLE_HTML.format(body=body).strip().splitlines()
 | 
						|
 | 
						|
 | 
						|
def makeExtension(*args: Any, **kwargs: Any) -> EmoticonTranslationsHelpExtension:
 | 
						|
    return EmoticonTranslationsHelpExtension(*args, **kwargs)
 |