Skip to content

Commit

Permalink
feat: 🆕 add customHTMLTags option
Browse files Browse the repository at this point in the history
  • Loading branch information
brklntmhwk committed Oct 31, 2024
1 parent 0c33a6c commit 2c70a64
Showing 1 changed file with 97 additions and 97 deletions.
194 changes: 97 additions & 97 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,112 +5,112 @@ import type { LeafDirective } from "mdast-util-directive";
import type { Plugin } from "unified";
import { visit } from "unist-util-visit";
import {
isContainerDirective,
isImage,
isLink,
isParagraph,
isText,
isContainerDirective,
isImage,
isLink,
isParagraph,
isText,
} from "./utils.js";

export interface Config {
customHTMLTags: {
enabled: boolean;
};
customHTMLTags: {
enabled: boolean;
};
}

const defaultConfig: Config = {
customHTMLTags: {
enabled: false,
},
customHTMLTags: {
enabled: false,
},
};

const remarkCard: Plugin<[Config?], Root> = (config = defaultConfig) => {
return (tree) => {
visit(tree, isContainerDirective, (node) => {
if (node.name !== "card-grid") return;
if (node.children.length === 0) return;

node.data = {
...node.data,
hName: config.customHTMLTags.enabled ? "card-grid" : "div",
hProperties: {
class: node.attributes?.class,
},
};
});

visit(tree, isContainerDirective, (node) => {
if (node.name !== "card") return;
if (node.children.length === 0) return;

const [firstNode, secondNode, ..._restNodes] = node.children;
if (!isParagraph(firstNode)) return;
if (firstNode.children.length === 0) return;

let cardImageOrLink: PhrasingContent;
let cardContent: PhrasingContent[];
let cardLabel = "";

const imageWrapper: LeafDirective = {
type: "leafDirective",
name: "image-wrapper",
data: {
hName: "div",
},
children: [],
};

const content: LeafDirective = {
type: "leafDirective",
name: "card-content",
data: {
hName: "div",
},
children: [],
};

if (firstNode.data?.directiveLabel === true) {
if (!isText(firstNode.children[0])) return;

cardLabel = firstNode.children[0].value;

if (!isParagraph(secondNode)) return;
const [imageOrLink, ...restContent] = secondNode.children;
cardImageOrLink = imageOrLink;
cardContent = restContent;
} else {
const [imageOrLink, ...restContent] = firstNode.children;
cardImageOrLink = imageOrLink;
cardContent = restContent;
}

if (isImage(cardImageOrLink)) {
cardImageOrLink.alt = cardImageOrLink.alt || cardLabel;
} else if (isLink(cardImageOrLink)) {
const cardImage = cardImageOrLink.children[0];
if (!isImage(cardImage)) return;

cardImage.alt = cardImage.alt || cardLabel;
} else {
return;
}

imageWrapper.children.push(cardImageOrLink);

for (const contentElem of cardContent) {
content.children.push(contentElem);
}

node.data = {
...node.data,
hName: config.customHTMLTags.enabled ? "card" : "div",
hProperties: {
class: node.attributes?.class,
},
};
node.children.splice(0, Number.POSITIVE_INFINITY, imageWrapper, content);
});
};
return (tree) => {
visit(tree, isContainerDirective, (node) => {
if (node.name !== "card-grid") return;
if (node.children.length === 0) return;

node.data = {
...node.data,
hName: config.customHTMLTags.enabled ? "card-grid" : "div",
hProperties: {
class: node.attributes?.class,
},
};
});

visit(tree, isContainerDirective, (node) => {
if (node.name !== "card") return;
if (node.children.length === 0) return;

const [firstNode, secondNode, ..._restNodes] = node.children;
if (!isParagraph(firstNode)) return;
if (firstNode.children.length === 0) return;

let cardImageOrLink: PhrasingContent;
let cardContent: PhrasingContent[];
let cardLabel = "";

const imageWrapper: LeafDirective = {
type: "leafDirective",
name: "image-wrapper",
data: {
hName: "div",
},
children: [],
};

const content: LeafDirective = {
type: "leafDirective",
name: "card-content",
data: {
hName: "div",
},
children: [],
};

if (firstNode.data?.directiveLabel === true) {
if (!isText(firstNode.children[0])) return;

cardLabel = firstNode.children[0].value;

if (!isParagraph(secondNode)) return;
const [imageOrLink, ...restContent] = secondNode.children;
cardImageOrLink = imageOrLink;
cardContent = restContent;
} else {
const [imageOrLink, ...restContent] = firstNode.children;
cardImageOrLink = imageOrLink;
cardContent = restContent;
}

if (isImage(cardImageOrLink)) {
cardImageOrLink.alt = cardImageOrLink.alt || cardLabel;
} else if (isLink(cardImageOrLink)) {
const cardImage = cardImageOrLink.children[0];
if (!isImage(cardImage)) return;

cardImage.alt = cardImage.alt || cardLabel;
} else {
return;
}

imageWrapper.children.push(cardImageOrLink);

for (const contentElem of cardContent) {
content.children.push(contentElem);
}

node.data = {
...node.data,
hName: config.customHTMLTags.enabled ? "card" : "div",
hProperties: {
class: node.attributes?.class,
},
};
node.children.splice(0, Number.POSITIVE_INFINITY, imageWrapper, content);
});
};
};

export default remarkCard;

0 comments on commit 2c70a64

Please sign in to comment.