@@ -6,6 +6,22 @@ import Editable from 'components/editable';
66
77const { attr, html } = query ;
88
9+ function Image ( { url, alt, align } ) {
10+ let className ;
11+ if ( align ) {
12+ className = `align${ align } ` ;
13+ }
14+
15+ return < img src = { url } alt = { alt } className = { className } /> ;
16+ }
17+
18+ function applyOrUnset ( align ) {
19+ return ( attributes , setAttributes ) => {
20+ const nextAlign = attributes . align === align ? undefined : align ;
21+ setAttributes ( { align : nextAlign } ) ;
22+ } ;
23+ }
24+
925registerBlock ( 'core/image' , {
1026 title : wp . i18n . __ ( 'Image' ) ,
1127
@@ -16,15 +32,43 @@ registerBlock( 'core/image', {
1632 attributes : {
1733 url : attr ( 'img' , 'src' ) ,
1834 alt : attr ( 'img' , 'alt' ) ,
19- caption : html ( 'figcaption' )
35+ caption : html ( 'figcaption' ) ,
36+ align : ( node ) => ( node . className . match ( / \b a l i g n ( \S + ) / ) || [ ] ) [ 1 ]
2037 } ,
2138
39+ controls : [
40+ {
41+ icon : 'align-left' ,
42+ title : wp . i18n . __ ( 'Align left' ) ,
43+ isActive : ( { align } ) => 'left' === align ,
44+ onClick : applyOrUnset ( 'left' )
45+ } ,
46+ {
47+ icon : 'align-center' ,
48+ title : wp . i18n . __ ( 'Align center' ) ,
49+ isActive : ( { align } ) => 'center' === align ,
50+ onClick : applyOrUnset ( 'center' )
51+ } ,
52+ {
53+ icon : 'align-right' ,
54+ title : wp . i18n . __ ( 'Align right' ) ,
55+ isActive : ( { align } ) => 'right' === align ,
56+ onClick : applyOrUnset ( 'right' )
57+ } ,
58+ {
59+ icon : 'align-none' ,
60+ title : wp . i18n . __ ( 'No alignment' ) ,
61+ isActive : ( { align } ) => ! align || 'none' === align ,
62+ onClick : applyOrUnset ( 'none' )
63+ }
64+ ] ,
65+
2266 edit ( { attributes, isSelected, setAttributes } ) {
23- const { url, alt, caption } = attributes ;
67+ const { url, alt, align , caption } = attributes ;
2468
2569 return (
2670 < figure >
27- < img src = { url } alt = { alt } />
71+ < Image url = { url } alt = { alt } align = { align } />
2872 { caption || isSelected ? (
2973 < Editable
3074 tagName = "figcaption"
@@ -37,8 +81,8 @@ registerBlock( 'core/image', {
3781 } ,
3882
3983 save ( { attributes } ) {
40- const { url, alt, caption } = attributes ;
41- const img = < img src = { url } alt = { alt } /> ;
84+ const { url, alt, align , caption } = attributes ;
85+ const img = < Image url = { url } alt = { alt } align = { align } /> ;
4286
4387 if ( ! caption ) {
4488 return img ;
0 commit comments