Example #1
0
def buildCardsAndDeck(path: Path):
	global AnkiNotes, AnkiModels, Anki_Collections, totalCardCount, FAILED_DECKS
	conn = sqlite3.connect(path.joinpath("collection.anki2").as_posix())
	cursor = conn.cursor()
	cursor.execute(
		"SELECT * FROM cards ORDER BY factor ASC")  # min ease would at rows[0] and max index would be at rows[-1]
	rows = cursor.fetchall()
	with IncrementalBar("\tBuilding Cards and deck", max=len(rows)) as bar:
		for row in rows:
			cid, nid, did, ordi, mod, usn, crtype, queue, due, ivl, factor, reps, lapses, left, odue, odid, flags, data = row
			reqNote = AnkiNotes[str(nid)]
			genCard = None
			
			if reqNote.model.type == 0:
				reqTemplate = getTemplateofOrd(reqNote.model.tmpls, int(ordi))
				
				questionTg = "<style> " + buildCssForOrd(reqNote.model.css, ordi) \
				             + "</style><section class='card' style=\" height:100%; width:100%; margin:0; \">" \
				             + mustache.render(reqTemplate.qfmt, buildStubbleDict(reqNote)) + "</section>"
				answerTag = "<style> " + buildCssForOrd(reqNote.model.css, ordi) \
				            + "</style><section class='card' style=\" height:100%; width:100%; margin:0; \">" \
				            + mustache.render(reqTemplate.afmt, buildStubbleDict(reqNote)) + "</section>"
				questionTg = premailer.transform(questionTg)
				answerTag = premailer.transform(answerTag)
				genCard = Card(cid, questionTg, answerTag)
			
			elif reqNote.model.type == 1:
				reqTemplate = getTemplateofOrd(reqNote.model.tmpls, 0)
				
				mustache.filters["cloze"] = lambda txt: Formatters.cloze_q_filter(txt, str(int(ordi) + 1))
				
				css = reqNote.model.css
				css = buildCssForOrd(css, ordi) if css else ""
				
				questionTg = "<style> " + css + " </style><section class='card' style=\" height:100%; width:100%; margin:0; \">" \
				             + mustache.render(reqTemplate.qfmt, buildStubbleDict(reqNote)) + "</section>"
				
				mustache.filters["cloze"] = lambda txt: Formatters.cloze_a_filter(txt, str(int(ordi) + 1))
				
				answerTag = "<section class='card' style=\" height:100%; width:100%; margin:0; \">" \
				            + mustache.render(reqTemplate.afmt, buildStubbleDict(reqNote)) + "</section>"
				
				questionTg = premailer.transform(questionTg)
				answerTag = premailer.transform(answerTag)
				genCard = Card(cid, questionTg, answerTag)
			
			if genCard is not None:
				reqDeck = getDeckFromID(Anki_Collections, str(did))
				if reqDeck is not None:
					reqDeck.cards.append(genCard)
				else:
					if did not in FAILED_DECKS:
						FAILED_DECKS.append(did)
			else:
				if did not in FAILED_DECKS:
					FAILED_DECKS.append(did)
			totalCardCount += 1
			bar.next()
		bar.finish()
Example #2
0
    def __call__(self, msg):
        if not self.matches(msg):
            return None

        result = Formatters.getFactory().findMedium('irc', msg).formatMessage(msg)
        if self.includeName:
            args = Message.FormatterArgs(msg, result)
            result = Formatters.getFactory().findName('IRCProjectName').format(args)

        return result
Example #3
0
    def __call__(self, msg):
        if not self.matches(msg):
            return None

        result = Formatters.getFactory().findMedium('irc',
                                                    msg).formatMessage(msg)
        if self.includeName:
            args = Message.FormatterArgs(msg, result)
            result = Formatters.getFactory().findName('IRCProjectName').format(
                args)

        return result
Example #4
0
    def element_formatter(self, element):
        """Creates a Formatter instance matching the element's description,
           returns a function that applies the formatter against the current
           message and result.
           """
        # Evaluate this once at parse-time so any silly errors
        # like unknown formatters or media can be detected.
        Formatters.getFactory().fromXml(element)

        def rulesetFormatter(msg):
            args = Message.FormatterArgs(msg, self.result)
            self.result = Formatters.getFactory().fromXml(element, msg).format(args)
            return True
        return rulesetFormatter
Example #5
0
    def element_formatter(self, element):
        """Creates a Formatter instance matching the element's description,
           returns a function that applies the formatter against the current
           message and result.
           """
        # Evaluate this once at parse-time so any silly errors
        # like unknown formatters or media can be detected.
        Formatters.getFactory().fromXml(element)

        def rulesetFormatter(msg):
            args = Message.FormatterArgs(msg, self.result)
            self.result = Formatters.getFactory().fromXml(element,
                                                          msg).format(args)
            return True

        return rulesetFormatter
Example #6
0
 def rulesetFormatter(msg):
     args = Message.FormatterArgs(msg, self.result)
     self.result = Formatters.getFactory().fromXml(element,
                                                   msg).format(args)
     return True
