@ -1,7 +1,8 @@
@@ -1,7 +1,8 @@
# include <map>
# include <ranges>
# include <stack>
# include <map>
# include <unordered_ map>
# include <vector>
# include <string>
# include <filesystem>
@ -17,6 +18,7 @@ namespace fs = std::filesystem;
@@ -17,6 +18,7 @@ namespace fs = std::filesystem;
const std : : string TEMPLATE_CODE_START = " {{ " ;
const std : : string TEMPLATE_CODE_END = " }} " ;
enum job_type {
COPY_FILE = 1 ,
MARKDOWN = 1 < < 1 ,
@ -31,7 +33,7 @@ enum job_type {
@@ -31,7 +33,7 @@ enum job_type {
struct blog_item {
job_type type ;
fs : : path src ;
std : : map < std : : string , std : : string > properties ;
std : : unordered_ map< std : : string , std : : string > properties ;
time_t post_date ;
} ;
@ -48,7 +50,7 @@ class substitution_plugin {
@@ -48,7 +50,7 @@ class substitution_plugin {
/* Must return lengh of replaced text */
virtual int perform_substitution ( int start , int end , const std : : string & invocation ,
std : : string & file_text ,
const std : : map < std : : string , std : : string > & properties ) = 0 ;
const std : : unordered_ map< std : : string , std : : string > & properties ) = 0 ;
virtual ~ substitution_plugin ( ) = default ;
} ;
@ -59,7 +61,7 @@ class s2_substitution_plugin : public substitution_plugin {
@@ -59,7 +61,7 @@ class s2_substitution_plugin : public substitution_plugin {
int
perform_substitution ( int start , int end , const std : : string & invocation ,
std : : string & file_text ,
const std : : map < std : : string , std : : string > & properties ) override
const std : : unordered_ map< std : : string , std : : string > & properties ) override
{
return 0 ;
}
@ -68,8 +70,8 @@ class s2_substitution_plugin : public substitution_plugin {
@@ -68,8 +70,8 @@ class s2_substitution_plugin : public substitution_plugin {
virtual int
perform_substitution ( int start , int end , const std : : string & invocation ,
std : : string & file_text ,
const std : : map < std : : string , std : : string > & properties ,
const std : : map < fs : : path , blog_item > & pages ) = 0 ;
const std : : unordered_ map< std : : string , std : : string > & properties ,
const std : : unordered_ map< fs : : path , blog_item , pathHash > & pages ) = 0 ;
} ;
/*
@ -121,7 +123,7 @@ class file_transclude_plugin : public substitution_plugin {
@@ -121,7 +123,7 @@ class file_transclude_plugin : public substitution_plugin {
int perform_substitution ( int start , int end , const std : : string & invocation ,
std : : string & file_text ,
const std : : map < std : : string , std : : string > & properties ) override {
const std : : unordered_ map< std : : string , std : : string > & properties ) override {
auto args = get_arguments ( invocation , 1 ) ;
std : : string filename { args . at ( 1 ) } ;
@ -154,7 +156,7 @@ class mmd_snippet_transclude_plugin : public substitution_plugin {
@@ -154,7 +156,7 @@ class mmd_snippet_transclude_plugin : public substitution_plugin {
int perform_substitution ( int start , int end , const std : : string & invocation ,
std : : string & file_text ,
const std : : map < std : : string , std : : string > & properties ) override {
const std : : unordered_ map< std : : string , std : : string > & properties ) override {
auto args = get_arguments ( invocation , 1 ) ;
fs : : path path ;
@ -177,7 +179,7 @@ class variable_transclude_plugin final : public substitution_plugin {
@@ -177,7 +179,7 @@ class variable_transclude_plugin final : public substitution_plugin {
int perform_substitution ( int start , int end , const std : : string & invocation ,
std : : string & file_text ,
const std : : map < std : : string , std : : string > & properties ) override {
const std : : unordered_ map< std : : string , std : : string > & properties ) override {
auto args = get_arguments ( invocation , 1 ) ;
@ -214,7 +216,7 @@ class ifdef_plugin : public substitution_plugin {
@@ -214,7 +216,7 @@ class ifdef_plugin : public substitution_plugin {
do_replace should_substitute ( int start , int end , const std : : string & invocation ,
std : : string & file_text ,
const std : : map < std : : string , std : : string > & properties ) {
const std : : unordered_ map< std : : string , std : : string > & properties ) {
do_replace val { } ;
val . first = invocation . find ( " : " ) + 1 ;
@ -247,7 +249,7 @@ class ifdef_plugin : public substitution_plugin {
@@ -247,7 +249,7 @@ class ifdef_plugin : public substitution_plugin {
int perform_substitution ( int start , int end , const std : : string & invocation ,
std : : string & file_text ,
const std : : map < std : : string , std : : string > & properties ) override {
const std : : unordered_ map< std : : string , std : : string > & properties ) override {
do_replace val = should_substitute ( start , end , invocation , file_text , properties ) ;
@ -274,7 +276,7 @@ class comment_plugin : public substitution_plugin {
@@ -274,7 +276,7 @@ class comment_plugin : public substitution_plugin {
int perform_substitution ( int start , int end , const std : : string & invocation ,
std : : string & file_text ,
const std : : map < std : : string , std : : string > & properties ) override {
const std : : unordered_ map< std : : string , std : : string > & properties ) override {
std : : string subst_text = " \n " ;
@ -293,7 +295,7 @@ class ifndef_plugin : public ifdef_plugin {
@@ -293,7 +295,7 @@ class ifndef_plugin : public ifdef_plugin {
int perform_substitution ( int start , int end , const std : : string & invocation ,
std : : string & file_text ,
const std : : map < std : : string , std : : string > & properties ) override {
const std : : unordered_ map< std : : string , std : : string > & properties ) override {
do_replace val = should_substitute ( start , end , invocation , file_text , properties ) ;
@ -334,13 +336,13 @@ class file_index_plugin : public substitution_plugin {
@@ -334,13 +336,13 @@ class file_index_plugin : public substitution_plugin {
file_index_plugin ( std : : set < std : : string > exclude ) : exclude_filenames ( exclude ) { }
/**
* Recursively get a sorted map of directories .
* Recursively get a sorted unordered_ map of directories .
*
* Directory must exist . Does not handle any errors .
*
*/
std : : multimap < time_t , post_entry > get_directory_list ( const fs : : path & dir ,
const std : : map < std : : string , std : : string > & properties ) {
const std : : unordered_ map< std : : string , std : : string > & properties ) {
// todo support custom depth
@ -425,7 +427,7 @@ class file_index_plugin : public substitution_plugin {
@@ -425,7 +427,7 @@ class file_index_plugin : public substitution_plugin {
int perform_substitution ( int start , int end , const std : : string & invocation ,
std : : string & file_text ,
const std : : map < std : : string , std : : string > & properties ) override {
const std : : unordered_ map< std : : string , std : : string > & properties ) override {
int rval = 0 ;
@ -659,7 +661,7 @@ class feed_builder {
@@ -659,7 +661,7 @@ class feed_builder {
std : : multimap < time_t , blog_item > get_sorted_post_list ( const std : : string & cs_directories ,
const std : : map < std : : string , std : : string > & properties , const std : : map < fs : : path , blog_item > & pages ) {
const std : : unordered_ map< std : : string , std : : string > & properties , const std : : unordered_ map< fs : : path , blog_item , pathHash > & pages ) {
std : : vector < fs : : path > paths ;
@ -722,7 +724,7 @@ class rss_feed_plugin : public s2_substitution_plugin {
@@ -722,7 +724,7 @@ class rss_feed_plugin : public s2_substitution_plugin {
int perform_substitution ( int start , int end , const std : : string & invocation ,
std : : string & file_text ,
const std : : map < std : : string , std : : string > & properties , const std : : map < fs : : path , blog_item > & pages ) override {
const std : : unordered_ map< std : : string , std : : string > & properties , const std : : unordered_ map< fs : : path , blog_item , pathHash > & pages ) override {
auto args = get_arguments ( invocation , 2 ) ;
@ -780,7 +782,7 @@ class microblog_plugin : public s2_substitution_plugin {
@@ -780,7 +782,7 @@ class microblog_plugin : public s2_substitution_plugin {
int perform_substitution ( int start , int end , const std : : string & invocation ,
std : : string & file_text ,
const std : : map < std : : string , std : : string > & properties , const std : : map < fs : : path , blog_item > & pages ) override {
const std : : unordered_ map< std : : string , std : : string > & properties , const std : : unordered_ map< fs : : path , blog_item , pathHash > & pages ) override {
auto args = get_arguments ( invocation , 1 ) ;
std : : string relpath = args . at ( 1 ) ;
@ -830,8 +832,8 @@ class microblog_plugin : public s2_substitution_plugin {
@@ -830,8 +832,8 @@ class microblog_plugin : public s2_substitution_plugin {
class templater {
std : : map < std : : string , substitution_plugin * > substitution_commands { } ;
std : : map < std : : string , s2_substitution_plugin * > s2_substitution_commands { } ;
std : : unordered_ map< std : : string , substitution_plugin * > substitution_commands { } ;
std : : unordered_ map< std : : string , s2_substitution_plugin * > s2_substitution_commands { } ;
public :
@ -869,8 +871,8 @@ class templater {
@@ -869,8 +871,8 @@ class templater {
done_subtitution_options
do_substitution ( int start , int end , const std : : string & invocation ,
std : : string & file_text ,
const std : : map < std : : string , std : : string > & properties ,
std : : optional < const std : : map < fs : : path , blog_item > > pages )
const std : : unordered_ map< std : : string , std : : string > & properties ,
std : : optional < const std : : unordered_ map< fs : : path , blog_item , pathHash > > pages )
{
std : : string command_name = invocation . substr ( 0 , invocation . find ( " : " ) ) ;
@ -899,21 +901,21 @@ class templater {
@@ -899,21 +901,21 @@ class templater {
void
run_substitution_plugins ( std : : string & text ,
const std : : map < std : : string , std : : string > & properties )
const std : : unordered_ map< std : : string , std : : string > & properties )
{
run_substitution_plugins ( text , properties , { } , true ) ;
}
void
run_substitution_plugins_once ( std : : string & text ,
const std : : map < std : : string , std : : string > & properties )
const std : : unordered_ map< std : : string , std : : string > & properties )
{
run_substitution_plugins ( text , properties , { } , false ) ;
}
void
run_substitution_plugins ( std : : string & text ,
const std : : map < std : : string , std : : string > & properties , std : : optional < const std : : map < fs : : path , blog_item > > pages ) {
const std : : unordered_ map< std : : string , std : : string > & properties , std : : optional < const std : : unordered_ map< fs : : path , blog_item , pathHash > > pages ) {
run_substitution_plugins ( text , properties , pages , true ) ;
}
@ -921,7 +923,7 @@ class templater {
@@ -921,7 +923,7 @@ class templater {
void
run_substitution_plugins ( std : : string & text ,
const std : : map < std : : string , std : : string > & properties , std : : optional < const std : : map < fs : : path , blog_item > > pages , bool allow_recursion )
const std : : unordered_ map< std : : string , std : : string > & properties , std : : optional < const std : : unordered_ map< fs : : path , blog_item , pathHash > > pages , bool allow_recursion )
{
std : : string : : size_type next = text . find ( TEMPLATE_CODE_START , 0 ) ;