PageRenderTime 279ms CodeModel.GetById 28ms RepoModel.GetById 3ms app.codeStats 0ms

/www/wp-content/plugins/timber-library/lib/timber-twig.php

https://gitlab.com/esiao/wp-timber-startertheme
PHP | 318 lines | 211 code | 31 blank | 76 comment | 25 complexity | 72dd96e1bc0eaa4ef056f846a3d9fe68 MD5 | raw file
  1. <?php
  2. class TimberTwig {
  3. public static $dir_name;
  4. /**
  5. * Initialization
  6. */
  7. public static function init() {
  8. new TimberTwig();
  9. }
  10. function __construct() {
  11. add_action( 'timber/twig/filters', array( $this, 'add_timber_filters_deprecated' ) );
  12. add_action( 'timber/twig/filters', array( $this, 'add_timber_filters' ) );
  13. }
  14. /**
  15. * These are all deprecated and will be removed in 0.21.0
  16. *
  17. * @param Twig_Environment $twig
  18. * @deprecated since 0.20.7
  19. * @return Twig_Environment
  20. */
  21. function add_timber_filters_deprecated( $twig ) {
  22. $twig->addFilter( new Twig_SimpleFilter( 'get_src_from_attachment_id', 'twig_get_src_from_attachment_id' ) );
  23. $twig->addFilter( new Twig_SimpleFilter( 'wp_body_class', array( $this, 'body_class' ) ) );
  24. $twig->addFilter( new Twig_SimpleFilter( 'twitterify', array( 'TimberHelper', 'twitterify' ) ) );
  25. $twig->addFilter( new Twig_SimpleFilter( 'twitterfy', array( 'TimberHelper', 'twitterify' ) ) );
  26. $twig->addFilter( new Twig_SimpleFilter( 'string', function($arr, $glue = ' '){
  27. return twig_join_filter($arr, $glue);
  28. } ) );
  29. return $twig;
  30. }
  31. /**
  32. *
  33. *
  34. * @param Twig_Environment $twig
  35. * @return Twig_Environment
  36. */
  37. function add_timber_filters( $twig ) {
  38. /* image filters */
  39. $twig->addFilter( new Twig_SimpleFilter( 'resize', array( 'TimberImageHelper', 'resize' ) ) );
  40. $twig->addFilter( new Twig_SimpleFilter( 'retina', array( 'TimberImageHelper', 'retina_resize' ) ) );
  41. $twig->addFilter( new Twig_SimpleFilter( 'letterbox', array( 'TimberImageHelper', 'letterbox' ) ) );
  42. $twig->addFilter( new Twig_SimpleFilter( 'tojpg', array( 'TimberImageHelper', 'img_to_jpg' ) ) );
  43. /* debugging filters */
  44. $twig->addFilter( new Twig_SimpleFilter( 'docs', 'twig_object_docs' ) );
  45. $twig->addFilter( new Twig_SimpleFilter( 'get_class', 'get_class' ) );
  46. $twig->addFilter( new Twig_SimpleFilter( 'get_type', 'get_type' ) );
  47. $twig->addFilter( new Twig_SimpleFilter( 'print_r', function( $arr ) {
  48. return print_r( $arr, true );
  49. } ) );
  50. $twig->addFilter( new Twig_SimpleFilter( 'print_a', function( $arr ) {
  51. return '<pre>' . self::object_docs( $arr, true ) . '</pre>';
  52. } ) );
  53. /* other filters */
  54. $twig->addFilter( new Twig_SimpleFilter( 'stripshortcodes', 'strip_shortcodes' ) );
  55. $twig->addFilter( new Twig_SimpleFilter( 'array', array( $this, 'to_array' ) ) );
  56. $twig->addFilter( new Twig_SimpleFilter( 'excerpt', 'wp_trim_words' ) );
  57. $twig->addFilter( new Twig_SimpleFilter( 'function', array( $this, 'exec_function' ) ) );
  58. $twig->addFilter( new Twig_SimpleFilter( 'pretags', array( $this, 'twig_pretags' ) ) );
  59. $twig->addFilter( new Twig_SimpleFilter( 'sanitize', 'sanitize_title' ) );
  60. $twig->addFilter( new Twig_SimpleFilter( 'shortcodes', 'do_shortcode' ) );
  61. $twig->addFilter( new Twig_SimpleFilter( 'time_ago', array( $this, 'time_ago' ) ) );
  62. $twig->addFilter( new Twig_SimpleFilter( 'wpautop', 'wpautop' ) );
  63. $twig->addFilter( new Twig_SimpleFilter( 'relative', function ( $link ) {
  64. return TimberURLHelper::get_rel_url( $link, true );
  65. } ) );
  66. $twig->addFilter( new Twig_SimpleFilter( 'date', array( $this, 'intl_date' ) ) );
  67. $twig->addFilter( new Twig_SimpleFilter( 'truncate', function ( $text, $len ) {
  68. return TimberHelper::trim_words( $text, $len );
  69. } ) );
  70. /* actions and filters */
  71. $twig->addFunction( new Twig_SimpleFunction( 'action', function ( $context ) {
  72. $args = func_get_args();
  73. array_shift( $args );
  74. $args[] = $context;
  75. call_user_func_array( 'do_action', $args );
  76. }, array( 'needs_context' => true ) ) );
  77. $twig->addFilter( new Twig_SimpleFilter( 'apply_filters', function () {
  78. $args = func_get_args();
  79. $tag = current( array_splice( $args, 1, 1 ) );
  80. return apply_filters_ref_array( $tag, $args );
  81. } ) );
  82. $twig->addFunction( new Twig_SimpleFunction( 'function', array( &$this, 'exec_function' ) ) );
  83. $twig->addFunction( new Twig_SimpleFunction( 'fn', array( &$this, 'exec_function' ) ) );
  84. $twig->addFunction( new Twig_SimpleFunction( 'shortcode', 'do_shortcode' ) );
  85. /* TimberObjects */
  86. $twig->addFunction( new Twig_SimpleFunction( 'TimberPost', function ( $pid, $PostClass = 'TimberPost' ) {
  87. if ( is_array( $pid ) && !TimberHelper::is_array_assoc( $pid ) ) {
  88. foreach ( $pid as &$p ) {
  89. $p = new $PostClass( $p );
  90. }
  91. return $pid;
  92. }
  93. return new $PostClass( $pid );
  94. } ) );
  95. $twig->addFunction( new Twig_SimpleFunction( 'TimberImage', function ( $pid, $ImageClass = 'TimberImage' ) {
  96. if ( is_array( $pid ) && !TimberHelper::is_array_assoc( $pid ) ) {
  97. foreach ( $pid as &$p ) {
  98. $p = new $ImageClass( $p );
  99. }
  100. return $pid;
  101. }
  102. return new $ImageClass( $pid );
  103. } ) );
  104. $twig->addFunction( new Twig_SimpleFunction( 'TimberTerm', function ( $pid, $TermClass = 'TimberTerm' ) {
  105. if ( is_array( $pid ) && !TimberHelper::is_array_assoc( $pid ) ) {
  106. foreach ( $pid as &$p ) {
  107. $p = new $TermClass( $p );
  108. }
  109. return $pid;
  110. }
  111. return new $TermClass( $pid );
  112. } ) );
  113. $twig->addFunction( new Twig_SimpleFunction( 'TimberUser', function ( $pid, $UserClass = 'TimberUser' ) {
  114. if ( is_array( $pid ) && !TimberHelper::is_array_assoc( $pid ) ) {
  115. foreach ( $pid as &$p ) {
  116. $p = new $UserClass( $p );
  117. }
  118. return $pid;
  119. }
  120. return new $UserClass( $pid );
  121. } ) );
  122. /* TimberObjects Alias */
  123. $twig->addFunction( new Twig_SimpleFunction( 'Post', function ( $pid, $PostClass = 'TimberPost' ) {
  124. if ( is_array( $pid ) && !TimberHelper::is_array_assoc( $pid ) ) {
  125. foreach ( $pid as &$p ) {
  126. $p = new $PostClass( $p );
  127. }
  128. return $pid;
  129. }
  130. return new $PostClass( $pid );
  131. } ) );
  132. $twig->addFunction( new Twig_SimpleFunction( 'Image', function ( $pid, $ImageClass = 'TimberImage' ) {
  133. if ( is_array( $pid ) && !TimberHelper::is_array_assoc( $pid ) ) {
  134. foreach ( $pid as &$p ) {
  135. $p = new $ImageClass( $p );
  136. }
  137. return $pid;
  138. }
  139. return new $ImageClass( $pid );
  140. } ) );
  141. $twig->addFunction( new Twig_SimpleFunction( 'Term', function ( $pid, $TermClass = 'TimberTerm' ) {
  142. if ( is_array( $pid ) && !TimberHelper::is_array_assoc( $pid ) ) {
  143. foreach ( $pid as &$p ) {
  144. $p = new $TermClass( $p );
  145. }
  146. return $pid;
  147. }
  148. return new $TermClass( $pid );
  149. } ) );
  150. $twig->addFunction( new Twig_SimpleFunction( 'User', function ( $pid, $UserClass = 'TimberUser' ) {
  151. if ( is_array( $pid ) && !TimberHelper::is_array_assoc( $pid ) ) {
  152. foreach ( $pid as &$p ) {
  153. $p = new $UserClass( $p );
  154. }
  155. return $pid;
  156. }
  157. return new $UserClass( $pid );
  158. } ) );
  159. /* bloginfo and translate */
  160. $twig->addFunction( 'bloginfo', new Twig_SimpleFunction( 'bloginfo', function ( $show = '', $filter = 'raw' ) {
  161. return get_bloginfo( $show, $filter );
  162. } ) );
  163. $twig->addFunction( '__', new Twig_SimpleFunction( '__', function ( $text, $domain = 'default' ) {
  164. return __( $text, $domain );
  165. } ) );
  166. /* get_twig is deprecated, use timber/twig */
  167. $twig = apply_filters( 'get_twig', $twig );
  168. $twig = apply_filters( 'timber/twig', $twig );
  169. return $twig;
  170. }
  171. /**
  172. *
  173. *
  174. * @param mixed $arr
  175. * @return array
  176. */
  177. function to_array( $arr ) {
  178. if ( is_array( $arr ) ) {
  179. return $arr;
  180. }
  181. $arr = array( $arr );
  182. return $arr;
  183. }
  184. /**
  185. *
  186. *
  187. * @param string $function_name
  188. * @return mixed
  189. */
  190. function exec_function( $function_name ) {
  191. $args = func_get_args();
  192. array_shift( $args );
  193. if ( is_string($function_name) ) {
  194. $function_name = trim( $function_name );
  195. }
  196. return call_user_func_array( $function_name, ( $args ) );
  197. }
  198. /**
  199. *
  200. *
  201. * @param string $content
  202. * @return string
  203. */
  204. function twig_pretags( $content ) {
  205. return preg_replace_callback( '|<pre.*>(.*)</pre|isU', array( &$this, 'convert_pre_entities' ), $content );
  206. }
  207. /**
  208. *
  209. *
  210. * @param array $matches
  211. * @return string
  212. */
  213. function convert_pre_entities( $matches ) {
  214. return str_replace( $matches[1], htmlentities( $matches[1] ), $matches[0] );
  215. }
  216. /**
  217. * @param mixed $body_classes
  218. * @deprecated 0.20.7
  219. * @return string
  220. */
  221. function body_class( $body_classes ) {
  222. ob_start();
  223. if ( is_array( $body_classes ) ) {
  224. $body_classes = explode( ' ', $body_classes );
  225. }
  226. body_class( $body_classes );
  227. $return = ob_get_contents();
  228. ob_end_clean();
  229. return $return;
  230. }
  231. /**
  232. *
  233. *
  234. * @param string $date
  235. * @param string $format (optional)
  236. * @return string
  237. */
  238. function intl_date( $date, $format = null ) {
  239. if ( $format === null ) {
  240. $format = get_option( 'date_format' );
  241. }
  242. if ( $date instanceof DateTime ) {
  243. $timestamp = $date->getTimestamp();
  244. } else {
  245. $timestamp = strtotime( $date );
  246. }
  247. return date_i18n( $format, $timestamp );
  248. }
  249. //debug
  250. /**
  251. *
  252. *
  253. * @param mixed $obj
  254. * @param bool $methods
  255. * @return string
  256. */
  257. function object_docs( $obj, $methods = true ) {
  258. $class = get_class( $obj );
  259. $properties = (array)$obj;
  260. if ( $methods ) {
  261. /** @var array $methods */
  262. $methods = $obj->get_method_values();
  263. }
  264. $rets = array_merge( $properties, $methods );
  265. ksort( $rets );
  266. $str = print_r( $rets, true );
  267. $str = str_replace( 'Array', $class . ' Object', $str );
  268. return $str;
  269. }
  270. /**
  271. * @param int|string $from
  272. * @param int|string $to
  273. * @param string $format_past
  274. * @param string $format_future
  275. * @return string
  276. */
  277. function time_ago( $from, $to = null, $format_past = '%s ago', $format_future = '%s from now' ) {
  278. $to = $to === null ? time() : $to;
  279. $to = is_int( $to ) ? $to : strtotime( $to );
  280. $from = is_int( $from ) ? $from : strtotime( $from );
  281. if ( $from < $to ) {
  282. return sprintf( $format_past, human_time_diff( $from, $to ) );
  283. } else {
  284. return sprintf( $format_future, human_time_diff( $to, $from ) );
  285. }
  286. }
  287. }