def list_cards(self, query, verbose=False): """List cards that match a query""" for cid in self.find_cards(query): c = self.col.getCard(cid) question = BeautifulSoup(html_to_screen(c.q()), features='html5lib') question = re.sub(r'\s\s+', ' ', question.get_text().replace('\n', ' ').strip()) answer = BeautifulSoup(html_to_screen(c.a()), features='html5lib') answer = re.sub(r'\s\s+', ' ', answer.get_text().replace('\n', ' ').strip()) card_type = ['new', 'learning', 'review', 'relearning'][c.type] click.echo(f"{click.style('', fg='reset')}" f"{click.style('Q:', fg='yellow')} " f"{question[:cfg['width']]}") if verbose: click.echo(f"{click.style('', fg='reset')}" f"{click.style('A:', fg='yellow')} " f"{answer[:cfg['width']]}") click.echo( f"{click.style('', fg='reset')}" f"{click.style('cid:', fg='yellow')} {cid} " f"{click.style('type:', fg='yellow')} {card_type} " f"{click.style('ease:', fg='yellow')} {c.factor/10}% " f"{click.style('lapses:', fg='yellow')} {c.lapses} " f"{click.style('due:', fg='yellow')} {c.due} " f"{click.style('model:', fg='yellow')} {c.model()['name']}\n")
def list_cards(self, query, verbose=False): """List cards that match a query""" for cid in self.find_cards(query): c = self.col.getCard(cid) question = html_to_screen(clean_html(c.q())).replace('\n', ' ') answer = html_to_screen(clean_html(c.a())).replace('\n', ' ') click.echo(f'Q: {question[:cfg["width"]]}') if verbose: click.echo(f'A: {answer[:cfg["width"]]}') click.echo(f'ease: {c.factor/10}% ' f'lapses: {c.lapses} ' f'model: {c.model()["name"]}\n')
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 __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 print_short(self): """Print short version to screen""" import os import re import click from apy.convert import html_to_screen try: width = os.get_terminal_size()[0] except OSError: width = 120 first_field = html_to_screen(self.n.values()[0]) first_field = first_field.replace('\n', ' ') first_field = re.sub(r'\s\s\s+', ' ', first_field) first_field = first_field[:width - 14] + click.style('', reset=True) if self.suspended: color = 'red' elif 'marked' in self.n.tags: color = 'yellow' else: color = 'green' model = f'{self.model_name[:13]:14s}' click.echo(click.style(model, fg=color) + first_field)
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 list_cards(query): """List cards that match a given query.""" from apy.anki import Anki from apy.convert import html_to_screen, clean_html with Anki(cfg['base']) as a: for cid in a.find_cards(query): c = a.col.getCard(cid) question = html_to_screen(clean_html(c.q())).replace('\n', ' ') # answer = html_to_screen(clean_html(c.a())).replace('\n', ' ') click.echo(f'lapses: {c.lapses:2d} ease: {c.factor/10}% Q: ' + question[:80])
def list_cards(self, query, verbose=False): """List cards that match a query""" for cid in self.find_cards(query): c = self.col.getCard(cid) question = html_to_screen(c.q()).replace('\n', ' ') answer = html_to_screen(c.a()).replace('\n', ' ') card_type = ['new', 'learning', 'review', 'relearning'][c.type] click.echo(f"{click.style('Q:', fg='yellow')} " f"{question[:cfg['width']]}") if verbose: click.echo(f"{click.style('A:', fg='yellow')} " f"{answer[:cfg['width']]}") click.echo( f"{click.style('cid:', fg='yellow')} {cid} " f"{click.style('type:', fg='yellow')} {card_type} " f"{click.style('ease:', fg='yellow')} {c.factor/10}% " f"{click.style('lapses:', fg='yellow')} {c.lapses} " f"{click.style('due:', fg='yellow')} {c.due} " f"{click.style('model:', fg='yellow')} {c.model()['name']}\n" )
def list_notes(self, query, verbose=False): """List notes that match a query""" for note in self.find_notes(query): first_field = html_to_screen(note.n.values()[0]) first_field = first_field.replace('\n', ' ') first_field = re.sub(r'\s\s\s+', ' ', first_field) first_field = first_field[:cfg['width']-14] \ + click.style('', reset=True) first = 'Q: ' if note.suspended: first = click.style(first, fg='red') elif 'marked' in note.n.tags: first = click.style(first, fg='yellow') click.echo(f'{first}{first_field}') if verbose: click.echo(f'model: {note.model_name}\n')
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 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))