Exemple #1
0
    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")
Exemple #2
0
 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')
Exemple #3
0
    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)
Exemple #4
0
    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)
Exemple #5
0
    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)
Exemple #6
0
    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))
Exemple #7
0
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])
Exemple #8
0
    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"
                )
Exemple #9
0
    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')
Exemple #10
0
    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))
Exemple #11
0
    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))