diff --git a/src/calibre/gui2/catalog/catalog_epub_mobi.py b/src/calibre/gui2/catalog/catalog_epub_mobi.py
index 7f76406718..54e8bf5db9 100644
--- a/src/calibre/gui2/catalog/catalog_epub_mobi.py
+++ b/src/calibre/gui2/catalog/catalog_epub_mobi.py
@@ -112,131 +112,6 @@ class PluginWidget(QWidget,Ui_Form):
'datatype':field_md['datatype']}
self.eligible_custom_fields = custom_fields
- def generatePrefixList(self):
- def prefix_sorter(item):
- key = item
- if item[0] == "_":
- key = 'zzz' + item
- return key
-
-
- # Create a list of prefixes for user selection
- raw_prefix_list = [
- ('Ampersand',u'&'),
- ('Angle left double',u'\u00ab'),
- ('Angle left',u'\u2039'),
- ('Angle right double',u'\u00bb'),
- ('Angle right',u'\u203a'),
- ('Arrow double',u'\u2194'),
- ('Arrow down',u'\u2193'),
- ('Arrow left',u'\u2190'),
- ('Arrow right',u'\u2192'),
- ('Arrow up',u'\u2191'),
- ('Asterisk',u'*'),
- ('At sign',u'@'),
- ('Bullet smallest',u'\u22c5'),
- ('Bullet small',u'\u00b7'),
- ('Bullet',u'\u2022'),
- ('Caret',u'^'),
- ('Checkmark',u'\u2713'),
- ('Copyright',u'\u00a9'),
- ('Currency dollar',u'$'),
- ('Currency euro',u'\u20ac'),
- ('Dagger double',u'\u2021'),
- ('Dagger',u'\u2020'),
- ('Degree',u'\u00b0'),
- ('Dots3',u'\u2234'),
- ('Hash',u'#'),
- ('Infinity',u'\u221e'),
- ('Lozenge',u'\u25ca'),
- ('Math divide',u'\u00f7'),
- ('Math empty',u'\u2205'),
- ('Math equals',u'='),
- ('Math minus',u'\u2212'),
- ('Math plus circled',u'\u2295'),
- ('Math times circled',u'\u2297'),
- ('Math times',u'\u00d7'),
- ('O slash',u'\u00d8'),
- ('Paragraph',u'\u00b6'),
- ('Percent',u'%'),
- ('Plus-or-minus',u'\u00b1'),
- ('Plus',u'+'),
- ('Punctuation colon',u':'),
- ('Punctuation colon-semi',u';'),
- ('Punctuation exclamation',u'!'),
- ('Punctuation question',u'?'),
- ('Registered trademark',u'\u00ae'),
- ('Section',u'\u00a7'),
- ('Tilde',u'~'),
- ('Vertical bar',u'|'),
- ('Vertical bar broken',u'\u00a6'),
- ('_0',u'0'),
- ('_1',u'1'),
- ('_2',u'2'),
- ('_3',u'3'),
- ('_4',u'4'),
- ('_5',u'5'),
- ('_6',u'6'),
- ('_7',u'7'),
- ('_8',u'8'),
- ('_9',u'9'),
- ('_A',u'A'),
- ('_B',u'B'),
- ('_C',u'C'),
- ('_D',u'D'),
- ('_E',u'E'),
- ('_F',u'F'),
- ('_G',u'G'),
- ('_H',u'H'),
- ('_I',u'I'),
- ('_J',u'J'),
- ('_K',u'K'),
- ('_L',u'L'),
- ('_M',u'M'),
- ('_N',u'N'),
- ('_O',u'O'),
- ('_P',u'P'),
- ('_Q',u'Q'),
- ('_R',u'R'),
- ('_S',u'S'),
- ('_T',u'T'),
- ('_U',u'U'),
- ('_V',u'V'),
- ('_W',u'W'),
- ('_X',u'X'),
- ('_Y',u'Y'),
- ('_Z',u'Z'),
- ('_a',u'a'),
- ('_b',u'b'),
- ('_c',u'c'),
- ('_d',u'd'),
- ('_e',u'e'),
- ('_f',u'f'),
- ('_g',u'g'),
- ('_h',u'h'),
- ('_i',u'i'),
- ('_j',u'j'),
- ('_k',u'k'),
- ('_l',u'l'),
- ('_m',u'm'),
- ('_n',u'n'),
- ('_o',u'o'),
- ('_p',u'p'),
- ('_q',u'q'),
- ('_r',u'r'),
- ('_s',u's'),
- ('_t',u't'),
- ('_u',u'u'),
- ('_v',u'v'),
- ('_w',u'w'),
- ('_x',u'x'),
- ('_y',u'y'),
- ('_z',u'z'),
- ]
- #raw_prefix_list = sorted(raw_prefix_list, key=lambda k: sort_key(k[0]))
- raw_prefix_list = sorted(raw_prefix_list, key=prefix_sorter)
- self.prefixes = [x[1] for x in raw_prefix_list]
-
def initialize(self, name, db):
'''
@@ -259,7 +134,6 @@ class PluginWidget(QWidget,Ui_Form):
self.name = name
self.db = db
self.fetchEligibleCustomFields()
- self.generatePrefixList()
self.populate_combo_boxes()
@@ -315,41 +189,8 @@ class PluginWidget(QWidget,Ui_Form):
# Hook changes to Description section
self.generate_descriptions.stateChanged.connect(self.generate_descriptions_changed)
- # Neaten up the prefix rules
- self.prefix_rules_initialize()
- self.populate_prefix_rules(prefix_rules)
- self.prefix_rules_tw.resizeColumnsToContents()
- self.prefix_rules_resize_name(1.5)
- self.prefix_rules_tw.horizontalHeader().setStretchLastSection(True)
-
- def prefix_rules_initialize(self):
- # Assign icons to buttons, hook clicks
- self.move_rule_up_tb.setToolTip('Move rule up')
- self.move_rule_up_tb.setIcon(QIcon(I('arrow-up.png')))
- self.move_rule_up_tb.clicked.connect(self.prefix_rules_move_row_up)
-
- self.add_rule_tb.setToolTip('Add a new rule')
- self.add_rule_tb.setIcon(QIcon(I('plus.png')))
- self.add_rule_tb.clicked.connect(self.prefix_rules_add_row)
-
- self.delete_rule_tb.setToolTip('Delete selected rule')
- self.delete_rule_tb.setIcon(QIcon(I('list_remove.png')))
- self.delete_rule_tb.clicked.connect(self.prefix_rules_delete_row)
-
- self.move_rule_down_tb.setToolTip('Move rule down')
- self.move_rule_down_tb.setIcon(QIcon(I('arrow-down.png')))
- self.move_rule_down_tb.clicked.connect(self.prefix_rules_move_row_down)
-
- # Configure the QTableWidget
- # enabled/rule name/source field/pattern/prefix
- self.prefix_rules_tw.clear()
- header_labels = ['','Name','Prefix','Source','Pattern']
- self.prefix_rules_tw.setColumnCount(len(header_labels))
- self.prefix_rules_tw.setHorizontalHeaderLabels(header_labels)
- self.prefix_rules_tw.setSortingEnabled(False)
- self.prefix_rules_tw.setSelectionBehavior(QAbstractItemView.SelectRows)
-
- self.prefix_rules_tw.cellDoubleClicked.connect(self.prefix_rules_cell_double_clicked)
+ # Initialize prefix rules
+ self.prefix_rules_initialize(prefix_rules)
def options(self):
# Save/return the current options
@@ -505,75 +346,18 @@ class PluginWidget(QWidget,Ui_Form):
self.merge_after.setEnabled(False)
self.include_hr.setEnabled(False)
- def populate_prefix_rules(self,rules):
- # Format of rules list is different if default values vs retrieved JSON
- # Hack to normalize list style
- if type(rules[0]) is list:
- rules = rules[0]
- self.prefix_rules_tw.setFocus()
- for row, rule in enumerate(rules):
- self.prefix_rules_tw.insertRow(row)
- self.prefix_rules_select_and_scroll_to_row(row)
- self.populate_prefix_rules_table_row(row, rule)
- self.prefix_rules_tw.selectRow(0)
-
- def populate_prefix_rules_table_row(self, row, data):
-
- def set_prefix_field_in_row(row, col, field=''):
- prefix_combo = PrefixRulesComboBox(self, self.prefixes, field)
- self.prefix_rules_tw.setCellWidget(row, col, prefix_combo)
-
- def set_rule_name_in_row(row, col, name=''):
- rule_name = QLineEdit(name)
- rule_name.home(False)
- rule_name.editingFinished.connect(self.prefix_rules_rule_name_edited)
- self.prefix_rules_tw.setCellWidget(row, col, rule_name)
-
- def set_source_field_in_row(row, col, field=''):
- source_combo = PrefixRulesComboBox(self, sorted(self.eligible_custom_fields.keys(), key=sort_key), field)
- source_combo.currentIndexChanged.connect(partial(self.prefix_rules_source_index_changed, source_combo, row))
- #source_combo.currentIndexChanged.connect(self.prefix_rules_source_index_changed, source_combo, row)
- self.prefix_rules_tw.setCellWidget(row, col, source_combo)
- return source_combo
-
-
- # Entry point
- self.prefix_rules_tw.blockSignals(True)
- #print("populate_prefix_rules_table_row processing rule:\n%s\n" % data)
-
- # Column 0: Enabled
- self.prefix_rules_tw.setItem(row, 0, CheckableTableWidgetItem(data['enabled']))
-
- # Column 1: Rule name
- #rule_name = QTableWidgetItem(data['name'])
- #self.prefix_rules_tw.setItem(row, 1, rule_name)
- set_rule_name_in_row(row, 1, name=data['name'])
-
- # Column 2: Prefix
- set_prefix_field_in_row(row, 2, field=data['prefix'])
-
- # Column 3: Source field
- source_combo = set_source_field_in_row(row, 3, field=data['field'])
-
- # Column 4: Pattern
- # The contents of the Pattern field is driven by the Source field
- self.prefix_rules_source_index_changed(source_combo, row, 4, pattern=data['pattern'])
-
- self.prefix_rules_tw.blockSignals(False)
def prefix_rules_add_row(self):
# Called when '+' clicked
self.prefix_rules_tw.setFocus()
row = self.prefix_rules_tw.currentRow() + 1
self.prefix_rules_tw.insertRow(row)
- self.populate_prefix_rules_table_row(row, self.prefix_rules_create_blank_row_data())
+ self.prefix_rules_populate_table_row(row, self.prefix_rules_create_blank_row_data())
self.prefix_rules_select_and_scroll_to_row(row)
self.prefix_rules_tw.resizeColumnsToContents()
+ # Just in case table was empty
self.prefix_rules_tw.horizontalHeader().setStretchLastSection(True)
- def prefix_rules_cell_double_clicked(self, row, col):
- print("prefix_rules_cell_double_clicked: row:%d col:%d" % (row, col))
-
def prefix_rules_convert_row_to_data(self, row):
data = self.prefix_rules_create_blank_row_data()
data['ordinal'] = row
@@ -612,6 +396,142 @@ class PluginWidget(QWidget,Ui_Form):
elif self.prefix_rules_tw.rowCount() > 0:
self.prefix_rules_select_and_scroll_to_row(first_sel_row - 1)
+ def prefix_rules_generate_prefix_list(self):
+ def prefix_sorter(item):
+ key = item
+ if item[0] == "_":
+ key = 'zzz' + item
+ return key
+
+
+ # Create a list of prefixes for user selection
+ raw_prefix_list = [
+ ('Ampersand',u'&'),
+ ('Angle left double',u'\u00ab'),
+ ('Angle left',u'\u2039'),
+ ('Angle right double',u'\u00bb'),
+ ('Angle right',u'\u203a'),
+ ('Arrow carriage return',u'\u21b5'),
+ ('Arrow double',u'\u2194'),
+ ('Arrow down',u'\u2193'),
+ ('Arrow left',u'\u2190'),
+ ('Arrow right',u'\u2192'),
+ ('Arrow up',u'\u2191'),
+ ('Asterisk',u'*'),
+ ('At sign',u'@'),
+ ('Bullet smallest',u'\u22c5'),
+ ('Bullet small',u'\u00b7'),
+ ('Bullet',u'\u2022'),
+ ('Cards clubs',u'\u2663'),
+ ('Cards diamonds',u'\u2666'),
+ ('Cards hearts',u'\u2665'),
+ ('Cards spades',u'\u2660'),
+ ('Caret',u'^'),
+ ('Checkmark',u'\u2713'),
+ ('Copyright circle c',u'\u00a9'),
+ ('Copyright circle r',u'\u00ae'),
+ ('Copyright trademark',u'\u2122'),
+ ('Currency cent',u'\u00a2'),
+ ('Currency dollar',u'$'),
+ ('Currency euro',u'\u20ac'),
+ ('Currency pound',u'\u00a3'),
+ ('Currency yen',u'\u00a5'),
+ ('Dagger double',u'\u2021'),
+ ('Dagger',u'\u2020'),
+ ('Degree',u'\u00b0'),
+ ('Dots3',u'\u2234'),
+ ('Hash',u'#'),
+ ('Infinity',u'\u221e'),
+ ('Lozenge',u'\u25ca'),
+ ('Math divide',u'\u00f7'),
+ ('Math empty',u'\u2205'),
+ ('Math equals',u'='),
+ ('Math minus',u'\u2212'),
+ ('Math plus circled',u'\u2295'),
+ ('Math times circled',u'\u2297'),
+ ('Math times',u'\u00d7'),
+ ('O slash',u'\u00d8'),
+ ('Paragraph',u'\u00b6'),
+ ('Percent',u'%'),
+ ('Plus-or-minus',u'\u00b1'),
+ ('Plus',u'+'),
+ ('Punctuation colon',u':'),
+ ('Punctuation colon-semi',u';'),
+ ('Punctuation exclamation',u'!'),
+ ('Punctuation question',u'?'),
+ ('Punctuation period',u'.'),
+ ('Punctuation slash back',u'\\'),
+ ('Punctuation slash forward',u'/'),
+ ('Section',u'\u00a7'),
+ ('Tilde',u'~'),
+ ('Vertical bar',u'|'),
+ ('Vertical bar broken',u'\u00a6'),
+ ('_0',u'0'),
+ ('_1',u'1'),
+ ('_2',u'2'),
+ ('_3',u'3'),
+ ('_4',u'4'),
+ ('_5',u'5'),
+ ('_6',u'6'),
+ ('_7',u'7'),
+ ('_8',u'8'),
+ ('_9',u'9'),
+ ('_A',u'A'),
+ ('_B',u'B'),
+ ('_C',u'C'),
+ ('_D',u'D'),
+ ('_E',u'E'),
+ ('_F',u'F'),
+ ('_G',u'G'),
+ ('_H',u'H'),
+ ('_I',u'I'),
+ ('_J',u'J'),
+ ('_K',u'K'),
+ ('_L',u'L'),
+ ('_M',u'M'),
+ ('_N',u'N'),
+ ('_O',u'O'),
+ ('_P',u'P'),
+ ('_Q',u'Q'),
+ ('_R',u'R'),
+ ('_S',u'S'),
+ ('_T',u'T'),
+ ('_U',u'U'),
+ ('_V',u'V'),
+ ('_W',u'W'),
+ ('_X',u'X'),
+ ('_Y',u'Y'),
+ ('_Z',u'Z'),
+ ('_a',u'a'),
+ ('_b',u'b'),
+ ('_c',u'c'),
+ ('_d',u'd'),
+ ('_e',u'e'),
+ ('_f',u'f'),
+ ('_g',u'g'),
+ ('_h',u'h'),
+ ('_i',u'i'),
+ ('_j',u'j'),
+ ('_k',u'k'),
+ ('_l',u'l'),
+ ('_m',u'm'),
+ ('_n',u'n'),
+ ('_o',u'o'),
+ ('_p',u'p'),
+ ('_q',u'q'),
+ ('_r',u'r'),
+ ('_s',u's'),
+ ('_t',u't'),
+ ('_u',u'u'),
+ ('_v',u'v'),
+ ('_w',u'w'),
+ ('_x',u'x'),
+ ('_y',u'y'),
+ ('_z',u'z'),
+ ]
+ raw_prefix_list = sorted(raw_prefix_list, key=prefix_sorter)
+ self.prefixes = [x[1] for x in raw_prefix_list]
+
def prefix_rules_get_data(self):
data_items = []
for row in range(self.prefix_rules_tw.rowCount()):
@@ -625,6 +545,42 @@ class PluginWidget(QWidget,Ui_Form):
'prefix':data['prefix']})
return data_items
+ def prefix_rules_initialize(self, prefix_rules):
+ # Assign icons to buttons, hook clicks
+ self.move_rule_up_tb.setToolTip('Move rule up')
+ self.move_rule_up_tb.setIcon(QIcon(I('arrow-up.png')))
+ self.move_rule_up_tb.clicked.connect(self.prefix_rules_move_row_up)
+
+ self.add_rule_tb.setToolTip('Add a new rule')
+ self.add_rule_tb.setIcon(QIcon(I('plus.png')))
+ self.add_rule_tb.clicked.connect(self.prefix_rules_add_row)
+
+ self.delete_rule_tb.setToolTip('Delete selected rule')
+ self.delete_rule_tb.setIcon(QIcon(I('list_remove.png')))
+ self.delete_rule_tb.clicked.connect(self.prefix_rules_delete_row)
+
+ self.move_rule_down_tb.setToolTip('Move rule down')
+ self.move_rule_down_tb.setIcon(QIcon(I('arrow-down.png')))
+ self.move_rule_down_tb.clicked.connect(self.prefix_rules_move_row_down)
+
+ # Configure the QTableWidget
+ # enabled/prefix/rule name/source field/pattern
+ self.prefix_rules_tw.clear()
+ header_labels = ['','Name','Prefix','Source','Pattern']
+ self.prefix_rules_tw.setColumnCount(len(header_labels))
+ self.prefix_rules_tw.setHorizontalHeaderLabels(header_labels)
+ self.prefix_rules_tw.setSortingEnabled(False)
+ self.prefix_rules_tw.setSelectionBehavior(QAbstractItemView.SelectRows)
+
+ # Generate the prefix list
+ self.prefix_rules_generate_prefix_list()
+
+ # Populate the table
+ self.prefix_rules_populate(prefix_rules)
+ self.prefix_rules_tw.resizeColumnsToContents()
+ self.prefix_rules_resize_name(1.5)
+ self.prefix_rules_tw.horizontalHeader().setStretchLastSection(True)
+
def prefix_rules_move_row_down(self):
self.prefix_rules_tw.setFocus()
rows = self.prefix_rules_tw.selectionModel().selectedRows()
@@ -649,7 +605,7 @@ class PluginWidget(QWidget,Ui_Form):
self.prefix_rules_tw.insertRow(src_row)
# Populate it with the saved data
- self.populate_prefix_rules_table_row(src_row, saved_data)
+ self.prefix_rules_populate_table_row(src_row, saved_data)
self.blockSignals(False)
scroll_to_row = last_sel_row + 1
if scroll_to_row < self.prefix_rules_tw.rowCount() - 1:
@@ -671,7 +627,7 @@ class PluginWidget(QWidget,Ui_Form):
# Add a row below us with the source data
self.prefix_rules_tw.insertRow(selrow.row() + 1)
- self.populate_prefix_rules_table_row(selrow.row() + 1, saved_data)
+ self.prefix_rules_populate_table_row(selrow.row() + 1, saved_data)
# Delete the row above
self.prefix_rules_tw.removeRow(selrow.row() - 1)
@@ -682,6 +638,63 @@ class PluginWidget(QWidget,Ui_Form):
scroll_to_row = scroll_to_row - 1
self.prefix_rules_tw.scrollToItem(self.prefix_rules_tw.item(scroll_to_row, 0))
+ def prefix_rules_populate(self,rules):
+ # Format of rules list is different if default values vs retrieved JSON
+ # Hack to normalize list style
+ if type(rules[0]) is list:
+ rules = rules[0]
+ self.prefix_rules_tw.setFocus()
+ rules = sorted(rules, key=lambda k: k['ordinal'])
+ for row, rule in enumerate(rules):
+ self.prefix_rules_tw.insertRow(row)
+ self.prefix_rules_select_and_scroll_to_row(row)
+ self.prefix_rules_populate_table_row(row, rule)
+ self.prefix_rules_tw.selectRow(0)
+
+ def prefix_rules_populate_table_row(self, row, data):
+
+ def set_prefix_field_in_row(row, col, field=''):
+ prefix_combo = PrefixRulesComboBox(self, self.prefixes, field)
+ self.prefix_rules_tw.setCellWidget(row, col, prefix_combo)
+
+ def set_rule_name_in_row(row, col, name=''):
+ rule_name = QLineEdit(name)
+ rule_name.home(False)
+ rule_name.editingFinished.connect(self.prefix_rules_rule_name_edited)
+ self.prefix_rules_tw.setCellWidget(row, col, rule_name)
+
+ def set_source_field_in_row(row, col, field=''):
+ source_combo = PrefixRulesComboBox(self, sorted(self.eligible_custom_fields.keys(), key=sort_key), field)
+ source_combo.currentIndexChanged.connect(partial(self.prefix_rules_source_index_changed, source_combo, row))
+ #source_combo.currentIndexChanged.connect(self.prefix_rules_source_index_changed, source_combo, row)
+ self.prefix_rules_tw.setCellWidget(row, col, source_combo)
+ return source_combo
+
+
+ # Entry point
+ self.prefix_rules_tw.blockSignals(True)
+ #print("prefix_rules_populate_table_row processing rule:\n%s\n" % data)
+
+ # Column 0: Enabled
+ self.prefix_rules_tw.setItem(row, 0, CheckableTableWidgetItem(data['enabled']))
+
+ # Column 1: Rule name
+ #rule_name = QTableWidgetItem(data['name'])
+ #self.prefix_rules_tw.setItem(row, 1, rule_name)
+ set_rule_name_in_row(row, 1, name=data['name'])
+
+ # Column 2: Prefix
+ set_prefix_field_in_row(row, 2, field=data['prefix'])
+
+ # Column 3: Source field
+ source_combo = set_source_field_in_row(row, 3, field=data['field'])
+
+ # Column 4: Pattern
+ # The contents of the Pattern field is driven by the Source field
+ self.prefix_rules_source_index_changed(source_combo, row, 4, pattern=data['pattern'])
+
+ self.prefix_rules_tw.blockSignals(False)
+
def prefix_rules_resize_name(self, scale):
current_width = self.prefix_rules_tw.columnWidth(1)
self.prefix_rules_tw.setColumnWidth(1, min(225,int(current_width * scale)))
@@ -719,6 +732,7 @@ class PluginWidget(QWidget,Ui_Form):
values_combo = PrefixRulesComboBox(self, values, pattern)
self.prefix_rules_tw.setCellWidget(row, 4, values_combo)
+
def read_source_field_changed(self,new_index):
'''
Process changes in the read_source_field combo box
@@ -873,5 +887,3 @@ class PrefixRulesComboBox(NoWheelComboBox):
self.setCurrentIndex(idx)
else:
self.setCurrentIndex(0)
-
-
diff --git a/src/calibre/gui2/catalog/catalog_epub_mobi.ui b/src/calibre/gui2/catalog/catalog_epub_mobi.ui
index 31c5063a12..eb39415a81 100644
--- a/src/calibre/gui2/catalog/catalog_epub_mobi.ui
+++ b/src/calibre/gui2/catalog/catalog_epub_mobi.ui
@@ -107,10 +107,11 @@
- <p>Default pattern
-\[.+\]
-excludes tags of the form [tag],
-e.g., [Project Gutenberg]</p>
+ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'Lucida Grande'; font-size:13pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Default pattern \[.+\]|\+ excludes tags of the form [tag], e.g., [Project Gutenberg], and '+', the default tag for a read book.</p></body></html>
Excluded genres
@@ -333,6 +334,9 @@ Default: ~,Catalog
0
+
+ The first matching rule will be used to add a prefix to book listings in the generated catalog.
+
Prefix rules
diff --git a/src/calibre/library/catalogs/epub_mobi_builder.py b/src/calibre/library/catalogs/epub_mobi_builder.py
index edb9567d93..6cc94c0e08 100644
--- a/src/calibre/library/catalogs/epub_mobi_builder.py
+++ b/src/calibre/library/catalogs/epub_mobi_builder.py
@@ -3117,32 +3117,24 @@ Author '{0}':
def discoverPrefix(self, record):
'''
- Given a field:pattern spec, discover if this book marked as read
-
- if field == tag, scan tags for pattern
- if custom field, try regex match for pattern
- This allows maximum flexibility with fields of type
- datatype bool: #field_name:True
- datatype text: #field_name:
- datatype datetime: #field_name:.*
-
+ Evaluate conditions for including prefixes in various listings
'''
- if self.opts.verbose:
- self.opts.log.info("\tevaluating %s (%s)" % (record['title'], record['authors']))
+ def log_prefix_rule_match_info(rule, record):
+ self.opts.log.info(" %s %s by %s (Prefix rule '%s': %s:%s)" %
+ (rule['prefix'],record['title'],
+ record['authors'][0], rule['name'],
+ rule['field'],rule['pattern']))
+
# Compare the record to each rule looking for a match
for rule in self.prefixRules:
- if self.opts.verbose:
- self.opts.log.info("\t prefix_rule '%s': %s" % (rule['name'], rule))
-
# Literal comparison for Tags field
if rule['field'].lower() == 'tags':
if rule['pattern'].lower() in map(unicode.lower,record['tags']):
if self.opts.verbose:
- self.opts.log.info("\t '%s' found in '%s' (%s)" %
- (rule['pattern'], rule['field'], rule['name']))
+ log_prefix_rule_match_info(rule, record)
return rule['prefix']
- # Regex comparison for custom field
+ # Regex match for custom field
elif rule['field'].startswith('#'):
field_contents = self.__db.get_field(record['id'],
rule['field'],
@@ -3150,30 +3142,23 @@ Author '{0}':
if field_contents == '':
field_contents = None
- if self.opts.verbose:
- self.opts.log.info("\t field_contents: %s" % repr(field_contents))
-
if field_contents is not None:
try:
if re.search(rule['pattern'], unicode(field_contents),
re.IGNORECASE) is not None:
if self.opts.verbose:
- self.opts.log.info("\t '%s' matches '%s' value (%s)" %
- (rule['pattern'], rule['field'], rule['name']))
+ log_prefix_rule_match_info(rule, record)
return rule['prefix']
except:
# Compiling of pat failed, ignore it
if self.opts.verbose:
- self.opts.log.info("pattern failed to compile: %s" % rule['pattern'])
+ self.opts.log.error("pattern failed to compile: %s" % rule['pattern'])
pass
elif field_contents is None and rule['pattern'] == 'None':
if self.opts.verbose:
- self.opts.log.info("\t '%s' found in '%s' (%s)" %
- (rule['pattern'], rule['field'], rule['name']))
+ log_prefix_rule_match_info(rule, record)
return rule['prefix']
- if False and self.opts.verbose:
- self.opts.log.info("\t No prefix match found")
return None
def filterDbTags(self, tags):