Pick top N tags from posts
This commit is contained in:
parent
2446ec7f95
commit
b696005d89
1 changed files with 66 additions and 17 deletions
71
src/Nav.js
71
src/Nav.js
|
|
@ -69,33 +69,82 @@ class TagNav extends Component {
|
||||||
constructor (props) {
|
constructor (props) {
|
||||||
super(props);
|
super(props);
|
||||||
|
|
||||||
|
// TODO: fetch this number from config
|
||||||
|
// Number of top tags to display
|
||||||
|
this.numTop = 5;
|
||||||
|
|
||||||
this.state = {
|
this.state = {
|
||||||
topTags: [
|
topTags: [],
|
||||||
'Tag 1',
|
|
||||||
'Tag 2',
|
|
||||||
'Really long tag',
|
|
||||||
'Really really really long tag',
|
|
||||||
'Another tag',
|
|
||||||
],
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
topTags () {
|
fetchTopTags () {
|
||||||
|
fetch('/site.json')
|
||||||
|
.then(resp => resp.json())
|
||||||
|
.then(blob => {
|
||||||
|
let counts = new Map();
|
||||||
|
|
||||||
|
// Count up the tags
|
||||||
|
blob.posts.forEach(post => {
|
||||||
|
post.tags.forEach(tag => {
|
||||||
|
let count = counts.get(tag);
|
||||||
|
if (count === undefined) {
|
||||||
|
count = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
counts.set(tag, count + 1);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
// Sort the tags
|
||||||
|
let tags = [...counts.entries()];
|
||||||
|
tags.sort(function(t1, t2) {
|
||||||
|
let tag1 = t1[0];
|
||||||
|
let tag2 = t2[0];
|
||||||
|
let count1 = t1[1];
|
||||||
|
let count2 = t2[1]
|
||||||
|
|
||||||
|
let diff = count2 - count1;
|
||||||
|
|
||||||
|
if (diff !== 0) {
|
||||||
|
return diff
|
||||||
|
} else {
|
||||||
|
// We have a tie, sort by the strings
|
||||||
|
return tag1.localeCompare(tag2);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Get just the tag names
|
||||||
|
tags = tags.map(t => t[0]);
|
||||||
|
|
||||||
|
// Get top N
|
||||||
|
tags = tags.slice(0, this.numTop);
|
||||||
|
|
||||||
|
this.setState({topTags: tags});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
componentDidMount() {
|
||||||
|
this.fetchTopTags();
|
||||||
}
|
}
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
// TODO: Populate these tags from the top tags in the post
|
let tags = "";
|
||||||
let tags = (
|
if (this.state.topTags.length > 0) {
|
||||||
|
tags = (
|
||||||
|
<div>
|
||||||
|
<h5 className="nav-header">Top Tags</h5>
|
||||||
<ul>
|
<ul>
|
||||||
{this.state.topTags.map(tag => (
|
{this.state.topTags.map(tag => (
|
||||||
<ListLink icon="tag" key={tag} name={tag} href={"/tag/" + tag} />
|
<ListLink icon="tag" key={tag} name={tag} href={"/tag/" + tag} />
|
||||||
))}
|
))}
|
||||||
</ul>
|
</ul>
|
||||||
|
</div>
|
||||||
);
|
);
|
||||||
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Row>
|
<Row>
|
||||||
<h5 className="nav-header">Top Tags</h5>
|
|
||||||
{ tags }
|
{ tags }
|
||||||
</Row>
|
</Row>
|
||||||
);
|
);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue