Skip to content

Commit

Permalink
Add rewrite NodeJS app
Browse files Browse the repository at this point in the history
It helps to rewrite/reformat and make consistent the `baggers.js` file.

```sh
node rewrite/rewrite.js
rewrite/rewrite.js
```

It will generate a file named `rewrite/baggers-new.js` which is git ignored.

The script:

* moves `tags` under each talk, which means that every speaker will have then to modify its talks if tags are incorrects
* normalized the `name` by uppercasing each first letter and lowercasing the other letters.
* normalized website titles. We check for `LinkedIn`, `GitHub`, `Podcast`, `Google+`, `Slideshare`, `Hopwork`, `Book`, `InfoQ` and `Viadeo`. Other titles are set to `Web`
* contact is now an object which contains two fields:
    * `type`: facultative. No data mean `mail`. If no contact was provided, it fallbacks to `twitter`.
    * `url`: the email address is provided, the twitter handle otherwise

For example, `Gregory Estrade` will be modified from:

```json
{
    "since": "2015-09-24",
    "name": "Gregory Estrade",
    "bio": "Directeur R&D de Lyra-Network, software & hardware hacker, reverse-engineer, philosophe agile auto-proclamé. Ou Disruptive Innovation Lead Strategist, Instant Expert in Everything, ça dépend. Membre de l'association Silicium de préservation du patrimoine micro-informatique.",
    "picture": "http://torlus.github.io/hat_pro.png",
    "websites": [
        {
            "title": "Home Page",
            "href": "http://lvt.tl/"
        },
        {
            "title": "GitHub",
            "href": "https://github.com/Torlus"
        },
        {
            "title": "Silicium",
            "href": "http://www.silicium.org/"
        }
    ],
    "twitter": "Torlus",
    "contact": "gregory.estrade@gmail.com",
    "mail": "gregory.estrade@gmail.com",
    "location": "Toulouse",
    "sessions": [
        {
            "title": "Les nouveaux enjeux du paiement.",
            "summary": "Etat de l'art, sécurité, les moyens de paiement et leur avenir, les enjeux du click-and-mortar, SEPA, marketplaces."
        },
        {
            "title": "IoT, software & hardware hacking, FPGA.",
            "summary": "Vous aimez bricoler, prototyper? Moi aussi. Invitez-moi pour de l'aide ou du conseil sur un sujet de votre choix."
        },
        {
            "title": "Café philosophique, agilité, histoire de l'informatique.",
            "summary": "Ayant eu depuis 30 ans les mains sur un clavier (En commençant sur un TRS-80) et étant membre de l'association Silicium, je vous propose de deviser autour de tout ce qui fait l'actualité, et qui tend à montrer que quoi qu'on fasse, l'histoire vient souvent à se répéter."
        }
    ],
    "tags": [
        "Software development",
        "Hardware hacking",
        "Optimisation",
        "Telecom & Réseau",
        "FPGA",
        "Philosophie",
        "Agilité"
    ],
    "cities": [
        "Toulouse"
    ]
}
```

to:

```json
{
  "since": "2015-09-24",
  "name": "Gregory Estrade",
  "bio": "Directeur R&D de Lyra-Network, software & hardware hacker, reverse-engineer, philosophe agile auto-proclamé. Ou Disruptive Innovation Lead Strategist, Instant Expert in Everything, ça dépend. Membre de l'association Silicium de préservation du patrimoine micro-informatique.",
  "picture": "http://torlus.github.io/hat_pro.png",
  "websites": [
    {
      "name": "Web",
      "url": "http://lvt.tl/"
    },
    {
      "name": "GitHub",
      "url": "https://github.com/Torlus"
    },
    {
      "name": "Web",
      "url": "http://www.silicium.org/"
    }
  ],
  "twitter": "Torlus",
  "location": "Toulouse",
  "sessions": [
    {
      "title": "Les nouveaux enjeux du paiement.",
      "abstract": "Etat de l'art, sécurité, les moyens de paiement et leur avenir, les enjeux du click-and-mortar, SEPA, marketplaces.",
      "tags": [
        "Software development",
        "Hardware hacking",
        "Optimisation",
        "Telecom & Réseau",
        "FPGA",
        "Philosophie",
        "Agilité"
      ]
    },
    {
      "title": "IoT, software & hardware hacking, FPGA.",
      "abstract": "Vous aimez bricoler, prototyper? Moi aussi. Invitez-moi pour de l'aide ou du conseil sur un sujet de votre choix.",
      "tags": [
        "Software development",
        "Hardware hacking",
        "Optimisation",
        "Telecom & Réseau",
        "FPGA",
        "Philosophie",
        "Agilité"
      ]
    },
    {
      "title": "Café philosophique, agilité, histoire de l'informatique.",
      "abstract": "Ayant eu depuis 30 ans les mains sur un clavier (En commençant sur un TRS-80) et étant membre de l'association Silicium, je vous propose de deviser autour de tout ce qui fait l'actualité, et qui tend à montrer que quoi qu'on fasse, l'histoire vient souvent à se répéter.",
      "tags": [
        "Software development",
        "Hardware hacking",
        "Optimisation",
        "Telecom & Réseau",
        "FPGA",
        "Philosophie",
        "Agilité"
      ]
    }
  ],
  "cities": [
    "Toulouse"
  ],
  "contact": {
    "url": "gregory.estrade@gmail.com"
  }
}
```

Related to brownbaglunch#65.
  • Loading branch information
