diff --git a/freifunkmeta.php b/freifunkmeta.php
index 4eac73a..d064b74 100644
--- a/freifunkmeta.php
+++ b/freifunkmeta.php
@@ -3,34 +3,34 @@
Plugin Name: Freifunk Metadata Shortcodes
Plugin URI: http://mschuette.name/
Description: Defines shortcodes to display Freifunk metadata
-Version: 0.3
+Version: 0.4dev
Author: Martin Schuette
Author URI: http://mschuette.name/
*/
-define('FF_META_DEFAULT_CACHETIME', 15);
-define('FF_META_DEFAULT_DIR', 'https://raw.githubusercontent.com/freifunk/directory.api.freifunk.net/master/directory.json');
-define('FF_META_DEFAULT_CITY', 'hamburg');
+define( 'FF_META_DEFAULT_CACHETIME', 15 );
+define( 'FF_META_DEFAULT_DIR', 'https://raw.githubusercontent.com/freifunk/directory.api.freifunk.net/master/directory.json' );
+define( 'FF_META_DEFAULT_CITY', 'hamburg' );
/**
* class to fetch and cache data from external URLs
*/
class FF_Meta_Externaldata
{
- public function get($url) {
- /* gets metadata from URL, handles caching */
- $cachekey = 'ff_metadata_'.hash('crc32', $url);
- $cachetime = get_option('ff_meta_cachetime', FF_META_DEFAULT_CACHETIME) * MINUTE_IN_SECONDS;
+ public function get( $url ) {
+ /* gets metadata from URL, handles caching */
+ $cachekey = 'ff_metadata_'.hash( 'crc32', $url );
+ $cachetime = get_option( 'ff_meta_cachetime', FF_META_DEFAULT_CACHETIME ) * MINUTE_IN_SECONDS;
- // Caching
- if ( false === ( $data = get_transient($cachekey) ) ) {
- $http_response = wp_remote_get($url);
- $json = wp_remote_retrieve_body($http_response);
- $data = json_decode ($json, $assoc = true);
- set_transient( $cachekey, $data, $cachetime );
- }
- return $data;
- }
+ // Caching
+ if ( false === ( $data = get_transient( $cachekey ) ) ) {
+ $http_response = wp_remote_get( $url );
+ $json = wp_remote_retrieve_body( $http_response );
+ $data = json_decode( $json, $assoc = true );
+ set_transient( $cachekey, $data, $cachetime );
+ }
+ return $data;
+ }
}
/**
@@ -38,22 +38,22 @@ class FF_Meta_Externaldata
*/
class FF_Directory
{
- private $directory;
+ private $directory;
- function __construct() {
- $ed = new FF_Meta_Externaldata();
- $this->directory = $ed->get(FF_META_DEFAULT_DIR);
- }
+ function __construct() {
+ $ed = new FF_Meta_Externaldata();
+ $this->directory = $ed->get( FF_META_DEFAULT_DIR );
+ }
- function get_url_by_city($city) {
- $val = $this->directory[$city];
+ function get_url_by_city( $city ) {
+ $val = $this->directory[$city];
- if (empty($val)) {
- return false;
- } else {
- return $val;
- }
- }
+ if ( empty( $val ) ) {
+ return false;
+ } else {
+ return $val;
+ }
+ }
}
/**
@@ -61,49 +61,49 @@ class FF_Directory
*/
class FF_Community
{
- public $name;
- public $street;
- public $zip;
- public $city;
- public $lon;
- public $lat;
+ public $name;
+ public $street;
+ public $zip;
+ public $city;
+ public $lon;
+ public $lat;
- /**
- * Default constructor from metadata
- */
- function __construct($metadata) {
- $loc = $metadata['location'];
- $this->name = (isset($loc['address']) && isset($loc['address']['Name'])) ? $loc['address']['Name'] : '';
- $this->street = (isset($loc['address']) && isset($loc['address']['Street'])) ? $loc['address']['Street'] : '';
- $this->zip = (isset($loc['address']) && isset($loc['address']['Zipcode'])) ? $loc['address']['Zipcode'] : '';
- $this->city = isset($loc['city']) ? $loc['city'] : '';
- $this->lon = isset($loc['lon']) ? $loc['lon'] : '';
- $this->lat = isset($loc['lat']) ? $loc['lat'] : '';
- }
+ /**
+ * Default constructor from metadata
+ */
+ function __construct( $metadata ) {
+ $loc = $metadata['location'];
+ $this->name = ( isset( $loc['address'] ) && isset( $loc['address']['Name'] ) ) ? $loc['address']['Name'] : '';
+ $this->street = ( isset( $loc['address'] ) && isset( $loc['address']['Street'] ) ) ? $loc['address']['Street'] : '';
+ $this->zip = ( isset( $loc['address'] ) && isset( $loc['address']['Zipcode'] ) ) ? $loc['address']['Zipcode'] : '';
+ $this->city = isset( $loc['city'] ) ? $loc['city'] : '';
+ $this->lon = isset( $loc['lon'] ) ? $loc['lon'] : '';
+ $this->lat = isset( $loc['lat'] ) ? $loc['lat'] : '';
+ }
- /**
- * Alternative constructor from city name
- */
- static function make_from_city($city) {
- // TODO: test
- if (false === ($url = $this->dir->get_url_by_city($city))) {
- return "\n";
- }
- if (false === ($metadata = FF_Meta_Externaldata::get($url))) {
- return "\n";
- }
- return new FF_Community($metadata);
- }
+ /**
+ * Alternative constructor from city name
+ */
+ static function make_from_city( $city ) {
+ // TODO: test
+ if ( false === ( $url = $this->dir->get_url_by_city( $city ) ) ) {
+ return "\n";
+ }
+ if ( false === ( $metadata = FF_Meta_Externaldata::get( $url ) ) ) {
+ return "\n";
+ }
+ return new FF_Community( $metadata );
+ }
- function format_address() {
- if (empty($this->name) || empty($this->street) || empty($this->zip)) {
- return '';
- }
- // TODO: style address + map as single box
- // TODO: once it is "ready" package openlayers.js into the plugin (cf. http://docs.openlayers.org/library/deploying.html)
- // TODO: handle missing values (i.e. only name & city)
- return '
' . sprintf('%s %s %s %s', $this->name, $this->street, $this->zip, $this->city) . '
';
- }
+ function format_address() {
+ if ( empty( $this->name ) || empty( $this->street ) || empty( $this->zip ) ) {
+ return '';
+ }
+ // TODO: style address + map as single box
+ // TODO: once it is "ready" package openlayers.js into the plugin ( cf. http://docs.openlayers.org/library/deploying.html )
+ // TODO: handle missing values ( i.e. only name & city )
+ return '' . sprintf( '%s %s %s %s', $this->name, $this->street, $this->zip, $this->city ) . '
';
+ }
}
/**
@@ -111,297 +111,297 @@ class FF_Community
*/
class FF_Meta
{
- private $dir;
+ private $dir;
- function __construct() {
- $this->dir = new FF_Directory();
- }
+ function __construct() {
+ $this->dir = new FF_Directory();
+ }
- function register_stuff() {
- if ( ! shortcode_exists('ff_state') ) {
- add_shortcode('ff_state', array($this, 'shortcode_handler'));
- }
- if ( ! shortcode_exists('ff_services') ) {
- add_shortcode('ff_services', array($this, 'shortcode_handler'));
- }
- if ( ! shortcode_exists('ff_contact') ) {
- add_shortcode('ff_contact', array($this, 'shortcode_handler'));
- }
- if ( ! shortcode_exists('ff_location') ) {
- add_shortcode('ff_location', array($this, 'shortcode_handler'));
- }
+ function register_stuff() {
+ if ( ! shortcode_exists( 'ff_state' ) ) {
+ add_shortcode( 'ff_state', array( $this, 'shortcode_handler' ) );
+ }
+ if ( ! shortcode_exists( 'ff_services' ) ) {
+ add_shortcode( 'ff_services', array( $this, 'shortcode_handler' ) );
+ }
+ if ( ! shortcode_exists( 'ff_contact' ) ) {
+ add_shortcode( 'ff_contact', array( $this, 'shortcode_handler' ) );
+ }
+ if ( ! shortcode_exists( 'ff_location' ) ) {
+ add_shortcode( 'ff_location', array( $this, 'shortcode_handler' ) );
+ }
- add_action('admin_menu', array($this, 'admin_menu'));
- add_action('admin_init', array($this, 'admin_init'));
- register_uninstall_hook( __FILE__, array('ff_meta', 'uninstall_hook'));
- }
+ add_action( 'admin_menu', array( $this, 'admin_menu' ) );
+ add_action( 'admin_init', array( $this, 'admin_init' ) );
+ register_uninstall_hook( __FILE__, array( 'ff_meta', 'uninstall_hook' ) );
+ }
- function output_ff_state($citydata) {
- $state = $citydata['state'];
- return sprintf('%s', $state['nodes']);
- }
+ function output_ff_state( $citydata ) {
+ $state = $citydata['state'];
+ return sprintf( '%s', $state['nodes'] );
+ }
- function aux_get_all_locations() {
- // gather all location data
- if (false === ( $json_locs = get_transient("FF_metadata_json_locs") )) {
- $all_locs = array();
- $arr_select = array('lat' => 1, 'lon' => 1);
- foreach ($this->dir as $tmp_city => $url) {
- try {
- $tmp_meta = FF_Meta_Externaldata::get($url);
- if (!empty($tmp_meta['location'])) {
- $tmp_loc = array_intersect_key($tmp_meta['location'], $arr_select);
- $all_locs[$tmp_city] = $tmp_loc;
- }
- } catch (Exception $e) {
- // pass
- }
- }
- $json_locs = json_encode($all_locs);
- $cachetime = get_option('FF_meta_cachetime', FF_META_DEFAULT_CACHETIME) * MINUTE_IN_SECONDS;
- set_transient("FF_metadata_json_locs", $json_locs, $cachetime);
- }
- return $json_locs;
- }
+ function aux_get_all_locations() {
+ // gather all location data
+ if ( false === ( $json_locs = get_transient( 'FF_metadata_json_locs' ) ) ) {
+ $all_locs = array();
+ $arr_select = array( 'lat' => 1, 'lon' => 1 );
+ foreach ( $this->dir as $tmp_city => $url ) {
+ try {
+ $tmp_meta = FF_Meta_Externaldata::get( $url );
+ if ( ! empty( $tmp_meta['location'] ) ) {
+ $tmp_loc = array_intersect_key( $tmp_meta['location'], $arr_select );
+ $all_locs[$tmp_city] = $tmp_loc;
+ }
+ } catch ( Exception $e ) {
+ // pass
+ }
+ }
+ $json_locs = json_encode( $all_locs );
+ $cachetime = get_option( 'FF_meta_cachetime', FF_META_DEFAULT_CACHETIME ) * MINUTE_IN_SECONDS;
+ set_transient( 'FF_metadata_json_locs', $json_locs, $cachetime );
+ }
+ return $json_locs;
+ }
- function output_ff_location($citydata) {
- // normal per-city code
- $loc = new FF_Community($citydata);
+ function output_ff_location( $citydata ) {
+ // normal per-city code
+ $loc = new FF_Community( $citydata );
+ $outstr = $loc->format_address();
+ $json_locs = $this->aux_get_all_locations();
- $outstr = $loc->format_address();
- $json_locs = $this->aux_get_all_locations();
-
- if (!empty($loc_name) && !empty($loc_name)) {
- $icon_url = plugin_dir_url(__FILE__) . "freifunk_marker.png";
- $outstr .= <<
EOT;
- }
- return $outstr;
- }
+ }
+ return $outstr;
+ }
- function output_ff_services($citydata) {
- $outstr = '';
- if (isset($citydata['services'])) {
- $services = $citydata['services'];
- foreach ($services as $service) {
- $outstr .= sprintf('%s (%s): %s ', $service['serviceName'], $service['serviceDescription'], $service['internalUri'], $service['internalUri']);
- }
- }
- $outstr .= ' ';
- return $outstr;
- }
+ function output_ff_services( $citydata ) {
+ $outstr = '';
+ if ( isset( $citydata['services'] ) ) {
+ $services = $citydata['services'];
+ foreach ( $services as $service ) {
+ $outstr .= sprintf( '%s (%s ): %s ', $service['serviceName'], $service['serviceDescription'], $service['internalUri'], $service['internalUri'] );
+ }
+ }
+ $outstr .= ' ';
+ return $outstr;
+ }
- function output_ff_contact($citydata) {
- $outstr = '';
- $contact = $citydata['contact'];
- // Output -- rather ugly but the data is not uniform, some fields are URIs, some are usernames, ...
- if (!empty($contact['email'])) {
- $outstr .= sprintf("E-Mail: %s \n", $contact['email'], $contact['email']);
- }
- if (!empty($contact['ml'])) {
- $outstr .= sprintf("Mailingliste: %s \n", $contact['ml'], $contact['ml']);
- }
- if (!empty($contact['irc'])) {
- $outstr .= sprintf("IRC: %s \n", $contact['irc'], $contact['irc']);
- }
- if (!empty($contact['twitter'])) {
- // catch username instead of URI
- if ($contact['twitter'][0] === "@") {
- $twitter_url = 'http://twitter.com/' . ltrim($contact['twitter'], "@");
- $twitter_handle = $contact['twitter'];
- } else {
- $twitter_url = $contact['twitter'];
- $twitter_handle = '@' . substr($contact['twitter'], strrpos($contact['twitter'], '/') + 1);
- }
- $outstr .= sprintf("Twitter: %s \n", $twitter_url, $twitter_handle);
- }
- if (!empty($contact['facebook'])) {
- $outstr .= sprintf("Facebook: %s \n", $contact['facebook'], $contact['facebook']);
- }
- if (!empty($contact['googleplus'])) {
- $outstr .= sprintf("G+: %s \n", $contact['googleplus'], $contact['googleplus']);
- }
- if (!empty($contact['jabber'])) {
- $outstr .= sprintf("XMPP: %s \n", $contact['jabber'], $contact['jabber']);
- }
- $outstr .= '
';
- return $outstr;
- }
+ function output_ff_contact( $citydata ) {
+ $outstr = '';
+ $contact = $citydata['contact'];
+ // Output -- rather ugly but the data is not uniform, some fields are URIs, some are usernames, ...
+ if ( ! empty( $contact['email'] ) ) {
+ $outstr .= sprintf( "E-Mail: %s \n", $contact['email'], $contact['email'] );
+ }
+ if ( ! empty( $contact['ml'] ) ) {
+ $outstr .= sprintf( "Mailingliste: %s \n", $contact['ml'], $contact['ml'] );
+ }
+ if ( ! empty( $contact['irc'] ) ) {
+ $outstr .= sprintf( "IRC: %s \n", $contact['irc'], $contact['irc'] );
+ }
+ if ( ! empty( $contact['twitter'] ) ) {
+ // catch username instead of URI
+ if ( $contact['twitter'][0] === '@' ) {
+ $twitter_url = 'http://twitter.com/' . ltrim( $contact['twitter'], '@' );
+ $twitter_handle = $contact['twitter'];
+ } else {
+ $twitter_url = $contact['twitter'];
+ $twitter_handle = '@' . substr( $contact['twitter'], strrpos( $contact['twitter'], '/' ) + 1 );
+ }
+ $outstr .= sprintf( "Twitter: %s \n", $twitter_url, $twitter_handle );
+ }
+ if ( ! empty( $contact['facebook'] ) ) {
+ $outstr .= sprintf( "Facebook: %s \n", $contact['facebook'], $contact['facebook'] );
+ }
+ if ( ! empty( $contact['googleplus'] ) ) {
+ $outstr .= sprintf( "G+: %s \n", $contact['googleplus'], $contact['googleplus'] );
+ }
+ if ( ! empty( $contact['jabber'] ) ) {
+ $outstr .= sprintf( "XMPP: %s \n", $contact['jabber'], $contact['jabber'] );
+ }
+ $outstr .= '
';
+ return $outstr;
+ }
- function output_ff_list() {
- return 'here be some ff_list';
- }
-
- function shortcode_handler($atts, $content, $shortcode) {
- // $atts[0] holds the city name, if given
- if (empty($atts[0])) {
- $city = get_option('FF_meta_city', FF_META_DEFAULT_CITY);
- } else {
- $city = $atts[0];
- }
+ function output_ff_list() {
+ return 'here be some ff_list';
+ }
+
+ function shortcode_handler( $atts, $content, $shortcode ) {
+ // $atts[0] holds the city name, if given
+ if ( empty( $atts[0] ) ) {
+ $city = get_option( 'FF_meta_city', FF_META_DEFAULT_CITY );
+ } else {
+ $city = $atts[0];
+ }
- if (false === ($cityurl = $this->dir->get_url_by_city($city))) {
- return "\n";
- }
+ if ( false === ( $cityurl = $this->dir->get_url_by_city( $city ) ) ) {
+ return "\n";
+ }
- if (false === ($metadata = FF_Meta_Externaldata::get($cityurl))) {
- return "\n";
- }
+ if ( false === ( $metadata = FF_Meta_Externaldata::get( $cityurl ) ) ) {
+ return "\n";
+ }
- $outstr = "";
- switch ($shortcode) {
- case 'ff_state':
- $outstr .= $this->output_ff_state($metadata);
- break;
- case 'ff_location':
- $outstr .= $this->output_ff_location($metadata);
- break;
- case 'ff_services':
- $outstr .= $this->output_ff_services($metadata);
- break;
- case 'ff_contact':
- $outstr .= $this->output_ff_contact($metadata);
- break;
- case 'ff_list':
- $outstr .= $this->output_ff_list();
- break;
- default:
- $outstr .= "";
- break;
- }
- $outstr .= "
";
- return $outstr;
- }
+ $outstr = "";
+ switch ( $shortcode ) {
+ case 'ff_state':
+ $outstr .= $this->output_ff_state( $metadata );
+ break;
+ case 'ff_location':
+ $outstr .= $this->output_ff_location( $metadata );
+ break;
+ case 'ff_services':
+ $outstr .= $this->output_ff_services( $metadata );
+ break;
+ case 'ff_contact':
+ $outstr .= $this->output_ff_contact( $metadata );
+ break;
+ case 'ff_list':
+ $outstr .= $this->output_ff_list();
+ break;
+ default:
+ $outstr .= '';
+ break;
+ }
+ $outstr .= '
';
+ return $outstr;
+ }
- function admin_menu() {
- // Options Page:
- add_options_page(
- 'FF Meta Plugin', // page title
- 'FF Meta', // menu title
- 'manage_options', // req'd capability
- 'ff_meta_plugin', // menu slug
- array ('FF_meta', 'options_page') // callback function
- );
- }
+ function admin_menu() {
+ // Options Page:
+ add_options_page(
+ 'FF Meta Plugin', // page title
+ 'FF Meta', // menu title
+ 'manage_options', // req'd capability
+ 'ff_meta_plugin', // menu slug
+ array( 'FF_meta', 'options_page' ) // callback function
+ );
+ }
- function admin_init() {
- register_setting(
- 'ff_meta_settings-group', // group name
- 'ff_meta_cachetime' // option name
- );
- register_setting(
- 'ff_meta_settings-group', // group name
- 'ff_meta_city' // option name
- );
- add_settings_section(
- 'ff_meta_section-one', // ID
- 'Section One', // Title
- array ('FF_Meta', 'section_one_callback'), // callback to fill
- 'ff_meta_plugin' // page to display on
- );
- add_settings_field(
- 'ff_meta_city', // ID
- 'Default community', // Title
- array ('FF_Meta', 'city_callback'), // callback to fill field
- 'ff_meta_plugin', // menu page=slug to display field on
- 'ff_meta_section-one', // section to display the field in
- array('label_for' => 'ff_meta_city_id') // ID of input element
- );
- add_settings_field(
- 'ff_meta_cachetime', // ID
- 'Cache time', // Title
- array ('FF_Meta', 'cachetime_callback'), // callback to fill field
- 'ff_meta_plugin', // menu page=slug to display field on
- 'ff_meta_section-one', // section to display the field in
- array('label_for' => 'ff_meta_cachetime_id') // ID of input element
- );
- }
+ function admin_init() {
+ register_setting(
+ 'ff_meta_settings-group', // group name
+ 'ff_meta_cachetime' // option name
+ );
+ register_setting(
+ 'ff_meta_settings-group', // group name
+ 'ff_meta_city' // option name
+ );
+ add_settings_section(
+ 'ff_meta_section-one', // ID
+ 'Section One', // Title
+ array( 'FF_Meta', 'section_one_callback' ), // callback to fill
+ 'ff_meta_plugin' // page to display on
+ );
+ add_settings_field(
+ 'ff_meta_city', // ID
+ 'Default community', // Title
+ array( 'FF_Meta', 'city_callback' ), // callback to fill field
+ 'ff_meta_plugin', // menu page=slug to display field on
+ 'ff_meta_section-one', // section to display the field in
+ array( 'label_for' => 'ff_meta_city_id' ) // ID of input element
+ );
+ add_settings_field(
+ 'ff_meta_cachetime', // ID
+ 'Cache time', // Title
+ array( 'FF_Meta', 'cachetime_callback' ), // callback to fill field
+ 'ff_meta_plugin', // menu page=slug to display field on
+ 'ff_meta_section-one', // section to display the field in
+ array( 'label_for' => 'ff_meta_cachetime_id' ) // ID of input element
+ );
+ }
- function section_one_callback() {
- echo 'This Plugin provides shortcodes to display information from the Freifunk meta.json.';
- }
+ function section_one_callback() {
+ echo 'This Plugin provides shortcodes to display information from the Freifunk meta.json.';
+ }
- function cachetime_callback() {
- $time = get_option( 'ff_meta_cachetime', FF_META_DEFAULT_CACHETIME );
- echo " minutes"
- ."Data from external URLs is cached for this number of minutes.
";
- }
+ function cachetime_callback() {
+ $time = get_option( 'ff_meta_cachetime', FF_META_DEFAULT_CACHETIME );
+ echo " minutes'.
+ "Data from external URLs is cached for this number of minutes.
";
+ }
- function city_callback() {
- if (false === ($directory = FF_Meta_Externaldata::get ( FF_META_DEFAULT_DIR ))) {
- // TODO: error handling
- return;
- }
- $default_city = get_option( 'ff_meta_city', FF_META_DEFAULT_CITY );
+ function city_callback() {
+ if ( false === ( $directory = FF_Meta_Externaldata::get( FF_META_DEFAULT_DIR ) ) ) {
+ // TODO: error handling
+ return;
+ }
+ $default_city = get_option( 'ff_meta_city', FF_META_DEFAULT_CITY );
- echo "";
- foreach (array_keys($directory) as $city) {
- $prettycity = ucwords(str_replace(array('_', '-'), ' ', $city));
- $selected = selected( $default_city, $city );
- echo "$prettycity ";
- }
- echo " ";
- echo "This is the default city parameter.
";
- }
+ echo "";
+ foreach ( array_keys( $directory ) as $city ) {
+ $prettycity = ucwords( str_replace( array( '_', '-' ), ' ', $city ) );
+ $selected = selected( $default_city, $city );
+ echo ""
+ . esc_html( $prettycity ) . ' ';
+ }
+ echo ' ';
+ echo "This is the default city parameter.
";
+ }
- function options_page() {
- ?>
-
-
Freifunk Meta Plugin Options
-
-
-
+
+
Freifunk Meta Plugin Options
+
+
+