Skip to content

Commit f13bbec

Browse files
author
Ben Cipollini
committed
Implement GiftiImageParser, stamp on GiftiImage
1 parent abcf925 commit f13bbec

File tree

2 files changed

+6
-78
lines changed

2 files changed

+6
-78
lines changed

nibabel/gifti/gifti.py

Lines changed: 3 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -420,6 +420,9 @@ def __init__(self, header=None, extra=None, file_map=None, meta=None,
420420
labeltable=None, darrays=None, version="1.0"):
421421
super(GiftiImage, self).__init__(header=header, extra=extra,
422422
file_map=file_map)
423+
# placed here temporarily for git diff purposes
424+
from .parse_gifti_fast import GiftiImageParser
425+
GiftiImage.parser = GiftiImageParser
423426

424427
if darrays is None:
425428
darrays = []
@@ -561,19 +564,3 @@ def to_xml(self, enc='utf-8'):
561564
return b"""<?xml version="1.0" encoding="UTF-8"?>
562565
<!DOCTYPE GIFTI SYSTEM "http://www.nitrc.org/frs/download.php/115/gifti.dtd">
563566
""" + xml.XmlSerializable.to_xml(self, enc)
564-
565-
@classmethod
566-
def from_file_map(klass, file_map):
567-
""" Load a Gifti image from a file_map
568-
569-
Parameters
570-
file_map : string
571-
572-
Returns
573-
-------
574-
img : GiftiImage
575-
Returns a GiftiImage
576-
"""
577-
from .parse_gifti_fast import parse_gifti_file
578-
return parse_gifti_file(
579-
fptr=file_map['image'].get_prepare_fileobj('rb'))

nibabel/gifti/parse_gifti_fast.py

Lines changed: 3 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
import warnings
1414
import zlib
1515
from ..externals.six import StringIO
16-
from xml.parsers.expat import ParserCreate, ExpatError
1716

1817
import numpy as np
1918

@@ -23,7 +22,7 @@
2322
GiftiCoordSystem)
2423
from .util import (array_index_order_codes, gifti_encoding_codes,
2524
gifti_endian_codes)
26-
25+
from ..xmlbasedimages import XmlImageParser
2726

2827
DEBUG_PRINT = False
2928

@@ -71,14 +70,11 @@ def read_data_block(encoding, endian, ordering, datatype, shape, data):
7170
return newarr
7271

7372

74-
class Outputter(object):
73+
class GiftiImageParser(XmlImageParser):
7574

7675
def __init__(self):
77-
self.initialize()
76+
super(GiftiImageParser, self).__init__()
7877

79-
def initialize(self):
80-
""" Initialize outputter
81-
"""
8278
# finite state machine stack
8379
self.fsm_state = []
8480

@@ -95,7 +91,6 @@ def initialize(self):
9591

9692
# where to write CDATA:
9793
self.write_to = None
98-
self.img = None
9994

10095
# Collecting char buffer fragments
10196
self._char_blocks = None
@@ -316,57 +311,3 @@ def flush_chardata(self):
316311
def pending_data(self):
317312
" True if there is character data pending for processing "
318313
return not self._char_blocks is None
319-
320-
321-
def parse_gifti_file(fname=None, fptr=None, buffer_size=None):
322-
""" Parse gifti file named `fname`, return image
323-
324-
Parameters
325-
----------
326-
fname : str
327-
filename of gifti file
328-
buffer_size: None or int, optional
329-
size of read buffer. None gives default of 35000000 unless on python <
330-
2.6, in which case it is read only in the parser. In that case values
331-
other than None cause a ValueError on execution
332-
333-
Returns
334-
-------
335-
img : gifti image
336-
"""
337-
assert (fname is not None) + (fptr is not None) == 1, "Specify only fname or fptr, not both"
338-
339-
if fptr is None:
340-
with open(fname, 'rb') as datasource:
341-
return parse_gifti_file(fptr=datasource, buffer_size=buffer_size)
342-
else:
343-
datasource = fptr
344-
345-
if buffer_size is None:
346-
buffer_sz_val = 35000000
347-
else:
348-
buffer_sz_val = buffer_size
349-
350-
parser = ParserCreate()
351-
parser.buffer_text = True
352-
try:
353-
parser.buffer_size = buffer_sz_val
354-
except AttributeError:
355-
if not buffer_size is None:
356-
raise ValueError('Cannot set buffer size for parser')
357-
HANDLER_NAMES = ['StartElementHandler',
358-
'EndElementHandler',
359-
'CharacterDataHandler']
360-
out = Outputter()
361-
for name in HANDLER_NAMES:
362-
setattr(parser, name, getattr(out, name))
363-
try:
364-
parser.ParseFile(datasource)
365-
except ExpatError:
366-
print('An expat error occured while parsing the Gifti file.')
367-
368-
# Reality check for pending data
369-
assert out.pending_data is False
370-
# update filename
371-
out.img.filename = fname
372-
return out.img

0 commit comments

Comments
 (0)