+++ /dev/null
-# Copyright 2001 by Katharine Lindner. All rights reserved.\r
-# This code is part of the Biopython distribution and governed by its\r
-# license. Please see the LICENSE file that should have been included\r
-# as part of this package.\r
-\r
-"""Code for more fancy file handles (OBSOLETE).\r
-\r
-Classes:\r
-Filtered is a decorator for File that allows the user to filter the output\r
-on a line by line basis.\r
-\r
-The FilteredReader module reads a file and applies a sequence of filters to the input\r
-The constructor sets a default filter chain, but the user can select another filter by setting\r
-Bio.FilteredReader.filter_chain.\r
-\r
-handle = open( "filename" )\r
-filtered_reader = Bio.FilteredReader( handle )\r
-filtered_reader.filter_chain = [ remove_asterisks, replace_dot_with_dash ]\r
-filtered_reasder.read()\r
-\r
-All filters in the chain must provide the same interface with a line of text as the single\r
-input parameter and altered text as the return value.\r
-\r
-This module is now considered to be obsolete, and is likely to be deprecated\r
-in a future release of Biopython, and later removed.\r
-"""\r
-\r
-\r
-def dump_saved( name, text, j ):\r
- """Used for debugging."""\r
- dump_file = open( name + '%d' % j, "w" )\r
- k = 0\r
- for i in range ( 0, len( text ), 80 ):\r
- dump_file.write( '%s\n' % text[ i : i + 80 ] )\r
- dump_file.close()\r
-\r
-def remove_leading_whitespace( line ):\r
- return line.lstrip()\r
-\r
-\r
-def remove_empty_line( line ):\r
- stripped_line = line.strip()\r
- if( stripped_line ):\r
- return line[ : ]\r
- else:\r
- return ''\r
-\r
-def remove_useless_dot( line ):\r
- before = line\r
- while( 1 ):\r
- after = before.replace( "\t.\t", "\t\t" )\r
- if( len( before ) == len( after ) ):\r
- break\r
- before = after\r
- if( after.endswith( '.' ) ):\r
- after = after[ :-1 ]\r
- return after\r
-\r
-def fix_punctuation( line ):\r
- line = line.replace( "'", '' )\r
- line = line.replace( '"', '' )\r
- line = line.replace( ';', '\t' )\r
- line = line.replace( 'entryname', 'id' )\r
-# line = line.lower( )\r
- if( line ):\r
- return line[ : ]\r
- else:\r
- return ''\r
-\r
-\r
-\r
-class FilteredReader:\r
- def __init__(self, handle ):\r
- self._handle = handle\r
- self._start_line = ''\r
- self._debug_count = 0\r
- self.filter_chain = [ remove_empty_line, remove_useless_dot, fix_punctuation ]\r
-\r
- def __getattr__(self, attr):\r
- return getattr(self._handle, attr)\r
-\r
-\r
-\r
- def close(self, *args, **keywds ):\r
- return self._handle.close( *args, **keywds)\r
-\r
- def read( self, *args, **keywds ):\r
- line = ''\r
- len_expected = self._get_len_expected( args, keywds )\r
- if( len_expected ):\r
- filtered_text = self.read_block( len_expected )\r
- else:\r
- filtered_text = self.read_to_end()\r
- return filtered_text\r
-\r
- def read_block( self, len_expected ):\r
-\r
- len_filtered = 0\r
- len_adjusted -= len( self._start_line )\r
- filtered_text = ''\r
- while( len_filtered < len_expected ):\r
-\r
- text_read = self._handle.read( len_adjusted )\r
- full_text = self._start_line + text_read\r
- lines = full_text.splitlines( 1 )\r
- if( text_read == '' ):\r
- filtered_text = filtered_text + self.filter( lines )\r
- break\r
- else:\r
- all_but_last_line = lines[ :-1 ]\r
- self._start_line = lines[ -1 ]\r
- filtered_text = filtered_text + self.filter( all_but_last_line )\r
- len_filtered_text = len( filtered_text )\r
- len_adjusted = len_adjusted - len_filtered_text\r
- return filtered_text[ : ]\r
-\r
- def read_to_end( self ):\r
- filtered_text = ''\r
- text_read = self._handle.read()\r
- full_text = self._start_line + text_read\r
- lines = full_text.splitlines( 1 )\r
- filtered_text += self.filter( lines[:] )\r
- return filtered_text[ : ]\r
-\r
- def _get_len_expected( self, args, keywds ):\r
-\r
- if( len( args) > 0 ):\r
- len_expected = args[ 0 ]\r
- if( len_expected < 0 ):\r
- len_expected = None\r
- elif 'size' in keywds:\r
- len_expected = keywds['size']\r
- else:\r
- len_expected = None\r
- return len_expected\r
-\r
- def filter( self, lines ):\r
- filter_chain = self.filter_chain\r
- filtered_text = ''\r
- for line in lines:\r
- for filter in filter_chain:\r
- line = filter( *( line, ) )\r
- filtered_text += line\r
-\r
- return filtered_text\r
-\r
-def has_trailing_linefeed( line ):\r
- if( line.endswith( chr( 13 ) ) or \\r
- line.endswith( chr( 10 ) ) ):\r
- return 1\r
- else:\r
- return 0\r