--- /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