diff --git a/src/lib/menu.js b/src/lib/menu.js new file mode 100644 index 00000000..b8843d78 --- /dev/null +++ b/src/lib/menu.js @@ -0,0 +1,52 @@ +const url = require('url') +const getPathWithNoTrailingSlash = require('../lib/url').getPathWithNoTrailingSlash +const urlToPattern = require('../lib/url').urlToPattern +const isMatchPathPattern = require('../lib/url').isMatchPathPattern +const isEqualPate = require('../lib/url').isEqualPath +const { compose, any } = require('../lib/common') + +function isActive(path, menuItem) { + return isEqualPate(path, menuItem.url, true) +} + +function isHighlighted(path, menuItem) { + return any(flatMenuItem(menuItem) + .map(i => isMatchPathPattern( + compose(urlToPattern, getPathWithNoTrailingSlash)(i.url), + path, + true + )) + ) +} + +function flatMenuItem(item) { + const rootUrl = item.url + const flatUrls = items => { + return items.map(item => ({ + ...item, + url: url.resolve(rootUrl, item.url) + })) + } + + return !item.items + ? [item] + : item.items.reduce((acc, i) => [...acc, ...compose(flatUrls, flatMenuItem)(i)], [item]) +} + +/** + * Takes plain menu model and sample path and defines is an item of menu should be active + * + * @param path + * @param menu + * @return {{items}} + */ +function buildMenu(path, menu) { + const items = menu.map(item => ({ + ...item, + active: isActive(path, item), + highlighted: isHighlighted(path, item), + })) + return { items } +} + +exports.buildMenu = buildMenu diff --git a/src/lib/render.js b/src/lib/render.js index 9d14a2eb..b9b27ab7 100644 --- a/src/lib/render.js +++ b/src/lib/render.js @@ -1,16 +1,11 @@ const {readFile} = require('async-file') const handlebars = require('handlebars') -const url = require('url') const renderApp = require('../lib/component').renderApp const getHtml = require('../lib/component').getHtml -const getPathWithNoTrailingSlash = require('../lib/url').getPathWithNoTrailingSlash -const urlToPattern = require('../lib/url').urlToPattern -const isMatchPathPattern = require('../lib/url').isMatchPathPattern -const isEqualPate = require('../lib/url').isEqualPath -const {compose, any} = require('../lib/common') const menuModel = require('../models/menu').default +const buildMenu = require('../menu').buildMenu const {viewMain, viewEdit} = require('../config') const defaultOptions = { @@ -28,50 +23,6 @@ const defaultMeta = { imageHeight: 630, } -function isActive(path, menuItem) { - return isEqualPate(path, menuItem.url, true) -} - -function isHighlighted(path, menuItem) { - return any(flatMenuItem(menuItem) - .map(i => isMatchPathPattern( - compose(urlToPattern, getPathWithNoTrailingSlash)(i.url), - path, - true - )) - ) -} - -function flatMenuItem(item) { - const rootUrl = item.url - const flatUrls = items => { - return items.map(item => ({ - ...item, - url: url.resolve(rootUrl, item.url) - })) - } - - return !item.items - ? [item] - : item.items.reduce((acc, i) => [...acc, ...compose(flatUrls, flatMenuItem)(i)], [item]) -} - -/** - * Takes plain menu model and sample path and defines is an item of menu should be active - * - * @param path - * @param menu - * @return {{items}} - */ -function buildMenu(path, menu) { - const items = menu.map(item => ({ - ...item, - active: isActive(path, item), - highlighted: isHighlighted(path, item), - })) - return {items} -} - const getTitle = meta => 'title' in meta ? meta.title : 'Шлиссельбургская художественная школа'