source: trunk/www.guidonia.net/wp/wp-content/plugins/contact-form-7/includes/shortcodes.php@ 44

Last change on this file since 44 was 44, checked in by luciano, 14 years ago
File size: 3.8 KB
Line 
1<?php
2
3class WPCF7_ShortcodeManager {
4
5 var $shortcode_tags = array();
6
7 // Taggs scanned at the last time of do_shortcode()
8 var $scanned_tags = null;
9
10 // Executing shortcodes (true) or just scanning (false)
11 var $exec = true;
12
13 function add_shortcode( $tag, $func, $has_name = false ) {
14 if ( is_callable( $func ) )
15 $this->shortcode_tags[$tag] = array(
16 'function' => $func,
17 'has_name' => (boolean) $has_name );
18 }
19
20 function remove_shortcode( $tag ) {
21 unset( $this->shortcode_tags[$tag] );
22 }
23
24 function do_shortcode( $content, $exec = true ) {
25 $this->exec = (bool) $exec;
26 $this->scanned_tags = array();
27
28 if ( empty( $this->shortcode_tags ) || ! is_array( $this->shortcode_tags) )
29 return $content;
30
31 $pattern = $this->get_shortcode_regex();
32 return preg_replace_callback( '/' . $pattern . '/s',
33 array(&$this, 'do_shortcode_tag'), $content );
34 }
35
36 function scan_shortcode( $content ) {
37 $this->do_shortcode( $content, false );
38 return $this->scanned_tags;
39 }
40
41 function get_shortcode_regex() {
42 $tagnames = array_keys( $this->shortcode_tags );
43 $tagregexp = join( '|', array_map( 'preg_quote', $tagnames ) );
44
45 return '(\[?)\[(' . $tagregexp . ')(?:\s(.*?))?(?:\s(\/))?\](?:(.+?)\[\/\2\])?(\]?)';
46 }
47
48 function do_shortcode_tag( $m ) {
49 // allow [[foo]] syntax for escaping a tag
50 if ( $m[1] == '[' && $m[6] == ']' ) {
51 return substr( $m[0], 1, -1 );
52 }
53
54 $tag = $m[2];
55 $attr = $this->shortcode_parse_atts( $m[3] );
56
57 $scanned_tag = array();
58 $scanned_tag['type'] = $tag;
59
60 if ( is_array( $attr ) ) {
61 if ( is_array( $attr['options'] ) && ! empty( $attr['options'] ) ) {
62 if ( $this->shortcode_tags[$tag]['has_name'] )
63 $scanned_tag['name'] = array_shift( $attr['options'] );
64 $scanned_tag['options'] = $attr['options'];
65 }
66 $scanned_tag['raw_values'] = (array) $attr['values'];
67
68 if ( WPCF7_USE_PIPE ) {
69 $pipes = new WPCF7_Pipes( $scanned_tag['raw_values'] );
70 $scanned_tag['values'] = $pipes->collect_befores();
71 $scanned_tag['pipes'] = $pipes;
72 } else {
73 $scanned_tag['values'] = $scanned_tag['raw_values'];
74 }
75
76 } else {
77 $scanned_tag['attr'] = $attr;
78 }
79
80 $content = trim( $m[5] );
81 $content = preg_replace( "/<br\s*\/?>$/m", '', $content );
82 $scanned_tag['content'] = $content;
83
84 $this->scanned_tags[] = $scanned_tag;
85
86 $func = $this->shortcode_tags[$tag]['function'];
87
88 if ( $this->exec ) {
89 $scanned_tag = apply_filters( 'wpcf7_form_tag', $scanned_tag );
90 return $m[1] . call_user_func( $func, $scanned_tag ) . $m[6];
91 } else {
92 return $m[0];
93 }
94 }
95
96 function shortcode_parse_atts( $text ) {
97 $atts = array();
98 $text = preg_replace( "/[\x{00a0}\x{200b}]+/u", " ", $text );
99 $text = stripcslashes( trim( $text ) );
100
101 $pattern = '%^([-0-9a-zA-Z:.#_/|\s]*?)((?:\s*"[^"]*"|\s*\'[^\']*\')*)$%';
102
103 if ( preg_match( $pattern, $text, $match ) ) {
104 if ( ! empty( $match[1] ) ) {
105 $atts['options'] = preg_split( '/[\s]+/', trim( $match[1] ) );
106 }
107 if ( ! empty( $match[2] ) ) {
108 preg_match_all( '/"[^"]*"|\'[^\']*\'/', $match[2], $matched_values );
109 $atts['values'] = wpcf7_strip_quote_deep( $matched_values[0] );
110 }
111 } else {
112 $atts = $text;
113 }
114
115 return $atts;
116 }
117
118}
119
120$wpcf7_shortcode_manager = new WPCF7_ShortcodeManager();
121
122function wpcf7_add_shortcode( $tag, $func, $has_name = false ) {
123 global $wpcf7_shortcode_manager;
124
125 return $wpcf7_shortcode_manager->add_shortcode( $tag, $func, $has_name );
126}
127
128function wpcf7_remove_shortcode( $tag ) {
129 global $wpcf7_shortcode_manager;
130
131 return $wpcf7_shortcode_manager->remove_shortcode( $tag );
132}
133
134function wpcf7_do_shortcode( $content ) {
135 global $wpcf7_shortcode_manager;
136
137 return $wpcf7_shortcode_manager->do_shortcode( $content );
138}
139
140function wpcf7_get_shortcode_regex() {
141 global $wpcf7_shortcode_manager;
142
143 return $wpcf7_shortcode_manager->get_shortcode_regex();
144}
145
146?>
Note: See TracBrowser for help on using the repository browser.