Stable version with prefix_rules* functions

This commit is contained in:
GRiker 2012-08-05 04:38:35 -06:00
parent 9d22a3d22a
commit 67c98bae56
3 changed files with 256 additions and 255 deletions

View File

@ -112,131 +112,6 @@ class PluginWidget(QWidget,Ui_Form):
'datatype':field_md['datatype']} 'datatype':field_md['datatype']}
self.eligible_custom_fields = custom_fields 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): def initialize(self, name, db):
''' '''
@ -259,7 +134,6 @@ class PluginWidget(QWidget,Ui_Form):
self.name = name self.name = name
self.db = db self.db = db
self.fetchEligibleCustomFields() self.fetchEligibleCustomFields()
self.generatePrefixList()
self.populate_combo_boxes() self.populate_combo_boxes()
@ -315,41 +189,8 @@ class PluginWidget(QWidget,Ui_Form):
# Hook changes to Description section # Hook changes to Description section
self.generate_descriptions.stateChanged.connect(self.generate_descriptions_changed) self.generate_descriptions.stateChanged.connect(self.generate_descriptions_changed)
# Neaten up the prefix rules # Initialize prefix rules
self.prefix_rules_initialize() self.prefix_rules_initialize(prefix_rules)
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)
def options(self): def options(self):
# Save/return the current options # Save/return the current options
@ -505,75 +346,18 @@ class PluginWidget(QWidget,Ui_Form):
self.merge_after.setEnabled(False) self.merge_after.setEnabled(False)
self.include_hr.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): def prefix_rules_add_row(self):
# Called when '+' clicked # Called when '+' clicked
self.prefix_rules_tw.setFocus() self.prefix_rules_tw.setFocus()
row = self.prefix_rules_tw.currentRow() + 1 row = self.prefix_rules_tw.currentRow() + 1
self.prefix_rules_tw.insertRow(row) 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_select_and_scroll_to_row(row)
self.prefix_rules_tw.resizeColumnsToContents() self.prefix_rules_tw.resizeColumnsToContents()
# Just in case table was empty
self.prefix_rules_tw.horizontalHeader().setStretchLastSection(True) 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): def prefix_rules_convert_row_to_data(self, row):
data = self.prefix_rules_create_blank_row_data() data = self.prefix_rules_create_blank_row_data()
data['ordinal'] = row data['ordinal'] = row
@ -612,6 +396,142 @@ class PluginWidget(QWidget,Ui_Form):
elif self.prefix_rules_tw.rowCount() > 0: elif self.prefix_rules_tw.rowCount() > 0:
self.prefix_rules_select_and_scroll_to_row(first_sel_row - 1) 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): def prefix_rules_get_data(self):
data_items = [] data_items = []
for row in range(self.prefix_rules_tw.rowCount()): for row in range(self.prefix_rules_tw.rowCount()):
@ -625,6 +545,42 @@ class PluginWidget(QWidget,Ui_Form):
'prefix':data['prefix']}) 'prefix':data['prefix']})
return data_items 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): def prefix_rules_move_row_down(self):
self.prefix_rules_tw.setFocus() self.prefix_rules_tw.setFocus()
rows = self.prefix_rules_tw.selectionModel().selectedRows() rows = self.prefix_rules_tw.selectionModel().selectedRows()
@ -649,7 +605,7 @@ class PluginWidget(QWidget,Ui_Form):
self.prefix_rules_tw.insertRow(src_row) self.prefix_rules_tw.insertRow(src_row)
# Populate it with the saved data # 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) self.blockSignals(False)
scroll_to_row = last_sel_row + 1 scroll_to_row = last_sel_row + 1
if scroll_to_row < self.prefix_rules_tw.rowCount() - 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 # Add a row below us with the source data
self.prefix_rules_tw.insertRow(selrow.row() + 1) 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 # Delete the row above
self.prefix_rules_tw.removeRow(selrow.row() - 1) self.prefix_rules_tw.removeRow(selrow.row() - 1)
@ -682,6 +638,63 @@ class PluginWidget(QWidget,Ui_Form):
scroll_to_row = scroll_to_row - 1 scroll_to_row = scroll_to_row - 1
self.prefix_rules_tw.scrollToItem(self.prefix_rules_tw.item(scroll_to_row, 0)) 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): def prefix_rules_resize_name(self, scale):
current_width = self.prefix_rules_tw.columnWidth(1) current_width = self.prefix_rules_tw.columnWidth(1)
self.prefix_rules_tw.setColumnWidth(1, min(225,int(current_width * scale))) 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) values_combo = PrefixRulesComboBox(self, values, pattern)
self.prefix_rules_tw.setCellWidget(row, 4, values_combo) self.prefix_rules_tw.setCellWidget(row, 4, values_combo)
def read_source_field_changed(self,new_index): def read_source_field_changed(self,new_index):
''' '''
Process changes in the read_source_field combo box Process changes in the read_source_field combo box
@ -873,5 +887,3 @@ class PrefixRulesComboBox(NoWheelComboBox):
self.setCurrentIndex(idx) self.setCurrentIndex(idx)
else: else:
self.setCurrentIndex(0) self.setCurrentIndex(0)