dadoonet committed Jan 21, 2016
1 parent 5c991d0 commit 43e8909
Show file tree
Hide file tree
Showing 3 changed files with 250 additions and 0 deletions.
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
.idea
node_modules/
baggers-new.js
30 changes: 30 additions & 0 deletions rewrite/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
{
"name": "rewrite",
"version": "1.0.0",
"description": "Rewrite Data",
"main": "rewrite.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"repository": {
"type": "git",
"url": "git+https://github.com/brownbaglunch/bblfr_data.git"
},
"keywords": [
"bbl",
"brownbaglunch"
],
"author": "David Pilato",
"license": "Apache-2.0",
"bugs": {
"url": "https://github.com/brownbaglunch/bblfr_data/issues"
},
"homepage": "https://github.com/brownbaglunch/bblfr_data#readme",
"dependencies": {
"async": ">= 1.5.1",
"express": "^4.13.3",
"moment": ">= 2.11.0",
"request": "^2.67.0",
"sync-request": ">= 2.1.0"
}
}
217 changes: 217 additions & 0 deletions rewrite/rewrite.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,217 @@
#!/usr/bin/env node

var https = require('https');
var fs = require('fs');
var moment = require('moment');
var request = require('request');
var path = require('path');

console.log("*** starting");

var now = moment();

var data = fs.readFileSync(path.resolve(__dirname, '../baggers.js')).toString();

// Remove the "var data = " part and
script = data.replace("var data = ", "").replace(/;([^;]*)$/, '');
bblfrData = JSON.parse(script);

// Store cities as a map so we will be able to replace cities by coordinates
var cities = {};
bblfrData.cities.forEach(function(obj) {
cities[obj.name] = obj;
} );

var webSiteExists = function(name, url) {
request(url, {method: 'HEAD', timeout: 10000}, function (err, res, body){
if (res !== undefined) {
if (res.statusCode == 404 || res.statusCode >= 500) {
console.log(name, 'Res incorrect URL', url, 'got', res.statusCode);
}
} else {
console.log(name, 'Err incorrect URL', url, 'got', err);
}
});
};

// Read speakers
var websiteTypes = {};
var speakers = [];
bblfrData.baggers.forEach(function(obj) {
var sessions = [];

obj.sessions.forEach(function(session) {
sessions.push({
"title": session.title,
"abstract": session.summary,
"tags": obj.tags
});
});

obj.sessions = sessions;
delete obj.tags;

// Generate the new contact
var contact;
if (obj.contact === undefined) {
contact = {
type: 'twitter',
url: obj.twitter
}
} else {
contact = {
url: obj.mail
}
}

if (obj.since === undefined || obj.since === '') {
// For audit purpose
console.log('no date for', obj.name);
}

delete obj.mail;
delete obj.contact;

obj.contact = contact;

// Rewrite names
obj.name = obj.name.replace(/\w\S*/g, function(txt){return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();});

// Rewrite website links
var websites = [];
if (obj.websites === undefined) {
// For audit purpose
console.log('no website for', obj.name);
} else {
obj.websites.forEach(function(website) {
// webSiteExists(obj.name, website.href);

var name = website.title.toLowerCase();
switch (name) {
case 'linkedin':
case 'linked in':
case 'profil linkedin':
name = 'LinkedIn';
break;
case 'github':
name = 'GitHub';
break;
case 'podcast':
name = 'Podcast';
break;
case 'google+':
name = 'Google+';
break;
case 'slideshare':
name = 'Slideshare';
break;
case 'hopwork':
name = 'Hopwork';
break;
case 'home page':
case 'silicium':
case 'ippon':
case 'code distillers':
case 'loxodata':
case 'use case driven':
case 'one.hundred.acorns':
case 'n-fluent.net':
case 'pragmafabrik':
case 'homepage':
case 'iergo':
case 'easymock':
case 'objenesis':
case 'faveod':
case 'arolla':
case 'agileit':
case 'websbite':
case 'codeurs en seine':
case 'lean kanban france':
case 'lesfurets.com':
case 'duchess france':
case 'affini-tech':
case 'random code':
case 'about me':
case 'ux-fr':
case 'carbon it':
case 'agilexperience':
case 'human coders':
case 'human coders formations':
case 'pragmatic entrepreneurs':
case 'conseil en business model':
case 'bloc-notes sur l\'expérience utilisateur':
case 'mes projets':
case 'tous sur java, c++, la sécurité et la poo':
name = 'Web';
break;
case 'les bouquins que j\'ai écrit':
name = 'Book';
break;
case 'infoq':
name = 'InfoQ';
break;
case 'viadeo':
name = 'Viadeo';
break;
default:
if (name.toLowerCase().indexOf('blog') > -1) {
name = 'Web';
} else if (name.toLowerCase().indexOf('site') > -1) {
name = 'Web';
} else if (website.href.toLowerCase().indexOf('linkedin') > -1) {
name = 'LinkedIn';
} else if (website.href.toLowerCase().indexOf('about.me') > -1) {
name = 'AboutMe';
} else {
name = 'Web';
}
}

// Audit HTTP link


websites.push({
"name": name,
"url": website.href
});

obj.websites = websites;

// For audit purpose
if (websiteTypes[name] !== undefined) {
var nb = websiteTypes[name].nb;
nb++;
websiteTypes[name].nb = nb;
websiteTypes[name].list.push(website.href);
} else {
websiteTypes[name] = {
nb: 1,
list: [ website.href ]
};
}

});
}

speakers.push(obj);

// console.log('speaker', obj.name, JSON.stringify(obj, null, 2));
});

// For audit purpose
//console.log(websiteTypes);
//console.log('different website types', Object.keys(websiteTypes).length);

// Create the new final object
var newData = {
speakers: speakers,
cities: cities
};


var finalString = 'var data = ' + JSON.stringify(newData, null, 2) + ";";

fs.writeFileSync(path.resolve(__dirname, 'baggers-new.js'), finalString);

console.log('file generated');

0 comments on commit 43e8909

Please sign in to comment.