add_query_arg( 'ver', ONDAVILO_VERSION, plugins_url( 'assets/assistant.css', __FILE__ ) ), 'front' => add_query_arg( 'ver', ONDAVILO_VERSION, plugins_url( 'assets/front.css', __FILE__ ) ) ), JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS | JSON_HEX_QUOT ) . ';', 'before' ); register_block_type( __DIR__, array( 'render_callback' => 'sflo_render' ) ); register_block_type( __DIR__ . '/background' ); } add_action( 'init', 'sflo_assets_and_block' ); /** The assistant also runs in the editor canvas; its stylesheet is shared with that document. */ function sflo_editor_assistant_assets() { wp_enqueue_style( 'sflo-assistant' ); wp_enqueue_style( 'sflo-front' ); } add_action( 'enqueue_block_editor_assets', 'sflo_editor_assistant_assets' ); /** Rendering accepts parameters only; arbitrary SVG/CSS/HTML is never accepted. */ function sflo_render( $attributes ) { if ( PHP_INT_SIZE < 8 ) { return ''; } $c = sflo_normalize( $attributes ); if ( $c['upper'] === $c['lower'] ) { return ''; } $class = 'sflo-' . substr( md5( wp_json_encode( $c ) ), 0, 12 ); $style = '--sflo-desktop:' . $c['desktop'] . 'px;--sflo-tablet:' . $c['tablet'] . 'px;--sflo-mobile:' . $c['mobile'] . 'px'; $classes = 'sflo-divider ' . $class . ( $c['motion'] ? ' sflo-divider-motion' : '' ); $wrapper = get_block_wrapper_attributes( array( 'class' => $classes, 'style' => $style ) ); // Wrapper attributes are escaped by WordPress; sflo_svg() escapes its generated SVG attributes. // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Escaped wrapper and generated, escaped SVG. return '
' . sflo_svg( $c ) . '
'; } function sflo_workshop_menu() { add_management_page( __( 'Ondavilo', 'ondavilo' ), __( 'Ondavilo', 'ondavilo' ), 'edit_posts', 'ondavilo', 'sflo_workshop_page' ); } add_action( 'admin_menu', 'sflo_workshop_menu' ); function sflo_workshop_assets( $hook ) { if ( $hook !== 'tools_page_ondavilo' || PHP_INT_SIZE < 8 ) { return; } wp_enqueue_script( 'sflo-engine' ); wp_enqueue_script( 'sflo-assistant' ); wp_enqueue_style( 'sflo-assistant' ); wp_enqueue_style( 'sflo-front' ); wp_enqueue_script( 'sflo-portable-source', plugins_url( 'assets/portable-source.js', __FILE__ ), array(), ONDAVILO_VERSION, true ); wp_enqueue_script( 'sflo-workshop', plugins_url( 'assets/workshop.js', __FILE__ ), array( 'sflo-engine', 'sflo-adapters' ), ONDAVILO_VERSION, true ); wp_enqueue_script( 'sflo-workshop-analysis', plugins_url( 'assets/workshop-analysis.js', __FILE__ ), array( 'sflo-assistant', 'sflo-portable-source' ), ONDAVILO_VERSION, true ); wp_enqueue_style( 'sflo-workshop', plugins_url( 'assets/workshop.css', __FILE__ ), array(), ONDAVILO_VERSION ); wp_enqueue_style( 'sflo-collections', plugins_url( 'assets/collections.css', __FILE__ ), array( 'sflo-workshop' ), ONDAVILO_VERSION ); wp_enqueue_script( 'sflo-studio', plugins_url( 'assets/studio.js', __FILE__ ), array( 'sflo-workshop' ), ONDAVILO_VERSION, true ); wp_enqueue_style( 'sflo-background-workshop', plugins_url( 'assets/background-workshop.css', __FILE__ ), array( 'sflo-workshop' ), ONDAVILO_VERSION ); wp_enqueue_script( 'sflo-background-workshop', plugins_url( 'assets/background-workshop.js', __FILE__ ), array( 'sflo-background-engine', 'sflo-studio' ), ONDAVILO_VERSION, true ); wp_enqueue_script( 'sflo-catalog', plugins_url( 'assets/catalog.js', __FILE__ ), array(), ONDAVILO_VERSION, true ); wp_enqueue_script( 'sflo-collections', plugins_url( 'assets/collections.js', __FILE__ ), array( 'sflo-engine', 'sflo-background-engine', 'sflo-studio', 'sflo-catalog' ), ONDAVILO_VERSION, true ); wp_enqueue_style( 'sflo-style-library', plugins_url( 'assets/style-library.css', __FILE__ ), array( 'sflo-workshop' ), ONDAVILO_VERSION ); wp_enqueue_script( 'sflo-style-library', plugins_url( 'assets/style-library.js', __FILE__ ), array( 'sflo-workshop', 'sflo-background-workshop' ), ONDAVILO_VERSION, true ); wp_add_inline_script( 'sflo-style-library', 'window.OndaviloStyleStore=' . wp_json_encode( array( 'url' => admin_url( 'admin-ajax.php' ), 'nonce' => wp_create_nonce( 'sflo_styles' ) ), JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS | JSON_HEX_QUOT ) . ';', 'before' ); $pages = array(); foreach ( get_posts( array( 'post_type' => 'page', 'post_status' => 'publish', 'numberposts' => 80, 'orderby' => 'title', 'order' => 'ASC' ) ) as $page ) { if ( $page->post_password !== '' ) { continue; } $pages[] = array( 'title' => wp_strip_all_tags( get_the_title( $page ) ), 'url' => get_permalink( $page ), 'edit' => current_user_can( 'edit_post', $page->ID ) ? get_edit_post_link( $page->ID, 'raw' ) : '' ); } $config = array( 'home' => home_url( '/' ), 'pages' => $pages ); wp_add_inline_script( 'sflo-workshop-analysis', 'window.OndaviloSite=' . wp_json_encode( $config, JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS | JSON_HEX_QUOT ) . ';', 'before' ); } add_action( 'admin_enqueue_scripts', 'sflo_workshop_assets' ); function sflo_workshop_page() { if ( ! current_user_can( 'edit_posts' ) ) { wp_die( esc_html__( 'Accès non autorisé.', 'ondavilo' ) ); } if ( PHP_INT_SIZE < 8 ) { wp_die( esc_html__( 'Ondavilo nécessite PHP 64 bits. L’atelier ne peut pas être utilisé dans cet environnement.', 'ondavilo' ) ); } echo '
'; require __DIR__ . '/includes/studio-header.php'; require __DIR__ . '/includes/analysis-markup.php'; require __DIR__ . '/includes/workshop-markup.php'; require __DIR__ . '/includes/background-markup.php'; echo '
'; require __DIR__ . '/includes/style-library-markup.php'; require __DIR__ . '/includes/collections-markup.php'; echo '
'; } function sflo_settings_link( $links ) { if ( current_user_can( 'edit_posts' ) ) { array_unshift( $links, '' . esc_html__( 'Ouvrir l’atelier', 'ondavilo' ) . '' ); } return $links; } add_filter( 'plugin_action_links_' . plugin_basename( __FILE__ ), 'sflo_settings_link' ); function sflo_platform_notice() { if ( PHP_INT_SIZE < 8 && current_user_can( 'activate_plugins' ) ) { echo '

' . esc_html__( 'Ondavilo nécessite PHP 64 bits. Les blocs et l’atelier sont désactivés dans cet environnement.', 'ondavilo' ) . '

'; } } add_action( 'admin_notices', 'sflo_platform_notice' );