def load_single(mgr, section, parm, vers=None): stream = utilities.MemoryStream() if vers: stream << metadata.open_line(C.MD_V, vers) stream << metadata.open_line(section, parm) stream.rewind() mgr.load_meta(stream)
def load_section(mgr, section, wordlist, vers=None): stream = utilities.MemoryStream() if vers: stream << '{{VERSION ' + vers + '}}\n' stream << metadata.open_line(section) for word in wordlist: stream.writeLine(word) stream << metadata.close_line(section) stream.rewind() mm.load_meta(stream)
def load_section(mgr, section, line_list, vers=None): stream = utilities.MemoryStream() if vers: stream << metadata.open_line(C.MD_V, vers) stream << metadata.open_line(section) for line in line_list: stream.writeLine(line) stream << metadata.close_line(section) stream.rewind() mgr.load_meta(stream)
def check_section(mgr, section, jsonbits): stream = utilities.MemoryStream() mgr.write_section(stream, section) stream.rewind() received = stream.readAll() received = strip_white(received) expected = strip_white(jsonbits) t = (expected == received) if not t: # about to fail assertion in caller print('expected', expected) print('received', received) return t
def check_section(mgr, section, line_list): stream = utilities.MemoryStream() mm.write_meta(stream) stream.rewind() while True: line = stream.readLine() if stream.atEnd(): break if line == metadata.open_string(section) : break assert (not stream.atEnd()) saved = set() for line in metadata.read_to(stream, section): saved.add(line) assert saved == set(line_list)
file_nexiste = os.path.join(T.path_to_Files, 'fubar') # not existing file file_unreadable = os.path.join(T.path_to_Files, 'unreadable.txt') # has mode 0222 dir_name = os.path.join(T.path_to_Files, 'pngs') # existing dir import utilities # The following incidentally test class key_dependent_default assert utilities.file_is_accessible(file_exists) assert not utilities.file_is_accessible(dir_name) assert not utilities.file_is_accessible(file_nexiste) assert not utilities.file_is_accessible(file_unreadable) assert ('en_US.aff', T.path_to_Files) == utilities.file_split(file_exists) assert ('pngs', T.path_to_Files) == utilities.file_split(dir_name) assert ('en_US.aff', T.path_to_Files) == utilities.file_split('en_US.aff') assert len(utilities._FI_DICT) == 5 # Not much to test in MemoryStream other than added methods memstream = utilities.MemoryStream() THETA = 'Θ' STRING = THETA + 'foobar!' memstream.writeLine(STRING) assert (len(STRING) + 1) * 2 == memstream.pos() memstream.rewind() assert memstream.readLine() == STRING # n.b. it does no good to check .pos() now, it is a bytes offset # on a unicode stream. useless... memstream.rewind() assert memstream.pos() == 0 assert memstream.readAll() == STRING + '\n' # FBTS gets used a lot. Check base functionality from PyQt5.QtCore import QFile qfile_exists = QFile(file_exists) fbts = utilities.FileBasedTextStream(qfile_exists)
def load_section(mgr, jsonbits): stream = utilities.MemoryStream() stream << '\n' # must start section with newline stream << jsonbits stream.rewind() mgr.load_meta(stream)
def get_section(mgr, section): stream = utilities.MemoryStream() mgr.write_section(stream, section) stream.rewind() return stream.readAll()
def push_ub(fpanel, butno, udict): stream = utilities.MemoryStream() stream << '{} : {}'.format(butno, udict) stream.rewind() fpanel.user_button_input(stream)
def check_single(mgr, section, parm): stream = utilities.MemoryStream() mgr.write_meta(stream) stream.rewind() txt = stream.readAll() assert (section + ' ' + parm) in txt
def _move_meta( from_mgr, to_mgr, section ) : stream = utilities.MemoryStream() from_mgr.write_section( stream, section ) stream.rewind() to_mgr.load_meta( stream ) stream.rewind()
def xlt_book( source_book, xlt_index, main_window ) : global WORK_UNITS # Get the namespace of the chosen Translator, based on the index saved in # the menu action. xlt_namespace = _XLT_NAMESPACES[ xlt_index ] menu_name = getattr( xlt_namespace, 'MENU_NAME' ) xlt_logger.info('Translating {}: {}'.format(xlt_index, menu_name) ) # If it has an option dialog, now is the time to run it. If the # user clicks Cancel, we are done. dialog_list = getattr( xlt_namespace, 'OPTION_DIALOG', None ) if dialog_list : answer = _run_dialog( dialog_list, menu_name, main_window ) if not answer : xlt_logger.error('User cancelled option dialog for', menu_name) return None # Perform the document parse. If it succeeds, the list of work units is # ready. If it fails, a message has been shown to the user and we exit. WORK_UNITS = [] if not _do_parse( source_book, main_window ) : return None # Initialize the translator. Create three streams. Collect the book facts # dict. Make a page boundary offset list filled with -1. Pass all that to # the initialize function to store. prolog = utilities.MemoryStream() body = utilities.MemoryStream() epilog = utilities.MemoryStream() book_facts = source_book.get_book_facts() source_page_model = source_book.get_page_model() page_list = [] if source_page_model.active() : page_list = [ -1 for x in range( source_page_model.page_count() ) ] try: result = xlt_namespace.initialize( prolog, body, epilog, book_facts, page_list ) except Exception as e : m1 = _TR( 'Translator throws exception', 'Unexpected error initializing translator' ) + ' ' + menu_name m2 = str(e) utilities.warning_msg( m1, m2, main_window ) xlt_logger.error('Exception from {}.initialize()'.format(menu_name)) xlt_logger.error(m2) return None if not result : return None # The translator is initialized, so call its translate() passing our # event_generator(), below. try: event_iterator = event_generator( source_page_model, source_book.get_edit_model() ) result = xlt_namespace.translate( event_iterator ) except Exception as e : m1 = _TR( 'Translator throws exception', 'Unexpected error in translate() function of') + ' ' + menu_name m2 = str(e) utilities.warning_msg( m1, m2, main_window ) xlt_logger.error('Exception from {}.translate()'.format(menu_name)) xlt_logger.error(m2) return None if not result : return None # Translating over, finalize it. try: result = xlt_namespace.finalize( ) except Exception as e : m1 = _TR( 'Translator throws exception', 'Unexpected error in finalize() function of') + ' ' + menu_name m2 = str(e) utilities.warning_msg( m1, m2, main_window ) xlt_logger.error('Exception from {}.finalize()'.format(menu_name)) xlt_logger.error(m2) return None if not result : return None # Now put it all together as a Book. First, have mainwindow create a # New book and display it. new_book = main_window.do_new() # Get an edit cursor and use it to insert all the translated text. new_edit_view = new_book.get_edit_view() qtc = new_edit_view.get_cursor() prolog.rewind() qtc.insertText( prolog.readAll() ) body.rewind() qtc.insertText( body.readAll() ) epilog.rewind() qtc.insertText( epilog.readAll() ) # Position the file at the top. new_edit_view.go_to_line_number( 1 ) # Read relevant metadata sections from the source book and install them # on the new book. metadata.write_section() gets a specific section. # metadata.load_meta() doesn't care if the stream is a single section # or a whole file. source_mgr = source_book.get_meta_manager() new_mgr = new_book.get_meta_manager() new_book.book_folder = source_book.book_folder # base folder _move_meta( source_mgr, new_mgr, C.MD_BW ) # badwords _move_meta( source_mgr, new_mgr, C.MD_FR ) # find memory _move_meta( source_mgr, new_mgr, C.MD_FU ) # find userbuttons _move_meta( source_mgr, new_mgr, C.MD_GW ) # goodwords _move_meta( source_mgr, new_mgr, C.MD_MD ) # main dictionary _move_meta( source_mgr, new_mgr, C.MD_NO ) # notes if source_page_model.active() and page_list[0] > -1 : # It looks as if the translator did update the page offset list. Get # the source page metadata and modify it. (Note the original design # was to just transfer the old page metadata the way we transfer the # other types, above, then use pagedata.set_position() to set the new # positions. HOWEVER there is a possibility that the new book is # shorter than the old one, in which case pagedata.read_pages() would # see some of the (old) positions as invalid, and would discard some # of the final rows. So we get the metadata; translate it back to # python; modify it in place with the new positions which are # presumably all valid for the new book; convert it to json and feed # that to the new book. If the translator messed up any of those # positions, there will be log messages. stream = utilities.MemoryStream() source_mgr.write_section( stream, C.MD_PT ) stream.rewind() pdata = json.loads( stream.readAll() ) plist = pdata['PAGETABLE'] for j in range( len( plist ) ) : plist[j][0] = page_list[j] stream = utilities.MemoryStream() stream << json.dumps( pdata ) stream.rewind() new_mgr.load_meta( stream ) new_book.hook_images()