From a2b04c088ea864990a2920a3760919a715bae942 Mon Sep 17 00:00:00 2001 From: Tom Raithel Date: Fri, 10 Feb 2017 23:38:10 +0100 Subject: [PATCH] Refactor radar creation --- .../languages-and-frameworks/react.md | 2 + static-pages/index.pug | 16 ++- tasks/radar.js | 99 ++++++++++++------- templates/item.pug | 44 +++++---- templates/quadrant.pug | 13 +-- 5 files changed, 107 insertions(+), 67 deletions(-) diff --git a/radar/2016-02-03/languages-and-frameworks/react.md b/radar/2016-02-03/languages-and-frameworks/react.md index 4519d0b..0911b85 100644 --- a/radar/2016-02-03/languages-and-frameworks/react.md +++ b/radar/2016-02-03/languages-and-frameworks/react.md @@ -1,3 +1,5 @@ --- isFeatured: false --- + +Foo! diff --git a/static-pages/index.pug b/static-pages/index.pug index 47c043a..9dfbaaa 100644 --- a/static-pages/index.pug +++ b/static-pages/index.pug @@ -10,14 +10,20 @@ block content = ' ' | March 2017 div + //- + pre + = JSON.stringify(radar, 0, 2) each quadrant, quadrantName in radar .quadrant-section .quadrant-section__header h4= translate(quadrantName) .quadrant-section__lists - each radarItem, itemName in quadrant + each items, ringName in quadrant .quadrant-section__list - a(href='/' + quadrantName + '/' + itemName + '.html') - = radarItem.attributes.title - span(class=`badge badge--${radarItem.attributes.ring}`) - = radarItem.attributes.ring + .ring-list + .ring-list__header + span(class=`badge badge--${ringName}`) + = ringName + each item in items + a.ring-list__item(href='/' + quadrantName + '/' + item.name + '.html') + = item.attributes.title diff --git a/tasks/radar.js b/tasks/radar.js index 9ed833c..54d6347 100644 --- a/tasks/radar.js +++ b/tasks/radar.js @@ -16,11 +16,12 @@ import { export const createRadar = async (tree) => { const fileNames = (await getAllMarkdownFiles(radarPath())); const revisions = await createRevisionsFromFiles(fileNames); - const allVersions = getAllVersions(revisions); - const quadrants = createQuadrants(revisions); - const quadrantsWithIsNewFlag = flagWithIsNew(quadrants, allVersions); + const allReleases = getAllReleases(revisions); + const items = createItems(revisions); + const itemsWithIsNewFlag = flagWithIsNew(items, allReleases); + const quadrants = groupByQuadrants(itemsWithIsNewFlag); - return quadrantsWithIsNewFlag; + return quadrants; }; const createRevisionsFromFiles = (fileNames) => ( @@ -45,40 +46,58 @@ const createRevisionsFromFiles = (fileNames) => ( const itemInfoFromFilename = (fileName) => { const [ - version, + release, quadrant, nameWithSuffix, ] = fileName.split('/').slice(-3); return { name: nameWithSuffix.substr(0, nameWithSuffix.length - 3), - version, + release, quadrant, } }; -const getAllVersions = (revisions) => ( - revisions.reduce((allVersions, { version }) => { - if(!allVersions.includes(version)) { - return [...allVersions, version]; +const getAllReleases = (revisions) => ( + revisions.reduce((allReleases, { release }) => { + if(!allReleases.includes(release)) { + return [...allReleases, release]; } - return allVersions; + return allReleases; }, []).sort() ) -const createQuadrants = (revisions) => ( - revisions.reduce((quadrants, revision) => { - return { - ...quadrants, - [revision.quadrant]: addRevisionToQuadrant(quadrants[revision.quadrant], revision), - }; - }, {}) -); +// const createQuadrants = (revisions) => ( +// revisions.reduce((quadrants, revision) => { +// return { +// ...quadrants, +// [revision.quadrant]: addRevisionToQuadrant(quadrants[revision.quadrant], revision), +// }; +// }, {}) +// ); + +// const addRevisionToQuadrant = (quadrant = {}, revision) => ({ +// ...quadrant, +// [revision.name]: addRevisionToItem(quadrant[revision.name], revision), +// }); const addRevisionToQuadrant = (quadrant = {}, revision) => ({ ...quadrant, - [revision.name]: addRevisionToItem(quadrant[revision.name], revision), + [revision.attributes.ring]: addRevisionToRing(quadrant[revision.attributes.ring], revision), }); +const createItems = (revisions) => { + const itemMap = revisions.reduce((items, revision) => { + return { + ...items, + [revision.name]: addRevisionToItem(items[revision.name], revision), + }; + }, {}); + + return Object + .values(itemMap) + .sort((x, y) => (x.name > y.name ? 1 : -1)); +} + const addRevisionToItem = (item = { attributes: { isFeatured: true, @@ -86,13 +105,12 @@ const addRevisionToItem = (item = { revisions: [], }, revision) => { const { - name, - quadrant, fileName, ...rest, } = revision; let newItem = { ...item, + ...rest, attributes: { ...item.attributes, ...revision.attributes, @@ -154,19 +172,30 @@ const outputQuadrantPage = (quadrantName, quadrant) => ( }) ) -const flagWithIsNew = (radar, allVersions) => ( - Object.entries(radar).reduce((newRadar, [quadrantName, quadrant]) => ({ - ...newRadar, - [quadrantName]: Object.entries(quadrant).reduce((newItem, [itemName, item]) => ({ - ...newItem, - [itemName]: { - ...item, - isNew: isNewItem(item, allVersions), - }, - }), {}), +const flagWithIsNew = (items, allReleases) => ( + items.map((item) => ({ + ...item, + isNew: isNewItem(item, allReleases), + }), []) +); + +const isNewItem = (item, allReleases) => { + return item.revisions[0].release === allReleases[allReleases.length-1] +} + +const groupByQuadrants = (items) => ( + items.reduce((quadrants, item) => ({ + ...quadrants, + [item.quadrant]: addItemToQuadrant(quadrants[item.quadrant], item), }), {}) ); -const isNewItem = (item, allVersions) => { - return item.revisions[0].version === allVersions[allVersions.length-1] -} +const addItemToQuadrant = (quadrant = {}, item) => ({ + ...quadrant, + [item.attributes.ring]: addItemToRing(quadrant[item.attributes.ring], item), +}); + +const addItemToRing = (ring = [], item) => ({ + ...ring, + item, +}); diff --git a/templates/item.pug b/templates/item.pug index 6d10eb0..139b76c 100644 --- a/templates/item.pug +++ b/templates/item.pug @@ -1,31 +1,33 @@ extends layout.pug block vars - - var title=item.attributes.title + //- + - var title=item.attributes.title block content - a(href='/' + quadrantName + '.html')= translate(quadrantName) - h1 #{item.attributes.title} - = ' ' - small #{item.attributes.ring} + //- + a(href='/' + quadrantName + '.html')= translate(quadrantName) + h1 #{item.attributes.title} + = ' ' + small #{item.attributes.ring} - hr + hr - h4= item.revisions[0].version - h5 New: #{item.isNew ? 'YES' : 'NO'} - h5 Feature: #{item.attributes.isFeatured ? 'YES' : 'NO'} + h4= item.revisions[0].version + h5 New: #{item.isNew ? 'YES' : 'NO'} + h5 Feature: #{item.attributes.isFeatured ? 'YES' : 'NO'} - section - != item.revisions[0].body - hr + section + != item.revisions[0].body + hr - ul - each revision, index in item.revisions - if index > 0 - li - h3 - = revision.version - = ' ' - = revision.attributes.ring - != revision.body + ul + each revision, index in item.revisions + if index > 0 + li + h3 + = revision.version + = ' ' + = revision.attributes.ring + != revision.body diff --git a/templates/quadrant.pug b/templates/quadrant.pug index b4574d3..5557cd8 100644 --- a/templates/quadrant.pug +++ b/templates/quadrant.pug @@ -4,9 +4,10 @@ block vars - var title='Quadrant' block content - h1 - = translate(quadrantName) - ul - each radarItem, itemName in quadrant - li - a(href='/' + quadrantName + '/' + itemName + '.html')= radarItem.attributes.title + // + h1 + = translate(quadrantName) + ul + each radarItem, itemName in quadrant + li + a(href='/' + quadrantName + '/' + itemName + '.html')= radarItem.attributes.title