From 0f080b6610ed20f5c0ac00f7e595f541e433b681 Mon Sep 17 00:00:00 2001 From: Urban Wallasch Date: Wed, 16 Jun 2021 11:53:57 +0200 Subject: [PATCH] * Optimized result formatting for lower memory usage and higher speed; however, the real pain is the unavoidable massive join(). * Introduced a hard upper limit of 10000 for search results to avoid nasty surprises. --- ROADMAP.txt | 3 ++- jiten-pai.py | 23 +++++++++++++---------- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/ROADMAP.txt b/ROADMAP.txt index 28e3481..a8a705d 100644 --- a/ROADMAP.txt +++ b/ROADMAP.txt @@ -14,8 +14,9 @@ Phase II [x] preferences, config file [x] history [x] Romaji input -[ ] icons, "About" dialog +[ ] app icon, "About" dialog [ ] README +[ ] verb de-inflection? Phase III diff --git a/jiten-pai.py b/jiten-pai.py index 34a8996..6b9c8f2 100755 --- a/jiten-pai.py +++ b/jiten-pai.py @@ -69,6 +69,7 @@ cfg = { 'dict_idx': 0, 'dict_all': False, 'limit': 100, + 'hardlimit': 10000, 'do_limit': True, 'auto_adj': True, 'jap_opt': [True, False, False, False], @@ -892,7 +893,7 @@ class jpMainWindow(QMainWindow): self.genopt_dolimit.setChecked(cfg['do_limit']) self.genopt_limit = QSpinBox() self.genopt_limit.setMinimum(1) - self.genopt_limit.setMaximum(1000) + self.genopt_limit.setMaximum(cfg['hardlimit']) self.genopt_limit.setValue(cfg['limit']) self.genopt_limit.setMinimumWidth(130) self.genopt_limit.setEnabled(cfg['do_limit']) @@ -1090,7 +1091,7 @@ class jpMainWindow(QMainWindow): self.search_box.insertItem(0, term) self.search_box.setCurrentIndex(0) # result limiting - limit = self.genopt_limit.value() if self.genopt_limit.isEnabled() else 0 + limit = self.genopt_limit.value() if self.genopt_limit.isEnabled() else cfg['hardlimit'] # search self.result_group.setTitle('Search results: ...') QApplication.processEvents() @@ -1119,18 +1120,23 @@ class jpMainWindow(QMainWindow): if not self._search_relax(mode): break; # report results - self.result_group.setTitle('Search results: %d' % len(result)) + rlen = len(result) + self.result_group.setTitle('Search results: %d' % rlen) QApplication.processEvents() # format result + if rlen > cfg['hardlimit'] / 2: + self.result_pane.setPlainText('Formatting...') + QApplication.processEvents() re_term = re.compile(term, re.IGNORECASE) nfmt = '
' % (cfg['nfont'], cfg['nfont_sz']) lfmt = '' % (cfg['lfont'], cfg['lfont_sz']) hlfmt = '' % cfg['hl_col'] - html = [nfmt] + html = [''] * (rlen + 2) + html[0] = nfmt def hl_repl(match, org=None): grp = match.group(0) if org is None else org[match.span()[0]:match.span()[1]] return '%s%s' % (hlfmt, grp) - for res in result: + for idx, res in enumerate(result): # highlight matches if mode == ScanMode.JAP: res[0] = re_term.sub(lambda m: hl_repl(m, res[0]), kata2hira(res[0])) @@ -1138,11 +1144,8 @@ class jpMainWindow(QMainWindow): else: res[2] = re_term.sub(hl_repl, res[2]) # construct display line - html.append('%s%s' % (lfmt, res[0])) - if len(res[1]) > 0: - html.append(' (%s)' % res[1]) - html.append(' %s
\n' % res[2]) - html.append('
') + html[idx+1] = '%s%s%s %s
\n' % (lfmt, res[0], (' (%s)'%res[1] if len(res[1]) > 0 else ''), res[2]) + html[rlen + 1] = '' self.result_pane.setHtml(''.join(html)) self.result_pane.setEnabled(True) -- 2.30.2