View File

@ -107,10 +107,11 @@
</size> </size>
</property> </property>
<property name="toolTip"> <property name="toolTip">
<string>&lt;p&gt;Default pattern <string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
\[.+\] &lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
excludes tags of the form [tag], p, li { white-space: pre-wrap; }
e.g., [Project Gutenberg]&lt;/p&gt;</string> &lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'Lucida Grande'; font-size:13pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Default pattern \[.+\]|\+ excludes tags of the form [tag], e.g., [Project Gutenberg], and '+', the default tag for a read book.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property> </property>
<property name="title"> <property name="title">
<string>Excluded genres</string> <string>Excluded genres</string>
@ -333,6 +334,9 @@ Default: ~,Catalog</string>
<verstretch>0</verstretch> <verstretch>0</verstretch>
</sizepolicy> </sizepolicy>
</property> </property>
<property name="toolTip">
<string>The first matching rule will be used to add a prefix to book listings in the generated catalog.</string>
</property>
<property name="title"> <property name="title">
<string>Prefix rules</string> <string>Prefix rules</string>
</property> </property>

View File

@ -3117,32 +3117,24 @@ Author '{0}':
def discoverPrefix(self, record): def discoverPrefix(self, record):
''' '''
Given a field:pattern spec, discover if this book marked as read Evaluate conditions for including prefixes in various listings
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:<string>
datatype datetime: #field_name:.*
''' '''
if self.opts.verbose: def log_prefix_rule_match_info(rule, record):
self.opts.log.info("\tevaluating %s (%s)" % (record['title'], record['authors'])) 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 # Compare the record to each rule looking for a match
for rule in self.prefixRules: 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 # Literal comparison for Tags field
if rule['field'].lower() == 'tags': if rule['field'].lower() == 'tags':
if rule['pattern'].lower() in map(unicode.lower,record['tags']): if rule['pattern'].lower() in map(unicode.lower,record['tags']):
if self.opts.verbose: if self.opts.verbose:
self.opts.log.info("\t '%s' found in '%s' (%s)" % log_prefix_rule_match_info(rule, record)
(rule['pattern'], rule['field'], rule['name']))
return rule['prefix'] return rule['prefix']
# Regex comparison for custom field # Regex match for custom field
elif rule['field'].startswith('#'): elif rule['field'].startswith('#'):
field_contents = self.__db.get_field(record['id'], field_contents = self.__db.get_field(record['id'],
rule['field'], rule['field'],
@ -3150,30 +3142,23 @@ Author '{0}':
if field_contents == '': if field_contents == '':
field_contents = None field_contents = None
if self.opts.verbose:
self.opts.log.info("\t field_contents: %s" % repr(field_contents))
if field_contents is not None: if field_contents is not None:
try: try:
if re.search(rule['pattern'], unicode(field_contents), if re.search(rule['pattern'], unicode(field_contents),
re.IGNORECASE) is not None: re.IGNORECASE) is not None:
if self.opts.verbose: if self.opts.verbose:
self.opts.log.info("\t '%s' matches '%s' value (%s)" % log_prefix_rule_match_info(rule, record)
(rule['pattern'], rule['field'], rule['name']))
return rule['prefix'] return rule['prefix']
except: except:
# Compiling of pat failed, ignore it # Compiling of pat failed, ignore it
if self.opts.verbose: 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 pass
elif field_contents is None and rule['pattern'] == 'None': elif field_contents is None and rule['pattern'] == 'None':
if self.opts.verbose: if self.opts.verbose:
self.opts.log.info("\t '%s' found in '%s' (%s)" % log_prefix_rule_match_info(rule, record)
(rule['pattern'], rule['field'], rule['name']))
return rule['prefix'] return rule['prefix']
if False and self.opts.verbose:
self.opts.log.info("\t No prefix match found")
return None return None
def filterDbTags(self, tags): def filterDbTags(self, tags):