1 /*=============================================================================
2 Copyright (c) 2011-2013 Daniel James
4 Use, modification and distribution is subject to the Boost Software
5 License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
6 http://www.boost.org/LICENSE_1_0.txt)
7 =============================================================================*/
9 #if !defined(BOOST_QUICKBOOK_DOCUMENT_STATE_IMPL_HPP)
10 #define BOOST_QUICKBOOK_DOCUMENT_STATE_IMPL_HPP
12 #include "document_state.hpp"
13 #include "phrase_tags.hpp"
15 #include <boost/utility/string_ref.hpp>
16 #include <boost/shared_ptr.hpp>
26 // When generating the xml, quickbook can't allocate the identifiers until
27 // the end, so it stores in the intermedia xml a placeholder string,
28 // e.g. id="$1". This represents one of these placeholders.
33 unsigned index; // The index in document_state_impl::placeholders.
34 // Use for the dollar identifiers in
36 std::string unresolved_id;
37 // The id that would be generated
38 // without any duplicate handling.
39 // Used for generating old style header anchors.
40 std::string id; // The node id.
41 id_placeholder const* parent;
42 // Placeholder of the parent id.
44 unsigned num_dots; // Number of dots in the id.
45 // Normally equal to the section level
46 // but not when an explicit id contains
49 id_placeholder(unsigned index, boost::string_ref id,
50 id_category category, id_placeholder const* parent_);
52 std::string to_string() const;
56 // document_state_impl
58 // Contains all the data tracked by document_state.
65 struct document_state_impl
67 boost::shared_ptr<file_info> current_file;
68 std::deque<id_placeholder> placeholders;
70 // Placeholder methods
72 id_placeholder const* add_placeholder(boost::string_ref, id_category,
73 id_placeholder const* parent = 0);
75 id_placeholder const* get_placeholder(boost::string_ref) const;
77 id_placeholder const* get_id_placeholder(
78 boost::shared_ptr<section_info> const& section) const;
82 id_placeholder const* start_file(
83 unsigned compatibility_version,
85 boost::string_ref include_doc_id,
91 id_placeholder const* add_id(
93 id_category category);
94 id_placeholder const* old_style_id(
96 id_category category);
97 id_placeholder const* begin_section(
100 source_mode_info const&);
104 id_placeholder const* add_id_to_section(
105 boost::string_ref id,
106 id_category category,
107 boost::shared_ptr<section_info> const& section);
108 id_placeholder const* create_new_section(
109 boost::string_ref id,
110 id_category category,
111 source_mode_info const&);
114 std::string replace_ids(document_state_impl const& state, boost::string_ref xml,
115 std::vector<std::string> const* = 0);
116 std::vector<std::string> generate_ids(document_state_impl const&, boost::string_ref);
118 std::string normalize_id(boost::string_ref src_id);
119 std::string normalize_id(boost::string_ref src_id, std::size_t);
122 // Xml subset parser used for finding id values.
124 // I originally tried to integrate this into the post processor
125 // but that proved tricky. Alternatively it could use a proper
126 // xml parser, but I want this to be able to survive badly
127 // marked up escapes.
134 std::vector<std::string> id_attributes;
137 virtual void start(boost::string_ref) {}
138 virtual void id_value(boost::string_ref) {}
139 virtual void finish(boost::string_ref) {}
140 virtual ~callback() {}
143 void parse(boost::string_ref, callback&);