'tokenforge_changelog', '_wpnonce' => wp_create_nonce( 'tokenforge_changelog' ), 'TB_iframe' => 'true', 'width' => 772, 'height' => 700, ), admin_url( 'admin-ajax.php' ) ); $links[] = '' . esc_html__( 'Changelog', 'tokenforge' ) . ''; return $links; } /** * Markdown (the small subset CHANGELOG.md uses) to safe HTML. * * @param string $md Markdown. * @return string */ public static function to_html( $md ) { $html = ''; $list = false; $para = array(); $flush = function () use ( &$html, &$para ) { if ( $para ) { $html .= '

' . implode( ' ', $para ) . "

\n"; $para = array(); } }; $inline = function ( $t ) { $t = esc_html( $t ); $t = preg_replace( '/`([^`]+)`/', '$1', $t ); return preg_replace( '/\*\*([^*]+)\*\*/', '$1', $t ); }; foreach ( preg_split( '/\r?\n/', (string) $md ) as $line ) { if ( preg_match( '/^(#{1,4})\s+(.*)$/', $line, $m ) ) { $flush(); if ( $list ) { $html .= "\n"; $list = false; } $level = min( 4, strlen( $m[1] ) ); $html .= "" . $inline( $m[2] ) . "\n"; } elseif ( preg_match( '/^\s*[-*]\s+(.*)$/', $line, $m ) ) { $flush(); if ( ! $list ) { $html .= "\n"; $list = false; } } elseif ( $list && preg_match( '/^\s{2,}(\S.*)$/', $line, $m ) ) { $html = preg_replace( '/<\/li>\n$/', ' ' . $inline( $m[1] ) . "\n", $html ); } else { $para[] = $inline( trim( $line ) ); } } $flush(); if ( $list ) { $html .= "\n"; } return $html; } /** * The popup page. * * @return void */ public static function render() { if ( ! current_user_can( 'activate_plugins' ) ) { wp_die( esc_html__( 'Sorry, you are not allowed to view this page.', 'tokenforge' ), 403 ); } check_admin_referer( 'tokenforge_changelog' ); $file = TOKENFORGE_DIR . 'CHANGELOG.md'; $md = is_readable( $file ) ? (string) file_get_contents( $file ) : ''; // phpcs:ignore WordPress.WP.AlternativeFunctions.file_get_contents_file_get_contents -- local file header( 'Content-Type: text/html; charset=utf-8' ); ?> <?php esc_html_e( 'TokenForge changelog', 'tokenforge' ); ?>