This plugin is no longer maintained, please consider installing F13 GitHub.
WordPress
Awaiting approval
GitHub
[gitrepo author=”f13dev” repo=”wp-gist-shortcode”]
Introduction
Are you a developer who uses GitHubs Gist to store and share code? Why not share your code on a WordPress powered blog using Gist Shortcode by F13Dev.
Simply install the plugin and activate it via the WordPress admin panel, add a GitHub API token (optional), then add the shortcode [gist gid="A Gist ID] to the desired location on a page or blog post.
Features
- Cached using Transient
- Clean styled appearance
- Shows the creation date and last edited date
- Shows the Gist description if one is set
- Displays the filename, file size, download link and full code for each file in the gist
- Code is displayed in using Googles PrettyPrint in a fixed height scrollable container
- Works without an API Key, but also has the option to add a Key should you require a higher rate limit
Examples
The result of [gist id="fc53666cfbde382ca6a5ae1c519dc65a"]
Gist created by: f13dev
Created: July 06, 2016 - 10:05am
Last edited: July 06, 2016 - 10:08am
Last edited: July 06, 2016 - 10:08am
Description: N/A
Files (2)
wp-api.class.php (6.66kb) Download file<?phpwp-api.test.php (1.16kb) Download file
class wordpress_pluing_information
{
// Variable to store plugin name
var $slug;
var $results;
function wordpress_pluing_information($aSlug)
{
// Set the pluignName of the new object to the argument
$this->slug = $aSlug;
// Generate results
$this->getResults();
}
private function getResults()
{
// start curl
$curl = curl_init();
// set the curl URL
$url = 'https://api.wordpress.org/plugins/info/1.0/' . $this->slug . '.json';
// Set curl options
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_HTTPGET, true);
// Set the user agent
curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13');
// Set curl to return the response, rather than print it
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
// Get the results and store the XML to results
$this->results = json_decode(curl_exec($curl), true);
// Close the curl session
curl_close($curl);
}
function getName()
{
return $this->results['name'];
}
function getSlug()
{
return $this->results['slug'];
}
function getPluginURL()
{
return 'https://wordpress.org/plugins/' . $this->getSlug() . '/';
}
function getVersion()
{
return $this->results['version'];
}
function getAuthor()
{
return $this->results['author'];
}
function getAuthorURL()
{
return $this->results['author_profile'];
}
function getAuthorLink()
{
return $this->results['contributors'][0];
}
function getContributorsList()
{
$list = '<ul>';
foreach ($this->results['contributors'] as $key => $value)
{
$list .= '<li><a href="' . $value . '">' . $key . '</a></li>';
}
$list .= '</ul>';
return $list;
}
function getVersionRequired()
{
return $this->results['requires'];
}
function getVersionTestedOn()
{
return $this->results['tested'];
}
function getRating()
{
return $this->results['rating'] / 20;
}
function getRatingNumber()
{
return $this->results['num_ratings'];
}
function getRatingStars()
{
for ($x = 1; $x < $this->getRating(); $x++ )
{
echo '<img src="img/star-full.png" />';
}
if (strpos($this->getRating(), '.'))
{
echo '<img src="img/star-half.png" />';
$x++;
}
while ($x <= 5)
{
echo '<img src="img/star-empty.png" />';
$x++;
}
}
function getNumberDownloads()
{
return $this->results['downloaded'];
}
function getLastUpdate()
{
$date = explode ('-', explode(' ', $this->results['last_updated'])[0]);
$string = $date[2] . ' ' . $this->convertNumberToMonth($date[1]) . ' ' . $date[0];
return $string;
}
function getCreationDate()
{
$date = explode ('-', explode(' ', $this->results['added'])[0]);
$string = $date[2] . ' ' . $this->convertNumberToMonth($date[1]) . ' ' . $date[0];
return $string;
}
function getBannerURL()
{
$baseURL = 'https://ps.w.org/' . $this->getSlug() . '/assets/banner-772x250';
if ($this->remoteFileExists($baseURL . '.jpg'))
{
return $baseURL . '.jpg';
}
else if ($this->remoteFileExists($baseURL . '.png'))
{
return $baseURL . '.png';
}
else
{
return 'img/default_banner.png';
}
}
function getBannerImage()
{
return '<img src="' . $this->getBannerURL() . '" />';
}
function getIconURL()
{
$baseURL = 'https://ps.w.org/' . $this->getSlug() . '/assets/icon-128x128';
if ($this->remoteFileExists($baseURL . '.jpg'))
{
return $baseURL . '.jpg';
}
else if ($this->remoteFileExists(baseURL . '.png'))
{
return $baseURL . '.png';
}
else
{
return 'img/default_icon.png';
}
}
function getIconImage()
{
return '<img src="' . $this->getIconURL() . '" />';
}
function getShortDescription()
{
return $this->results['short_description'];
}
function getDownloadURL()
{
return $this->results['download_link'];
}
function getDownloadLink()
{
return '<a href="' . $this->getDownloadURL() . '">Download</a>';
}
function getTagsList()
{
$string = '<ul>';
foreach ($this->results['tags'] as $key => $value)
{
$string .= '<li>' . $value . '</li>';
}
$string .= '</ul>';
return $string;
}
function getDonateURL()
{
return $this->results['donate_link'];
}
function getDonateLink()
{
return '<a href="' . $this->getDonateURL() . '">Donate</a>';
}
private function convertNumberToMonth($month)
{
if ($month == 01)
{
return "January";
}
else if ($month == 02)
{
return "February";
}
else if ($month == 03)
{
return "March";
}
else if ($month == 04)
{
return "April";
}
else if ($month == 05)
{
return "May";
}
else if ($month == 06)
{
return "June";
}
else if ($month == 07)
{
return "July";
}
else if ($month == 08)
{
return "August";
}
else if ($month == 09)
{
return "September";
}
else if ($month == 10)
{
return "October";
}
else if ($month == 11)
{
return "November";
}
else if ($month == 12)
{
return "December";
}
else
{
return null;
}
}
private function remoteFileExists($url)
{
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_NOBODY, true);
$result = curl_exec($curl);
if ($result != false)
{
if (curl_getinfo($curl, CURLINFO_HTTP_CODE) == 200)
{
return true;
}
}
else
{
return false;
}
}
}
<?php
// Require the api PHP file
require_once('wp-api.class.php');
// Create a new object for the API
$wpapi = new wordpress_pluing_information('WP-Twitter-profile-widget');
// Returning results
echo 'Name: ' . $wpapi->getName() . '<br/>';
echo 'Slug: ' . $wpapi->getSlug() . '<br/>';
echo 'Version: ' . $wpapi->getVersion() . '<br/>';
echo 'Author' . $wpapi->getAuthor() . '<br/>';
echo 'Author profile: ' . $wpapi->getAuthorLink() . '<br/>';
echo 'Contributors: ' . $wpapi->getContributorsList();
echo 'Requires version: ' . $wpapi->getVersionRequired() . '<br/>';
echo 'Tested on: ' . $wpapi->getVersionTestedOn . '<br/>';
echo 'Rating: ' . $wpapi->getRatingStars() . '<br/>';
echo 'Downloaded: ' . $wpapi->getNumberDownloads() . '<br/>';
echo 'Last updated: ' . $wpapi->getLastUpdate() . '<br/>';
echo 'Added: ' . $wpapi->getCreationDate() . '<br/>';
echo 'Header image: ' . $wpapi->getBannerImage() . '<br/>';
echo 'Icon: ' . $wpapi->getIconImage() . '<br/>';
echo 'Short description: ' . $wpapi->getShortDescription() . '<br/>';
echo 'Download: ' . $wpapi->getDownloadLink() . '<br/>';
echo 'Tags: ' . $wpapi->getTagsList();
echo 'Donate link: ' . $wpapi->getDonateLink() . '<br/>';
Comments: 0
The result of [gist id="85ea6e90e79cad8dfe7c7cd699b13f41"]
Gist created by: f13dev
Created: June 27, 2016 - 07:15pm
Last edited: June 29, 2016 - 10:37am
Last edited: June 29, 2016 - 10:37am
Description: Converts a plain text Twitter tweet into html to <a> tags for URLs, #links and @links
Files (1)
getLinksFromTwitterText.php (0.81kb) Download file<?php
/**
* Takes a string argument, which may include URLs, twitter #links or twitter @links,
* imbeds html <a> tags into the string and returns it.
*
* @param [type] $string [description]
* @return [type] $string [description]
*/
function getLinksFromTwitterText($string)
{
// Converts a plain text url to a hyperlink
$string = preg_replace('~(?:(https?)://([^\s<]+)|(www\.[^\s<]+?\.[^\s<]+))(?<![\.,:])~i', '<a href="$0" ' . $target . ' " title="$0">$0</a>', $string);
// Converts hashtags to a link
$string = preg_replace("/#([A-Za-z0-9\/\.]*)/", "<a href=\"http://twitter.com/search?q=$1\" " . $target . " >#$1</a>", $string);
// Converts @user to a link
$string = preg_replace("/@([A-Za-z0-9\/\.]*)/", "<a href=\"http://www.twitter.com/$1\" $target >@$1</a>", $string);
return $string;
}
Comments: 0
Installation
- Upload the plugin files to the `/wp-content/plugins/plugin-name` directory, or install the plugin through the WordPress plugins screen directly.
- Activate the plugin through the ‘Plugins’ screen in WordPress
- Optionally add a GitHub API key via the admin panel, Settings -> F13 Gist Shortcode
- Add the shortcode [gist gid="A Gist ID"] to the desired location on your blog
Code
Plugin file:
<?php /* Plugin Name: F13 Gist Shortcode Plugin URI: http://f13dev.com/wordpress-plugin-gist-shortcode Description: Embed information about a GitHub Gist into a blog post or page using shortcode. Version: 1.0 Author: Jim Valentine - f13dev Author URI: http://f13dev.com Text Domain: f13-gist-shortcode License: GPLv3 */ /* Copyright 2016 James Valentine - f13dev (jv@f13dev.com) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ // Register the shortcode add_shortcode( 'gist', 'f13_gist_shortcode'); // Register the CSS add_action( 'wp_enqueue_scripts', 'f13_gist_shortcode_stylesheet'); // Register the admin page add_action('admin_menu', 'f13_gs_create_menu'); function f13_gist_shortcode( $atts, $content = null ) { // Get the attributes extract( shortcode_atts ( array ( 'gid' => '', // Get the gist ID ), $atts )); // Check if the gist attribute has been received if ($gid != '') { // The gist attribute is present, attempt to get the // api response. $data = f13_get_gist_data($gid); // Check to see if an error message has been returned, if (array_key_exists('message', $data)) { // Alert the user of the error $response = 'The Gist ID: \'' . $gid . '\' returned an error.<br /> Message: ' . $data['message'] . '<br />'; } else { // A response has been generated and the response does not appear // to contain an error message. From now on data will be cached. // Set the cache name and prefix $cache = get_transient('f13gist' . md5(serialize($atts))); if ($cache) { // If the cache exists, return it rather than re-creating it return $cache; } else { // If a cache does not exist, create the shortcode content // Generate the formatted data and save it as the response. $response = f13_format_gist_data($data); // Get the cache timeout and convert it from minutes to seconds $timeout = esc_attr( get_option('f13gs_timeout')) * 60; // If the timeout is set to zero seconds, change it to 1 second, // otherwise the cache will never timeout. if ($timeout == 0 || !is_numeric($timeout)) { $timeout = 1; } // Set the transient cache using the response and timeout value set_transient('f13gist' . md5(serialize($atts)), $response, $timeout); } } } else { // The gist attribute has not been received $response = 'The gist attribute is required<br /> E.g. [gist gid="a gist ID"]'; } // Return the response return $response; } function f13_format_gist_data($gistData) { // Create a new variable to hold the response $response = ''; // Open a container div $response .= '<div class="f13-gist-container">'; // add username of creator $response .= '<div class="f13-gist-header"> <svg aria-hidden="true" version="1.1" viewBox="0 0 16 16"><path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0 0 16 8c0-4.42-3.58-8-8-8z"></path></svg> Gist created by: <a href="https://github.com/' . $gistData['owner']['login'] . '">' . $gistData['owner']['login'] . '</a> </div>'; // Add created at/ updated $response .= '<div class="f13-gist-created"> Created at: ' . f13_get_git_date($gistData['created_at']) . ' | Last edited: ' . f13_get_git_date($gistData['updated_at']) . ' | <a href="https://gist.github.com/' . $gistData['owner']['login'] . '/' . $gistData['id'] . '">View on GitHub</a> </div>'; // Create a description div $response .= '<div class="f13-gist-description">'; // Add a span to contain the title $response .= '<span>Description:</span> '; // Check if a description is set if ($gistData['description'] != '') { // Add the description $response .= htmlentities($gistData['description']); } else { // If no description is set, respond n/a $response .= 'N/A'; } // Close the description div $response .= '</div>'; // Add a horizontal rule to seperate the header data and file data $response .= '<hr />'; // Add a div for the files head $response .= '<div class="f13-gist-files-head">'; // Add the header text and number of files $response .= '<span>Files</span> (' . count($gistData['files']) . ')'; // Close the div for the files head $response .= '</div>'; foreach ($gistData['files'] as &$eachFile) { // Add the Gist icon $response .= '<svg aria-hidden="true" version="1.1" viewBox="0 0 12 16"><path d="M7.5 5L10 7.5 7.5 10l-.75-.75L8.5 7.5 6.75 5.75 7.5 5zm-3 0L2 7.5 4.5 10l.75-.75L3.5 7.5l1.75-1.75L4.5 5zM0 13V2c0-.55.45-1 1-1h10c.55 0 1 .45 1 1v11c0 .55-.45 1-1 1H1c-.55 0-1-.45-1-1zm1 0h10V2H1v11z"></path></svg>'; // Add the filename and size $response .= $eachFile['filename'] . ' (' . round($eachFile['size'] / 1024, 2) . 'kb) <a href="' . $eachFile['raw_url'] . '" download>Download file</a><br />'; // Create a prettyprint pre element $response .= '<pre class="prettyprint lang-' . strtolower($eachFile['language']) . '" style="border: 1px solid black; margin: 10px; padding: 10px; max-height: 200px; overflow: scroll">'; // Add the file contents using nl2br to create new lines // and htmlentities to convert symbols such as < to < etc... $response .= nl2br(htmlentities($eachFile['content'])); // Close the prettyprint pre element $response .= '</pre>'; } // Add a horizontal rule to end the files section $response .= '<hr />'; // Add comment count $response .= 'Comments: <a href="https://gist.github.com/' . $gistData['owner']['login'] . '/' . $gistData['id'] . '#comments">' . $gistData['comments'] . '</a>'; // Close the container div $response .= '</div>'; return $response; } function f13_get_git_date($aDate) { // Explode the date $aDate = explode('-', $aDate); // Set the year $aYear = $aDate[0]; // Set the month $aMonth = DateTime::createFromFormat('!m', $aDate[1])->format('F'); // Set the day $aDay = $aDate[2][0] . $aDate[2][1]; // Return the re-formatted date return $aDay . ' ' . $aMonth . ' ' . $aYear; } function f13_get_gist_data($aGist) { // Start curl $curl = curl_init(); // Generate the URL $url = 'https://api.github.com/gists/' . $aGist; // Set curl options curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_HTTPGET, true); // Get the token from the admin panel $token = esc_attr( get_option('f13gs_token')); // Check if a token has been entered. if (preg_replace('/\s+/', '', $token) != '' || $token != null) { // If a token is set attempt to send it in the header curl_setopt($curl, CURLOPT_HTTPHEADER, array( 'Content-Type: application/json', 'Accept: application/json', 'Authorization: token ' . $token )); } else { // If no token is set, send the header as unauthenticated, // some features may not work and a lower rate limit applies. curl_setopt($curl, CURLOPT_HTTPHEADER, array( 'Content-Type: application/json', 'Accept: application/json' )); } // Set the user agent curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13'); // Set curl to return the response, rather than print it curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); // Get the results $result = curl_exec($curl); // Close the curl session curl_close($curl); // Decode the results $result = json_decode($result, true); // Return the results return $result; } function f13_gist_shortcode_stylesheet() { wp_register_style( 'f13gist-style', plugins_url('wp-gist-shortcode.css', __FILE__)); wp_enqueue_style( 'f13gist-style' ); // Also register prettyprint javascript files wp_enqueue_script('PrettyPrint', plugins_url('prettyprint/run_prettify.js', __FILE__)); } function f13_gs_create_menu() { // Create the sub-level menu add_options_page('F13Devs Gist Shortcode Settings', 'F13 Gist Shortcode', 'administrator', 'f13-gist-shortcode', 'f13_gs_settings_page'); // Retister the Settings add_action( 'admin_init', 'f13_gs_settings'); } function f13_gs_settings() { // Register settings for token and timeout register_setting( 'f13-gs-settings-group', 'f13gs_token'); register_setting( 'f13-gs-settings-group', 'f13gs_timeout'); } function f13_gs_settings_page() { ?> <div class="wrap"> <h2>F13 Gist Shortcode Settings</h2> <p> Welcome to the settings page for GitHub Gist Shortcode. </p> <p> This plugin can be used without an API token, although it is recommended to use one as the number of API calls is quite restrictive without one. </p> <p> To obtain a GitHub API token: <ol> <li> Log-in to your GitHub account. </li> <li> Visit <a href="https://github.com/settings/tokens">https://github.com/settings/tokens</a>. </li> <li> Click the 'Generate new token' button at the top of the page/ </li> <li> Re-enter your GitHub password for security. </li> <li> Enter a description, such as 'my wordpress site'. </li> <li> Click the 'Generate token' button at the bottom of the page, no other setting changes are required. </li> <li> Copy and paste your new API token. Please note, your access token will only be visible once. </li> </ol> </p> <form method="post" action="options.php"> <?php settings_fields( 'f13-gs-settings-group' ); ?> <?php do_settings_sections( 'f13-gs-settings-group' ); ?> <table class="form-table"> <tr valign="top"> <th scope="row"> GitHub API Key </th> <td> <input type="password" name="f13gs_token" value="<?php echo esc_attr( get_option( 'f13gs_token' ) ); ?>" style="width: 50%;"/> </td> </tr> <tr valign="top"> <th scope="row"> Cache timeout (minutes) </th> <td> <input type="number" name="f13gs_timeout" value="<?php echo esc_attr( get_option( 'f13gs_timeout' ) ); ?>" style="width: 75px;"/> </td> </tr> </table> <?php submit_button(); ?> </form> <h3>Shortcode example</h3> <p> If you wish to display a widget showing details of a gist at: https://gist.github.com/f13dev/fc53666cfbde382ca6a5ae1c519dc65a use the following shortcode, obtaining the 'gid' from the end of the gist.github.com URL: </p> <p> [gist gid="fc53666cfbde382ca6a5ae1c519dc65a"] </p> </div> <?php }
CSS:
.f13-gist-container { background: #eee; border-radius: 10px; padding: 10px; } .f13-gist-container > hr { height: 1px; background-color: #333; } .f13-gist-container > svg { height: 1.4em; width: 1.4em; margin-right: 0.5em; margin-bottom: -0.5em; } .f13-gist-header { font-size: 1.5em; font-weight: bold; } .f13-gist-header > svg { height: 1em; width: 1em; margin-bottom: -0.1em; } .f13-gist-files-head { margin-top: -0.5em; } .f13-gist-description { margin-bottom: -0.5em; } .f13-gist-description > span { font-weight: bold; display: block; } .f13-gist-files-head > span { font-size: 1.5em; } .f13-gist-container svg { fill: #6B6B6B; }
No comments on WordPress Plugin: Gist Shortcode