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' );