LightboxGallery.php
changeset 0 1978f8d29bea
child 1 d2584c5a075c
equal deleted inserted replaced
-1:000000000000 0:1978f8d29bea
       
     1 <?php
       
     2 /**!info**
       
     3 {
       
     4   "Plugin Name"  : "Lightbox Gallery",
       
     5   "Plugin URI"   : "http://enanocms.org/plugin/lightboxgallery",
       
     6   "Description"  : "Adds a <lightboxgallery> tag that lets you have a gallery triggered on click of a thumbnail or something. Documentation at provided URL.",
       
     7   "Author"       : "Dan Fuhry",
       
     8   "Version"      : "0.1",
       
     9   "Author URI"   : "http://enanocms.org/"
       
    10 }
       
    11 **!*/
       
    12 
       
    13 // Hook into wikitext render flow
       
    14 $plugins->attachHook('render_wikiformat_pre', 'lbgallery_process_tags($text);');
       
    15 $plugins->attachHook('html_attribute_whitelist', '$whitelist["lightboxgallery"] = array("maxwidth"); $whitelist["trigger"] = array();');
       
    16 
       
    17 function lbgallery_process_tags(&$text)
       
    18 {
       
    19   if ( !preg_match_all('#<lightboxgallery(?: maxwidth="?([0-9]+)"?)>(.+?)</lightboxgallery>#s', $text, $matches) )
       
    20     return true;
       
    21   
       
    22   lbgallery_add_headers();
       
    23   
       
    24   foreach ( $matches[0] as $i => $match )
       
    25   {
       
    26     $gallery = lbgallery_build_gallery($matches[2][$i], $matches[1][$i]);
       
    27     $text = str_replace($match, $gallery, $text);
       
    28   }
       
    29 }
       
    30 
       
    31 function lbgallery_add_headers()
       
    32 {
       
    33   global $db, $session, $paths, $template, $plugins; // Common objects
       
    34   
       
    35   $template->add_header('<script type="text/javascript" src="' . cdnPath . '/includes/clientside/static/jquery.js"></script>');
       
    36   $template->add_header('<script type="text/javascript" src="' . cdnPath . '/includes/clientside/static/jquery-ui.js"></script>');
       
    37   $template->add_header('<script type="text/javascript" src="' . scriptPath . '/plugins/lightboxgallery/jquery.lightbox-0.5.pack.js"></script>');
       
    38   $template->add_header('<link rel="stylesheet" type="text/css" href="' . scriptPath . '/plugins/lightboxgallery/jquery.lightbox-0.5.css" />');
       
    39   $template->add_header('<script type="text/javascript">
       
    40       var loaded_components = loaded_components || {};
       
    41       loaded_components["jquery.js"] = true;
       
    42       loaded_components["jquery-ui.js"] = true;
       
    43       if ( window.pref_disable_js_fx )
       
    44       {
       
    45         jQuery.fx.off = true;
       
    46       }
       
    47       function lbgallery_construct(selector)
       
    48       {
       
    49         var settings = {
       
    50           // Configuration related to images
       
    51           imageLoading:			\'' . cdnPath . '/images/loading-big.gif\',		// (string) Path and the name of the loading icon
       
    52           imageBtnPrev:			\'' . scriptPath . '/plugins/lightboxgallery/images/lightbox-btn-prev.gif\',			// (string) Path and the name of the prev button image
       
    53           imageBtnNext:			\'' . scriptPath . '/plugins/lightboxgallery/images/lightbox-btn-next.gif\',			// (string) Path and the name of the next button image
       
    54           imageBtnClose:		\'' . scriptPath . '/plugins/lightboxgallery/images/lightbox-btn-close.gif\',		// (string) Path and the name of the close btn
       
    55           imageBlank:				\'' . cdnPath . '/images/spacer.gif\',			// (string) Path and the name of a blank image (one pixel)
       
    56         };
       
    57         jQuery(selector).lightBox(settings);
       
    58       }
       
    59     </script>');
       
    60 }
       
    61 
       
    62 function lbgallery_build_gallery($gallerytag, $width)
       
    63 {
       
    64   // parse out any text sections
       
    65   $text = preg_replace('#^.*<trigger>(.+?)</trigger>.*$#s', '$1', $gallerytag);
       
    66   if ( $text == $gallerytag )
       
    67     $text = '';
       
    68   $gallerytag = preg_replace('#<trigger>(.+?)</trigger>#s', '', $gallerytag);
       
    69   
       
    70   $images = explode("\n", $gallerytag);
       
    71   if ( empty($images) )
       
    72   {
       
    73     return '<div class="error-box-mini">' . $lang->get('lboxgal_err_no_images') . '</div>';
       
    74   }
       
    75   
       
    76   $id = 'lbgal' . md5(microtime() . mt_rand());
       
    77   $inner = '';
       
    78   $width = intval($width);
       
    79   if ( empty($width) )
       
    80     $width = 640;
       
    81   
       
    82   $imagelist = array();
       
    83   foreach ( $images as $line )
       
    84   {
       
    85     $line = trim($line);
       
    86     if ( empty($line) )
       
    87       continue;
       
    88     
       
    89     list($image) = explode('|', $line);
       
    90     $image = sanitize_page_id(trim($image));
       
    91     if ( ($alt = strstr($line, '|')) )
       
    92     {
       
    93       $alt = trim(substr($alt, 1));
       
    94     }
       
    95     else
       
    96     {
       
    97       $alt = str_replace('_', ' ', dirtify_page_id($image));
       
    98     }
       
    99     $imagelist[] = array($image, $alt);
       
   100     $tag = '<a class="' . $id . '" href="' . makeUrlNS('Special', "DownloadFile/$image", "preview&width=$width&height=9999", true) . '" title="' . trim(htmlspecialchars(RenderMan::render($alt))) . '">';
       
   101     if ( !isset($firstimageid) )
       
   102     {
       
   103       $firstimagetag = $tag;
       
   104       $firstimageid = $image;
       
   105       $firstimagealt = $alt;
       
   106     }
       
   107     else
       
   108     {
       
   109       $inner .= $tag . '.</a>';
       
   110     }
       
   111   }
       
   112   
       
   113   if ( $text )
       
   114   {
       
   115     $trigger = str_replace('<a>', $firstimagetag, trim($text));
       
   116   }
       
   117   else
       
   118   {
       
   119     list($image, $alt) = $imagelist[ array_rand($imagelist) ];
       
   120     $trigger = $firstimagetag . '<img alt="' . htmlspecialchars($alt) . '" src="' . makeUrlNS('Special', "DownloadFile/$image", "preview", true) . '" />' . '</a>';
       
   121   }
       
   122   
       
   123   return "$trigger<nowiki>
       
   124     <div style=\"display: none;\">$inner</div>
       
   125     <script type=\"text/javascript\">
       
   126       addOnloadHook(function()
       
   127         {
       
   128           lbgallery_construct('a.$id');
       
   129         });
       
   130     </script></nowiki>";
       
   131 }
       
   132 
       
   133 /**!language**
       
   134 
       
   135 The following text up to the closing comment tag is JSON language data.
       
   136 It is not PHP code but your editor or IDE may highlight it as such. This
       
   137 data is imported when the plugin is loaded for the first time; it provides
       
   138 the strings displayed by this plugin's interface.
       
   139 
       
   140 You should copy and paste this block when you create your own plugins so
       
   141 that these comments and the basic structure of the language data is
       
   142 preserved. All language data is in the same format as the Enano core
       
   143 language files in the /language/* directories. See the Enano Localization
       
   144 Guide and Enano API Documentation for further information on the format of
       
   145 language files.
       
   146 
       
   147 The exception in plugin language file format is that multiple languages
       
   148 may be specified in the language block. This should be done by way of making
       
   149 the top-level elements each a JSON language object, with elements named
       
   150 according to the ISO-639-1 language they are representing. The path should be:
       
   151 
       
   152   root => language ID => categories array, ( strings object => category \
       
   153   objects => strings )
       
   154 
       
   155 All text leading up to first curly brace is stripped by the parser; using
       
   156 a code tag makes jEdit and other editors do automatic indentation and
       
   157 syntax highlighting on the language data. The use of the code tag is not
       
   158 necessary; it is only included as a tool for development.
       
   159 
       
   160 <code>
       
   161 {
       
   162   eng: {
       
   163     categories: [ 'meta', 'lboxgal' ],
       
   164     strings: {
       
   165       meta: {
       
   166         lboxgal: 'Lightbox gallery plugin'
       
   167       },
       
   168       lboxgal: {
       
   169         msg_docs: 'See <a href="http://enanocms.org/plugin/lightboxgallery">lightboxgallery on enanocms.org</a> for usage information.',
       
   170         err_no_images: 'No images specified in gallery. %this.lboxgal_msg_docs%',
       
   171       }
       
   172     }
       
   173   }
       
   174 }
       
   175 </code>
       
   176 
       
   177 **!*/