Plugin Directory

Changeset 3463466


Ignore:
Timestamp:
02/17/2026 12:05:29 PM (6 weeks ago)
Author:
jorisvanmontfort
Message:

version 1.6

Location:
jvm-rich-text-icons/trunk
Files:
7 added
3 deleted
9 edited

Legend:

Unmodified
Added
Removed
  • jvm-rich-text-icons/trunk/dist/blocks.asset.php

    r3458442 r3463466  
    1 <?php return array('dependencies' => array('react-jsx-runtime', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-dom-ready', 'wp-element', 'wp-i18n', 'wp-rich-text'), 'version' => '18b71cc4c254cd2560b7');
     1<?php return array('dependencies' => array('react-jsx-runtime', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-dom-ready', 'wp-element', 'wp-i18n', 'wp-rich-text'), 'version' => '9d371a5b985f530e55d9');
  • jvm-rich-text-icons/trunk/dist/css/admin-settings.css

    r3094356 r3463466  
    1 #jvm-rich-text-icons_custom_icon_generator h2.title{
    2         display: inline-block;
    3     }
     1#jvm-rich-text-icons_custom_icon_generator {
     2  background: #fff;
     3  border: 1px solid #c3c4c7;
     4  border-radius: 4px;
     5  padding: 16px;
     6  margin-top: 24px;
     7}
    48
    5     #jvm-rich-text-icons_custom_icon_uploader {
    6         text-align: center;
    7     }
     9#jvm-rich-text-icons_custom_icon_generator h2.title {
     10  display: inline-block;
     11  margin: 0 8px 0 0;
     12  font-size: 1.2em;
     13}
    814
    9     /*#jvm-rich-text-icons_custom_icon_generator .uploader-inline .drop-instructions {
     15#jvm-rich-text-icons_custom_icon_uploader {
     16  text-align: center;
     17}
     18
     19/*#jvm-rich-text-icons_custom_icon_generator .uploader-inline .drop-instructions {
    1020        display: none;
    1121    }
     
    1525    }*/
    1626
    17     #jvm-rich-text-icons_custom_icon_generator .media-sidebar {
    18         position: relative;
    19         width: auto;
    20         margin-top: 12px;
    21         padding: 0 16px;
    22         border-left: 4px solid #d63638;
    23         box-shadow: 0 1px 1px 0 rgb(0 0 0 / 10%);
    24         background-color: #fff;
    25         overflow: auto;
    26     }
     27#jvm-rich-text-icons_custom_icon_generator .media-sidebar {
     28  position: relative;
     29  width: auto;
     30  margin-top: 12px;
     31  padding: 0 16px;
     32  border-left: 4px solid #d63638;
     33  box-shadow: 0 1px 1px 0 rgb(0 0 0 / 10%);
     34  background-color: #fff;
     35  overflow: auto;
     36}
    2737
    28     #jvm-rich-text-icons_custom_icon_generator #upload-progess {
    29         display: none;
    30     }
     38#jvm-rich-text-icons_custom_icon_generator #upload-progess {
     39  display: none;
     40}
    3141
    32     #jvm-rich-text-icons_custom_icon_generator #media-uploader-status.uploading #upload-progess {
    33         display: block;
    34     }
     42#jvm-rich-text-icons_custom_icon_generator
     43  #media-uploader-status.uploading
     44  #upload-progess {
     45  display: block;
     46}
    3547
     48#jvm-rich-text-icons_custom_icon_generator .media-progress-bar {
     49  position: relative;
     50  height: 10px;
     51  width: 70%;
     52  margin: 10px auto;
     53  border-radius: 10px;
     54  background: #dcdcde;
     55  width: 100%;
     56}
    3657
    37     #jvm-rich-text-icons_custom_icon_generator .media-progress-bar {
    38         position: relative;
    39         height: 10px;
    40         width: 70%;
    41         margin: 10px auto;
    42         border-radius: 10px;
    43         background: #dcdcde;
    44         width: 100%;
    45     }
     58#jvm-rich-text-icons_custom_icon_generator .media-progress-bar div {
     59  height: 10px;
     60  min-width: 20px;
     61  width: 0;
     62  background: #2271b1;
     63  border-radius: 10px;
     64  transition: width 0.3s;
     65}
    4666
    47     #jvm-rich-text-icons_custom_icon_generator .media-progress-bar div {
    48         height: 10px;
    49         min-width: 20px;
    50         width: 0;
    51         background: #2271b1;
    52         border-radius: 10px;
    53         transition: width .3s;
    54     }
     67#jvm-rich-text-icons_custom_icon_generator #media-uploader-status.errors::after,
     68#jvm-rich-text-icons_custom_icon_generator
     69  #media-uploader-status.uploading::after {
     70  content: "";
     71  display: flex;
     72  clear: both;
     73  height: 24px;
     74}
    5575
    56     #jvm-rich-text-icons_custom_icon_generator #media-uploader-status.errors::after,
    57     #jvm-rich-text-icons_custom_icon_generator #media-uploader-status.uploading::after {
    58         content: "";
    59         display: flex;
    60         clear: both;
    61         height: 24px;   
    62     }
     76#jvm-rich-text-icons_custom_icon_generator .media-sidebar .upload-error {
     77  margin: 12px 0;
     78  padding: 4px 0 0;
     79  border: none;
     80  box-shadow: none;
     81  background: 0 0;
     82}
    6383
    64     #jvm-rich-text-icons_custom_icon_generator .media-sidebar .upload-error {
    65         margin: 12px 0;
    66         padding: 4px 0 0;
    67         border: none;
    68         box-shadow: none;
    69         background: 0 0;
    70     }
     84#jvm-rich-text-icons_custom_icon_generator
     85  #upload-errors
     86  .upload-error-filename {
     87  font-weight: 600;
     88}
    7189
    72     #jvm-rich-text-icons_custom_icon_generator #upload-errors .upload-error-filename {
    73         font-weight: 600;
    74     }
     90#jvm-rich-text-icons_custom_icon_generator
     91  #upload-errors
     92  .upload-error-message {
     93  display: block;
     94  padding-top: 8px;
     95  word-wrap: break-word;
     96}
    7597
    76     #jvm-rich-text-icons_custom_icon_generator #upload-errors .upload-error-message {
    77         display: block;
    78         padding-top: 8px;
    79         word-wrap: break-word;
    80     }
     98#jvm-rich-text-icons_custom_icon_uploader
     99  .uploader-inline
     100  h2.drop-instructions {
     101  font-size: 20px;
     102  line-height: 1.4;
     103  font-weight: 400;
     104  margin: 0;
     105}
    81106
    82     #jvm-rich-text-icons_custom_icon_uploader .uploader-inline h2.drop-instructions {
    83         font-size: 20px;
    84         line-height: 1.4;
    85         font-weight: 400;
    86         margin: 0;
    87     }
     107#jvm-rich-text-icons_custom_icon_uploader .close {
     108  background-color: transparent;
     109  border: 0;
     110  cursor: pointer;
     111  height: 48px;
     112  outline: 0;
     113  padding: 0;
     114  position: absolute;
     115  right: 2px;
     116  text-align: center;
     117  top: 2px;
     118  width: 48px;
     119  z-index: 1;
     120}
    88121
    89     #jvm-rich-text-icons_custom_icon_uploader .close{
    90         background-color: transparent;
    91         border: 0;
    92         cursor: pointer;
    93         height: 48px;
    94         outline: 0;
    95         padding: 0;
    96         position: absolute;
    97         right: 2px;
    98         text-align: center;
    99         top: 2px;
    100         width: 48px;
    101         z-index: 1;
    102     }
     122#jvm-rich-text-icons_custom_icon_uploader .close:before {
     123  font: normal 30px/1 dashicons !important;
     124  color: #50575e;
     125  display: inline-block;
     126  content: "\f335";
     127  font-weight: 300;
     128  margin-top: 1px;
     129}
    103130
    104     #jvm-rich-text-icons_custom_icon_uploader .close:before {
    105         font: normal 30px/1 dashicons!important;
    106         color: #50575e;
    107         display: inline-block;
    108         content: "\f335";
    109         font-weight: 300;
    110         margin-top: 1px;
    111     }
     131#jvm-rich-text-icons_custom_icon_uploader .upload-ui {
     132  margin: 2em 0;
     133}
    112134
    113     #jvm-rich-text-icons_custom_icon_uploader .upload-ui {
    114         margin: 2em 0;
    115     }
     135#jvm-rich-text-icons_custom_icon_uploader .dz-default.dz-message {
     136  display: none;
     137}
    116138
    117     #jvm-rich-text-icons_custom_icon_uploader .dz-default.dz-message {
    118         display: none;
    119     }
     139#svg-file-list {
     140  display: grid;
     141  grid-template-columns: repeat(auto-fill, minmax(80px, 1fr));
     142  gap: 8px;
     143  padding: 4px;
     144  margin: 20px 0;
     145}
    120146
    121     #svg-file-list {
    122         font-size: 48px;
    123         margin: 40px 0;
    124     }
     147#svg-file-list .icon-dialog-link {
     148  display: flex;
     149  flex-direction: column;
     150  align-items: center;
     151  padding: 8px 4px;
     152  border: 1px solid #dcdcde;
     153  border-radius: 4px;
     154  color: #000;
     155  text-decoration: none;
     156  min-height: 70px;
     157  transition:
     158    border-color 0.15s,
     159    background-color 0.15s;
     160}
    125161
    126     #svg-file-list .icon-dialog-link {
    127         border: 1px solid #8c8f94;
    128         border-radius: 4px;
    129         display: inline-flex;
    130         width: 60px;
    131         height: 60px;
    132         align-items: center;
    133         justify-content: center;
    134         margin: 0 0 10px 0;
    135         color:  #000;
    136         text-decoration: none;
    137     }
     162#svg-file-list .icon-dialog-link:hover {
     163  border-color: #2271b1;
     164  background-color: #f0f6fc;
     165}
    138166
    139     #svg-file-list .icon-dialog-link i {
    140         margin: 0 !important;
    141         top:  0 !important;
    142     }
     167#svg-file-list .icon-dialog-link i {
     168  font-size: 24px;
     169  width: 24px;
     170  height: 24px;
     171  display: flex;
     172  align-items: center;
     173  justify-content: center;
     174  margin: 0 !important;
     175  top: 0 !important;
     176}
     177
     178#svg-file-list .icon-dialog-label {
     179  font-size: 10px;
     180  text-align: center;
     181  word-break: break-all;
     182  line-height: 1.2;
     183  color: #333;
     184  max-width: 100%;
     185  overflow: hidden;
     186  text-overflow: ellipsis;
     187  display: -webkit-box;
     188  -webkit-line-clamp: 2;
     189  -webkit-box-orient: vertical;
     190  margin-top: 4px;
     191}
  • jvm-rich-text-icons/trunk/package.json

    r3458442 r3463466  
    88  },
    99  "devDependencies": {
    10     "@wordpress/scripts": "^31.4.0"
     10    "@wordpress/scripts": "^31.4.0",
     11    "webpack": "^5.105.1",
     12    "webpack-cli": "^6.0.1"
    1113  }
    1214}
  • jvm-rich-text-icons/trunk/plugin.php

    r3460659 r3463466  
    33 * Plugin Name: JVM Rich Text Icons
    44 * Description: Insert icons anywhere in your content. Inline in text, as a block, or in ACF fields. Includes Font Awesome and supports custom SVG icons.
    5  * Version: 1.5.1
     5 * Version: 1.6.0
    66 * Author: Joris van Montfort
    77 * Author URI: https://jorisvm.nl
    8  * Text Domain: jvm-richtext-icons
     8 * Text Domain: jvm-rich-text-icons
    99 * Domain Path: languages
    1010 *
    1111 * @category Gutenberg
    1212 * @author Joris van Montfort
    13  * @version 1.5.1
     13 * @version 1.6.0
    1414 * @package JVM Rich Text Icons
    1515 */
     
    2121 * Initializer.
    2222 */
     23load_plugin_textdomain( 'jvm-rich-text-icons', false, dirname( plugin_basename( __FILE__ ) ) . '/languages' );
     24
     25require_once plugin_dir_path( __FILE__ ) . 'src/renderer.php';
    2326require_once plugin_dir_path( __FILE__ ) . 'src/init.php';
    2427
  • jvm-rich-text-icons/trunk/readme.txt

    r3460659 r3463466  
    44Tags: icon, svg, font-awesome, gutenberg, icon-block
    55Requires at least: 5.4
    6 Tested up to: 6.9
    7 Stable tag: 1.5.1
     6Tested up to: 6.9 * Stable tag: 1.6.0
    87License: GPLv2 or later
    98License URI: http://www.gnu.org/licenses/gpl-2.0.html
     
    8483== Changelog ==
    8584
     85= 1.6.0 =
     86* Renamed the "Custom SVG icon set" to "My SVG uploads" for clarity.
     87* Improved layout forSVG uploads grid on the settings page: CSS grid layout with icon class name labels.
     88* Added Dutch and German translations.
     89* Added `load_plugin_textdomain()` for translation support.
     90* Fixed Text Domain header mismatch (was `jvm-richtext-icons`, now matches code: `jvm-rich-text-icons`).
     91* Centralized CSS renderer for custom SVG icons. Replaces three separate view files with a single renderer class that supports all render technologies (inline-svg, html-css, html-css-before, html-css-after).
     92* Icons JSON parser supports a new pro/extended format alongside the existing flat array and Fontello formats.
     93* More preparation for (Pro) future features.
     94
    8695= 1.5.1 =
    8796* Added extensibility hooks for pro plugin support: `jvm_richtext_icons_svg_directories`, `jvm_richtext_icons_use_inline_svg`, `jvm_richtext_icons_available_icon_sets`, `jvm_richtext_icons_valid_icon_sets`, `jvm_richtext_icons_load_default_css`.
  • jvm-rich-text-icons/trunk/src/init.php

    r3460659 r3463466  
    384384                        $icons[] = $data->css_prefix_text.$g->css;
    385385                    }
    386                 }else {
     386                // Pro/extended format: object with icons array of {name, tags, categories, styles}
     387                } elseif (is_object($data) && isset($data->icons) && is_array($data->icons)) {
     388                    foreach ($data->icons as $icon) {
     389                        if (is_object($icon) && isset($icon->name)) {
     390                            $icons[] = $icon->name;
     391                        } elseif (is_string($icon)) {
     392                            $icons[] = $icon;
     393                        }
     394                    }
     395                // Legacy format: flat array of class name strings
     396                } else {
    387397                    $icons = $data;
    388398                }
     
    448458    public static function parse_dynamic_css() {
    449459        $settings = self::get_settings();
    450         $view = 'dynamic_css.php';
    451 
    452         if ($settings['technology'] == 'html-css-before') {
    453             $view = 'dynamic_css_before.php';
    454         }else  if ($settings['technology'] == 'html-css-after') {
    455             $view = 'dynamic_css_after.php';
    456         }
    457 
    458         return JVM_Richtext_icons::render_view($view, ['files' => JVM_Richtext_icons::get_svg_file_list(), 'settings', JVM_Richtext_icons::get_settings()]);
     460        $technology = isset($settings['technology']) ? $settings['technology'] : 'html-css';
     461        $files = self::get_svg_file_list();
     462        $prefix_class = self::get_class_prefix();
     463
     464        $icons = [];
     465        foreach ($files as $file) {
     466            $pi = pathinfo($file);
     467            $icon_class = sanitize_title($pi['filename']);
     468            $file_content = file_get_contents($file);
     469            if ($file_content === false) { continue; }
     470
     471            $ratio = 1;
     472            $dom = new DOMDocument();
     473            @$dom->load($file);
     474            $svg = $dom->getElementsByTagName('svg');
     475            if ($svg && $svg->length > 0) {
     476                $viewBox = $svg[0]->getAttribute('viewBox');
     477                if ($viewBox) {
     478                    list($x, $y, $width, $height) = explode(' ', $viewBox);
     479                } else {
     480                    $width = str_replace('px', '', $svg[0]->getAttribute('width'));
     481                    $height = str_replace('px', '', $svg[0]->getAttribute('height'));
     482                }
     483                if (!empty($width) && !empty($height)) {
     484                    $ratio = $width / $height;
     485                }
     486            }
     487
     488            $icons[] = ['class' => $icon_class, 'svg' => $file_content, 'ratio' => $ratio];
     489        }
     490
     491        return JVM_RTI_Renderer::generate_css($icons, $technology);
    459492    }
    460493
  • jvm-rich-text-icons/trunk/src/settings.php

    r3460659 r3463466  
    2828                add_action( 'admin_menu', array( $this, 'add_plugin_page' ) );
    2929                add_action( 'admin_init', array( $this, 'page_init' ) );
     30                add_action( 'admin_init', array( $this, 'register_technology_field' ), 30 );
    3031                add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_scripts' ));
    3132
     
    5152                    $iconFileLoaded = apply_filters('jvm_richtext_icons_iconset_file', $iconFileDefault);
    5253
    53                     if ($iconFileDefault != $iconFileLoaded) {
     54                    $show_custom_notice = apply_filters('jvm_richtext_icons_show_custom_iconset_notice', $iconFileDefault != $iconFileLoaded, $iconFileLoaded);
     55                    if ($show_custom_notice) {
    5456                        echo '<div class="notice notice-warning">';
    5557                        echo '<p>'.sprintf(__("A custom icon set is being loaded from: %s. Keep your setting set to the default Font Awsome icon set to keep this working. The custom icon set can't be loaded if you are creating a SVG icon set from this page.", 'jvm-rich-text-icons'), $iconFileLoaded).'</p>';
     
    231233                    'fa-5'       => __('Font Awesome Free 5.15.4', 'jvm-rich-text-icons'),
    232234                    'fa-6'       => __('Font Awesome Free 6.7.2', 'jvm-rich-text-icons'),
    233                     'custom-svg' => __('Custom SVG icon set', 'jvm-rich-text-icons'),
     235                    'custom-svg' => __('My SVG uploads', 'jvm-rich-text-icons'),
    234236                ];
    235237                $icon_sets = apply_filters('jvm_richtext_icons_available_icon_sets', $icon_sets);
     
    246248        );
    247249
    248         if ($this->options['icon_set'] == 'custom-svg') {
    249             add_settings_field(
    250                 'technology', // ID
    251                 __('Render technology', 'jvm-rich-text-icons'), // Title
    252                 function () {
    253                     echo '<select name="jvm-rich-text-icons[technology]">';
    254 
    255                     $checked = $this->options['technology'] == 'inline-svg' ? ' selected' : '';
    256                     echo '<option value="inline-svg"'.$checked.'>'.__('Inline SVG', 'jvm-rich-text-icons').'</option>';
    257 
    258                     $checked = $this->options['technology'] == 'html-css' ? ' selected' : '';
    259                     echo '<option value="html-css"'.$checked.'>'.__('HTML + CSS', 'jvm-rich-text-icons').'</option>';
    260                     $checked = $this->options['technology'] == 'html-css-before' ? ' selected' : '';
    261                     echo '<option value="html-css-before"'.$checked.'>'.__('HTML + CSS ::before pseudo-element', 'jvm-rich-text-icons').'</option>';
    262 
    263                     $checked = $this->options['technology'] == 'html-css-after' ? ' selected' : '';
    264                     echo '<option value="html-css-after"'.$checked.'>'.__('HTML + CSS ::after pseudo-element', 'jvm-rich-text-icons').'</option>';
    265 
    266                     echo '</select>';
    267                 },
    268                 'jvm-rich-text-icons', // Page
    269                 'general' // Section
    270             );
    271         }
    272 
    273250        register_setting(
    274251            'jvm-rich-text-icons', // Option group
     
    278255    }
    279256
     257    /**
     258     * Register the technology field at priority 30 so it appears after
     259     * any pro plugin fields (style, stroke width) registered at priority 20.
     260     */
     261    public function register_technology_field() {
     262        $this->options = JVM_Richtext_icons::get_settings();
     263
     264        add_settings_field(
     265            'technology', // ID
     266            __('Render technology', 'jvm-rich-text-icons'), // Title
     267            function () {
     268                echo '<select name="jvm-rich-text-icons[technology]">';
     269
     270                $checked = $this->options['technology'] == 'inline-svg' ? ' selected' : '';
     271                echo '<option value="inline-svg"'.$checked.'>'.__('Inline SVG', 'jvm-rich-text-icons').'</option>';
     272
     273                $checked = $this->options['technology'] == 'html-css' ? ' selected' : '';
     274                echo '<option value="html-css"'.$checked.'>'.__('HTML + CSS', 'jvm-rich-text-icons').'</option>';
     275                $checked = $this->options['technology'] == 'html-css-before' ? ' selected' : '';
     276                echo '<option value="html-css-before"'.$checked.'>'.__('HTML + CSS ::before pseudo-element', 'jvm-rich-text-icons').'</option>';
     277
     278                $checked = $this->options['technology'] == 'html-css-after' ? ' selected' : '';
     279                echo '<option value="html-css-after"'.$checked.'>'.__('HTML + CSS ::after pseudo-element', 'jvm-rich-text-icons').'</option>';
     280
     281                echo '</select>';
     282            },
     283            'jvm-rich-text-icons', // Page
     284            'general', // Section
     285            [ 'class' => 'jvm-rti-technology-row' ]
     286        );
     287    }
     288
    280289    public function validation_notice($text) {
    281290        return '<div id="setting-error-empty" class="error settings-error notice"><p><strong>'.esc_html($text).'</strong></p></div>';
     
    290299        $sanitized = [];
    291300
    292         $valid_icon_sets = ['default', 'fa-5', 'fa-6', 'custom-svg'];
     301        $valid_icon_sets = ['default', 'fa-5', 'fa-6', 'fa-7', 'custom-svg'];
    293302        $valid_icon_sets = apply_filters('jvm_richtext_icons_valid_icon_sets', $valid_icon_sets);
    294303        if (isset($input['icon_set']) && in_array($input['icon_set'], $valid_icon_sets, true)) {
  • jvm-rich-text-icons/trunk/views/icon-list.php

    r3458442 r3463466  
    1313        echo '<a id="icon-dialog-link-'.$icon_class.'" href="#icon-dialog" class="icon-dialog-link icon" data-icon-class-full="'.$css_class . ' ' . $icon_class .'" data-icon-class="'. $icon_class .'" data-file="'.esc_js(basename($file)).'" data-nonce="'.$nonce.'">';
    1414        echo '<i class="' . $css_class . ' ' . $icon_class . '" aria-hidden="true"> </i>';
     15        echo '<span class="icon-dialog-label">' . esc_html($icon_class) . '</span>';
    1516        echo '</a>'."\n";
    1617    }
  • jvm-rich-text-icons/trunk/views/settings.php

    r3460659 r3463466  
    11<div class="wrap">
    22    <h1><?php _e('Rich Text Icons Settings', 'jvm-rich-text-icons');?></h1>
     3    <?php $settings = JVM_Richtext_icons::get_settings(); ?>
     4    <?php if ( in_array( $settings['icon_set'], array( 'default', 'fa-5', 'fa-6' ), true ) ) : ?>
     5        <style>.form-table tr.jvm-rti-technology-row { display: none; }</style>
     6    <?php endif; ?>
    37    <form id="jvm-rich-text-icons-settings-form" method="post" action="options.php">
    48    <?php
     
    711        do_settings_sections( 'jvm-rich-text-icons' );
    812        submit_button();
    9 
    10         $settings = JVM_Richtext_icons::get_settings();
    1113    ?>
    1214    </form>
    1315    <?php do_action('jvm_richtext_icons_settings_after_form', $settings); ?>
    1416    <div id="jvm-rich-text-icons_custom_icon_generator" <?php echo $settings['icon_set'] != "custom-svg" ? ' style="display: none;"' : "";?>>
    15         <h2 class="title"><?php _e('Custom SVG icon set', 'jvm-rich-text-icons');?></h2><a id="add_icon_btn" href="#" class="page-title-action"><?php _e('Add Icon', 'jvm-rich-text-icons');?></a>
     17        <h2 class="title"><?php _e('My SVG uploads', 'jvm-rich-text-icons');?></h2><a id="add_icon_btn" href="#" class="page-title-action"><?php _e('Add Icon', 'jvm-rich-text-icons');?></a>
    1618        <?php
    1719            echo JVM_Richtext_icons::render_view('uploader.php');
     
    2022    </div>
    2123    <?php do_action('jvm_richtext_icons_settings_after_icons', $settings); ?>
     24    <?php if ( apply_filters('jvm_richtext_icons_show_donate', true) ) : ?>
    2225    <form action="https://www.paypal.com/donate" method="post" target="_top">
    2326        <p style="max-width: 500px;">
     
    2831        <img alt="" border="0" src="https://www.paypal.com/en_NL/i/scr/pixel.gif" width="1" height="1" />
    2932    </form>
     33    <?php endif; ?>
    3034
    3135</div>
Note: See TracChangeset for help on using the changeset viewer.