# Copyright David Abrahams 2004. Distributed under the Boost
# Software License, Version 1.0. (See accompanying
# file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)

# Support for docutils ReStructuredText processing.

import type ;
import scanner ;
import generators ;
import os ;
import common ;
import toolset ;
import path ;
import feature : feature ;
import property ;

.initialized = ;

type.register ReST : rst ;

class rst-scanner : common-scanner
{
    rule __init__ ( paths * )
    {
        common-scanner.__init__ . $(paths) ;
    }
    
    rule pattern ( )
    {
         return "^[ 	]*\\.\\.[ 	]+include::[ 	]+([^
]+)"
        "^[ 	]*\\.\\.[ 	]+image::[ 	]+([^
]+)"
        "^[ 	]*\\.\\.[ 	]+figure::[ 	]+([^
]+)"
        ;
    }
}

scanner.register rst-scanner : include ;
type.set-scanner ReST : rst-scanner ;

generators.register-standard docutils.html : ReST : HTML ;

rule init ( docutils-dir ? : tools-dir ? )
{
    docutils-dir ?= [ modules.peek : DOCUTILS_DIR ] ;
    tools-dir ?= $(docutils-dir)/tools ;

    if ! $(.initialized)
    {
        .initialized = true ;
        .docutils-dir = $(docutils-dir) ;
        .tools-dir = $(tools-dir:R="") ;
       
        .setup = [ 
          common.prepend-path-variable-command PYTHONPATH 
            : $(.docutils-dir) $(.docutils-dir)/extras ] ;
    }
}

rule html ( target : source : properties *  )
{
    if ! [ on $(target) return $(RST2XXX) ]
    {
        local python-cmd = [ property.select <python.interpreter> : $(properties) ] ;
        RST2XXX on $(target) = $(python-cmd:G=:E="python") $(.tools-dir)/rst2html.py ;
    }
}


feature docutils : : free ;
feature docutils-html : : free ;
feature docutils-cmd : : free ;
toolset.flags docutils COMMON-FLAGS : <docutils> ;
toolset.flags docutils HTML-FLAGS : <docutils-html> ;
toolset.flags docutils RST2XXX : <docutils-cmd> ;
  
actions html
{
    $(.setup)
    "$(RST2XXX)" $(COMMON-FLAGS) $(HTML-FLAGS) $(>) $(<)
}

