@nolebase/vitepress-plugin-page-properties
Version:
A VitePress plugin that renders frontmatter as page properties, and makes them editable.
68 lines (67 loc) • 2.97 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.usePageProperties = usePageProperties;
var _virtualNolebasePageProperties = _interopRequireDefault(require("virtual:nolebase-page-properties"));
var _vue = require("vue");
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
function normalizeProperties(frontmatter, propertyConfig, calculatedPropertiesActualData) {
const {
key
} = propertyConfig;
const baseResolvedProperties = {
key: "unknown",
pageProperty: propertyConfig,
value: "",
omitEmpty: true
};
if (propertyConfig.type === "dynamic") {
if (propertyConfig.key) baseResolvedProperties.key = propertyConfig.key;else baseResolvedProperties.key = propertyConfig.type;
baseResolvedProperties.value = calculatedPropertiesActualData || "";
baseResolvedProperties.omitEmpty = false;
return baseResolvedProperties;
}
if (!key) return baseResolvedProperties;
baseResolvedProperties.key = propertyConfig.key;
if ("omitEmpty" in propertyConfig) baseResolvedProperties.omitEmpty = !!propertyConfig.omitEmpty;
if (!Object.keys(frontmatter).length || !frontmatter[String(key)]) return baseResolvedProperties;
baseResolvedProperties.value = frontmatter[String(key)];
return baseResolvedProperties;
}
function usePageProperties(pageData, userConfiguredPageProperties) {
const pagePropertiesData = (0, _vue.ref)({
..._virtualNolebasePageProperties.default
});
if (!pagePropertiesData.value) pagePropertiesData.value = {};
return {
config: (0, _vue.computed)(() => {
if (!userConfiguredPageProperties.value || !userConfiguredPageProperties.value.length) return [];
const currentPath = (0, _vue.toValue)(pageData.value.filePath).toLowerCase();
const matchedPagePropertiesForCurrentPath = pagePropertiesData.value[currentPath];
if (!matchedPagePropertiesForCurrentPath || !Object.keys(matchedPagePropertiesForCurrentPath).length) return [];
const mPageProperties = userConfiguredPageProperties.value.map(item => normalizeProperties(pageData.value.frontmatter, item, matchedPagePropertiesForCurrentPath));
return mPageProperties.filter(item => {
if (item.omitEmpty && !item.value) return false;
return true;
});
}),
data: (0, _vue.computed)(() => {
const currentPath = (0, _vue.toValue)(pageData.value.filePath).toLowerCase();
const matchedPagePropertiesForCurrentPath = pagePropertiesData.value[currentPath];
if (!matchedPagePropertiesForCurrentPath || !Object.keys(matchedPagePropertiesForCurrentPath).length) return {
readingTime: 0,
wordsCount: 0
};
return {
readingTime: matchedPagePropertiesForCurrentPath.readingTime || 0,
wordsCount: matchedPagePropertiesForCurrentPath.wordsCount || 0
};
}),
update(data) {
pagePropertiesData.value = {
...data
};
}
};
}