def __repr__(self): """Convert note to Markdown format""" from apy.convert import is_generated_html from apy.convert import html_to_screen lines = [ f'# Note ID: {self.n.id}', f'model: {self.model_name}', ] if self.a.n_decks > 1: lines += [f'deck: {self.get_deck()}'] lines += [f'tags: {self.get_tag_string()}'] if not any([is_generated_html(x) for x in self.n.values()]): lines += ['markdown: false'] lines += [''] for key, val in self.n.items(): if is_generated_html(val): key += ' (md)' lines.append('## ' + key) lines.append(html_to_screen(val, parseable=True)) lines.append('') return '\n'.join(lines)
def get_template(self): """Convert note to Markdown format as a template for new notes""" lines = [f'model: {self.model_name}'] if self.a.n_decks > 1: lines += [f'deck: {self.get_deck()}'] lines += [f'tags: {self.get_tag_string()}'] if not any([is_generated_html(x) for x in self.n.values()]): lines += ['markdown: false'] lines += [''] lines += ['# Note'] lines += [''] for key, val in self.n.items(): if is_generated_html(val): key += ' (md)' lines.append('## ' + key) lines.append(html_to_screen(val, parseable=True)) lines.append('') return '\n'.join(lines)
def print(self, pprint=True): """Print to screen (similar to __repr__ but with colors)""" lines = [click.style('# Note', fg='green')] types = ', '.join({['new', 'learning', 'review', 'relearning'][c.type] for c in self.n.cards()}) lines += [ click.style('nid: ', fg='yellow') + f'{self.n.id}' + click.style(' card type(s): ', fg='yellow') + types ] lines += [ click.style('model: ', fg='yellow') + f'{self.model_name} ({len(self.n.cards())} cards)' ] if self.a.n_decks > 1: lines += [click.style('deck: ', fg='yellow') + self.get_deck()] lines += [click.style('tags: ', fg='yellow') + self.get_tag_string()] flags = [c.template()["name"] for c in self.n.cards() if c.flags > 0] if flags: flags = [click.style(x, fg='magenta') for x in flags] lines += [ f"{click.style('flagged:', fg='yellow')} {', '.join(flags)}" ] if not any([is_generated_html(x) for x in self.n.values()]): lines += [f"{click.style('markdown:', fg='yellow')} false"] if self.suspended: lines[0] += f" ({click.style('suspended', fg='red')})" lines += [''] latex_imgs = [] for key, html in self.n.items(): # Render LaTeX if necessary latex.render_latex(html, self.n.model(), self.a.col) latex_imgs += _get_imgs_from_html_latex(html, self.a, self.n.model()) lines.append(click.style('## ' + key, fg='blue')) lines.append(html_to_screen(html, pprint)) lines.append('') if latex_imgs: lines.append(click.style('LaTeX sources', fg='blue')) for line in latex_imgs: lines.append('- ' + str(line)) lines.append('') click.echo('\n'.join(lines))
def print(self): """Print to screen (similar to __repr__ but with colors)""" import click from apy.convert import is_generated_html from apy.convert import html_to_screen lines = [ click.style(f'# Note ID: {self.n.id}', fg='green'), click.style('model: ', fg='yellow') + f'{self.model_name} ({len(self.n.cards())} cards)', ] if self.a.n_decks > 1: lines += [click.style('deck: ', fg='yellow') + self.get_deck()] lines += [click.style('tags: ', fg='yellow') + self.get_tag_string()] if not any([is_generated_html(x) for x in self.n.values()]): lines += [f"{click.style('markdown:', fg='yellow')} false"] if self.suspended: lines[0] += f" ({click.style('suspended', fg='red')})" lines += [''] for key, val in self.n.items(): if is_generated_html(val): key += ' (md)' lines.append(click.style('# ' + key, fg='blue')) lines.append(html_to_screen(val)) lines.append('') latex_tags = self.get_lateximg_from_field(val) if latex_tags: lines.append('LaTeX sources:') for line in latex_tags: lines.append('- ' + line) lines.append('') click.echo('\n'.join(lines))
def get_field(self, index_or_name): """Return field with given index or name""" if isinstance(index_or_name, str): index = self.fields.index(index_or_name) else: index = index_or_name reply = self.n.fields[index] if is_generated_html(reply): reply = html_to_markdown(reply) return reply
def toggle_markdown(self, index=None): """Toggle markdown on a field""" if index is None: fields = self.fields field = choose(fields, 'Toggle markdown for field:') index = fields.index(field) field_value = self.n.fields[index] if is_generated_html(field_value): self.n.fields[index] = html_to_markdown(field_value) else: self.n.fields[index] = markdown_to_html(field_value) self.n.flush() self.a.modified = True
def print(self): """Print to screen (similar to __repr__ but with colors)""" lines = [ click.style(f'# Note ID: {self.n.id}', fg='green'), click.style('model: ', fg='yellow') + f'{self.model_name} ({len(self.n.cards())} cards)', ] if self.a.n_decks > 1: lines += [click.style('deck: ', fg='yellow')+self.get_deck()] lines += [click.style('tags: ', fg='yellow') + self.get_tag_string()] if not any([is_generated_html(x) for x in self.n.values()]): lines += [f"{click.style('markdown:', fg='yellow')} false"] if any([c.flags > 0 for c in self.n.cards()]): lines += [f"{click.style('flagged', fg='red')}"] if self.suspended: lines[0] += f" ({click.style('suspended', fg='red')})" lines += [''] latex_imgs = [] for key, html in self.n.items(): # Render LaTeX if necessary latex.render_latex(html, self.n.model(), self.a.col) latex_imgs += self.get_lateximg_from_field(html) lines.append(click.style('## ' + key, fg='blue')) lines.append(html_to_screen(html)) lines.append('') if latex_imgs: lines.append(click.style('LaTeX sources', fg='blue')) for line in latex_imgs: lines.append('- ' + str(line)) lines.append('') click.echo('\n'.join(lines))
def change_model(self): """Change the note type""" click.clear() click.secho('Warning!', fg='red') click.echo( '\nThe note type is changed by creating a new note with the selected' '\ntype and then deleting the old note. This means that the review' '\nprogress is lost!' ) if not click.confirm('\nContinue?'): return False models = list(self.a.model_names) models.sort() while True: click.clear() click.echo('Please choose new model:') for n, m in enumerate(models): click.echo(f' {n+1}: {m}') index = click.prompt('>>> ', prompt_suffix='', type=int) - 1 try: new_model = models[index] self.a.set_model(new_model) model = self.a.get_model(new_model) break except IndexError: continue fields = ['' for _ in range(len(model['flds']))] for key, val in self.n.items(): fields[0] += f'### {key}\n{val}\n' tags = ', '.join(self.n.tags) is_markdown = any([is_generated_html(x) for x in self.n.values()]) # pylint: disable=protected-access new_note = self.a._add_note(fields, tags, is_markdown) new_note.edit() # pylint: enable=protected-access self.a.delete_notes(self.n.id) return True
def toggle_markdown(self, index=None): """Toggle markdown on a field""" from apy.utilities import choose from apy.convert import is_generated_html from apy.convert import html_to_markdown from apy.convert import markdown_to_html if index is None: fields = self.fields field = choose(fields, 'Toggle markdown for field:') index = fields.index(field) field_value = self.n.fields[index] if is_generated_html(field_value): self.n.fields[index] = html_to_markdown(field_value) else: self.n.fields[index] = markdown_to_html(field_value) self.n.flush() self.a.modified = True