Skip to content

Commit d1f8ab6

Browse files
committed
Add source reader to get lines from github page source
1 parent d9f266f commit d1f8ab6

File tree

7 files changed

+671
-3
lines changed

7 files changed

+671
-3
lines changed

karma.conf.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,13 @@ module.exports = function(config) {
55
files: [
66
'src/**/*.js',
77
'test/**/*.spec.js',
8-
'test/fixtures/*.html',
8+
'test/fixtures/**/*.html',
99
],
1010
exclude: [],
1111
preprocessors: {
1212
'src/**/*.js': ['browserify'],
1313
'test/**/*.spec.js': ['browserify'],
14-
'test/fixtures/*.html': ['html2js'],
14+
'test/fixtures/**/*.html': ['html2js'],
1515
},
1616
browserify: {
1717
debug: true,

package.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,10 @@
99
"test": "./scripts/test",
1010
"watch-test": "./scripts/test --no-single-run --auto-watch"
1111
},
12-
"dependencies": {},
12+
"dependencies": {
13+
"@githublinker/filetype": "^0.1.0",
14+
"jquery": "^2.1.4"
15+
},
1316
"devDependencies": {
1417
"babel-eslint": "^4.1.3",
1518
"babelify": "^6.3.0",

src/sourceReader/index.js

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
import $ from 'jquery';
2+
import fileType from '@githublinker/filetype';
3+
4+
function readLine(el) {
5+
const text = $(el).text();
6+
return {
7+
el,
8+
text,
9+
};
10+
}
11+
12+
function readBlobLines($blob) {
13+
const $lines = $('.blob-code-inner', $blob);
14+
return Array.prototype.map.call($lines, readLine);
15+
}
16+
17+
function getBlobPath(blobElement, basePath) {
18+
let ret = basePath;
19+
20+
// When current page is a diff get path from the file description
21+
const filePath = $('.file-header', blobElement.parentElement).data('path');
22+
if (filePath) {
23+
ret += filePath;
24+
}
25+
26+
return ret;
27+
}
28+
29+
function getBlobMeta(blobElement, basePath) {
30+
const path = getBlobPath(blobElement, basePath);
31+
const type = fileType(path);
32+
const lines = readBlobLines(blobElement);
33+
34+
return {
35+
lines,
36+
type,
37+
path,
38+
};
39+
}
40+
41+
export default function(location = window.location.href) {
42+
let baseLocation = location;
43+
const $blobs = $('.blob-wrapper');
44+
45+
// When current page is a diff get baseLocation from the commit description
46+
const branch = $('.commit .branches-list a').eq(0);
47+
if (branch.length) {
48+
const repoUrl = branch.attr('href');
49+
const branchName = branch.text();
50+
baseLocation = `${repoUrl}/blob/${branchName}/`;
51+
}
52+
53+
return $.map($blobs, (el) => {
54+
return getBlobMeta(el, baseLocation);
55+
});
56+
}
Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
<div id="js-repo-pjax-container" class="repository-content context-loader-container" data-pjax-container="">
2+
<a href="/github-linker/testrepo/blob/6d380ffc7e2ef681f7da6b525140b817f3cb553c/sourcereader/foo.js" class="hidden js-permalink-shortcut" data-hotkey="y">Permalink</a>
3+
<!-- blob contrib key: blob_contributors:v21:1e3978f910d2c31d047054c6e6e9a4a8 -->
4+
<div class="file-navigation js-zeroclipboard-container">
5+
<div class="select-menu js-menu-container js-select-menu left">
6+
<button class="btn btn-sm select-menu-button js-menu-target css-truncate" data-hotkey="w" title="" type="button" aria-label="Switch branches or tags" tabindex="0" aria-haspopup="true">
7+
<i>Tree:</i>
8+
<span class="js-select-button css-truncate-target">6d380ffc7e</span>
9+
</button>
10+
<div class="select-menu-modal-holder js-menu-content js-navigation-container" data-pjax="" aria-hidden="true">
11+
<div class="select-menu-modal">
12+
<div class="select-menu-header">
13+
<span class="octicon octicon-x js-menu-close" role="button" aria-label="Close"></span>
14+
<span class="select-menu-title">Switch branches/tags</span>
15+
</div>
16+
<div class="select-menu-filters">
17+
<div class="select-menu-text-filter">
18+
<input type="text" aria-label="Filter branches/tags" id="context-commitish-filter-field" class="js-filterable-field js-navigation-enable" placeholder="Filter branches/tags">
19+
</div>
20+
<div class="select-menu-tabs">
21+
<ul>
22+
<li class="select-menu-tab">
23+
<a href="#" data-tab-filter="branches" data-filter-placeholder="Filter branches/tags" class="js-select-menu-tab" role="tab">Branches</a>
24+
</li>
25+
<li class="select-menu-tab">
26+
<a href="#" data-tab-filter="tags" data-filter-placeholder="Find a tag…" class="js-select-menu-tab" role="tab">Tags</a>
27+
</li>
28+
</ul>
29+
</div>
30+
</div>
31+
<div class="select-menu-list select-menu-tab-bucket js-select-menu-tab-bucket" data-tab-filter="branches" role="menu">
32+
<div data-filterable-for="context-commitish-filter-field" data-filterable-type="substring">
33+
<a class="select-menu-item js-navigation-item js-navigation-open " href="/github-linker/testrepo/blob/master/sourcereader/foo.js" data-name="master" data-skip-pjax="true" rel="nofollow">
34+
<span class="select-menu-item-icon octicon octicon-check"></span>
35+
<span class="select-menu-item-text css-truncate-target" title="master">
36+
master
37+
</span>
38+
</a>
39+
</div>
40+
<div class="select-menu-no-results">Nothing to show</div>
41+
</div>
42+
<div class="select-menu-list select-menu-tab-bucket js-select-menu-tab-bucket" data-tab-filter="tags">
43+
<div data-filterable-for="context-commitish-filter-field" data-filterable-type="substring">
44+
</div>
45+
<div class="select-menu-no-results">Nothing to show</div>
46+
</div>
47+
</div>
48+
</div>
49+
</div>
50+
<div class="btn-group right">
51+
<a href="/github-linker/testrepo/find/6d380ffc7e2ef681f7da6b525140b817f3cb553c" class="js-show-file-finder btn btn-sm empty-icon tooltipped tooltipped-nw" data-pjax="" data-hotkey="t" aria-label="Quickly jump between files">
52+
<span class="octicon octicon-list-unordered"></span>
53+
</a>
54+
<button aria-label="Copy file path to clipboard" class="js-zeroclipboard btn btn-sm zeroclipboard-button tooltipped tooltipped-s" data-copied-hint="Copied!" type="button"><span class="octicon octicon-clippy"></span></button>
55+
</div>
56+
<div class="breadcrumb js-zeroclipboard-target">
57+
<span class="repo-root js-repo-root"><span itemscope="" itemtype="http://data-vocabulary.org/Breadcrumb"><a href="/github-linker/testrepo/tree/6d380ffc7e2ef681f7da6b525140b817f3cb553c" class="" data-branch="6d380ffc7e2ef681f7da6b525140b817f3cb553c" data-pjax="true" itemscope="url" rel="nofollow"><span itemprop="title">testrepo</span></a></span></span><span class="separator">/</span><span itemscope="" itemtype="http://data-vocabulary.org/Breadcrumb"><a href="/github-linker/testrepo/tree/6d380ffc7e2ef681f7da6b525140b817f3cb553c/sourcereader" class="" data-branch="6d380ffc7e2ef681f7da6b525140b817f3cb553c" data-pjax="true" itemscope="url" rel="nofollow"><span itemprop="title">sourcereader</span></a></span><span class="separator">/</span><strong class="final-path">foo.js</strong>
58+
</div>
59+
</div>
60+
<div class="commit-tease">
61+
<span class="right">
62+
<a class="commit-tease-sha" href="/github-linker/testrepo/commit/6d380ffc7e2ef681f7da6b525140b817f3cb553c" data-pjax="">
63+
6d380ff
64+
</a>
65+
<time datetime="2015-11-01T22:11:45Z" is="relative-time" title="Nov 1, 2015, 11:11 PM GMT+1">17 minutes ago</time>
66+
</span>
67+
<div>
68+
<img alt="@stefanbuck" class="avatar" height="20" src="https://avatars1.githubusercontent.com/u/1393946?v=3&amp;s=40" width="20">
69+
<a href="/stefanbuck" class="user-mention" rel="contributor">stefanbuck</a>
70+
<a href="/github-linker/testrepo/commit/6d380ffc7e2ef681f7da6b525140b817f3cb553c" class="message" data-pjax="true" title="Add JavaScript test files">Add JavaScript test files</a>
71+
</div>
72+
<div class="commit-tease-contributors">
73+
<a class="muted-link contributors-toggle" href="#blob_contributors_box" rel="facebox">
74+
<strong>1</strong>
75+
contributor
76+
</a>
77+
</div>
78+
<div id="blob_contributors_box" style="display:none">
79+
<h2 class="facebox-header" data-facebox-id="facebox-header">Users who have contributed to this file</h2>
80+
<ul class="facebox-user-list" data-facebox-id="facebox-description">
81+
<li class="facebox-user-list-item">
82+
<img alt="@stefanbuck" height="24" src="https://avatars3.githubusercontent.com/u/1393946?v=3&amp;s=48" width="24">
83+
<a href="/stefanbuck">stefanbuck</a>
84+
</li>
85+
</ul>
86+
</div>
87+
</div>
88+
<div class="file">
89+
<div class="file-header">
90+
<div class="file-actions">
91+
<div class="btn-group">
92+
<a href="/github-linker/testrepo/raw/6d380ffc7e2ef681f7da6b525140b817f3cb553c/sourcereader/foo.js" class="btn btn-sm " id="raw-url">Raw</a>
93+
<a href="/github-linker/testrepo/blame/6d380ffc7e2ef681f7da6b525140b817f3cb553c/sourcereader/foo.js" class="btn btn-sm js-update-url-with-hash">Blame</a>
94+
<a href="/github-linker/testrepo/commits/6d380ffc7e2ef681f7da6b525140b817f3cb553c/sourcereader/foo.js" class="btn btn-sm " rel="nofollow">History</a>
95+
</div>
96+
<a class="octicon-btn disabled tooltipped tooltipped-nw" aria-label="You must be on a branch to open this file in GitHub Desktop">
97+
<span class="octicon octicon-device-desktop"></span>
98+
</a>
99+
<button type="button" class="octicon-btn disabled tooltipped tooltipped-nw" aria-label="You must be signed in to make or propose changes">
100+
<span class="octicon octicon-pencil"></span>
101+
</button>
102+
<button type="button" class="octicon-btn octicon-btn-danger disabled tooltipped tooltipped-nw" aria-label="You must be signed in to make or propose changes">
103+
<span class="octicon octicon-trashcan"></span>
104+
</button>
105+
</div>
106+
<div class="file-info">
107+
3 lines (2 sloc)
108+
<span class="file-info-divider"></span>
109+
43 Bytes
110+
</div>
111+
</div>
112+
<div class="blob-wrapper data type-javascript">
113+
<table class="highlight tab-size js-file-line-container" data-tab-size="8">
114+
<tbody>
115+
<tr>
116+
<td id="L1" class="blob-num js-line-number" data-line-number="1"></td>
117+
<td id="LC1" class="blob-code blob-code-inner js-file-line"><span class="pl-k">var</span> foo <span class="pl-k">=</span> <span class="pl-c1">require</span>(<span class="pl-s"><span class="pl-pds">'</span>foo<span class="pl-pds">'</span></span>);</td>
118+
</tr>
119+
<tr>
120+
<td id="L2" class="blob-num js-line-number" data-line-number="2"></td>
121+
<td id="LC2" class="blob-code blob-code-inner js-file-line"><span class="pl-c1">require</span>(<span class="pl-s"><span class="pl-pds">'</span>path<span class="pl-pds">'</span></span>);</td>
122+
</tr>
123+
</tbody>
124+
</table>
125+
</div>
126+
</div>
127+
<a href="#jump-to-line" rel="facebox[.linejump]" data-hotkey="l" style="display:none">Jump to Line</a>
128+
<div id="jump-to-line" style="display:none">
129+
<!-- </textarea> --><!-- '"` -->
130+
<form accept-charset="UTF-8" action="" class="js-jump-to-line-form" method="get">
131+
<div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value=""></div>
132+
<input class="linejump-input js-jump-to-line-field" type="text" placeholder="Jump to line…" aria-label="Jump to line" autofocus="">
133+
<button type="submit" class="btn">Go</button>
134+
</form>
135+
</div>
136+
</div>

0 commit comments

Comments
 (0)