- <?php
- /*
- * Hook into the backend and load scripts and
- * init metabox.
- */
- function ds_gist2wordpress_admin() {
- add_action( 'wp_ajax_gist', 'ds_gistify' );
- add_action( 'admin_print_scripts-post.php', 'ds_gist_js' );
- add_action( 'admin_print_scripts-post-new.php', 'ds_gist_js' );
- wp_register_script(
- 'gist-js',
- get_bloginfo( 'template_url' ) . "/gist.js",
- array( 'jquery' ),
- 0.1,
- true
- );
- add_meta_box(
- 'ds_gist',
- 'Gist',
- 'ds_gist_metabox_cb',
- 'post'
- );
- }
- add_action( 'admin_init', 'ds_gist2wordpress_admin' );
- /*
- * Hook into the frontend and load scripts.
- */
- function ds_gist2wordpress() {
- wp_register_style(
- 'gist-css',
- 'https://gist.github.com/stylesheets/gist/embed.css'
- );
- add_filter( 'the_content', 'ds_convert_to_gist', 99 );
- }
- add_action( 'init', 'ds_gist2wordpress' );
- /*
- * Helper for enqeueing script
- */
- function ds_gist_js() {
- wp_enqueue_script( 'gist-js' );
- }
- /*
- * Add a metabox the post edit screen with an input field for the gist ID
- * and show the file list.
- */
- function ds_gist_metabox_cb( $data ) {
- wp_nonce_field( 'ds_gist', 'ds-gist-nonce' );
- $gist_id = get_post_meta( $data->ID, '_gist_id', true ) ;
- $gist_id = ! empty( $gist_id ) ? $gist_id : '';
- $gist_data = get_post_meta( $data->ID, '_gist_data', true );
- $gist_data = ! empty( $gist_data ) ? $gist_data : array();
- $files = '';
- if ( ! empty( $gist_data ) ) {
- foreach ( $gist_data as $file => $data )
- $files .= '<li><code>{' . $file . '}</code></li>';
- }
- ?>
- <p>
- <label>Gist ID: <input type="text" class="small-text" style="width: 180px;" name="gist-id" id="gist-id" value="<?php echo esc_attr( $gist_id ); ?>" /></label>
- <input type="button" value="Fetch" id="gist-update" class="button" />
- <img src="<?php echo esc_url( admin_url( 'images/wpspin_light.gif' ) ); ?>" class="ajax-loading" id="gist-ajax-loading" alt="" />
- </p>
- <ul id="gist-files">
- <?php echo $files;?>
- </ul>
- <?php
- }
- /*
- * Replace {Filename} with associated snippet from the
- * custom fields.
- */
- function ds_gistify() {
- $post_id = intval( $_POST['post_id'] );
- $gist_id = sanitize_key( $_POST['gist_id'] );
- if ( empty( $post_id ) || empty( $gist_id ) )
- die( json_encode( array(
- 'id' => $gist_id,
- 'error' => 'Empty Post ID or Gist ID.'
- ) ) );
- check_ajax_referer( 'ds_gist' );
- $gist_body = wp_remote_retrieve_body(
- wp_remote_get(
- $gist_url = sprintf( "https://gist.github.com/%s.json", $gist_id )
- )
- );
- $gist_body = json_decode( $gist_body );
- if ( empty( $gist_body ) )
- die( json_encode( array(
- 'id' => $gist_id,
- 'error' => 'Empty Body'
- ) ) );
- if ( ! empty( $gist_body->error ) ) {
- die( json_encode( array(
- 'id' => $gist_id,
- 'error' => $gist_body->error
- ) ) );
- }
- update_post_meta( $post_id, '_gist_id', $gist_id );
- $gist_files = $gist_body->files;
- preg_match_all( '/<pre>(.+?)<\/pre>/is', $gist_body->div, $gist_divs );
- $gist_divs = $gist_divs[0];
- foreach ( $gist_files as $i => $gist_file )
- $gist_data[ $gist_file ] = '<div class="gist-syntax">' . $gist_divs[$i] . '</div>';
- foreach ( $gist_data as $file => $gist_item ) {
- $gist_new_meta = sprintf(
- '<div><p class="gist-meta"><a class="gist-raw" href="%s">RAW</a> · <a class="gist-download" href="%s">Download</a> · <a class="gist-github" href="%s">Gist@GitHub</a></p></div>',
- esc_url( "https://gist.github.com/raw/{$gist_id}/{$file}" ),
- esc_url( "https://gist.github.com/gists/{$gist_id}/download"),
- esc_url( "https://gist.github.com/{$gist_id}")
- );
- $gist_data[ $file ] .= $gist_new_meta;
- }
- update_post_meta( $post_id, '_gist_data', $gist_data );
- die( json_encode( array(
- 'id' => $gist_id,
- 'files' => $gist_files
- ) ) );
- }
- /*
- * AJAX callback function which handles the API response. Saves the data
- * into custom fields
- */
- function ds_convert_to_gist( $content ) {
- $gist_data = get_post_meta( get_the_ID(), '_gist_data', true );
- if ( empty( $gist_data ) )
- return $content;
- wp_enqueue_style('gist-css');
- foreach ( $gist_data as $file => $file_data ) {
- $files[] = '/{' . $file . '}/';
- $data[] = $file_data;
- }
- $content = preg_replace(
- $files,
- $data,
- $content
- );
- return $content;
- }