checkpoint commit before cleanup

This commit is contained in:
Peter Molnar 2016-08-04 08:58:53 +00:00
parent 4363d2ad09
commit 92a24e6d6b

View file

@ -29,16 +29,86 @@ namespace WP_FLATEXPORTS;
define ( 'WP_FLATEXPORTS\force', true ); define ( 'WP_FLATEXPORTS\force', true );
define ( 'WP_FLATEXPORTS\basedir', 'flat' ); define ( 'WP_FLATEXPORTS\basedir', 'flat' );
define ( 'WP_FLATEXPORTS\basefile', 'index.txt' ); define ( 'flatroot', \WP_CONTENT_DIR . DIRECTORY_SEPARATOR . 'flat' );
define ( 'WP_FLATEXPORTS\pandocfile', 'content.asciidoc' ); define ( 'WP_FLATEXPORTS\txtfile', 'index.txt' );
define ( 'WP_FLATEXPORTS\mdfile', 'item.md' );
define ( 'WP_FLATEXPORTS\htmlfile', 'index.html' );
//define ( 'WP_FLATEXPORTS\pandocfile', 'content.asciidoc' );
define ( 'WP_FLATEXPORTS\maxattachments', 100 ); define ( 'WP_FLATEXPORTS\maxattachments', 100 );
define ( 'WP_FLATEXPORTS\expire', 10 ); define ( 'WP_FLATEXPORTS\expire', 10 );
define ( 'WP_FLATEXPORTS\wrap', 80 ); define ( 'WP_FLATEXPORTS\wrap', 80 );
\register_activation_hook( __FILE__ , '\WP_FLATEXPORTS\plugin_activate' ); \register_activation_hook( __FILE__ , '\WP_FLATEXPORTS\plugin_activate' );
\add_action( 'wp', '\WP_FLATEXPORTS\export' );
\add_action ( 'init', '\WP_FLATEXPORTS\init' );
// init all the things
\add_action( 'init', '\WP_FLATEXPORTS\init' );
// export on any change made to a post
\add_action( 'transition_post_status', '\WP_FLATEXPORTS\export_auto' );
// cron based export for all posts
\add_action( 'wp_flatexport', '\WP_FLATEXPORTS\export_all' );
// display plain text with https://site.com/path/to/post/text
\add_action( 'template_redirect', '\WP_FLATEXPORTS\display' );
//
\add_action( 'wp', '\WP_FLATEXPORTS\export' );
// this is to capture the complete, rendered HTML
// fired on post visit, sadly; for WordPress, there seems to be no other way
// to properly trigger this
export_html_init();
/**
*
*/
function export_html_init( ) {
ob_start( '\WP_FLATEXPORTS\export_html' );
}
/**
*
*/
function export_html( $buffer ) {
$buffer = trim($buffer);
if ( ! is_singular() || is_user_logged_in() )
return $buffer;
$post = fix_post();
if ( $post === false )
return $buffer;
// create directory structure
$filename = $post->post_name;
$flatdir = flatroot . DIRECTORY_SEPARATOR . $filename;
$flatfile = $flatdir . DIRECTORY_SEPARATOR . htmlfile;
if ( ! is_dir( $flatdir ) )
return $buffer;
$post_timestamp = \get_the_modified_time( 'U', $post->ID );
$file_timestamp = 0;
if ( @file_exists($flatfile) ) {
$file_timestamp = @filemtime ( $flatfile );
if ( $file_timestamp == $post_timestamp && force == false ) {
return $buffer;
}
}
//$buffer = post_content_clean_uploaddir( $buffer, $post );
file_put_contents( $flatfile, $buffer );
touch ( $flatfile, $post_timestamp );
return trim($buffer);
}
/** /**
* activate hook * activate hook
@ -56,16 +126,21 @@ function plugin_activate() {
function init () { function init () {
$filters = array ( $filters = array (
'wp_flatexport_post' => array ( 'wp_flatexport_md' => array (
'insert_title', 'md_insert_meta',
'insert_excerpt', 'txt_insert_excerpt',
'insert_content', 'txt_insert_content',
'insert_published', ),
'insert_urls', 'wp_flatexport_txt' => array (
'insert_author', 'txt_insert_title',
'insert_tags', 'txt_insert_excerpt',
'insert_location', 'txt_insert_content',
'insert_uuid', 'txt_insert_published',
'txt_insert_urls',
'txt_insert_author',
'txt_insert_tags',
'txt_insert_location',
'txt_insert_uuid',
), ),
'wp_flatexport_content' => array ( 'wp_flatexport_content' => array (
'post_content_resized2orig', 'post_content_resized2orig',
@ -75,10 +150,14 @@ function init () {
//'post_content_pandoc', //'post_content_pandoc',
'post_content_fix_emstrong', 'post_content_fix_emstrong',
'post_content_fix_dl', 'post_content_fix_dl',
'post_content_fix_surprises',
'post_content_url2footnote', 'post_content_url2footnote',
'post_content_headers', 'post_content_setext_headers',
//'post_content_urls', //'post_content_urls',
), ),
'wp_flatexport_meta' => array (
'meta_add_location',
),
'wp_flatexport_comment' => array ( 'wp_flatexport_comment' => array (
'comment_insert_type', 'comment_insert_type',
'comment_insert_content', 'comment_insert_content',
@ -98,9 +177,30 @@ function init () {
} }
} }
\add_rewrite_endpoint( 'text', EP_PERMALINK );
if (!wp_get_schedule( 'wp_flatexport' ))
wp_schedule_event ( time(), 'daily', 'wp_flatexport' );
} }
/**
*
*/
function display () {
global $wp_query;
// if this is not a request for json or a singular object then bail
if ( ! isset( $wp_query->query_vars['text'] ) || ! is_singular() )
return;
// include custom template
header("Content-Type: text/plain");
print export();
exit;
}
/**
*
*/
function depthmap () { function depthmap () {
return array ( return array (
@ -116,9 +216,18 @@ function depthmap () {
* *
*/ */
function _insert_head ( $title, $depth = 2 ) { function _insert_head ( $title, $depth = 2 ) {
$map = depthmap(); if ( $depth > 2 ) {
$underline = str_repeat( $map[ $depth ], mb_strlen( $title) ); $prefix = str_repeat( "#", $depth );
return "\n\n{$title}\n${underline}\n"; $r = "\n\n{$prefix} {$title}\n";
}
else {
$map = depthmap();
$underline = str_repeat( $map[ $depth ], mb_strlen( $title) );
$r = "\n\n{$title}\n${underline}\n";
}
return $r;
} }
/** /**
@ -128,7 +237,7 @@ function _insert_head ( $title, $depth = 2 ) {
* ============ * ============
* *
*/ */
function insert_title ( $text, $post ) { function txt_insert_title ( $text, $post ) {
$title = trim( \get_the_title( $post->ID ) ); $title = trim( \get_the_title( $post->ID ) );
@ -155,7 +264,7 @@ function insert_title ( $text, $post ) {
* this should not ever change! * this should not ever change!
* *
*/ */
function insert_uuid ( $text, $post ) { function txt_insert_uuid ( $text, $post ) {
$uuid = hash ( $uuid = hash (
'md5', 'md5',
@ -174,12 +283,12 @@ function insert_uuid ( $text, $post ) {
* *
* \n\n (post excerpt) * \n\n (post excerpt)
*/ */
function insert_excerpt ( $text, $post ) { function txt_insert_excerpt ( $text, $post ) {
$excerpt = trim( $post->post_excerpt ); $excerpt = trim( $post->post_excerpt );
if( ! empty( $excerpt ) ) if( ! empty( $excerpt ) )
$text .= "\n\n" . $excerpt; $text .= "\n" . $excerpt;
return $text; return $text;
@ -191,7 +300,7 @@ function insert_excerpt ( $text, $post ) {
* *
* \n\n (post content) * \n\n (post content)
*/ */
function insert_content ( $text, $post ) { function txt_insert_content ( $text, $post ) {
$content = apply_filters( $content = apply_filters(
'wp_flatexport_content', 'wp_flatexport_content',
trim( $post->post_content ), trim( $post->post_content ),
@ -199,7 +308,7 @@ function insert_content ( $text, $post ) {
); );
if ( ! empty( $content ) ) if ( ! empty( $content ) )
$text .= "\n\n" . $content; $text .= "\n" . $content;
return $text; return $text;
} }
@ -213,16 +322,22 @@ function insert_content ( $text, $post ) {
* initial - (post publish date in Y-m-d H:i:s P format) * initial - (post publish date in Y-m-d H:i:s P format)
* [current - (post last update date in Y-m-d H:i:s P format)] * [current - (post last update date in Y-m-d H:i:s P format)]
*/ */
function insert_published ( $text, $post ) { function txt_insert_published ( $text, $post ) {
$published = \get_the_time( 'Y-m-d H:i:s P', $post->ID ); $published = \get_the_time( 'Y-m-d H:i:s P', $post->ID );
$modified = \get_the_modified_time( 'Y-m-d H:i:s P', $post->ID ); $modified = \get_the_modified_time( 'Y-m-d H:i:s P', $post->ID );
$text .= _insert_head ( "Published" ); $published = \get_the_time( 'U', $post->ID );
$text .= "initial - {$published}"; $modified = \get_the_modified_time( 'U', $post->ID );
if ( $published != $modified )
$text .= "\ncurrent - {$modified}"; $text .= _insert_head ( "Published" );
//$text .= "initial - {$published}";
$text .= "- " . date( 'Y-m-d H:i:s P', $published );
if ( $published != $modified && $modified > $published )
$text .= "\n- " . date( 'Y-m-d H:i:s P', $modified );
//$text .= "\ncurrent - {$modified}";
return $text; return $text;
} }
@ -238,7 +353,18 @@ function insert_published ( $text, $post ) {
* - (post permalink) * - (post permalink)
* [- additional urls, one per line] * [- additional urls, one per line]
*/ */
function insert_urls ( $text, $post ) { function txt_insert_urls ( $text, $post ) {
// basic ones
$slugs = list_urls( $post );
$text .= _insert_head ( "URLs" );
$text .= "- " . join ( "\n- ", $slugs );
return $text;
}
function list_urls ( $post ) {
// basic ones // basic ones
$slugs = \get_post_meta ( $post->ID, '_wp_old_slug' ); $slugs = \get_post_meta ( $post->ID, '_wp_old_slug' );
@ -287,13 +413,10 @@ function insert_urls ( $text, $post ) {
return strlen( $a ) - strlen( $b ); return strlen( $a ) - strlen( $b );
} }
); );
return $slugs;
$text .= _insert_head ( "URLs" );
$text .= "- " . join ( "\n- ", $slugs );
return $text;
} }
/** /**
* *
* extends the $text with * extends the $text with
@ -304,7 +427,7 @@ function insert_urls ( $text, $post ) {
* avatar URL * avatar URL
* [ author URL ] * [ author URL ]
*/ */
function insert_author ( $text, $post ) { function txt_insert_author ( $text, $post ) {
$author_id = $post->post_author; $author_id = $post->post_author;
$author = \get_the_author_meta ( 'display_name' , $author_id ); $author = \get_the_author_meta ( 'display_name' , $author_id );
@ -326,7 +449,20 @@ function insert_author ( $text, $post ) {
$author .= "\n${avatar}"; $author .= "\n${avatar}";
if ( $author_url = \get_the_author_meta ( 'url' , $author_id ) ) if ( $author_url = \get_the_author_meta ( 'url' , $author_id ) )
$author .= " \n{$author_url}"; $author .= " \n- {$author_url}";
$socials = array (
'github' => 'https://github.com/%s',
'flickr' => 'https://www.flickr.com/people/%s',
'key' => '%s',
);
foreach ( $socials as $silo => $pattern ) {
$socialmeta = get_the_author_meta ( $silo , $author_id );
if ( !empty($socialmeta) )
$author .= "\n- " . sprintf ( $pattern, $socialmeta );
}
$text .= _insert_head ( "Author" ); $text .= _insert_head ( "Author" );
@ -343,7 +479,7 @@ function insert_author ( $text, $post ) {
* ---- * ----
* \#(comma separated list of # tags) * \#(comma separated list of # tags)
*/ */
function insert_tags ( $text, $post ) { function txt_insert_tags ( $text, $post ) {
$raw_tags = \wp_get_post_terms( $post->ID, 'post_tag' ); $raw_tags = \wp_get_post_terms( $post->ID, 'post_tag' );
@ -374,7 +510,7 @@ function insert_tags ( $text, $post ) {
* -------- * --------
* latitude,longitude[@altitude] * latitude,longitude[@altitude]
*/ */
function insert_location ( $text, $post ) { function txt_insert_location ( $text, $post ) {
// geo // geo
$lat = \get_post_meta ( $post->ID, 'geo_latitude' , true ); $lat = \get_post_meta ( $post->ID, 'geo_latitude' , true );
@ -638,7 +774,7 @@ function post_content_url2footnote ( $content, $post ) {
/** /**
* export with pandoc * export with pandoc
* *
*/ *
function post_content_pandoc ( $content, $post ) { function post_content_pandoc ( $content, $post ) {
$flatroot = \WP_CONTENT_DIR . DIRECTORY_SEPARATOR . basedir; $flatroot = \WP_CONTENT_DIR . DIRECTORY_SEPARATOR . basedir;
$flatdir = $flatroot . DIRECTORY_SEPARATOR . $post->post_name; $flatdir = $flatroot . DIRECTORY_SEPARATOR . $post->post_name;
@ -656,6 +792,7 @@ function post_content_pandoc ( $content, $post ) {
return $content; return $content;
} }
*/
/** /**
* find markdown links and replace them with footnote versions * find markdown links and replace them with footnote versions
@ -665,27 +802,29 @@ function post_content_fix_emstrong ( $content, $post ) {
// these regexes are borrowed from https://github.com/erusev/parsedown // these regexes are borrowed from https://github.com/erusev/parsedown
$regexes = array (
$invalid = array (
'strong' => array( 'strong' => array(
'**' => '/[*]{2}((?:\\\\\*|[^*]|[*][^*]*[*])+?)[*]{2}(?![*])/s', //'**' => '/[*]{2}((?:\\\\\*|[^*]|[*][^*]*[*])+?)[*]{2}(?![*])/s',
'__' => '/__((?:\\\\_|[^_]|_[^_]*_)+?)__(?!_)/us', '__' => '/__((?:\\\\_|[^_]|_[^_]*_)+?)__(?!_)/us',
), ),
'em' => array ( 'em' => array (
'*' => '/[*]((?:\\\\\*|[^*]|[*][*][^*]+?[*][*])+?)[*](?![*])/s', '*' => '/[*]((?:\\\\\*|[^*]|[*][*][^*]+?[*][*])+?)[*](?![*])/s',
'_' => '/_((?:\\\\_|[^_]|__[^_]*__)+?)_(?!_)\b/us', //'_' => '/_((?:\\\\_|[^_]|__[^_]*__)+?)_(?!_)\b/us',
) )
); );
$replace_map = array ( $replace_map = array (
'*' => '/', '*' => '_',
'_' => '/', //'_' => '/',
'**' => '*', //'**' => '*',
'__' => '*', '__' => '**',
); );
foreach ( $regexes as $what => $subregexes ) {
foreach ( $invalid as $what => $regexes ) {
$m = array(); $m = array();
foreach ( $subregexes as $key => $regex ) { foreach ( $regexes as $key => $regex ) {
preg_match_all( $regex, $content, $m ); preg_match_all( $regex, $content, $m );
if ( empty( $m ) || ! isset( $m[0] ) || empty( $m[0] ) ) if ( empty( $m ) || ! isset( $m[0] ) || empty( $m[0] ) )
continue; continue;
@ -722,6 +861,16 @@ function post_content_fix_dl ( $content, $post ) {
return $content; return $content;
} }
/**
*
*
*/
function post_content_fix_surprises ( $content, $post ) {
$content = str_replace ( ''', "'", $content );
return $content;
}
@ -730,7 +879,7 @@ function post_content_fix_dl ( $content, $post ) {
* underlined version * underlined version
* *
*/ */
function post_content_headers ( $content, $post ) { function post_content_setext_headers ( $content, $post ) {
$map = depthmap(); $map = depthmap();
preg_match_all( "/^([#]+)\s?+(.*)$/m", $content, $m ); preg_match_all( "/^([#]+)\s?+(.*)$/m", $content, $m );
@ -738,6 +887,10 @@ function post_content_headers ( $content, $post ) {
if ( ! empty( $m ) && isset( $m[0] ) && ! empty( $m[0] ) ) { if ( ! empty( $m ) && isset( $m[0] ) && ! empty( $m[0] ) ) {
foreach ( $m[0] as $cntr => $match ) { foreach ( $m[0] as $cntr => $match ) {
$depth = strlen( trim( $m[1][$cntr] ) ); $depth = strlen( trim( $m[1][$cntr] ) );
if ( $depth > 2 )
continue;
$title = trim( $m[2][$cntr] ); $title = trim( $m[2][$cntr] );
$u = str_repeat( $map[ $depth ], mb_strlen( $title ) ); $u = str_repeat( $map[ $depth ], mb_strlen( $title ) );
$content = str_replace ( $match, "{$title}\n{$u}", $content ); $content = str_replace ( $match, "{$title}\n{$u}", $content );
@ -761,26 +914,58 @@ function post_content ( &$post ) {
); );
} }
/**
*
*/
function export_all () {
$types = get_post_types();
$exclude = [ 'attachment', 'revision', 'nav_menu_item' ];
foreach ( $exclude as $ex )
unset ( $types[ $ex ] );
$args = [
'posts_per_page' => -1,
'post_types' => array_keys( $types ),
];
$posts = get_posts( $args );
foreach ( $posts as $post ) {
export ( $post );
}
}
/** /**
* *
*/ */
function export () { function export_auto ( $new_status = null , $old_status = null, $post = null ) {
if ( null === $new_status || null === $old_status || null === $post )
return;
if ( ! \is_singular() ) export ( $post );
return false; }
$post = fix_post(); /**
*
*/
function export ( $post = null ) {
if ( null === $post ) {
if ( ! \is_singular() )
return false;
}
$post = fix_post( $post );
if ( $post === false ) if ( $post === false )
return false; return false;
// create directory structure // create directory structure
$filename = $post->post_name; $filename = $post->post_name;
$flatroot = \WP_CONTENT_DIR . DIRECTORY_SEPARATOR . basedir; $flatdir = \flatroot . DIRECTORY_SEPARATOR . $filename;
$flatdir = $flatroot . DIRECTORY_SEPARATOR . $filename; $flatfile = $flatdir . DIRECTORY_SEPARATOR . txtfile;
$flatfile = $flatdir . DIRECTORY_SEPARATOR . basefile; $mdfile = $flatdir . DIRECTORY_SEPARATOR . mdfile;
$post_timestamp = \get_the_modified_time( 'U', $post->ID ); $post_timestamp = \get_the_modified_time( 'U', $post->ID );
$file_timestamp = 0; $file_timestamp = 0;
@ -789,11 +974,11 @@ function export () {
$file_timestamp = @filemtime ( $flatfile ); $file_timestamp = @filemtime ( $flatfile );
} }
$mkdir = array ( $flatroot, $flatdir ); $mkdir = array ( \flatroot, $flatdir );
foreach ( $mkdir as $dir ) { foreach ( $mkdir as $dir ) {
if ( !is_dir($dir)) { if ( !is_dir($dir)) {
if (!mkdir( $dir )) { if (!mkdir( $dir )) {
debug_log('Failed to create ' . $dir . ', exiting export', 4); debug ('Failed to create ' . $dir . ', exiting export', 4);
return false; return false;
} }
} }
@ -852,13 +1037,21 @@ function export () {
return true; return true;
} }
$out = trim ( apply_filters ( 'wp_flatexport_post', "", $post ) ); $txt = trim ( apply_filters ( 'wp_flatexport_txt', "", $post ) ) . "\n\n";
// write log // write log
debug ( "Exporting #{$post->ID}, {$post->post_name} to {$flatfile}", 6 ); debug ( "Exporting #{$post->ID}, {$post->post_name} to {$flatfile}", 6 );
file_put_contents ($flatfile, $out); file_put_contents ($flatfile, $txt);
touch ( $flatfile, $post_timestamp ); touch ( $flatfile, $post_timestamp );
return true;
//$md = trim ( apply_filters ( 'wp_flatexport_md', "", $post ) );
// write log
//debug ( "Exporting #{$post->ID}, {$post->post_name} to {$mdfile}", 6 );
//file_put_contents ($mdfile, $md);
//touch ( $mdfile, $post_timestamp );
return $txt;
} }
/** /**
@ -866,8 +1059,7 @@ function export () {
*/ */
function export_comment ( $post, $comment ) { function export_comment ( $post, $comment ) {
$filename = $post->post_name; $filename = $post->post_name;
$flatroot = \WP_CONTENT_DIR . DIRECTORY_SEPARATOR . basedir; $flatdir = flatroot . DIRECTORY_SEPARATOR . $filename;
$flatdir = $flatroot . DIRECTORY_SEPARATOR . $filename;
$cfile = "comment_{$comment->comment_ID}.txt"; $cfile = "comment_{$comment->comment_ID}.txt";
$cfile = $flatdir . DIRECTORY_SEPARATOR . $cfile; $cfile = $flatdir . DIRECTORY_SEPARATOR . $cfile;
@ -891,20 +1083,25 @@ function export_comment ( $post, $comment ) {
touch ( $cfile, $c_timestamp ); touch ( $cfile, $c_timestamp );
} }
function meta_add_location ( $meta, $post ) {
return $meta;
}
/** /**
* *
* */
function yaml_header ( &$post ) { function md_insert_meta ( $md, $post ) {
if ( ! extension_loaded( 'yaml') || ! function_exists( 'yaml_emit') ) if ( ! extension_loaded( 'yaml') || ! function_exists( 'yaml_emit') )
return false; return $md;
$meta = [];
$tags = \wp_get_post_terms( $post->ID, 'post_tag' ); $tags = \wp_get_post_terms( $post->ID, 'post_tag' );
foreach ( $tags as $k => $tag ) { foreach ( $tags as $k => $tag ) {
$tags[ $k ] = "{$tag->name}"; $tags[ $k ] = "{$tag->name}";
} }
$urls = get_insert_urls ( $post ); $urls = list_urls( $post );
$permalink = \get_permalink( $post ); $permalink = \get_permalink( $post );
foreach ( $urls as $k => $url ) { foreach ( $urls as $k => $url ) {
@ -917,19 +1114,67 @@ function yaml_header ( &$post ) {
$urls[ $k ] = str_replace ( rtrim( site_url() . '/' ), '/', $url ); $urls[ $k ] = str_replace ( rtrim( site_url() . '/' ), '/', $url );
} }
$yaml = array ( $meta = [
'title' => $post->post_title, 'title' => $post->post_title,
'description' => $post->post_excerpt, 'description' => strip_tags($post->post_excerpt),
'date' => \get_the_time( 'Y-m-d H:i:s P', $post->ID ); 'publish_date' => \get_the_time( 'Y-m-d H:i:s P', $post->ID ),
'tags' => $tags, 'tags' => $tags,
'aliases' => $urls,
'slug' => $post->post_name, 'slug' => $post->post_name,
'url' => $permalink, 'url' => $permalink,
'published' => 'true',
'routes' => [
'canonical' => str_replace ( rtrim( site_url() . '/' ), '/', $permalink ),
'aliases' => $urls
]
];
//$modified = \get_the_modified_time( 'Y-m-d H:i:s P', $post->ID ); $meta = apply_filters( 'wp_flatexport_meta', $meta, $post );
$meta = yaml_emit( $meta );
return "{$meta}{$md}";
}
/**
* generate gravatar img link
*/
function gravatar ( $email ) {
return sprintf(
'https://s.gravatar.com/avatar/%s?=64',
md5( strtolower( trim( $email ) ) )
); );
}
/**
*
*
function on_publish( $new_status, $old_status, $post ) {
$post = fix_post ( $post );
if ( false === $post )
return false;
$content = export( $post );
if ( $post->post_content_filtered == $export )
return true;
global $wpdb;
$dbname = "{$wpdb->prefix}posts";
$req = false;
debug("Updating post content for #{$post->ID}", 5);
$q = $wpdb->prepare( "UPDATE `{$dbname}` SET `post_content_filtered`='%s' WHERE `ID`='{$post->ID}'", $content );
try {
$req = $wpdb->query( $q );
}
catch (Exception $e) {
debug('Something went wrong: ' . $e->getMessage(), 4);
}
return true;
} }
*/ */
@ -1018,13 +1263,3 @@ function debug( $message, $level = LOG_NOTICE ) {
return error_log( "{$parent}: {$message}" ); return error_log( "{$parent}: {$message}" );
} }
/**
* generate gravatar img link
*/
function gravatar ( $email ) {
return sprintf(
'https://s.gravatar.com/avatar/%s?=64',
md5( strtolower( trim( $email ) ) )
);
}