<?php
function svg_icon(string $icon, ?string $label = null): ?string
{
// These are our possible SVGs
static $config = [
'arrow' => '<svg aria-hidden="true" role="img" focusable="false" width="24" height="24" xmlns="http://www.w3.org/2000/svg" fill-rule="evenodd" clip-rule="evenodd"><path d="M21.883 12l-7.527 6.235.644.765 9-7.521-9-7.479-.645.764 7.529 6.236h-21.884v1h21.883z"/></svg>',
'hamburger' => '<svg aria-hidden="true" role="img" focusable="false" clip-rule="evenodd" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="m13 16.745c0-.414-.336-.75-.75-.75h-9.5c-.414 0-.75.336-.75.75s.336.75.75.75h9.5c.414 0 .75-.336.75-.75zm9-5c0-.414-.336-.75-.75-.75h-18.5c-.414 0-.75.336-.75.75s.336.75.75.75h18.5c.414 0 .75-.336.75-.75zm-4-5c0-.414-.336-.75-.75-.75h-14.5c-.414 0-.75.336-.75.75s.336.75.75.75h14.5c.414 0 .75-.336.75-.75z" fill-rule="nonzero"/></svg>',
'close' => '<svg aria-hidden="true" role="img" focusable="false" clip-rule="evenodd" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="m12.002 2.005c5.518 0 9.998 4.48 9.998 9.997 0 5.518-4.48 9.998-9.998 9.998-5.517 0-9.997-4.48-9.997-9.998 0-5.517 4.48-9.997 9.997-9.997zm0 1.5c-4.69 0-8.497 3.807-8.497 8.497s3.807 8.498 8.497 8.498 8.498-3.808 8.498-8.498-3.808-8.497-8.498-8.497zm0 7.425 2.717-2.718c.146-.146.339-.219.531-.219.404 0 .75.325.75.75 0 .193-.073.384-.219.531l-2.717 2.717 2.727 2.728c.147.147.22.339.22.531 0 .427-.349.75-.75.75-.192 0-.384-.073-.53-.219l-2.729-2.728-2.728 2.728c-.146.146-.338.219-.53.219-.401 0-.751-.323-.751-.75 0-.192.073-.384.22-.531l2.728-2.728-2.722-2.722c-.146-.147-.219-.338-.219-.531 0-.425.346-.749.75-.749.192 0 .385.073.531.219z" fill-rule="nonzero"/></svg>',
];
// If the requested icon doesn't exist, bail
if (!$svg = $config[$icon] ?? null) {
return null;
}
// If we have a label, un-hide the SVG and set the ARIA attribute
if (!empty($label)) {
$svg = str_replace('<svg ', '<svg aria-label="'.esc_attr($label).'"', $svg);
$svg = str_replace('aria-hidden="true"', '', $svg);
}
return $svg;
}
// Samples
echo svg_icon('hamburger', 'Main Menu');
echo PHP_EOL;
echo svg_icon('arrow', 'Click me');
echo PHP_EOL;
echo svg_icon('close');
echo PHP_EOL;
echo svg_icon('nope');
echo PHP_EOL;
// !! DO NOT COPY THIS FUNCTION !!
// This is a stub-function ONLY for the 3v4l.org site.
function esc_attr($string){return $string;}
Finding entry points
Branch analysis from position: 0
1 jumps found. (Code = 62) Position 1 = -2
filename: /in/UvAjF
function name: (null)
number of ops: 23
compiled vars: none
line #* E I O op fetch ext return operands
-------------------------------------------------------------------------------------
29 0 E > INIT_FCALL 'svg_icon'
1 SEND_VAL 'hamburger'
2 SEND_VAL 'Main+Menu'
3 DO_FCALL 0 $0
4 ECHO $0
30 5 ECHO '%0A'
31 6 INIT_FCALL 'svg_icon'
7 SEND_VAL 'arrow'
8 SEND_VAL 'Click+me'
9 DO_FCALL 0 $1
10 ECHO $1
32 11 ECHO '%0A'
33 12 INIT_FCALL 'svg_icon'
13 SEND_VAL 'close'
14 DO_FCALL 0 $2
15 ECHO $2
34 16 ECHO '%0A'
35 17 INIT_FCALL 'svg_icon'
18 SEND_VAL 'nope'
19 DO_FCALL 0 $3
20 ECHO $3
36 21 ECHO '%0A'
43 22 > RETURN 1
Function svg_icon:
Finding entry points
Branch analysis from position: 0
2 jumps found. (Code = 43) Position 1 = 9, Position 2 = 10
Branch analysis from position: 9
1 jumps found. (Code = 62) Position 1 = -2
Branch analysis from position: 10
2 jumps found. (Code = 43) Position 1 = 13, Position 2 = 30
Branch analysis from position: 13
1 jumps found. (Code = 62) Position 1 = -2
Branch analysis from position: 30
filename: /in/UvAjF
function name: svg_icon
number of ops: 34
compiled vars: !0 = $icon, !1 = $label, !2 = $config, !3 = $svg
line #* E I O op fetch ext return operands
-------------------------------------------------------------------------------------
3 0 E > RECV !0
1 RECV_INIT !1 null
6 2 BIND_STATIC !2
13 3 FETCH_DIM_IS ~4 !2, !0
4 COALESCE ~5 ~4
5 QM_ASSIGN ~5 null
6 ASSIGN ~6 !3, ~5
7 BOOL_NOT ~7 ~6
8 > JMPZ ~7, ->10
14 9 > > RETURN null
18 10 > ISSET_ISEMPTY_CV ~8 !1
11 BOOL_NOT ~9 ~8
12 > JMPZ ~9, ->30
19 13 > INIT_FCALL 'str_replace'
14 SEND_VAL '%3Csvg+'
15 INIT_FCALL_BY_NAME 'esc_attr'
16 SEND_VAR_EX !1
17 DO_FCALL 0 $10
18 CONCAT ~11 '%3Csvg+aria-label%3D%22', $10
19 CONCAT ~12 ~11, '%22'
20 SEND_VAL ~12
21 SEND_VAR !3
22 DO_ICALL $13
23 ASSIGN !3, $13
20 24 INIT_FCALL 'str_replace'
25 SEND_VAL 'aria-hidden%3D%22true%22'
26 SEND_VAL ''
27 SEND_VAR !3
28 DO_ICALL $15
29 ASSIGN !3, $15
23 30 > VERIFY_RETURN_TYPE !3
31 > RETURN !3
25 32* VERIFY_RETURN_TYPE
33* > RETURN null
End of function svg_icon
Function esc_attr:
Finding entry points
Branch analysis from position: 0
1 jumps found. (Code = 62) Position 1 = -2
filename: /in/UvAjF
function name: esc_attr
number of ops: 3
compiled vars: !0 = $string
line #* E I O op fetch ext return operands
-------------------------------------------------------------------------------------
43 0 E > RECV !0
1 > RETURN !0
2* > RETURN null
End of function esc_attr
Generated using Vulcan Logic Dumper, using php 8.0.0
preferences:
140.04 ms | 1005 KiB | 18 Q