IRI

IRIs, including ones that are set with FuncIRI syntax, are passed to the user code the same way as other strings in SVG++.

The only setting in IRI Policy configures whether to distinguish local references to document fragment (IRIs prefixed with “#”) from non-local IRI references. If policy::iri::distinguish_local used (as by default), then local reference to document fragment is passed as pair of parameters: {tag::iri_fragment(), <fragment string>}. If policy::iri::raw is set, then any IRI is passed as single string.

Named class template parameter for IRI Policy is iri_policy.

Example of using default IRI Policy (src/samples/sample_iri.cpp):

#include <svgpp/svgpp.hpp>

using namespace svgpp;

struct Context
{
  template<class String>
  void set(tag::attribute::xlink::href, String const & iri)
  {
    std::cout << "IRI: " << std::string(boost::begin(iri), boost::end(iri)) << "\n";
  }

  template<class String>
  void set(tag::attribute::xlink::href, tag::iri_fragment, String const & iri)
  {
    std::cout << "Fragment: " << std::string(boost::begin(iri), boost::end(iri)) << "\n";
  }
};

int main()
{
  Context context;
  value_parser<tag::type::iri>::parse(tag::attribute::xlink::href(), context,
    std::string("http://foo.com/bar#123"), tag::source::attribute());
  value_parser<tag::type::iri>::parse(tag::attribute::xlink::href(), context,
    std::string("#rect1"), tag::source::attribute());
  // Output:
  //  "IRI: http://foo.com/bar#123"
  //  "Fragment: rect1"
  return 0;
}