Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save tylerpaige/85429034190297949f174d63df42f458 to your computer and use it in GitHub Desktop.
Save tylerpaige/85429034190297949f174d63df42f458 to your computer and use it in GitHub Desktop.
Takes a markdown list of links (perhaps from an Economy <4 setting) and outputs JSON that can be used to seed an Economy 5 Menu
/*
REQUIRES NODE INSTALLED ON YOUR MACHINE
USAGE:
------
# firstly, edit the input variables
$ cd path/to/this/script
$ node markdown-list-to-economy-menu-json.js
CONFIG:
-------
No argument handling here. Just redefine the `menuTitle` and `input` variables,
where `menuTitle` becomes to JSON filename, and `input` is the markdown list
bounded by backtickets.
*/
const menuTitle = 'addtl-sitemap';
const input = `- [av office](/audio-video-office)
- [overview](/audio-video-office)
- [equipment request](/audio-video-office/equipment-request)
- [event support](/audio-video-office/event-support)
- [faq](/audio-video-office/faq)
- [output shop](/output-shop)
- [overview](/output-shop)
- [plotting](/output-shop/plotting)
- [fitch colloquium](/fitch)
- [2019](/events/1097-2019-fitch-colloquium-br-record-replay-data-technology-and-experimental-preservation)
- [2017](/events/735-2017-fitch-colloquium-br-ex-situ-on-moving-monuments)
- [2016](/events/290-fitch-colloquium-preservation-and-war)
- [2015](/fitch/2015)
- [end of year show](/eoys)
- [2016](/exhibitions/26-end-of-year-show-2016)
- [2015](/exhibitions/23-end-of-year-show-2015)
- [gis](/gis)
- [data](/gis/data)
- [tutorials](/gis/tutorials)
- [career services](/career-services)
- [job board](https://arch-columbia-csm.symplicity.com/students)
- [arch & ud](/career-services/job-board/#architecture-and-urban-design)
- [up](/career-services/job-board/#urban-planning)
- [hp](/career-services/job-board/#historic-preservation)
- [red](/career-services/job-board/#red)
- [submit a job](/career-services/job-board-submission)
- [studio-x](/studio-x)
- [amman](/environments/11-studio-x-amman)
- [beijing](/environments/12-studio-x-beijing)
- [istanbul](/environments/16-studio-x-istanbul)
- [johannesburg](/environments/17-studio-x-johannesburg)
- [mumbai](/environments/13-studio-x-mumbai)
- [rio de janeiro](/environments/14-studio-x-rio-de-janeiro)
- [summer workshops](/summer-workshops)
- [2017](/summer-workshops/2017)
- [beirut](/environments/22-the-invisible-eight-the-forgotten-or-otherwise-erased-modern-buildings-in-beirut-lebanon)
- [burning man](/environments/29-burning-man-in-black-rock-desert-nevada)
- [harare](/environments/23-afro-imaginaries-in-harare-zimbabwe)
- [hudson valley](/environments/28-justice-in-place-downtown-regeneration-in-the-shadow-of-urban-renewal-in-hudson-river-valley-ny)
- [jordan trail](/environments/27-heritage-sites-of-the-jordan-trail-documenting-and-interpreting-7-000-years-of-urban-living-in-jordan)
- [madrid](/environments/24-the-environmentalist-dilemma-reducing-the-economic-and-social-costs-of-a-low-carbon-city-in-madrid-spain)
- [shenzhen](/environments/25-data-mining-china-urban-village-in-shenzhen-china)
- [tokyo](/environments/26-aging-tokyo-in-japan)
- [2016](/summer-workshops/2016)
- [lalibela](/summer-workshops/2016/ethiopia)
- [beirut](/summer-workshops/2016/beirut)
- [berlin](/summer-workshops/2016/berlin)
- [copenhagen](/summer-workshops/2016/copenhagen)
- [istanbul](/summer-workshops/2016/istanbul)
- [new york](/summer-workshops/2016/nyc-tech)
- [shenzhen](/summer-workshops/2016/shenzhen)
- [2015](/summer-workshops/2015)
- [2014](/summer-workshops/2014)
- [2013](/summer-workshops/2013)
- [fabrication lab](/research/labs/4-fabrication-lab)
- [required training](/research/labs/4-fabrication-lab/training)
- [hardware](/research/labs/4-fabrication-lab/hardware)
- [software](/research/labs/4-fabrication-lab/software)
- [future anterior](/future-anterior)
- [call for papers](/future-anterior/cfp)
- [graphics project](/graphics-project)
- [2019](/graphics-project/2019)
- [2018](/graphics-project/2018)
- [2017](/graphics-project/2017)
- [2016](/graphics-project/2016)
- [2015](/graphics-project/2015)
- [2014](/graphics-project/2014)
- [student awards](/student-awards)
- [2019](/student-awards/2019)
- [2018](/student-awards/2018)
- [2017](/student-awards/2017)
- [2016](/student-awards/2016)
- [2015](/student-awards/2015)
- [2014](/student-awards/2014)
- [abstract](/abstract)
- [professor/ta submission](/abstract/submit)
- [student submission](/abstract/student-submit)
- [goodman fellowship](/goodman-fellowship)
- [about](/goodman-fellowship)
- [apply](/goodman-fellowship/apply)
- [dean's office](/deans-office)
- [faculty appointments](/deans-office/faculty-appointments)
- [student appointments](/deans-office/student-appointments)
- [grant proposals](/deans-office/grant-proposals)
- [prizes & awards](/deans-office/prizes-awards)
- [finance office: administration](/finance-administration)
- [payments & purchasing](/finance-administration/payments-purchasing)
- [procurement policies](/finance-administration/procurement-policies)
- [travel guide](/finance-administration/travel-guide)
- [key forms](/finance-administration/key-forms)
- [finance office: human resources](/finance-human-resources)
- [administration payroll](/finance-human-resources/administration-payroll)
- [student payroll](/finance-human-resources/student-payroll)
- [time away from work](/finance-human-resources/time-away)
- [key forms](/finance-human-resources/key-forms)`;
const fs = require("fs");
const markdownToJsonStr = input => {
let index = 0;
const parsed = [...input.matchAll(/^(\s*)- \[(.+)\]\((.+)\)/gm)]
.map(m => {
const leadingWhitespace = m[1].length;
const key = m[2];
const url = m[3];
const jsonSketch = `{ "key": "${key}", "id" : "${index}", "url" : "${url}"`;
index++;
return {
leadingWhitespace,
jsonSketch
};
})
.map((m, index, list) => {
let suffix;
const nextItem = list[index + 1];
if (nextItem && nextItem.leadingWhitespace > m.leadingWhitespace) {
suffix = ', "children" : ['
} else if ( nextItem && nextItem.leadingWhitespace === m.leadingWhitespace) {
suffix = '},'
} else if (!nextItem && m.leadingWhitespace > 0) {
suffix = '}]}'
} else {
suffix = '}'
}
let prefix;
const prevItem = list[index - 1];
if (prevItem && prevItem.leadingWhitespace > m.leadingWhitespace) {
prefix = ']}, ';
} else {
prefix = '';
}
return `${prefix}${m.jsonSketch}${suffix}`;
})
.join('');
return `[${parsed}]`;
};
const date = new Date().toLocaleDateString().replace(/\//g, '-');
const time = new Date().toLocaleTimeString().replace(/(\s)/g,'');
const filename = `${menuTitle}--${date}--${time}.json`;
fs.writeFile(filename, markdownToJsonStr(input), { encoding: 'utf-8' }, (err) => {
if (err) {
console.error(err);
return false;
}
console.log(`Converted markdown list to Economy Menu json at ${filename}`);
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment