mirror of
https://github.com/boostorg/quickbook.git
synced 2026-01-31 20:32:16 +00:00
Sometimes when including files on the path the same glob will match the same relative path from different include paths. In this case the paths were ordered by their absolute paths. Instead use the order they occur in the include path, which is a little more independent of the local machine. [SVN r86708]
183 lines
5.3 KiB
C++
183 lines
5.3 KiB
C++
/*=============================================================================
|
|
Copyright (c) 2002 2004 2006 Joel de Guzman
|
|
Copyright (c) 2004 Eric Niebler
|
|
Copyright (c) 2005 Thomas Guest
|
|
http://spirit.sourceforge.net/
|
|
|
|
Use, modification and distribution is subject to 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)
|
|
=============================================================================*/
|
|
#include "state.hpp"
|
|
#include "state_save.hpp"
|
|
#include "document_state.hpp"
|
|
#include "quickbook.hpp"
|
|
#include "grammar.hpp"
|
|
#include "native_text.hpp"
|
|
#include "utils.hpp"
|
|
#include "phrase_tags.hpp"
|
|
#include <boost/foreach.hpp>
|
|
|
|
#if (defined(BOOST_MSVC) && (BOOST_MSVC <= 1310))
|
|
#pragma warning(disable:4355)
|
|
#endif
|
|
|
|
namespace quickbook
|
|
{
|
|
char const* quickbook_get_date = "__quickbook_get_date__";
|
|
char const* quickbook_get_time = "__quickbook_get_time__";
|
|
|
|
unsigned qbk_version_n = 0; // qbk_major_version * 100 + qbk_minor_version
|
|
|
|
state::state(fs::path const& filein_, fs::path const& xinclude_base_,
|
|
string_stream& out_, document_state& document)
|
|
: grammar_()
|
|
|
|
, order_pos(0)
|
|
, xinclude_base(xinclude_base_)
|
|
|
|
, templates()
|
|
, error_count(0)
|
|
, anchors()
|
|
, warned_about_breaks(false)
|
|
, conditional(true)
|
|
, document(document)
|
|
, callouts()
|
|
, callout_depth(0)
|
|
, dependencies()
|
|
, explicit_list(false)
|
|
|
|
, imported(false)
|
|
, macro()
|
|
, source_mode()
|
|
, source_mode_next()
|
|
, source_mode_next_pos()
|
|
, current_file(0)
|
|
, current_path(filein_, 0, filein_.filename())
|
|
|
|
, template_depth(0)
|
|
, min_section_level(1)
|
|
|
|
, in_list(false)
|
|
, in_list_save()
|
|
, out(out_)
|
|
, phrase()
|
|
|
|
, values(¤t_file)
|
|
{
|
|
// add the predefined macros
|
|
macro.add
|
|
("__DATE__", std::string(quickbook_get_date))
|
|
("__TIME__", std::string(quickbook_get_time))
|
|
("__FILENAME__", std::string())
|
|
;
|
|
update_filename_macro();
|
|
|
|
boost::scoped_ptr<quickbook_grammar> g(
|
|
new quickbook_grammar(*this));
|
|
grammar_.swap(g);
|
|
}
|
|
|
|
quickbook_grammar& state::grammar() const {
|
|
return *grammar_;
|
|
}
|
|
|
|
void state::update_filename_macro() {
|
|
*boost::spirit::classic::find(macro, "__FILENAME__")
|
|
= detail::encode_string(
|
|
detail::path_to_generic(current_path.abstract_file_path));
|
|
}
|
|
|
|
unsigned state::get_new_order_pos() {
|
|
return ++order_pos;
|
|
}
|
|
|
|
void state::push_output() {
|
|
out.push();
|
|
phrase.push();
|
|
in_list_save.push(in_list);
|
|
}
|
|
|
|
void state::pop_output() {
|
|
phrase.pop();
|
|
out.pop();
|
|
in_list = in_list_save.top();
|
|
in_list_save.pop();
|
|
}
|
|
|
|
source_mode_info state::tagged_source_mode() const {
|
|
source_mode_info result;
|
|
|
|
BOOST_FOREACH(source_mode_info const& s, tagged_source_mode_stack) {
|
|
result.update(s);
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
source_mode_info state::current_source_mode() const {
|
|
source_mode_info result = source_mode;
|
|
|
|
result.update(document.section_source_mode());
|
|
|
|
BOOST_FOREACH(source_mode_info const& s, tagged_source_mode_stack) {
|
|
result.update(s);
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
void state::change_source_mode(source_mode_type s) {
|
|
source_mode = source_mode_info(s, get_new_order_pos());
|
|
}
|
|
|
|
void state::push_tagged_source_mode(source_mode_type s) {
|
|
tagged_source_mode_stack.push_back(
|
|
source_mode_info(s, s ? get_new_order_pos() : 0));
|
|
}
|
|
|
|
void state::pop_tagged_source_mode() {
|
|
assert(!tagged_source_mode_stack.empty());
|
|
tagged_source_mode_stack.pop_back();
|
|
}
|
|
|
|
state_save::state_save(quickbook::state& state, scope_flags scope)
|
|
: state(state)
|
|
, scope(scope)
|
|
, qbk_version(qbk_version_n)
|
|
, imported(state.imported)
|
|
, current_file(state.current_file)
|
|
, current_path(state.current_path)
|
|
, xinclude_base(state.xinclude_base)
|
|
, source_mode(state.source_mode)
|
|
, macro()
|
|
, template_depth(state.template_depth)
|
|
, min_section_level(state.min_section_level)
|
|
{
|
|
if (scope & scope_macros) macro = state.macro;
|
|
if (scope & scope_templates) state.templates.push();
|
|
if (scope & scope_output) {
|
|
state.push_output();
|
|
}
|
|
state.values.builder.save();
|
|
}
|
|
|
|
state_save::~state_save()
|
|
{
|
|
state.values.builder.restore();
|
|
boost::swap(qbk_version_n, qbk_version);
|
|
boost::swap(state.imported, imported);
|
|
boost::swap(state.current_file, current_file);
|
|
boost::swap(state.current_path, current_path);
|
|
boost::swap(state.xinclude_base, xinclude_base);
|
|
boost::swap(state.source_mode, source_mode);
|
|
if (scope & scope_output) {
|
|
state.pop_output();
|
|
}
|
|
if (scope & scope_templates) state.templates.pop();
|
|
if (scope & scope_macros) state.macro = macro;
|
|
boost::swap(state.template_depth, template_depth);
|
|
boost::swap(state.min_section_level, min_section_level);
|
|
}
|
|
}
|