This repository has been archived by the owner on Oct 22, 2022. It is now read-only.
/
github_trending_base.dart
86 lines (76 loc) · 2.38 KB
/
github_trending_base.dart
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
import 'package:http/http.dart' as http;
import 'package:html/parser.dart' show parse;
class TrendingRepository {
String owner;
String name;
String description;
int starCount;
int forkCount;
TrendingRepositoryPrimaryLanguage primaryLanguage;
TrendingRepository({
this.owner,
this.name,
this.description,
this.starCount,
this.forkCount,
this.primaryLanguage,
});
}
class TrendingRepositoryPrimaryLanguage {
String name;
String color;
TrendingRepositoryPrimaryLanguage({this.name, this.color});
}
Future<List<TrendingRepository>> getTrendingRepositories() async {
var res = await http.get('https://github.com/trending');
var document = parse(res.body);
var items = document.querySelectorAll('.repo-list>li');
return items.map((item) {
TrendingRepositoryPrimaryLanguage primaryLanguage;
var colorNode = item.querySelector('.repo-language-color');
if (colorNode != null) {
primaryLanguage = TrendingRepositoryPrimaryLanguage(
name: colorNode.nextElementSibling?.innerHtml?.trim(),
color: RegExp(r'(#\w{6})')
.firstMatch(colorNode.attributes['style'])
.group(0));
}
var starCountStr = item.children[3]
.querySelector('.octicon-star')
?.parent
?.innerHtml
?.replaceFirst(RegExp(r'^[\s\S]*svg>'), '')
?.replaceAll(',', '')
?.trim();
var starCount = starCountStr == null ? null : int.tryParse(starCountStr);
var forkCountStr = item
.querySelector('.octicon-repo-forked')
?.parent
?.innerHtml
?.replaceFirst(RegExp(r'^[\s\S]*svg>'), '')
?.replaceAll(',', '')
?.trim();
var forkCount = forkCountStr == null ? null : int.tryParse(forkCountStr);
return TrendingRepository(
owner: item
.querySelector('h3>a>span')
?.innerHtml
?.replaceFirst('/', '')
?.trim(),
name: item
.querySelector('h3>a')
?.innerHtml
?.replaceFirst(RegExp(r'^[\s\S]*span>'), '')
?.trim(),
description: item.children[2]
.querySelector('p')
?.innerHtml
?.trim()
?.replaceAll(RegExp(r'<g-emoji.*?>'), '') // TODO: emoji
?.replaceAll(RegExp(r'</g-emoji>'), ''),
starCount: starCount,
forkCount: forkCount,
primaryLanguage: primaryLanguage,
);
}).toList();
}