@jverneaut/html-to-gutenberg
Version:
Create custom Gutenberg blocks from the HTML templates you already have.
147 lines (134 loc) • 3.74 kB
JavaScript
import PrinterBase from "./PrinterBase.js";
import Mustache from "mustache";
import { format } from "prettier";
import parserBabel from "prettier/parser-babel";
import pluginESTree from "prettier/plugins/estree.js";
const template = `{{
import {
useBlockProps,
{{
useBlockEditingMode,
{{/_editingMode}}
{{
InnerBlocks,
{{/_hasInnerBlocks}}
{{
RichText,
{{/_hasRichTextImport}}
{{
MediaUpload,
{{/_hasMediaUploadImport}}
{{
InspectorControls,
{{/_hasInspectorControlsImport}}
{{
BlockControls,
{{/_hasBlockControlsImport}}
} from '@wordpress/block-editor';
{{
import {
{{
PanelBody,
{{/_hasPanelBodyImport}}
{{
CheckboxControl,
{{/_hasCheckboxControlImport}}
{{
RadioControl,
{{/_hasRadioControlImport}}
{{
TextControl,
{{/_hasTextControlImport}}
{{
ToggleControl,
{{/_hasToggleControlImport}}
{{
SelectControl,
{{/_hasSelectControlImport}}
{{
Toolbar,
{{/_hasToolbarImport}}
{{
ToolbarItem,
{{/_hasToolbarItemImport}}
{{
ToolbarGroup,
{{/_hasToolbarGroupImport}}
{{
ToolbarButton,
{{/_hasToolbarButtonImport}}
{{
ToolbarDropdownMenu,
{{/_hasToolbarDropdownMenuImport}}
} from '@wordpress/components';
{{/_hasWordPressComponents}}
{{
import { useSelect } from '@wordpress/data';
import { useEntityProp } from '@wordpress/core-data';
{{/_hasPostType}}
{{
import { Image } from "@10up/block-components/components/image";
{{/_hasMediaUploadImport}}
{{
import { ContentPicker } from "@10up/block-components/components/content-picker";
{{/_hasContentPickerImport}}
{{/content}}
{{
import ServerSideRender from '@wordpress/server-side-render';
{{/_hasServerSideRender}}
{{
{{
import './{{{editorStyle}}}';
{{/editorStyle}}
{{
export default ({{{propsString}}}) => {
{{
useBlockEditingMode('{{{_editingMode}}}');
{{/_editingMode}}
{{
const postType = useSelect(
(select) => select("core/editor").getCurrentPostType(),
[],
);
{{/_hasPostType}}
{{
const [meta, setMeta] = useEntityProp("postType", postType, "meta");
{{/_hasPostMeta}}
{{
const [postTitle, setPostTitle] = useEntityProp("postType", postType, "title");
{{/_hasPostTitle}}
return ({{{ content }}})
};
{{/content}}
{{^content}}
export default () => null;
{{/content}}
`;
export default class PrinterEditJS extends PrinterBase {
static filename = "edit.js";
async print(htmlString) {
const props = [
this.blockData._hasAttributesProps ? "attributes" : false,
this.blockData._hasAttributesProps ? "setAttributes" : false,
this.blockData._hasSelected ? "isSelected" : false,
].filter(Boolean);
const propsString = props.length ? `{${props.join(", ")}}` : "";
const iconsString = this.blockData._icons.length
? [
"import {",
...[...new Set(this.blockData._icons)].map((icon) => `${icon},`),
"} from '@wordpress/icons';\n",
].join("\n")
: false;
const renderedTemplate = Mustache.render(template, {
content: htmlString,
propsString,
iconsString,
...this.blockData,
});
return format(renderedTemplate, {
parser: "babel",
plugins: [parserBabel, pluginESTree],
});
}
}