def run(self): """Show the changelog in a new view.""" try: import mdpopups has_phantom_support = (mdpopups.version() >= (1, 10, 0)) fmatter = mdpopups.format_frontmatter(frontmatter) except Exception as e: print(e) fmatter = '' has_phantom_support = False text = sublime.load_resource('Packages/BracketHighlighter/CHANGES.md') view = self.window.new_file() view.set_name('BracketHighlighter - Changelog') view.settings().set('gutter', False) view.settings().set('word_wrap', False) if has_phantom_support: mdpopups.add_phantom( view, 'changelog', sublime.Region(0), fmatter + text, sublime.LAYOUT_INLINE, wrapper_class="bracket-highlighter", css=CSS, on_navigate=self.on_navigate ) else: view.run_command('insert', {"characters": text}) view.set_read_only(True) view.set_scratch(True)
def hover_content(self) -> str: contents = [] # type: List[Any] if isinstance(self._hover, dict): response_content = self._hover.get('contents') if response_content: if isinstance(response_content, list): contents = response_content else: contents = [response_content] formatted = [] for item in contents: value = "" language = None if isinstance(item, str): value = item else: value = item.get("value") language = item.get("language") if language: formatted.append("```{}\n{}\n```\n".format(language, value)) else: formatted.append(value) if formatted: frontmatter_config = mdpopups.format_frontmatter( {'allow_code_wrap': True}) return mdpopups.md2html(self.view, frontmatter_config + "\n".join(formatted)) return ""
def run(self, page): """Open page.""" try: import mdpopups import pymdownx has_phantom_support = (mdpopups.version() >= (1, 10, 0)) and (int(sublime.version()) >= 3124) fmatter = mdpopups.format_frontmatter(frontmatter) if pymdownx.version_info[:3] >= (4, 3, 0) else '' except Exception: fmatter = '' has_phantom_support = False if not has_phantom_support: sublime.run_command('open_file', {"file": page}) else: text = sublime.load_resource(page.replace('${packages}', 'Packages')) view = self.window.new_file() view.set_name('QuickCal - Quick Start') view.settings().set('gutter', False) view.settings().set('word_wrap', False) if has_phantom_support: mdpopups.add_phantom( view, 'quickstart', sublime.Region(0), fmatter + text, sublime.LAYOUT_INLINE, css=CSS, wrapper_class="quick-cal", on_navigate=self.on_navigate ) else: view.run_command('insert', {"characters": text}) view.set_read_only(True) view.set_scratch(True)
def run(self, page): """Open page.""" try: import mdpopups has_phantom_support = (mdpopups.version() >= (1, 10, 0)) fmatter = mdpopups.format_frontmatter(frontmatter) except Exception: fmatter = '' has_phantom_support = False if not has_phantom_support: sublime.run_command('open_file', {"file": page}) else: text = sublime.load_resource(page.replace('${packages}', 'Packages')) view = self.window.new_file() view.set_name('BracketHighlighter - Quick Start') view.settings().set('gutter', False) view.settings().set('word_wrap', False) if has_phantom_support: mdpopups.add_phantom( view, 'QUICKSTART', sublime.Region(0), fmatter + text, sublime.LAYOUT_INLINE, css=CSS, wrapper_class="bracket-highlighter", on_navigate=self.on_navigate ) else: view.run_command('insert', {"characters": text}) view.set_read_only(True) view.set_scratch(True)
def run(self): """Show the changelog in a new view.""" try: import mdpopups import pymdownx has_phantom_support = (mdpopups.version() >= (1, 10, 0)) and (int(sublime.version()) >= 3124) fmatter = mdpopups.format_frontmatter(frontmatter) if pymdownx.version_info[:3] >= (4, 3, 0) else '' except Exception: fmatter = '' has_phantom_support = False text = sublime.load_resource('Packages/QuickCal/CHANGES.md') view = self.window.new_file() view.set_name('QuickCal - Changelog') view.settings().set('gutter', False) view.settings().set('word_wrap', False) if has_phantom_support: mdpopups.add_phantom( view, 'changelog', sublime.Region(0), fmatter + text, sublime.LAYOUT_INLINE, wrapper_class="quick-cal", css=CSS, on_navigate=self.on_navigate ) else: view.run_command('insert', {"characters": text}) view.set_read_only(True) view.set_scratch(True)
def run(self): """Show the changelog in a new view.""" try: import mdpopups import pymdownx has_phantom_support = (mdpopups.version() >= (1, 10, 0)) and (int( sublime.version()) >= 3124) fmatter = mdpopups.format_frontmatter( frontmatter) if pymdownx.version_info[:3] >= (4, 3, 0) else '' except Exception: fmatter = '' has_phantom_support = False text = sublime.load_resource('Packages/ExportHtml/CHANGES.md') view = self.window.new_file() view.set_name('ExportHtml - Changelog') view.settings().set('gutter', False) view.settings().set('word_wrap', False) if has_phantom_support: mdpopups.add_phantom(view, 'changelog', sublime.Region(0), fmatter + text, sublime.LAYOUT_INLINE, wrapper_class="export-html", css=CSS, on_navigate=self.on_navigate) else: view.run_command('insert', {"characters": text}) view.set_read_only(True) view.set_scratch(True)
def run(self, page): """Open page.""" try: import mdpopups import pymdownx has_phantom_support = (mdpopups.version() >= (1, 10, 0)) and (int(sublime.version()) >= 3124) fmatter = mdpopups.format_frontmatter(frontmatter) if pymdownx.version_info[:3] >= (4, 3, 0) else '' except Exception: fmatter = '' has_phantom_support = False if not has_phantom_support: sublime.run_command('open_file', {"file": page}) else: text = sublime.load_resource(page.replace('${packages}', 'Packages')) view = self.window.new_file() view.set_name('SubNotify - Quick Start') view.settings().set('gutter', False) view.settings().set('word_wrap', False) if has_phantom_support: mdpopups.add_phantom( view, 'quickstart', sublime.Region(0), fmatter + text, sublime.LAYOUT_INLINE, css=CSS, wrapper_class="sub-notify", on_navigate=self.on_navigate ) else: view.run_command('insert', {"characters": text}) view.set_read_only(True) view.set_scratch(True)
def update_sheet(self, config: ClientConfig, active_view: Optional[sublime.View], output_sheet: sublime.HtmlSheet, resolved_command: List[str], server_output: str, exit_code: int) -> None: self.test_runner = None frontmatter = mdpopups.format_frontmatter({'allow_code_wrap': True}) contents = self.get_contents(config, active_view, resolved_command, server_output, exit_code) # The href needs to be encoded to avoid having markdown parser ruin it. copy_link = make_command_link('lsp_copy_to_clipboard_from_base64', '<kbd>Copy to clipboard</kbd>', {'contents': b64encode(contents.encode()).decode()}) formatted = '{}{}\n{}'.format(frontmatter, copy_link, contents) mdpopups.update_html_sheet(output_sheet, formatted, css=css().sheets, wrapper_class=css().sheets_classname)
def run(self, resource_path='docs/en/README.md'): try: w = self.window import mdpopups mdpopups.new_html_sheet( window=w, name='{}/{}'.format(PKG_NAME, resource_path), contents=mdpopups.format_frontmatter(FRONTMATTER) + sublime.load_resource('Packages/{}/{}'.format( PKG_NAME, resource_path)), md=True, css='{}'.format(CSS)) except Exception as e: print('{}: Exception: {}'.format(PKG_NAME, e))
def generate_content(self, view): total_region = sublime.Region(0, view.size()) fm, content = frontmatter.get_frontmatter(view.substr(total_region)) MD_FM.update(fm) content = "{}\n\n{}".format( mdpopups.format_frontmatter(MD_FM), self.render_checkboxes(content), ) html_content = mdpopups.md2html(view, content).replace("<br>", "<br/>") file_name = view.file_name() basepath = os.path.dirname(file_name) if file_name else None html_content = imageparser( html_content, basepath, partial(self._update_preview, view), resources, ) return html_content
def on_hover(self, view, point, hover_zone): if view.settings().get('is_widget'): return if not view.settings().get('show_definitions'): return if hover_zone is not sublime.HOVER_TEXT: return if not view.score_selector(point, 'source.lsl'): return # TODO: fix makopo/sublime-text-tooltip-lsl#6 # word = view.substr(view.expand_by_class(point, sublime.CLASS_WORD_START | sublime.CLASS_WORD_END, "./\\()\"'-:,.;<>~!@#$%^&*|+=[]{}`~?")) word = view.substr(view.word(point)) if not word: return from .keyword_data_loader import LSL_KEYWORD_DATA if LSL_KEYWORD_DATA is None: return try: tooltipRows = [] result = LSL_KEYWORD_DATA[word] if result is None: return # Python-Markdown/markdown used by facelessuser/sublime-markdown-popups requires 4 spaces indentation if 'type' in result or word.startswith('ll'): return_value = '({}) '.format(result['type']) if 'type' in result else '' # TODO: return_value = f'({result['type']}) ' if 'type' in result else '' if 'params' in result: paramsCache = [] for param in result['params']: if 'default' in param: paramsCache.append('<a href="{}{}">{}</a> {} (Default: {})'.format(SL_WIKI, param['type'], param['type'], param['name'], param['default'])) else: paramsCache.append('<a href="{}{}">{}</a> {}'.format(SL_WIKI, param['type'], param['type'], param['name'])) params = '(' + ', '.join(paramsCache) + ')' else: params = '' has_value = ' = {}'.format(str(result['value'])) if 'value' in result else '' if 'value_description' in result: has_value = has_value + ' = {}'.format(str(result['value_description'])) tooltipRows.append('{}<a href="{}{}">{}</a>{}{}'.format(return_value, SL_WIKI, word, word, params, has_value)) # TODO: tooltipRows.append(f'{return_value}<a href="{SL_WIKI}{word}">{word}</a>{params}{has_value}') else: tooltipRows.append('<a href="{}{}">{}</a>'.format(SL_WIKI, word, word)) # TODO: tooltipRows.append(f'<a href="{SL_WIKI}{word}">{word}</a>') tooltipRows.append(' ') if 'type' in result or word.startswith('ll'): if 'params' in result: tooltipRows.append('* Params:') for param in result['params']: tooltipRows.append(' * ({}) {}'.format(param['type'], param['name'])) if 'default' in param: tooltipRows.append(' * default: {}'.format(param['default'])) if 'description' in param: tooltipRows.append(' * description: {}'.format(param['description'])) if 'function-id' in result: tooltipRows.append('* [Function id](https://wiki.secondlife.com/wiki/LSL_Function_ID): {}'.format(str(result['function-id']))) if 'required_permissions' in result: tooltipRows.append('* [Required permissions](https://wiki.secondlife.com/wiki/Category:LSL_Requires_Permissions): ' + ', '.join(str('<a href="{}{}">{}</a>'.format(SL_WIKI, permission, permission)) for permission in result['required_permissions'])) # TODO: tooltipRows.append('* [Required permissions](https://wiki.secondlife.com/wiki/Category:LSL_Requires_Permissions): ' + ', '.join(str(f'<a href="{SL_WIKI}{permission}">{permission}</a>') for permission in result['required_permissions'])) if 'version' in result: tooltipRows.append('* SL server version: {}'.format(result['version'])) if 'status' in result: tooltipRows.append('* Status: {}'.format(result['status'])) if 'delay' in result: # delay is float (in seconds) or string ('variable' for llSleep) tooltipRows.append('* [Delay](https://wiki.secondlife.com/wiki/LSL_Delay): {}'.format(str(result['delay']))) if 'energy' in result: tooltipRows.append('* Energy: {}'.format(str(result['energy']))) tooltipRows.append('* SL JIRA: [{}](http://jira.secondlife.com/secure/IssueNavigator!executeAdvanced.jspa?jqlQuery=%28summary+%7E+%22{}%22+OR+description+%7E+%22{}%22%29+&runQuery=true)'.format(word, word, word)) # TODO: tooltipRows.append(f'* SL JIRA: [{word}](http://jira.secondlife.com/secure/IssueNavigator!executeAdvanced.jspa?jqlQuery=%28summary+%7E+%22{word}%22+OR+description+%7E+%22{word}%22%29+&runQuery=true)') if 'description' in result: tooltipRows.append(' ') tooltipRows.append('---') tooltipRows.append(' ') tooltipRows.append('{}'.format(result['description'])) if 'related' in result: tooltipRows.append(' ') tooltipRows.append('---') tooltipRows.append(' ') tooltipRows.append('Related:') tooltipRows.append(' ') if 'constants' in result['related']: tooltipRows.append('* Constants: ' + ', '.join(str('<a href="{}{}">{}</a>'.format(SL_WIKI, related, related)) for related in result['related']['constants'])) # TODO: tooltipRows.append('* Constants: ' + ', '.join(str(f'<a href="{SL_WIKI}{related}">{related}</a>') for related in result['related']['constants'])) if 'events' in result['related']: tooltipRows.append('* Events: ' + ', '.join(str('<a href="{}{}">{}</a>'.format(SL_WIKI, related, related)) for related in result['related']['events'])) # TODO: f-strings if 'functions' in result['related']: tooltipRows.append('* Functions: ' + ', '.join(str('<a href="{}{}">{}</a>'.format(SL_WIKI, related, related)) for related in result['related']['functions'])) # TODO: f-strings if 'slwiki' in result['related']: tooltipRows.append('* SL wiki: ' + ', '.join(str('<a href="{}{}">{}</a>'.format(SL_WIKI, related, related)) for related in result['related']['slwiki'])) # TODO: f-strings if 'slwiki_categories' in result['related']: tooltipRows.append('* SL wiki categories: ' + ', '.join(str('<a href="{}Category:{}">{}</a>'.format(SL_WIKI, related, related)) for related in result['related']['slwiki_categories'])) # TODO: f-strings if 'wikipedia' in result['related']: tooltipRows.append('* Wikipedia (en): ' + ', '.join(str('<a href="{}{}">{}</a>'.format(WIKIPEDIA, related, related)) for related in result['related']['wikipedia']['en'])) # TODO: f-strings if 'usage' in result: tooltipRows.append(' ') tooltipRows.append('---') for usage_example in result['usage']: tooltipRows.append(' ') tooltipRows.append('```lsl') tooltipRows.append('{}'.format(usage_example)) # TODO: tooltipRows.append(f'{usage_example}') tooltipRows.append('```') if 'snippets' in result: tooltipRows.append(' ') tooltipRows.append('---') for snippet in result['snippets']: tooltipRows.append(' ') tooltipRows.append('```lsl') tooltipRows.append('{}'.format(snippet)) # TODO: tooltipRows.append(f'{snippet}') tooltipRows.append('```') if 0 < len(tooltipRows): tooltipText = mdpopups.format_frontmatter({'allow_code_wrap': True}) tooltipText += '\n' tooltipText += '\n'.join(tooltipRows) # mdpopups.color_box for vectors? or mdpopups.tint with placeholder image? mdpopups.show_popup(view, tooltipText, flags=(sublime.COOPERATE_WITH_AUTO_COMPLETE | sublime.HIDE_ON_MOUSE_MOVE_AWAY), location=point, wrapper_class='lsl', max_width=640, max_height=480, on_navigate=self.on_navigate, on_hide=self.on_hide(view)) return mdpopups.hide_popup(view) except Exception as e: mdpopups.hide_popup(view)
COLOR = {"color": True, "fit": False} HEX = {"hex": True} HEX_NA = {"hex": True, "alpha": False} DEFAULT = {"fit": False} COMMA = {"fit": False, "comma": True} FULL_PREC = {"fit": False, "precision": -1} COLOR_FULL_PREC = {"color": True, "fit": False, "precision": -1} SRGB_SPACES = ("srgb", "hsl", "hwb") FRONTMATTER = mdpopups.format_frontmatter( { "allow_code_wrap": False, "markdown_extensions": [ "markdown.extensions.admonition", "markdown.extensions.attr_list", "markdown.extensions.def_list", "pymdownx.betterem", "pymdownx.magiclink", "pymdownx.extrarawhtml" ] } ) LINE_HEIGHT_WORKAROUND = platform.system() == "Windows" ADD_CSS = dedent( ''' div.color-helper { margin: 0; padding: 0.5rem; } .color-helper .small { font-size: 0.8rem; } .color-helper .alpha { text-decoration: underline; } '''
def on_hover(self, view, point, hover_zone): if view.settings().get('is_widget'): return if not view.settings().get('show_definitions'): return if hover_zone != sublime.HOVER_TEXT: return if not view.score_selector(point, 'source.lsl'): return word = view.substr(view.word(point)) if not word: return if TOOLTIP_DATA is None: return try: tooltipRows = [] for result in TOOLTIP_DATA: if result.get('name', None) == word: if 'type' in result or result['name'].startswith('ll'): tooltipRows.append( '### (%s) <a href="%s%s">%s</a>' % (result.get('type', 'void'), SL_WIKI, result['name'], result['name'])) else: tooltipRows.append( '### <a href="%s%s">%s</a>' % (SL_WIKI, result['name'], result['name'])) tooltipRows.append(' ') if 'value' in result: tooltipRows.append('* Value: %s' % str(result['value'])) if 'version' in result: tooltipRows.append('* SL server version: %s' % result['version']) if 'status' in result: tooltipRows.append( '* <div class="danger">Status: %s</div>' % result['status']) if 'delay' in result: tooltipRows.append('* Delay: %s' % str(result['delay'])) if 'energy' in result: tooltipRows.append('* Energy: %s' % str(result['energy'])) if 'param' in result: tooltipRows.append(' ') tooltipRows.append('#### Parameters') tooltipRows.append(' ') if type(result['param']) is dict: tooltipRows.append( '* <a href="%s%s">%s</a> %s' % (SL_WIKI, result['param']['type'], result['param']['type'], result['param']['name'])) elif type(result['param']) is list: for param in result['param']: tooltipRows.append( '* <a href="%s%s">%s</a> %s' % (SL_WIKI, param['type'], param['type'], param['name'])) if 'description' in result: tooltipRows.append(' ') tooltipRows.append('#### Description') tooltipRows.append(' ') tooltipRows.append('%s' % result['description']['en_US']) if 'related' in result: tooltipRows.append(' ') tooltipRows.append('---') tooltipRows.append(' ') tooltipRows.append('> ' + ', '.join( str('<a href="%s%s">%s</a>' % (SL_WIKI, related, related)) for related in result['related'])) tooltipRows.append(' ') if 'usage' in result: tooltipRows.append(' ') tooltipRows.append('---') for usage_example in result['usage']: tooltipRows.append(' ') tooltipRows.append('```lsl') tooltipRows.append('%s' % usage_example) tooltipRows.append('```') tooltipRows.append(' ') if 'snippets' in result: tooltipRows.append(' ') tooltipRows.append('---') for snippet in result['snippets']: tooltipRows.append(' ') tooltipRows.append('```lsl') tooltipRows.append('%s' % snippet) tooltipRows.append('```') tooltipRows.append(' ') if 0 < len(tooltipRows): frontmatter = mdpopups.format_frontmatter( {'allow_code_wrap': True}) mdpopups.show_popup(view, frontmatter + '\n'.join(tooltipRows), flags=(sublime.COOPERATE_WITH_AUTO_COMPLETE | sublime.HIDE_ON_MOUSE_MOVE_AWAY), location=point, wrapper_class='lsl', max_width=640, max_height=480, on_navigate=self.on_navigate, on_hide=self.on_hide(view)) return # mdpopups.color_box for vectors? or mdpopups.tint with placeholder img? except Exception as e: print(e) mdpopups.hide_popup(view)
COLOR_FULL_PREC = {"color": True, "fit": False, "precision": -1} SRGB_SPACES = ("srgb", "hsl", "hwb") CSS_L4_SPACES = ("srgb", "hsl", "hwb", "lch", "lab", "display-p3", "rec2020", "prophoto-rgb", "a98-rgb", "xyz") lang_map = { # `'name': (('mapping_alias',), ('tmLanguage_or_sublime-syntax file',))` 'color-helper': (('color-helper', ), ('ColorHelper/ColorHelperColors', )) } FRONTMATTER = mdpopups.format_frontmatter({ "allow_code_wrap": False, "language_map": lang_map, "markdown_extensions": [ "markdown.extensions.admonition", "markdown.extensions.attr_list", "markdown.extensions.def_list", "markdown.extensions.md_in_html", "pymdownx.inlinehilite", "pymdownx.betterem", "pymdownx.magiclink" ] }) LINE_HEIGHT_WORKAROUND = platform.system() == "Windows" ADD_CSS = dedent(''' html.light { --ch-button-color: color(var(--mdpopups-bg) blend(black 85%)); } html.dark { --ch-button-color: color(var(--mdpopups-bg) blend(white 85%)); }
def mdpopups_phantom_format_test(fm, md): """Test phantom.""" show_phantom(mdpopups.format_frontmatter(fm) + sublime.load_resource(md))
def minihtml(view: sublime.View, content: Union[MarkedString, MarkupContent, List[MarkedString]], allowed_formats: int) -> str: """ Formats provided input content into markup accepted by minihtml. Content can be in one of those formats: - string: treated as plain text - MarkedString: string or { language: string; value: string } - MarkedString[] - MarkupContent: { kind: MarkupKind, value: string } We can't distinguish between plain text string and a MarkedString in a string form so FORMAT_STRING and FORMAT_MARKED_STRING can't both be specified at the same time. :param view :param content :param allowed_formats: Bitwise flag specifying which formats to parse. :returns: Formatted string """ if allowed_formats == 0: raise ValueError("Must specify at least one format") parse_string = bool(allowed_formats & FORMAT_STRING) parse_marked_string = bool(allowed_formats & FORMAT_MARKED_STRING) parse_markup_content = bool(allowed_formats & FORMAT_MARKUP_CONTENT) if parse_string and parse_marked_string: raise ValueError( "Not allowed to specify FORMAT_STRING and FORMAT_MARKED_STRING at the same time" ) is_plain_text = True result = '' if (parse_string or parse_marked_string) and isinstance(content, str): # plain text string or MarkedString is_plain_text = parse_string result = content if parse_marked_string and isinstance(content, list): # MarkedString[] formatted = [] for item in content: value = "" language = None if isinstance(item, str): value = item else: value = item.get("value") or "" language = item.get("language") if language: formatted.append("```{}\n{}\n```\n".format(language, value)) else: formatted.append(value) is_plain_text = False result = "\n".join(formatted) if (parse_marked_string or parse_markup_content) and isinstance( content, dict): # MarkupContent or MarkedString (dict) language = content.get("language") kind = content.get("kind") value = content.get("value") or "" if parse_markup_content and kind: # MarkupContent is_plain_text = kind != "markdown" result = value if parse_marked_string and language: # MarkedString (dict) is_plain_text = False result = "```{}\n{}\n```\n".format(language, value) if is_plain_text: return "<p>{}</p>".format(text2html(result)) if result else '' else: frontmatter = { "allow_code_wrap": True, "markdown_extensions": [ { "pymdownx.escapeall": { "hardbreak": True, "nbsp": False } }, { "pymdownx.magiclink": { # links are displayed without the initial ftp://, http://, https://, or ftps://. "hide_protocol": True, # GitHub, Bitbucket, and GitLab commit, pull, and issue links are are rendered in a shorthand # syntax. "repo_url_shortener": True } } ] } # Workaround CommonMark deficiency: two spaces followed by a newline should result in a new paragraph. result = re.sub('(\\S) \n', '\\1\n\n', result) return mdpopups.md2html( view, mdpopups.format_frontmatter(frontmatter) + result)
def mdpopups_phantom_format_test(fm, md): """Test phantom.""" show_phantom(mdpopups.format_frontmatter(fm) + sublime.load_resource(md))