mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-08 18:54:09 -04:00
Added load/save for search replace definitions and plumbing to get the search/replace to work during conversion
This commit is contained in:
parent
07648f1ff3
commit
9bf3bcb75d
@ -156,9 +156,7 @@ def add_pipeline_options(parser, plumber):
|
|||||||
'SEARCH AND REPLACE' : (
|
'SEARCH AND REPLACE' : (
|
||||||
_('Modify the document text and structure using user defined patterns.'),
|
_('Modify the document text and structure using user defined patterns.'),
|
||||||
[
|
[
|
||||||
'sr1_search', 'sr1_replace',
|
'search_replace',
|
||||||
'sr2_search', 'sr2_replace',
|
|
||||||
'sr3_search', 'sr3_replace',
|
|
||||||
]
|
]
|
||||||
),
|
),
|
||||||
|
|
||||||
|
@ -600,32 +600,9 @@ OptionRecommendation(name='renumber_headings',
|
|||||||
'The tags are renumbered to prevent splitting in the middle '
|
'The tags are renumbered to prevent splitting in the middle '
|
||||||
'of chapter headings.')),
|
'of chapter headings.')),
|
||||||
|
|
||||||
OptionRecommendation(name='sr1_search',
|
OptionRecommendation(name='search_replace',
|
||||||
recommended_value='', level=OptionRecommendation.LOW,
|
recommended_value='[]', level=OptionRecommendation.LOW,
|
||||||
help=_('Search pattern (regular expression) to be replaced with '
|
help=_('Modify the document text and structure using user defined patterns.')),
|
||||||
'sr1-replace.')),
|
|
||||||
|
|
||||||
OptionRecommendation(name='sr1_replace',
|
|
||||||
recommended_value='', level=OptionRecommendation.LOW,
|
|
||||||
help=_('Replacement to replace the text found with sr1-search.')),
|
|
||||||
|
|
||||||
OptionRecommendation(name='sr2_search',
|
|
||||||
recommended_value='', level=OptionRecommendation.LOW,
|
|
||||||
help=_('Search pattern (regular expression) to be replaced with '
|
|
||||||
'sr2-replace.')),
|
|
||||||
|
|
||||||
OptionRecommendation(name='sr2_replace',
|
|
||||||
recommended_value='', level=OptionRecommendation.LOW,
|
|
||||||
help=_('Replacement to replace the text found with sr2-search.')),
|
|
||||||
|
|
||||||
OptionRecommendation(name='sr3_search',
|
|
||||||
recommended_value='', level=OptionRecommendation.LOW,
|
|
||||||
help=_('Search pattern (regular expression) to be replaced with '
|
|
||||||
'sr3-replace.')),
|
|
||||||
|
|
||||||
OptionRecommendation(name='sr3_replace',
|
|
||||||
recommended_value='', level=OptionRecommendation.LOW,
|
|
||||||
help=_('Replacement to replace the text found with sr3-search.')),
|
|
||||||
]
|
]
|
||||||
# }}}
|
# }}}
|
||||||
|
|
||||||
|
@ -5,7 +5,7 @@ __license__ = 'GPL v3'
|
|||||||
__copyright__ = '2009, Kovid Goyal <kovid@kovidgoyal.net>'
|
__copyright__ = '2009, Kovid Goyal <kovid@kovidgoyal.net>'
|
||||||
__docformat__ = 'restructuredtext en'
|
__docformat__ = 'restructuredtext en'
|
||||||
|
|
||||||
import functools, re
|
import functools, re, json
|
||||||
|
|
||||||
from calibre import entity_to_unicode, as_unicode
|
from calibre import entity_to_unicode, as_unicode
|
||||||
|
|
||||||
@ -515,14 +515,14 @@ class HTMLPreProcessor(object):
|
|||||||
if not getattr(self.extra_opts, 'keep_ligatures', False):
|
if not getattr(self.extra_opts, 'keep_ligatures', False):
|
||||||
html = _ligpat.sub(lambda m:LIGATURES[m.group()], html)
|
html = _ligpat.sub(lambda m:LIGATURES[m.group()], html)
|
||||||
|
|
||||||
for search, replace in [['sr3_search', 'sr3_replace'], ['sr2_search', 'sr2_replace'], ['sr1_search', 'sr1_replace']]:
|
search_replace = json.loads(getattr(self.extra_opts, 'search_replace', '[]'))
|
||||||
search_pattern = getattr(self.extra_opts, search, '')
|
for search_pattern, replace_txt in search_replace:
|
||||||
if search_pattern:
|
if search_pattern:
|
||||||
try:
|
try:
|
||||||
search_re = re.compile(search_pattern)
|
search_re = re.compile(search_pattern)
|
||||||
replace_txt = getattr(self.extra_opts, replace, '')
|
|
||||||
if not replace_txt:
|
if not replace_txt:
|
||||||
replace_txt = ''
|
replace_txt = ''
|
||||||
|
print 'Replacing pattern \'{0}\' with text \'{1}\''.format(search_pattern, replace_txt)
|
||||||
rules.insert(0, (search_re, replace_txt))
|
rules.insert(0, (search_re, replace_txt))
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
self.log.error('Failed to parse %r regexp because %s' %
|
self.log.error('Failed to parse %r regexp because %s' %
|
||||||
|
@ -10,7 +10,7 @@ import textwrap, codecs, importlib
|
|||||||
from functools import partial
|
from functools import partial
|
||||||
|
|
||||||
from PyQt4.Qt import QWidget, QSpinBox, QDoubleSpinBox, QLineEdit, QTextEdit, \
|
from PyQt4.Qt import QWidget, QSpinBox, QDoubleSpinBox, QLineEdit, QTextEdit, \
|
||||||
QCheckBox, QComboBox, Qt, QIcon, pyqtSignal, QLabel
|
QCheckBox, QComboBox, Qt, QIcon, pyqtSignal, QLabel, QTableWidget
|
||||||
|
|
||||||
from calibre.customize.conversion import OptionRecommendation
|
from calibre.customize.conversion import OptionRecommendation
|
||||||
from calibre.ebooks.conversion.config import load_defaults, \
|
from calibre.ebooks.conversion.config import load_defaults, \
|
||||||
@ -160,6 +160,15 @@ class Widget(QWidget):
|
|||||||
return g.xpath if g.xpath else None
|
return g.xpath if g.xpath else None
|
||||||
elif isinstance(g, RegexEdit):
|
elif isinstance(g, RegexEdit):
|
||||||
return g.regex if g.regex else None
|
return g.regex if g.regex else None
|
||||||
|
elif isinstance(g, QTableWidget):
|
||||||
|
import json
|
||||||
|
ans = []
|
||||||
|
for row in xrange(0, g.rowCount()):
|
||||||
|
colItems = []
|
||||||
|
for col in xrange(0, g.columnCount()):
|
||||||
|
colItems.append(unicode(g.item(row, col).text()))
|
||||||
|
ans.append(colItems)
|
||||||
|
return json.dumps(ans)
|
||||||
else:
|
else:
|
||||||
raise Exception('Can\'t get value from %s'%type(g))
|
raise Exception('Can\'t get value from %s'%type(g))
|
||||||
|
|
||||||
@ -187,6 +196,8 @@ class Widget(QWidget):
|
|||||||
elif isinstance(g, (XPathEdit, RegexEdit)):
|
elif isinstance(g, (XPathEdit, RegexEdit)):
|
||||||
g.edit.editTextChanged.connect(f)
|
g.edit.editTextChanged.connect(f)
|
||||||
g.edit.currentIndexChanged.connect(f)
|
g.edit.currentIndexChanged.connect(f)
|
||||||
|
elif isinstance(g, QTableWidget):
|
||||||
|
g.cellChanged.connect(f)
|
||||||
else:
|
else:
|
||||||
raise Exception('Can\'t connect %s'%type(g))
|
raise Exception('Can\'t connect %s'%type(g))
|
||||||
|
|
||||||
@ -220,6 +231,23 @@ class Widget(QWidget):
|
|||||||
g.setCheckState(Qt.Checked if bool(val) else Qt.Unchecked)
|
g.setCheckState(Qt.Checked if bool(val) else Qt.Unchecked)
|
||||||
elif isinstance(g, (XPathEdit, RegexEdit)):
|
elif isinstance(g, (XPathEdit, RegexEdit)):
|
||||||
g.edit.setText(val if val else '')
|
g.edit.setText(val if val else '')
|
||||||
|
elif isinstance(g, (QTableWidget)):
|
||||||
|
import json
|
||||||
|
try:
|
||||||
|
rowItems = json.loads(val)
|
||||||
|
if not isinstance(rowItems, list):
|
||||||
|
rowItems = []
|
||||||
|
except:
|
||||||
|
rowItems = []
|
||||||
|
|
||||||
|
|
||||||
|
g.setRowCount(len(rowItems))
|
||||||
|
|
||||||
|
for row, colItems in enumerate(rowItems):
|
||||||
|
for col, cellValue in enumerate(colItems):
|
||||||
|
newItem = g.itemPrototype().clone()
|
||||||
|
newItem.setText(cellValue)
|
||||||
|
g.setItem(row,col, newItem)
|
||||||
else:
|
else:
|
||||||
raise Exception('Can\'t set value %s in %s'%(repr(val),
|
raise Exception('Can\'t set value %s in %s'%(repr(val),
|
||||||
unicode(g.objectName())))
|
unicode(g.objectName())))
|
||||||
|
@ -7,7 +7,7 @@ __docformat__ = 'restructuredtext en'
|
|||||||
import re
|
import re
|
||||||
|
|
||||||
from PyQt4.QtCore import SIGNAL, Qt
|
from PyQt4.QtCore import SIGNAL, Qt
|
||||||
from PyQt4.QtGui import QTableWidgetItem
|
from PyQt4.QtGui import QTableWidgetItem, QFileDialog
|
||||||
from calibre.gui2.convert.search_and_replace_ui import Ui_Form
|
from calibre.gui2.convert.search_and_replace_ui import Ui_Form
|
||||||
from calibre.gui2.convert import Widget
|
from calibre.gui2.convert import Widget
|
||||||
from calibre.gui2 import error_dialog
|
from calibre.gui2 import error_dialog
|
||||||
@ -22,66 +22,75 @@ class SearchAndReplaceWidget(Widget, Ui_Form):
|
|||||||
|
|
||||||
def __init__(self, parent, get_option, get_help, db=None, book_id=None):
|
def __init__(self, parent, get_option, get_help, db=None, book_id=None):
|
||||||
Widget.__init__(self, parent,
|
Widget.__init__(self, parent,
|
||||||
['sr1_search', 'sr1_replace',
|
['search_replace']
|
||||||
'sr2_search', 'sr2_replace',
|
|
||||||
'sr3_search', 'sr3_replace']
|
|
||||||
)
|
)
|
||||||
self.db, self.book_id = db, book_id
|
self.db, self.book_id = db, book_id
|
||||||
self.initialize_options(get_option, get_help, db, book_id)
|
|
||||||
self.opt_sr1_search.set_msg(_('&Search Regular Expression'))
|
|
||||||
self.opt_sr1_search.set_book_id(book_id)
|
|
||||||
self.opt_sr1_search.set_db(db)
|
|
||||||
self.opt_sr1_search.set_regex('test.*')
|
|
||||||
self.opt_sr2_search.set_msg(_('&Search Regular Expression'))
|
|
||||||
self.opt_sr2_search.set_book_id(book_id)
|
|
||||||
self.opt_sr2_search.set_db(db)
|
|
||||||
self.opt_sr3_search.set_msg(_('&Search Regular Expression'))
|
|
||||||
self.opt_sr3_search.set_book_id(book_id)
|
|
||||||
self.opt_sr3_search.set_db(db)
|
|
||||||
|
|
||||||
self.opt_sr1_search.doc_update.connect(self.update_doc)
|
self.sr_search.set_msg(_('&Search Regular Expression'))
|
||||||
self.opt_sr2_search.doc_update.connect(self.update_doc)
|
self.sr_search.set_book_id(book_id)
|
||||||
self.opt_sr3_search.doc_update.connect(self.update_doc)
|
self.sr_search.set_db(db)
|
||||||
|
|
||||||
|
self.sr_search.doc_update.connect(self.update_doc)
|
||||||
|
|
||||||
|
proto = QTableWidgetItem()
|
||||||
|
proto.setFlags(Qt.ItemFlags(Qt.ItemIsSelectable + Qt.ItemIsEnabled))
|
||||||
|
self.opt_search_replace.setItemPrototype(proto)
|
||||||
|
self.opt_search_replace.setColumnCount(2)
|
||||||
|
self.opt_search_replace.setHorizontalHeaderLabels(['Search Expression', 'Replacement'])
|
||||||
|
|
||||||
self.opt_sr.setColumnCount(2)
|
|
||||||
self.opt_sr.setHorizontalHeaderLabels(['Search Expression', 'Replacement'])
|
|
||||||
self.connect(self.sr_add, SIGNAL('clicked()'), self.sr_add_clicked)
|
self.connect(self.sr_add, SIGNAL('clicked()'), self.sr_add_clicked)
|
||||||
self.connect(self.sr_change, SIGNAL('clicked()'), self.sr_change_clicked)
|
self.connect(self.sr_change, SIGNAL('clicked()'), self.sr_change_clicked)
|
||||||
self.connect(self.sr_remove, SIGNAL('clicked()'), self.sr_remove_clicked)
|
self.connect(self.sr_remove, SIGNAL('clicked()'), self.sr_remove_clicked)
|
||||||
self.connect(self.opt_sr, SIGNAL('currentCellChanged(int, int, int, int)'), self.sr_currentCellChanged)
|
self.connect(self.sr_load, SIGNAL('clicked()'), self.sr_load_clicked)
|
||||||
|
self.connect(self.sr_save, SIGNAL('clicked()'), self.sr_save_clicked)
|
||||||
|
self.connect(self.opt_search_replace, SIGNAL('currentCellChanged(int, int, int, int)'), self.sr_currentCellChanged)
|
||||||
|
|
||||||
|
self.initialize_options(get_option, get_help, db, book_id)
|
||||||
|
|
||||||
def sr_add_clicked(self):
|
def sr_add_clicked(self):
|
||||||
if self.opt_sr1_search.regex:
|
if self.sr_search.regex:
|
||||||
self.opt_sr.insertRow(0)
|
self.opt_search_replace.insertRow(0)
|
||||||
newItem = QTableWidgetItem()
|
newItem = self.opt_search_replace.itemPrototype().clone()
|
||||||
newItem.setFlags(Qt.ItemFlags(Qt.ItemIsSelectable + Qt.ItemIsEnabled))
|
newItem.setText(self.sr_search.regex)
|
||||||
newItem.setText(self.opt_sr1_search.regex)
|
self.opt_search_replace.setItem(0,0, newItem)
|
||||||
self.opt_sr.setItem(0,0, newItem)
|
newItem = self.opt_search_replace.itemPrototype().clone()
|
||||||
newItem = QTableWidgetItem()
|
newItem.setText(self.sr_replace.text())
|
||||||
newItem.setFlags(Qt.ItemFlags(Qt.ItemIsSelectable + Qt.ItemIsEnabled))
|
self.opt_search_replace.setItem(0,1, newItem)
|
||||||
newItem.setText(self.opt_sr1_replace.text())
|
self.opt_search_replace.setCurrentCell(0, 0)
|
||||||
self.opt_sr.setItem(0,1, newItem)
|
|
||||||
self.opt_sr.setCurrentCell(0, 0)
|
|
||||||
|
|
||||||
def sr_change_clicked(self):
|
def sr_change_clicked(self):
|
||||||
row = self.opt_sr.currentRow()
|
row = self.opt_search_replace.currentRow()
|
||||||
if row >= 0:
|
if row >= 0:
|
||||||
self.opt_sr.item(row, 0).setText(self.opt_sr1_search.regex)
|
self.opt_search_replace.item(row, 0).setText(self.sr_search.regex)
|
||||||
self.opt_sr.item(row, 1).setText(self.opt_sr1_replace.text())
|
self.opt_search_replace.item(row, 1).setText(self.sr_replace.text())
|
||||||
self.opt_sr.setCurrentCell(row, 0)
|
self.opt_search_replace.setCurrentCell(row, 0)
|
||||||
|
|
||||||
def sr_remove_clicked(self):
|
def sr_remove_clicked(self):
|
||||||
row = self.opt_sr.currentRow()
|
row = self.opt_search_replace.currentRow()
|
||||||
if row >= 0:
|
if row >= 0:
|
||||||
self.opt_sr.removeRow(row)
|
self.opt_search_replace.removeRow(row)
|
||||||
self.opt_sr.setCurrentCell(row-1, 0)
|
self.opt_search_replace.setCurrentCell(row-1, 0)
|
||||||
|
|
||||||
|
def sr_load_clicked(self):
|
||||||
|
filename = QFileDialog.getOpenFileName(self, 'Load Calibre Search-Replace definitions file', '.', 'Calibre Search-Replace definitions file (*.csr)')
|
||||||
|
if filename:
|
||||||
|
with open(filename, 'r') as f:
|
||||||
|
val = f.read()
|
||||||
|
self.set_value(self.opt_search_replace, val)
|
||||||
|
|
||||||
|
def sr_save_clicked(self):
|
||||||
|
filename = QFileDialog.getSaveFileName(self, 'Save Calibre Search-Replace definitions file', '.', 'Calibre Search-Replace definitions file (*.csr)')
|
||||||
|
if filename:
|
||||||
|
with open(filename, 'w') as f:
|
||||||
|
val = self.get_value(self.opt_search_replace)
|
||||||
|
f.write(val)
|
||||||
|
|
||||||
def sr_currentCellChanged(self, row, column, previousRow, previousColumn) :
|
def sr_currentCellChanged(self, row, column, previousRow, previousColumn) :
|
||||||
if row >= 0:
|
if row >= 0:
|
||||||
self.sr_change.setEnabled(True)
|
self.sr_change.setEnabled(True)
|
||||||
self.sr_remove.setEnabled(True)
|
self.sr_remove.setEnabled(True)
|
||||||
self.opt_sr1_search.set_regex(self.opt_sr.item(row, 0).text())
|
self.sr_search.set_regex(self.opt_search_replace.item(row, 0).text())
|
||||||
self.opt_sr1_replace.setText(self.opt_sr.item(row, 1).text())
|
self.sr_replace.setText(self.opt_search_replace.item(row, 1).text())
|
||||||
else:
|
else:
|
||||||
self.sr_change.setEnabled(False)
|
self.sr_change.setEnabled(False)
|
||||||
self.sr_remove.setEnabled(False)
|
self.sr_remove.setEnabled(False)
|
||||||
@ -95,34 +104,20 @@ class SearchAndReplaceWidget(Widget, Ui_Form):
|
|||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
d(self.opt_sr1_search)
|
d(self.sr_search)
|
||||||
d(self.opt_sr2_search)
|
|
||||||
d(self.opt_sr3_search)
|
|
||||||
|
|
||||||
self.opt_sr1_search.break_cycles()
|
self.sr_search.break_cycles()
|
||||||
self.opt_sr2_search.break_cycles()
|
|
||||||
self.opt_sr3_search.break_cycles()
|
|
||||||
|
|
||||||
def update_doc(self, doc):
|
def update_doc(self, doc):
|
||||||
self.opt_sr1_search.set_doc(doc)
|
self.sr_search.set_doc(doc)
|
||||||
self.opt_sr2_search.set_doc(doc)
|
|
||||||
self.opt_sr3_search.set_doc(doc)
|
|
||||||
|
|
||||||
def pre_commit_check(self):
|
def pre_commit_check(self):
|
||||||
for x in ('sr1_search', 'sr2_search', 'sr3_search'):
|
for row in xrange(0, self.opt_search_replace.rowCount()):
|
||||||
x = getattr(self, 'opt_'+x)
|
|
||||||
try:
|
try:
|
||||||
pat = unicode(x.regex)
|
pat = unicode(self.opt_search_replace.item(row,0).text())
|
||||||
re.compile(pat)
|
re.compile(pat)
|
||||||
except Exception as err:
|
except Exception as err:
|
||||||
error_dialog(self, _('Invalid regular expression'),
|
error_dialog(self, _('Invalid regular expression'),
|
||||||
_('Invalid regular expression: %s')%err, show=True)
|
_('Invalid regular expression: %s')%err, show=True)
|
||||||
return False
|
return False
|
||||||
return True
|
return True
|
||||||
|
|
||||||
@property
|
|
||||||
def opt_sr_items(self):
|
|
||||||
items = []
|
|
||||||
for row in xrange(0, self.opt_sr.rowCount()):
|
|
||||||
items.append([self.opt_sr.getItem(row,0).text(), self.opt_sr.getItem(row,1).text()])
|
|
||||||
return items
|
|
||||||
|
@ -39,7 +39,7 @@
|
|||||||
<enum>QLayout::SetMinimumSize</enum>
|
<enum>QLayout::SetMinimumSize</enum>
|
||||||
</property>
|
</property>
|
||||||
<item row="0" column="0">
|
<item row="0" column="0">
|
||||||
<widget class="RegexEdit" name="opt_sr1_search" native="true">
|
<widget class="RegexEdit" name="sr_search" native="true">
|
||||||
<property name="sizePolicy">
|
<property name="sizePolicy">
|
||||||
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
|
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
|
||||||
<horstretch>0</horstretch>
|
<horstretch>0</horstretch>
|
||||||
@ -60,12 +60,12 @@
|
|||||||
<string>&Replacement Text</string>
|
<string>&Replacement Text</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="buddy">
|
<property name="buddy">
|
||||||
<cstring>opt_sr1_replace</cstring>
|
<cstring>sr_replace</cstring>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="2" column="0">
|
<item row="2" column="0">
|
||||||
<widget class="QLineEdit" name="opt_sr1_replace">
|
<widget class="QLineEdit" name="sr_replace">
|
||||||
<property name="sizePolicy">
|
<property name="sizePolicy">
|
||||||
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
|
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
|
||||||
<horstretch>0</horstretch>
|
<horstretch>0</horstretch>
|
||||||
@ -78,114 +78,6 @@
|
|||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="2" column="0">
|
<item row="2" column="0">
|
||||||
<widget class="QGroupBox" name="groupBox_2">
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
|
|
||||||
<horstretch>0</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
<property name="title">
|
|
||||||
<string>Second Expression</string>
|
|
||||||
</property>
|
|
||||||
<layout class="QGridLayout" name="gridLayout">
|
|
||||||
<property name="sizeConstraint">
|
|
||||||
<enum>QLayout::SetMinimumSize</enum>
|
|
||||||
</property>
|
|
||||||
<item row="0" column="0">
|
|
||||||
<widget class="RegexEdit" name="opt_sr2_search" native="true">
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
|
|
||||||
<horstretch>0</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="1" column="0">
|
|
||||||
<widget class="QLabel" name="label_5">
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
|
|
||||||
<horstretch>0</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>&Replacement Text</string>
|
|
||||||
</property>
|
|
||||||
<property name="buddy">
|
|
||||||
<cstring>opt_sr2_replace</cstring>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="2" column="0">
|
|
||||||
<widget class="QLineEdit" name="opt_sr2_replace">
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
|
|
||||||
<horstretch>0</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="3" column="0">
|
|
||||||
<widget class="QGroupBox" name="groupBox_3">
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
|
|
||||||
<horstretch>0</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
<property name="title">
|
|
||||||
<string>Third expression</string>
|
|
||||||
</property>
|
|
||||||
<layout class="QGridLayout" name="gridLayout_3">
|
|
||||||
<property name="sizeConstraint">
|
|
||||||
<enum>QLayout::SetMinimumSize</enum>
|
|
||||||
</property>
|
|
||||||
<item row="0" column="0">
|
|
||||||
<widget class="RegexEdit" name="opt_sr3_search" native="true">
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
|
|
||||||
<horstretch>0</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="1" column="0">
|
|
||||||
<widget class="QLabel" name="label_6">
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
|
|
||||||
<horstretch>0</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>&Replacement Text</string>
|
|
||||||
</property>
|
|
||||||
<property name="buddy">
|
|
||||||
<cstring>opt_sr3_replace</cstring>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="2" column="0">
|
|
||||||
<widget class="QLineEdit" name="opt_sr3_replace">
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
|
|
||||||
<horstretch>0</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="4" column="0">
|
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||||
<property name="spacing">
|
<property name="spacing">
|
||||||
<number>-1</number>
|
<number>-1</number>
|
||||||
@ -220,10 +112,24 @@
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="sr_load" native="true">
|
||||||
|
<property name="text">
|
||||||
|
<string>Load</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="sr_save" native="true">
|
||||||
|
<property name="text">
|
||||||
|
<string>Save</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
<item row="5" column="0">
|
<item row="3" column="0">
|
||||||
<widget class="QTableWidget" name="opt_sr" native="true">
|
<widget class="QTableWidget" name="opt_search_replace" native="true">
|
||||||
<property name="sizePolicy">
|
<property name="sizePolicy">
|
||||||
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
|
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
|
||||||
<horstretch>0</horstretch>
|
<horstretch>0</horstretch>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user