Example #7
0
 def rulesetFormatter(msg):
     args = Message.FormatterArgs(msg, self.result)
     self.result = Formatters.getFactory().fromXml(element, msg).format(args)
     return True
Example #8
0
def main():
    """ Main function. """

    # default config
    cherrypy.config.update({
        'uid': 0,
        'gid': 0,
        'server_name': 'localhost',
        'genshi.template_dir': os.path.join(install_dir, 'templates'),
        'daemonize': False,
        'pidfile': None,
        'host': 'localhost',
        'file_host': 'localhost',
        })

    cherrypy.config.update(CHERRYPY_CONFIG)

    extra_config = ''
    for config_filename in LOCAL_CONFIG:
        try:
            cherrypy.config.update(config_filename)
            extra_config = config_filename
            break
        except IOError:
            pass

    # Rotating Logs
    # CherryPy will already open log files if present in config
    error_file = access_file = ''
    # read the logger file locations from config file.
    if not cherrypy.log.error_file:
        error_file = cherrypy.config.get('logger.error_file', '')
    if not cherrypy.log.access_file:
        access_file = cherrypy.config.get('logger.access_file', '')

    # disable log file handlers
    cherrypy.log.error_file = ""
    cherrypy.log.access_file = ""

    # set up python logging
    max_bytes = getattr(cherrypy.log, "rot_max_bytes", 100 * 1024 * 1024)
    backup_count = getattr(cherrypy.log, "rot_backup_count", 2)

    if error_file:
        h = logging.handlers.RotatingFileHandler(error_file, 'a', max_bytes, backup_count, 'utf-8')
        h.setLevel(logging.INFO)
        h.setFormatter(cherrypy._cplogging.logfmt)
        cherrypy.log.error_log.addHandler(h)

    if access_file:
        h = logging.handlers.RotatingFileHandler(access_file, 'a', max_bytes, backup_count, 'utf-8')
        h.setLevel(logging.INFO)
        h.setFormatter(cherrypy._cplogging.logfmt)
        cherrypy.log.access_log.addHandler(h)



    if not cherrypy.config['daemonize']:
        ch = logging.StreamHandler()
        ch.setLevel(logging.DEBUG)
        ch.setFormatter(cherrypy._cplogging.logfmt)
        cherrypy.log.error_log.addHandler(ch)

    # continue app init
    #

    cherrypy.log('*' * 80, context='ENGINE', severity=logging.INFO)
    cherrypy.log("Using config file '%s'." % CHERRYPY_CONFIG,
                  context='ENGINE', severity=logging.INFO)
    if extra_config:
        cherrypy.log('extra_config: %s' % extra_config, context='ENGINE', severity=logging.INFO)

    # after cherrypy.config is parsed
    Formatters.init()
    cherrypy.log("Continuing App Init", context='ENGINE', severity=logging.INFO)

    cherrypy.log("Continuing App Init", context='ENGINE', severity=logging.INFO)
    cherrypy.tools.I18nTool = i18n_tool.I18nTool()

    cherrypy.log("Continuing App Init", context='ENGINE', severity=logging.INFO)

    # Used to bust the cache on js and css files.  This should be the
    # files' mtime, but the files are not stored on the app server.
    # This is a `good enough´ replacement though.
    t = str(int(time.time()))
    cherrypy.config['css_mtime'] = t
    cherrypy.config['js_mtime']  = t

    cherrypy.config['all_hosts'] = (
        cherrypy.config['host'], cherrypy.config['file_host'])
    
    cherrypy.config.update({'error_page.404': error_page_404})

    if hasattr(cherrypy.engine, 'signal_handler'):
        cherrypy.engine.signal_handler.subscribe()

    GutenbergDatabase.options.update(cherrypy.config)
    cherrypy.engine.pool = plugins.ConnectionPool(
        cherrypy.engine, params=GutenbergDatabase.get_connection_params(cherrypy.config))
    cherrypy.engine.pool.subscribe()

    plugins.Timer(cherrypy.engine).subscribe()

    cherrypy.log("Daemonizing", context='ENGINE', severity=logging.INFO)

    if cherrypy.config['daemonize']:
        plugins.Daemonizer(cherrypy.engine).subscribe()

    uid = cherrypy.config['uid']
    gid = cherrypy.config['gid']
    if uid > 0 or gid > 0:
        plugins.DropPrivileges(cherrypy.engine, uid=uid, gid=gid, umask=0o22).subscribe()

    if cherrypy.config['pidfile']:
        pid = plugins.PIDFile(cherrypy.engine, cherrypy.config['pidfile'])
        # Write pidfile after privileges are dropped(prio == 77)
        # or we will not be able to remove it.
        cherrypy.engine.subscribe('start', pid.start, 78)
        cherrypy.engine.subscribe('exit', pid.exit, 78)


    cherrypy.log("Setting up routes", context='ENGINE', severity=logging.INFO)

    # setup 'routes' dispatcher
    #
    # d = cherrypy.dispatch.RoutesDispatcher(full_result=True)
    d = MyRoutesDispatcher(full_result=True)
    cherrypy.routes_mapper = d.mapper

    def check_id(environ, result):
        """ Check if id is a valid number. """
        try:
            return str(int(result['id'])) == result['id']
        except:
            return False

    d.connect('start', r'/ebooks{.format}/',
               controller=StartPage.Start())

    d.connect('suggest', r'/ebooks/suggest{.format}/',
               controller=SuggestionsPage.Suggestions())

    # search pages

    d.connect('search', r'/ebooks/search{.format}/',
               controller=BookSearchPage())

    d.connect('author_search', r'/ebooks/authors/search{.format}/',
               controller=AuthorSearchPage())

    d.connect('subject_search', r'/ebooks/subjects/search{.format}/',
               controller=SubjectSearchPage())

    d.connect('bookshelf_search', r'/ebooks/bookshelves/search{.format}/',
               controller=BookshelfSearchPage())

    # 'id' pages

    d.connect('author', r'/ebooks/author/{id:\d+}{.format}',
               controller=AuthorPage(), conditions=dict(function=check_id))

    d.connect('subject', r'/ebooks/subject/{id:\d+}{.format}',
               controller=SubjectPage(), conditions=dict(function=check_id))

    d.connect('bookshelf', r'/ebooks/bookshelf/{id:\d+}{.format}',
               controller=BookshelfPage(), conditions=dict(function=check_id))

    d.connect('also', r'/ebooks/{id:\d+}/also/{.format}',
               controller=AlsoDownloadedPage(), conditions=dict(function=check_id))

    # bibrec pages

    d.connect('download', r'/ebooks/{id:\d+}/download{.format}',
               controller=Page.NullPage(), _static=True)

    d.connect('bibrec', r'/ebooks/{id:\d+}{.format}',
               controller=BibrecPage(), conditions=dict(function=check_id))


    # legacy compatibility with /ebooks/123.bibrec
    d.connect('bibrec2', r'/ebooks/{id:\d+}.bibrec{.format}',
               controller=BibrecPage(), conditions=dict(function=check_id))

    d.connect('cover', r'/covers/{size:small|medium}/{order:latest|popular}/{count}',
               controller=CoverPages.CoverPages())

    d.connect('qrcode', r'/qrcode/',
               controller=QRCodePage.QRCodePage())

    d.connect('iplimit', r'/iplimit/',
               controller=Page.NullPage())

    d.connect('diagnostics', r'/diagnostics/',
               controller=diagnostics.DiagnosticsPage())

    d.connect('stats', r'/stats/',
               controller=Page.NullPage(), _static=True)

    d.connect('honeypot_send', r'/ebooks/send/megaupload/{id:\d+}.{filetype}',
               controller=Page.NullPage(), _static=True)

    # /w/captcha/question/ so varnish will cache it
    d.connect('captcha.question', r'/w/captcha/question/',
               controller=Page.GoHomePage())

    d.connect('captcha.answer', r'/w/captcha/answer/',
               controller=Page.GoHomePage())

    # sitemap protocol access control requires us to place sitemaps in /ebooks/
    d.connect('sitemap', r'/ebooks/sitemaps/',
               controller=Sitemap.SitemapIndex())

    d.connect('sitemap_index', r'/ebooks/sitemaps/{page:\d+}',
               controller=Sitemap.Sitemap())

    if 'dropbox_client_id' in cherrypy.config:
        import Dropbox
        dropbox = Dropbox.Dropbox()
        cherrypy.log("Dropbox Client Id: %s" % cherrypy.config['dropbox_client_id'],
                      context='ENGINE', severity=logging.INFO)
        d.connect('dropbox_send', r'/ebooks/send/dropbox/{id:\d+}.{filetype}',
                   controller=dropbox, conditions=dict(function=check_id))
        d.connect('dropbox_callback', r'/ebooks/send/dropbox/',
                   controller=dropbox)

    if 'gdrive_client_id' in cherrypy.config:
        import GDrive
        gdrive = GDrive.GDrive()
        cherrypy.log("GDrive Client Id: %s" % cherrypy.config['gdrive_client_id'],
                      context='ENGINE', severity=logging.INFO)
        d.connect('gdrive_send', r'/ebooks/send/gdrive/{id:\d+}.{filetype}',
                   controller=gdrive, conditions=dict(function=check_id))
        d.connect('gdrive_callback', r'/ebooks/send/gdrive/',
                   controller=gdrive)

    if 'msdrive_client_id' in cherrypy.config:
        import MSDrive
        msdrive = MSDrive.MSDrive()
        cherrypy.log("MSDrive Client Id: %s" % cherrypy.config['msdrive_client_id'],
                      context='ENGINE', severity=logging.INFO)
        d.connect('msdrive_send', r'/ebooks/send/msdrive/{id:\d+}.{filetype}',
                   controller=msdrive, conditions=dict(function=check_id))
        d.connect('msdrive_callback', r'/ebooks/send/msdrive/',
                   controller=msdrive)

    # start http server
    #

    cherrypy.log("Mounting root", context='ENGINE', severity=logging.INFO)

    app = cherrypy.tree.mount(root=None, config=CHERRYPY_CONFIG)

    app.merge({'/': {'request.dispatch': d}})
    return app