Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit e84289c

Browse files
committed
move to ES6
1 parent a083b73 commit e84289c

File tree

1 file changed

+113
-127
lines changed

1 file changed

+113
-127
lines changed

‎generate.js‎

Lines changed: 113 additions & 127 deletions
Original file line numberDiff line numberDiff line change
@@ -1,158 +1,144 @@
1-
// command: git update-index --assume-unchanged generate.js
21
// to make Git not to track this file anymore
3-
// 还原: git update-index --no-assume-unchanged generate.js
4-
5-
// Notice:
6-
// 注意这个 Cookie 要取 https://leetcode.com/api/problems/algorithms/ 下的
7-
// 而不是 https://leetcode.com/ 下的
8-
var Cookie = "OUTFOX_SEARCH_USER_ID_NCOO=1270182585.150294; LEETCODE_SESSION=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImhhbnppY2hpIiwidXNlcl9zbHVnIjoiaGFuemljaGkiLCJfYXV0aF91c2VyX2lkIjoiMjA3MDc0IiwidGltZXN0YW1wIjoiMjAxNy0wMi0xNiAxMTo0MToxOS45MTI2NjcrMDA6MDAiLCJfYXV0aF91c2VyX2JhY2tlbmQiOiJkamFuZ28uY29udHJpYi5hdXRoLmJhY2tlbmRzLk1vZGVsQmFja2VuZCIsImlkIjoyMDcwNzQsIl9zZXNzaW9uX2V4cGlyeSI6MCwiX2F1dGhfdXNlcl9oYXNoIjoiNjc3MzIyNDNmMGY4YzJmZTA1YTAwZDJlYzdhNzYwY2I4Y2FmN2NiNiIsImVtYWlsIjoiYmlnYmlnc3VucmlzZUBmb3htYWlsLmNvbSJ9.Howj_ZPQs9IAE22zfV4Ly_KwPZzD4w5W2-Sz_wp1Bbs; express.sid=s%3AuAx1lTlxg2OTvH1If4gvyZUpScHCQg42.L8TvyU2du93TkKd4KxDB7%2Bl6r%2FFR%2F%2FSBEZYyxBouiAw; csrftoken=bmPSY3AtNuo4iKpQ5KLfU0ElDX7AYka5iVQ8WgxNsJbepIdruoSvkQBfutFOXHXB; _ga=GA1.2.474225388.1483455439; __atuvc=8%7C5%2C43%7C6%2C23%7C7%2C0%7C8%2C23%7C9; __atuvs=58b68ccb38902096002"
9-
var superagent = require("superagent");
10-
var cheerio = require("cheerio");
11-
var fs = require("fs");
12-
13-
// collect items
14-
var ans = [];
15-
var solvedNum = 0;
16-
var problemNum = 0;
17-
var lockedNum = 0;
18-
19-
function makeMarkdownFile() {
20-
var str = '';
21-
str += '# Leetcode Solutions in JavaScript';
22-
str += '\n';
23-
str += "Update time: " + new Date;
24-
str += '\n\n';
25-
str += "I have solved **" + solvedNum + " / " + problemNum + "** problems ";
26-
str += "while **" + lockedNum + "** problems are still locked."
27-
str += '\n\n';
28-
str += 'If you have any question, please give me an [issue](https://github.com/hanzichi/leetcode/issues).';
29-
str += '\n\n';
30-
str += 'If you are loving solving leetcode problems in JavaScript, please contact me to enjoy it together!'
31-
str += '\n\n';
32-
str += '(Notes: :blue_book: means you need to buy a book from Leetcode)';
33-
str += '\n\n';
34-
str += '| # | Title | Source Code | Explanation | Difficulty |';
35-
str += '\n';
36-
str += '|:---:|:---:|:---:|:---:|:---:|';
37-
str += '\n';
2+
// git update-index --assume-unchanged generate.js
3+
// recover
4+
// git update-index --no-assume-unchanged generate.js
385

6+
const superagent = require("superagent");
7+
const cheerio = require("cheerio");
8+
const fs = require("fs");
9+
const eventproxy = require('eventproxy');
10+
11+
let CONFIG = {
12+
// cookie from -> https://leetcode.com/api/problems/algorithms/
13+
cookie: '',
14+
baseLocalSrc: '',
15+
markdownFileSrc: '',
16+
baseNetSrc: 'https://github.com/hanzichi/leetcode/blob/master/Algorithms/',
17+
api: 'https://leetcode.com/api/problems/algorithms/',
18+
ua: 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.87 Safari/537.36'
19+
};
20+
21+
function makeMarkdownFile(data) {
22+
let {problems, num_total, num_solved, num_locked} = data;
23+
24+
// use ES6 template string
25+
let tpl =
26+
`# Leetcode Solutions with JavaScript
27+
28+
Update time: ${new Date}
29+
30+
I have solved **${num_solved} / ${num_total}** problems while **${num_locked}** problems are still locked.
31+
32+
(Notes: :blue_book: means you need to buy a book from Leetcode)
33+
34+
| # | Title | Source Code | Explanation | Difficulty |
35+
|:---:|:---:|:---:|:---:|:---:|
36+
`
3937
// sort by the problemId desc
40-
ans.sort(function(a, b) {
41-
return +b.problemId - +a.problemId;
42-
});
38+
problems.sort((a, b) => b.problemId - a.problemId);
39+
40+
problems.forEach((item) => {
41+
let {problemId, title, url, language, sourceCode, explanation, difficulty, isSolved, isLocked} = item;
42+
tpl += `| ${problemId} | [${title}](${url}) `;
43+
44+
if (isLocked)
45+
tpl += ':blue_book: ';
4346

44-
for (var i = 0, len = ans.length; i < len; i++) {
45-
var item = ans[i];
46-
47-
var problemId = item.problemId;
48-
var title = item.title;
49-
var url = item.url;
50-
var language = item.language;
51-
var sourceCode = item.sourceCode;
52-
var explanation = item.explanation;
53-
var difficulty = item.difficulty;
54-
var isSolved = item.isSolved;
55-
var isLocked = item.isLocked;
56-
57-
str += '| ' + problemId + ' ';
58-
str += '| ' + '[' + title + '](' + url + ') ';
59-
60-
if (isSolved)
61-
str += '| ' + '[' + language + '](' + sourceCode + ') ';
62-
else if (isLocked) {
63-
// | :blue_book:
64-
str += '| :blue_book: ';
47+
if (isSolved) {
48+
tpl += `| [${language}](${sourceCode}) `;
6549
} else {
66-
str += '| ';
50+
tpl += '| ';
6751
}
6852

6953
if (explanation)
70-
str += '| '+'[Explanation]('+explanation+') ';
54+
tpl += `| [Explanation](${explanation}) `;
7155
else {
72-
str += '| ';
56+
tpl += '| ';
7357
}
7458

75-
str += '| '+difficulty+' |';
76-
str += '\n';
77-
}
59+
tpl += `| ${difficulty} |`;
60+
tpl += '\n';
61+
})
7862

79-
var makeDownFileSrc = "C:/wamp/www/github/leetcode/readme.md";
80-
fs.writeFile(makeDownFileSrc, str);
81-
console.log("success!");
63+
return new Promise((resolve, reject) => {
64+
fs.writeFile(CONFIG.markdownFileSrc, tpl, () => {
65+
resolve("saved!");
66+
});
67+
});
8268
}
8369

8470

85-
function dealWithFile() {
86-
var baseLocalSrc = "C:/wamp/www/github/leetcode/Algorithms/";
87-
var baseNetSrc = "https://github.com/hanzichi/leetcode/blob/master/Algorithms/";
71+
function dealWithFile(data) {
72+
return new Promise((resolve, reject) => {
73+
let ep = new eventproxy();
74+
let baseNetSrc = CONFIG.baseNetSrc;
8875

89-
for(vari=0,len=ans.length;i<len;i++) {
90-
!function(i){
91-
varp=ans[i];
76+
ep.after('read',data.num_solved,(problems)=> {
77+
resolve(data);
78+
});
9279

80+
data.problems.forEach((p) => {
9381
if (p.isSolved) {
94-
var fileSrc = baseLocalSrc + p.title;
82+
let fileSrc = CONFIG.baseLocalSrc + p.title;
9583

96-
fs.readdir(fileSrc, function(err, files) {
97-
files.forEach(function(fileName) {
98-
if (~fileName.indexOf("md")) {
84+
fs.readdir(fileSrc, (err, files)=> {
85+
files.forEach((fileName)=> {
86+
if (fileName.endsWith("md")) {
9987
p.explanation = encodeURI(baseNetSrc + p.title + '/' + fileName);
100-
}
101-
102-
if (~fileName.indexOf("js")) {
103-
p.language = "JavaScript";
104-
p.sourceCode = encodeURI(baseNetSrc + p.title + '/' + fileName);
105-
} else if (~fileName.indexOf("cpp")) {
106-
p.language = "C++";
107-
p.sourceCode = encodeURI(baseNetSrc + p.title + '/' + fileName);
108-
} else if (~fileName.indexOf("py")) {
109-
p.language = "Python";
88+
} else {
89+
// language -> JavaScript/Python/C++
90+
if (fileName.endsWith("js")) {
91+
p.language = "JavaScript";
92+
} else if (fileName.endsWith("cpp")) {
93+
p.language = "C++";
94+
} else if (fileName.endsWith("py")) {
95+
p.language = "Python";
96+
}
11097
p.sourceCode = encodeURI(baseNetSrc + p.title + '/' + fileName);
11198
}
11299
});
100+
101+
ep.emit('read', p);
113102
});
114103
}
115-
}(i);
116-
}
117-
118-
// delay 2000ms to make sure that async operations have been done
119-
// it's better to use eventproxy module
120-
setTimeout(function() {
121-
makeMarkdownFile();
122-
}, 2000);
104+
});
105+
});
123106
}
124107

125-
126108
function makeRequest() {
127-
superagent
128-
.get("https://leetcode.com/api/problems/algorithms/")
129-
.set("Cookie", Cookie) // for logining in
130-
.set("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.87 Safari/537.36")
131-
.end(function(err, res) {
132-
var str = res.text;
133-
var data = JSON.parse(str);
134-
var arr = data.stat_status_pairs;
135-
136-
problemNum = data.num_total;
137-
solvedNum = data.num_solved;
138-
139-
arr.forEach(function(item, index) {
140-
var obj = {
141-
isSolved: item.status === "ac",
142-
problemId: item.stat.question_id,
143-
title: item.stat.question__title,
144-
url: "https://leetcode.com/problems/" + item.stat.question__title_slug + '/',
145-
isLocked: item.paid_only === true,
146-
difficulty: ['', 'Easy', 'Medium', 'Hard'][item.difficulty.level]
147-
};
148-
149-
ans.push(obj);
150-
obj.isLocked && lockedNum++;
151-
});
109+
return new Promise((resolve, reject) => {
110+
superagent
111+
.get(CONFIG.api)
112+
.set("Cookie", CONFIG.cookie) // login in
113+
.set("User-Agent", CONFIG.ua)
114+
.end((err, res) => {
115+
let {stat_status_pairs, num_total, num_solved} = JSON.parse(res.text);
116+
let num_locked = 0;
117+
118+
let problems = stat_status_pairs.map((item) => {
119+
let obj = {
120+
isSolved: item.status === "ac",
121+
problemId: item.stat.question_id,
122+
title: item.stat.question__title,
123+
url: "https://leetcode.com/problems/" + item.stat.question__title_slug + '/',
124+
isLocked: item.paid_only === true,
125+
difficulty: ['', 'Easy', 'Medium', 'Hard'][item.difficulty.level],
126+
};
127+
128+
obj.isLocked && num_locked++;
129+
return obj;
130+
});
152131

153-
dealWithFile();
154-
});
132+
resolve({problems, num_total, num_solved, num_locked});
133+
});
134+
});
155135
}
156136

157-
// start
158-
makeRequest();
137+
// Promise
138+
makeRequest().then((data) => {
139+
return dealWithFile(data);
140+
}).then((data) => {
141+
return makeMarkdownFile(data);
142+
}).then((msg) => {
143+
console.log(msg);
144+
});

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /