From: Paul T. <pau...@gm...> - 2011-02-02 06:05:07
|
A simple question (I think). Can someone show me how to use the front end tools (or any other method) that allows me to convert an RST file to XML so that I get a string? I also need to use command line arguments. from docutils.core import publish_cmdline, default_description description = ('Generates Docutils-native XML from standalone ' 'reStructuredText sources. ' + default_description) publish_cmdline(writer_name='xml', description=description) Outputs to the terminal. I need to capture the output as a string (or as a path) and do further transformations. status, output = commands.getstatusoutput('rst2xml.py --arsg file.rst') Would work, but that is a bit of a hack, to say the least. Thanks Paul |
From: David G. <go...@py...> - 2011-02-02 15:28:28
|
On Wed, Feb 2, 2011 at 01:04, Paul Tremblay <pau...@gm...> wrote: > A simple question (I think). Can someone show me how to use the front > end tools (or any other method) that allows me to convert an RST file to > XML so that I get a string? I also need to use command line arguments. > > from docutils.core import publish_cmdline, default_description > description = ('Generates Docutils-native XML from standalone ' > 'reStructuredText sources. ' + default_description) > publish_cmdline(writer_name='xml', description=description) > > Outputs to the terminal. I need to capture the output as a string (or as > a path) and do further transformations. http://docutils.sourceforge.net/docs/api/publisher.html#publisher-convenience-functions see publish_string. As for processing command-line arguments, you'll have to replicate the code in docutils.core that does that, since your use case is non-standard. The convenience functions are there for convenience in common use cases only. I'm tempted to answer "mu" (un-ask the question, it's meaningless). Perhaps you should create a new Writer instead (a subclass of the XML writer)? It would have access to the text output. > status, output = commands.getstatusoutput('rst2xml.py --arsg > file.rst') > > Would work, but that is a bit of a hack, to say the least. But it may be the easiest and correct solution. The path of least resistance is often correct, grasshopper. ;-) -- David Goodger <http://python.net/~goodger> |
From: Paul T. <pau...@gm...> - 2011-02-02 15:45:33
|
Yes, the question is a bit meaningless. Let me re-phrase it: I want to capture the output from XML, and am willing to pass on arguments: import docutils.??? return_string = docutils.??.method('trim-footnote-reference-space' = True) I've had a look at the convenience methods, but I don't believe the ones that return strings or files allow you to pass arguments to it. Using commands will only work on unix systems, I believe? You would have to have rst2xml.py executable in in the PATH, and I don't know if Windows allows this. Thanks Paul On 2/2/11 10:27 AM, David Goodger wrote: > I'm tempted to answer "mu" (un-ask the question, it's meaningless). > Perhaps you should create a new Writer instead (a subclass of the XML > writer)? It would have access to the text output. > > |
From: David G. <go...@py...> - 2011-02-02 16:11:31
|
On Wed, Feb 2, 2011 at 10:45, Paul Tremblay <pau...@gm...> wrote: > Yes, the question is a bit meaningless. Let me re-phrase it: I want to > capture the output from XML, and am willing to pass on arguments: > > import docutils.??? > return_string = docutils.??.method('trim-footnote-reference-space' = True) > > I've had a look at the convenience methods, but I don't believe the ones > that return strings or files allow you to pass arguments to it. I understand what you want. The existing convenience functions don't do it, so you'll have to roll your own, or script existing tools. Look at what the convenience functions do, and adapt to your needs. It's all there, just combine the two functions that do parts of what you want. Use the source, Luke! > Using commands will only work on unix systems, I believe? You would have to > have rst2xml.py executable in in the PATH, and I don't know if Windows > allows this. It can be done. Details are up to you. -- David Goodger > On 2/2/11 10:27 AM, David Goodger wrote: >> >> I'm tempted to answer "mu" (un-ask the question, it's meaningless). >> Perhaps you should create a new Writer instead (a subclass of the XML >> writer)? It would have access to the text output. >> >> > > |
From: Paul T. <pau...@gm...> - 2011-02-03 02:54:13
|
On 2/2/11 11:10 AM, David Goodger wrote: > On Wed, Feb 2, 2011 at 10:45, Paul Tremblay<pau...@gm...> wrote: >> Yes, the question is a bit meaningless. Let me re-phrase it: I want to >> capture the output from XML, and am willing to pass on arguments: >> >> import docutils.??? >> return_string = docutils.??.method('trim-footnote-reference-space' = True) >> >> I've had a look at the convenience methods, but I don't believe the ones >> that return strings or files allow you to pass arguments to it. > I understand what you want. The existing convenience functions don't > do it, so you'll have to roll your own, or script existing tools. > > Look at what the convenience functions do, and adapt to your needs. > It's all there, just combine the two functions that do parts of what > you want. Use the source, Luke! > >> Using commands will only work on unix systems, I believe? You would have to >> have rst2xml.py executable in in the PATH, and I don't know if Windows >> allows this. > It can be done. Details are up to you. > Real helpful, Dave. I can't even begin to sort out the spaghetti code in core.py. |
From: Paul T. <pau...@gm...> - 2011-02-03 06:09:04
|
On 2/2/11 11:10 AM, David Goodger wrote: > > It can be done. Details are up to you. > I surrender! Here is my solution, a complete hack. I think at this point I will leave it up to the user to convert to XML, rather than rely on this code which could very well not work. #!/Library/Frameworks/Python.framework/Versions/2.7/Resources/Python.app/Contents/MacOS/Python # $Id: rst2xml_lib.py 6742 2011-02-03 06:01:53Z paultremblay $ import docutils.core import cStringIO, sys from docutils.core import default_description class XMLPublish(docutils.core.Publisher): default_usage = '%prog [options] [<source> [<destination>]]' default_description = ('Reads from <source> (default is stdin) and writes to ' '<destination> (default is stdout). See ' '<http://docutils.sf.net/docs/user/config.html> for ' 'the full reference.') description = ('Generates Docutils-native XML from standalone ' 'reStructuredText sources. ' + default_description) # doesn't work, and not sure why def __init_old__(self): docutils.core.Publisher.__init__(self) def publish(self, argv=None, usage=None, description=None, settings_spec=None, settings_overrides=None, config_section=None, enable_exit_status=None): """ Process command line options and arguments (if `self.settings` not already set), run `self.reader` and then `self.writer`. Return `self.writer`'s output. """ default_for_xml = {'trim_footnote_reference_space': True} if settings_overrides == None: settings_overrides = {} settings_overrides.update(default_for_xml) exit = None try: if self.settings is None: self.process_command_line( argv, usage, description, settings_spec, config_section, **(settings_overrides or {})) self.set_io() # had to add this as well the_source_path = settings_overrides.get('_source') if the_source_path: source_path = the_source_path source = file(the_source_path, 'rU') self.source = self.source_class( source=source, source_path=source_path, encoding=self.settings.input_encoding) self.document = self.reader.read(self.source, self.parser, self.settings) self.apply_transforms() # had to add the destination_path and destination to redirect # output destination_path = settings_overrides.get('_destination') if not destination_path: output = cStringIO.StringIO() destination = output else: destination = None self.destination = self.destination_class( destination=destination, destination_path=destination_path, encoding=self.settings.output_encoding, error_handler=self.settings.output_encoding_error_handler) output = self.writer.write(self.document, self.destination) self.writer.assemble_parts() except SystemExit, error: exit = 1 exit_status = error.code except Exception, error: if not self.settings: # exception too early to report nicely raise if self.settings.traceback: # Propagate exceptions? self.debugging_dumps() raise self.report_Exception(error) exit = 1 exit_status = 1 self.debugging_dumps() if (enable_exit_status and self.document and (self.document.reporter.max_level >= self.settings.exit_status_level)): sys.exit(self.document.reporter.max_level + 10) elif exit: sys.exit(exit_status) return output def publish_xml_cmdline(self, source = None, destination = None, reader=None, reader_name='standalone', parser=None, parser_name='restructuredtext', writer=None, writer_name='pseudoxml', settings=None, settings_spec=None, settings_overrides=None, config_section=None, enable_exit_status=1, argv=None, usage=None, description=None): """ Set up & run a `Publisher` for command-line-based file I/O (input and output file paths taken automatically from the command line). Return the encoded string output also. Parameters: see `publish_programmatically` for the remainder. - `argv`: Command-line argument list to use instead of ``sys.argv[1:]``. - `usage`: Usage string, output if there's a problem parsing the command line. - `description`: Program description, output for the "--help" option (along with command-line option descriptions). """ if usage == None: usage = self.default_usage if description == None: description = self.description if source: if settings_overrides == None: settings_overrides = {} settings_overrides['_source'] = source if destination: if settings_overrides == None: settings_overrides = {} settings_overrides['_destination'] = destination pub = XMLPublish(reader, parser, writer, settings=settings) pub.set_components(reader_name, parser_name, writer_name) output = pub.publish( argv, usage, description, settings_spec, settings_overrides, config_section=config_section, enable_exit_status=enable_exit_status) return output """ from docutils.core import default_description """ if __name__ == '__main__': try: import locale locale.setlocale(locale.LC_ALL, '') except: pass xml_obj = XMLPublish() the_out = xml_obj.publish_xml_cmdline(writer_name='xml') print the_out |
From: Guenter M. <mi...@us...> - 2011-02-02 21:20:39
|
On 2011-02-02, Paul Tremblay wrote: > A simple question (I think). Can someone show me how to use the front > end tools (or any other method) that allows me to convert an RST file to > XML so that I get a string? I also need to use command line arguments. > from docutils.core import publish_cmdline, default_description > description = ('Generates Docutils-native XML from standalone ' > 'reStructuredText sources. ' + default_description) > publish_cmdline(writer_name='xml', description=description) > Outputs to the terminal. I need to capture the output as a string (or as > a path) and do further transformations. > status, output = commands.getstatusoutput('rst2xml.py --arsg > file.rst') > Would work, but that is a bit of a hack, to say the least. How about re-directing sys.stdout? Günter |
From: Paul T. <pau...@gm...> - 2011-02-03 02:52:14
|
On 2/2/11 4:15 PM, Guenter Milde wrote: > On 2011-02-02, Paul Tremblay wrote: >> A simple question (I think). Can someone show me how to use the front >> end tools (or any other method) that allows me to convert an RST file to >> XML so that I get a string? I also need to use command line arguments. >> from docutils.core import publish_cmdline, default_description >> description = ('Generates Docutils-native XML from standalone ' >> 'reStructuredText sources. ' + default_description) >> publish_cmdline(writer_name='xml', description=description) >> Outputs to the terminal. I need to capture the output as a string (or as >> a path) and do further transformations. > >> status, output = commands.getstatusoutput('rst2xml.py --arsg >> file.rst') > >> Would work, but that is a bit of a hack, to say the least. > How about re-directing sys.stdout? > Meaning what? |
From: Paul T. <pau...@gm...> - 2011-02-04 03:14:03
|
On 2/2/11 4:15 PM, Guenter Milde wrote: > On 2011-02-02, Paul Tremblay wrote: >> A simple question (I think). Can someone show me how to use the front >> end tools (or any other method) that allows me to convert an RST file to >> XML so that I get a string? I also need to use command line arguments. >> from docutils.core import publish_cmdline, default_description >> description = ('Generates Docutils-native XML from standalone ' >> 'reStructuredText sources. ' + default_description) >> publish_cmdline(writer_name='xml', description=description) >> Outputs to the terminal. I need to capture the output as a string (or as >> a path) and do further transformations. > >> status, output = commands.getstatusoutput('rst2xml.py --arsg >> file.rst') > >> Would work, but that is a bit of a hack, to say the least. > How about re-directing sys.stdout? > > Günter > > Thanks! Got it, finally: (PS What exactly does the 'import locale etc' do? ) # code starts here def publish_xml_cmdline (in_path = None, out_path = None, settings_overrides=None): try: import locale locale.setlocale(locale.LC_ALL, '') except: pass from docutils.core import default_description, default_usage import docutils.core description = ('Generates Docutils-native XML from standalone ' 'reStructuredText sources. ' + default_description) if out_path: sys.stdout = file(out_path, 'w') if in_path: sys.stdin = file(in_path) pub = docutils.core.Publisher(None, None, None, settings=None) pub.set_components('standalone', 'restructuredtext', 'xml') output = pub.publish( None, default_usage, description, None, settings_overrides, config_section=None, enable_exit_status=1) return output if __name__ == '__main__': custom = {'title':'Doc Title'} publish_xml_cmdline('test.rst', 'out.xml', custom) |