Skip to content

Commit df929df

Browse files
authored
Extract Additional Link Details (#74)
* Fully utilize DataTables for Links Results Page * Allow Extracting Additional Link Details
1 parent 352adbb commit df929df

13 files changed

Lines changed: 354 additions & 173 deletions

gulpfile.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,11 @@ gulp.task('datatables', () => {
2121
'node_modules/datatables.net/js/dataTables.min.js',
2222
'node_modules/datatables.net-bs5/js/dataTables.bootstrap5.min.js',
2323
'node_modules/datatables.net-bs5/css/dataTables.bootstrap5.min.css',
24+
'node_modules/datatables.net-buttons/js/dataTables.buttons.min.js',
25+
'node_modules/datatables.net-buttons/js/buttons.colVis.min.js',
26+
'node_modules/datatables.net-buttons/js/buttons.html5.min.js',
27+
'node_modules/datatables.net-buttons-bs5/js/buttons.bootstrap5.min.js',
28+
'node_modules/datatables.net-buttons-bs5/css/buttons.bootstrap5.min.css',
2429
])
2530
.pipe(gulp.dest('src/dist/datatables'))
2631
})

manifest.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
"description": "Easily extract, parse, or open all links/domains from a site or text with optional filters.",
44
"homepage_url": "https://link-extractor.cssnr.com/",
55
"author": "Shane",
6-
"version": "0.5.2",
6+
"version": "0.6.0",
77
"manifest_version": 3,
88
"commands": {
99
"_execute_action": {

package-lock.json

Lines changed: 21 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
"clipboard": "^2.0.11",
1717
"datatables.net": "^2.0.7",
1818
"datatables.net-bs5": "^2.0.7",
19+
"datatables.net-buttons": "^3.0.2",
20+
"datatables.net-buttons-bs5": "^3.0.2",
1921
"jquery": "^3.7.1"
2022
},
2123
"devDependencies": {

src/html/links.html

Lines changed: 39 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
<link rel="stylesheet" type="text/css" href="../dist/bootstrap/bootstrap.min.css">
88
<link rel="stylesheet" type="text/css" href="../dist/fontawesome/css/all.min.css">
99
<link rel="stylesheet" type="text/css" href="../dist/datatables/dataTables.bootstrap5.min.css">
10+
<link rel="stylesheet" type="text/css" href="../dist/datatables/buttons.bootstrap5.min.css">
1011
<link rel="stylesheet" type="text/css" href="../css/main.css">
1112
<link rel="stylesheet" type="text/css" href="../css/links.css">
1213
<script type="text/javascript" src="../js/theme.js"></script>
@@ -19,7 +20,7 @@
1920
<a href="#links"><span class="badge text-bg-success w-100">Links</span></a>
2021
</div>
2122
<div class="col">
22-
<a role="button" class="clip" data-clipboard-target="#links-body" data-toast="Copied Links">
23+
<a href="#" class="copy-links">
2324
<span class="badge text-bg-success w-100">Copy</span></a>
2425
</div>
2526
</div>
@@ -28,7 +29,7 @@
2829
<a href="#domains"><span class="badge text-bg-primary w-100">Domains</span></a>
2930
</div>
3031
<div class="col">
31-
<a role="button" class="clip" data-clipboard-target="#domains-body" data-toast="Copied Domains">
32+
<a href="#" class="clip" data-clipboard-target="#domains-body" data-toast="Copied Domains">
3233
<span class="badge text-bg-primary w-100">Copy</span></a>
3334
</div>
3435
</div>
@@ -39,47 +40,50 @@ <h2 id="loading-message" class="user-select-none d-none">Loading...</h2>
3940
<div class="links d-none">
4041
<div class="user-select-none">
4142
<h2 id="links">Links <span class="badge bg-success-subtle"><span id="links-count">0</span>/<span id="links-total"></span></span></h2>
42-
<a id="copy-links" class="btn btn-sm btn-success clip me-1 mb-2" role="button" data-clipboard-target="#links-body" data-toast="Copied Links">
43-
Copy Links <i class="fa-solid fa-copy ms-1"></i></a>
44-
<a id="down-links" class="btn btn-sm btn-outline-info download-file me-1 mb-2" role="button" data-target="#links-body" data-filename="links.txt">
45-
Download <i class="fa-solid fa-download m-1"></i></a>
46-
<a id="open-links" class="btn btn-sm btn-outline-warning open-in-tabs position-relative me-2 mb-2" type="button" data-target="#links-body">
47-
Open <i class="fa-solid fa-up-right-from-square ms-1"></i></a>
43+
<button id="copy-links" class="btn btn-sm btn-success me-1 mb-2 copy-links" type="button">
44+
Copy Links <i class="fa-solid fa-copy ms-1"></i></button>
45+
<button id="down-links" class="btn btn-sm btn-outline-info download-file me-1 mb-2" type="button" data-target="#links-body" data-filename="links.txt">
46+
Download <i class="fa-solid fa-download m-1"></i></button>
47+
<button id="open-links" class="btn btn-sm btn-outline-warning open-in-tabs position-relative me-2 mb-2" type="button" data-target="#links-body">
48+
Open <i class="fa-solid fa-up-right-from-square ms-1"></i></button>
4849
<span class="d-inline-block me-1 mb-2">
4950
<kbd>C</kbd> <i class="fa-regular fa-keyboard"></i> <kbd>L</kbd> to Copy Links.</span>
50-
</div>
51-
52-
<!-- <div class="input-group mb-2">-->
53-
<!-- <input id="filter-links" type="text" class="form-control filter-input" list="savedFilters" placeholder="Press F and Type to Filter..." aria-label="Filter" aria-describedby="reset-button">-->
54-
<!-- <button class="btn btn-outline-secondary" type="button" id="reset-button">Reset</button>-->
55-
<!-- </div>-->
56-
<!-- <datalist id="savedFilters"></datalist>-->
57-
51+
<span class="d-inline-block me-1 mt-md-1 float-end">
52+
<kbd>K</kbd> <i class="fa-regular fa-keyboard"></i> <kbd>Z</kbd> Keyboard Shortcuts.
53+
</span>
54+
</div> <!-- links-buttons -->
5855
<table id="links-table" class="table table-sm table-striped table-hover table-responsive small" data-counter="links-count" style="width:100%">
59-
<caption class="visually-hidden user-select-none">Links</caption>
60-
<thead class=""><tr><th>Link</th></tr></thead>
56+
<thead class="">
57+
<tr>
58+
<th>Link</th>
59+
<th>Text</th>
60+
<th>Title</th>
61+
<th>Label</th>
62+
<th>Rel</th>
63+
<th>Target</th>
64+
</tr>
65+
</thead>
6166
<tbody id="links-body"></tbody>
62-
</table>
63-
</div>
67+
</table> <!-- links-table -->
68+
</div> <!-- links -->
6469

6570
<div class="domains d-none">
6671
<div class="user-select-none">
6772
<h2 id="domains">Domains <span class="badge bg-primary-subtle"><span id="domains-count">0</span>/<span id="domains-total"></span></span></h2>
68-
<a id="copy-domains" class="btn btn-sm btn-primary clip me-1 mb-2" role="button" data-clipboard-target="#domains-body" data-toast="Copied Domains">
69-
Copy Domains <i class="fa-solid fa-copy ms-1"></i></a>
70-
<a id="down-domains" class="btn btn-sm btn-outline-info download-file me-1 mb-2" role="button" data-target="#domains-body" data-filename="domains.txt">
71-
Download <i class="fa-solid fa-download ms-1"></i></a>
72-
<a id="open-domains" class="btn btn-sm btn-outline-warning open-in-tabs position-relative me-2 mb-2" type="button" data-target="#domains-body">
73-
Open <i class="fa-solid fa-up-right-from-square ms-1"></i></a>
73+
<button id="copy-domains" class="btn btn-sm btn-primary clip me-1 mb-2" type="button" data-clipboard-target="#domains-body" data-toast="Copied Domains">
74+
Copy Domains <i class="fa-solid fa-copy ms-1"></i></button>
75+
<button id="down-domains" class="btn btn-sm btn-outline-info download-file me-1 mb-2" type="button" data-target="#domains-body" data-filename="domains.txt">
76+
Download <i class="fa-solid fa-download ms-1"></i></button>
77+
<button id="open-domains" class="btn btn-sm btn-outline-warning open-in-tabs position-relative me-2 mb-2" type="button" data-target="#domains-body">
78+
Open <i class="fa-solid fa-up-right-from-square ms-1"></i></button>
7479
<span class="d-inline-block me-1 mb-2">
7580
<kbd>D</kbd> <i class="fa-regular fa-keyboard"></i> <kbd>M</kbd> to Copy Domains.</span>
76-
</div>
81+
</div> <!-- domains-buttons -->
7782
<table id="domains-table" class="table table-sm table-striped table-hover table-responsive small" data-counter="domains-count" style="width:100%">
78-
<caption class="visually-hidden user-select-none">Domains</caption>
7983
<thead class=""><tr><th>Domain</th></tr></thead>
8084
<tbody id="domains-body"></tbody>
81-
</table>
82-
</div>
85+
</table> <!-- domains-table -->
86+
</div> <!-- domains -->
8387
</div> <!-- container-fluid -->
8488

8589
<div id="keybinds-modal" class="modal" tabindex="-1">
@@ -98,6 +102,7 @@ <h5 class="modal-title">Keyboard Shortcuts <i class="fa-regular fa-keyboard ms-2
98102
<p><kbd>G</kbd> or <kbd>H</kbd> Focus Domains Filter</p>
99103
<p><kbd>T</kbd> or <kbd>O</kbd> Open Options</p>
100104
<p><kbd>Z</kbd> or <kbd>K</kbd> Keyboard Shortcuts</p>
105+
<p><kbd class="me-1">Escape</kbd> Unfocus Filter Input</p>
101106
</div>
102107
</div>
103108
</div>
@@ -123,6 +128,10 @@ <h5 class="modal-title">Keyboard Shortcuts <i class="fa-regular fa-keyboard ms-2
123128
<script type="text/javascript" src="../dist/bootstrap/bootstrap.bundle.min.js"></script>
124129
<script type="text/javascript" src="../dist/datatables/dataTables.min.js"></script>
125130
<script type="text/javascript" src="../dist/datatables/dataTables.bootstrap5.min.js"></script>
131+
<script type="text/javascript" src="../dist/datatables/dataTables.buttons.min.js"></script>
132+
<script type="text/javascript" src="../dist/datatables/buttons.bootstrap5.min.js"></script>
133+
<script type="text/javascript" src="../dist/datatables/buttons.colVis.min.js"></script>
134+
<script type="text/javascript" src="../dist/datatables/buttons.html5.min.js"></script>
126135
<script type="text/javascript" src="../dist/clipboard/clipboard.min.js"></script>
127136
<script type="text/javascript" src="../js/main.js"></script>
128137
<script type="module" src="../js/links.js"></script>

src/html/options.html

Lines changed: 17 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -39,36 +39,28 @@ <h1>Link Extractor</h1>
3939

4040
<form id="options-form" class="mb-3">
4141
<div class="row">
42-
<div class="col-sm-6 col-12 mb-2">
43-
<label for="linksDisplay" class="form-label"><i class="fa-solid fa-list-ol me-2"></i> Links to Show</label>
44-
<select id="linksDisplay" class="form-control form-select" aria-label="Number of Links" aria-describedby="linksDisplayHelp">
45-
<option value="-1" selected>All</option>
46-
<option value="10">10</option>
47-
<option value="25">25</option>
48-
<option value="50">50</option>
49-
<option value="100">100</option>
50-
<option value="250">250</option>
51-
<option value="500">500</option>
52-
<option value="1000">1000</option>
53-
</select>
54-
<div class="form-text" id="linksDisplayHelp">Initial # of Links to Show.</div>
55-
</div>
56-
<div class="col-sm-6 col-12 mb-2">
42+
<div class="col-12 mb-2">
5743
<label for="flags" class="form-label"><i class="fa-solid fa-code me-2"></i> Regex Flags</label>
58-
<a id="reset-default" class="float-end align-bottom small" role="button">Reset</a>
44+
<a id="reset-default" class="float-end align-bottom small text-decoration-none" role="button">Reset</a>
5945
<input id="flags" type="text" class="form-control" autocomplete="off">
6046
<div class="form-text" id="flagsHelp">
6147
Regex Flags for Filtering.
62-
<!-- <span data-bs-toggle="tooltip" data-bs-placement="bottom" data-bs-title="Regex Flags Used When Filtering Links.">-->
63-
<!-- <i class="fa-solid fa-circle-info ms-1"></i>-->
64-
<!-- </span>-->
65-
<a target="_blank" rel="noopener" class="ms-1"
48+
<a target="_blank" rel="noopener" class="ms-1 text-decoration-none"
6649
href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_expressions#advanced_searching_with_flags">
67-
<i class="fa-solid fa-arrow-up-right-from-square"></i></a>
50+
More Info <i class="fa-solid fa-arrow-up-right-from-square"></i></a>
6851
</div>
6952
</div>
7053
</div>
7154

55+
<div class="form-check form-switch">
56+
<input class="form-check-input form-control" type="checkbox" role="switch" id="removeDuplicates">
57+
<label class="form-check-label" for="removeDuplicates" aria-describedby="removeDuplicatesHelp">
58+
Remove Duplicate Links
59+
<span data-bs-toggle="tooltip" data-bs-placement="bottom" data-bs-title="Filter Out Links with the same URL">
60+
<i class="fa-solid fa-circle-info ms-1"></i>
61+
</span>
62+
</label>
63+
</div>
7264
<div class="form-check form-switch">
7365
<input class="form-check-input form-control" type="checkbox" role="switch" id="defaultFilter">
7466
<label class="form-check-label" for="defaultFilter" aria-describedby="defaultFilterHelp">
@@ -79,10 +71,10 @@ <h1>Link Extractor</h1>
7971
</label>
8072
</div>
8173
<div class="form-check form-switch">
82-
<input class="form-check-input form-control" type="checkbox" role="switch" id="sortLinks">
83-
<label class="form-check-label" for="sortLinks" aria-describedby="sortLinksHelp">
84-
Auto Sort Alphabetically
85-
<span data-bs-toggle="tooltip" data-bs-placement="bottom" data-bs-title="Sort Links and Domains Alphabetically">
74+
<input class="form-check-input form-control" type="checkbox" role="switch" id="saveState">
75+
<label class="form-check-label" for="saveState" aria-describedby="saveStateHelp">
76+
Save Links Page Options
77+
<span data-bs-toggle="tooltip" data-bs-placement="bottom" data-bs-title="Remember Links Display, Columns, and Sorting">
8678
<i class="fa-solid fa-circle-info ms-1"></i>
8779
</span>
8880
</label>

src/html/popup.html

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,15 @@
4747
</div>
4848

4949
<form id="options-form">
50+
<div class="form-check form-switch">
51+
<input class="form-check-input form-control" type="checkbox" role="switch" id="removeDuplicates">
52+
<label class="form-check-label" for="removeDuplicates" aria-describedby="removeDuplicatesHelp">
53+
Remove Duplicate Links
54+
<span data-bs-toggle="tooltip" data-bs-placement="bottom" data-bs-title="Filter Out Links with the same URL">
55+
<i class="fa-solid fa-circle-info ms-1"></i>
56+
</span>
57+
</label>
58+
</div>
5059
<div class="form-check form-switch">
5160
<input class="form-check-input me-2" type="checkbox" role="switch" id="defaultFilter">
5261
<label class="form-check-label" for="defaultFilter" aria-describedby="defaultFilterHelp">
@@ -57,10 +66,10 @@
5766
</label>
5867
</div>
5968
<div class="form-check form-switch">
60-
<input class="form-check-input form-control" type="checkbox" role="switch" id="sortLinks">
61-
<label class="form-check-label" for="sortLinks" aria-describedby="sortLinksHelp">
62-
Auto Sort Alphabetically
63-
<span data-bs-toggle="tooltip" data-bs-placement="bottom" data-bs-title="Sort Links and Domains Alphabetically">
69+
<input class="form-check-input form-control" type="checkbox" role="switch" id="saveState">
70+
<label class="form-check-label" for="saveState" aria-describedby="saveStateHelp">
71+
Save Links Page Options
72+
<span data-bs-toggle="tooltip" data-bs-placement="bottom" data-bs-title="Remember Links Display, Columns, and Sorting">
6473
<i class="fa-solid fa-circle-info ms-1"></i>
6574
</span>
6675
</label>

src/js/extract.js

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,16 @@ function extractSelection() {
7878
*/
7979
function pushElement(array, element) {
8080
try {
81-
array.push(decodeURI(element.href))
81+
const data = {
82+
href: decodeURI(element.href),
83+
text: element.textContent,
84+
title: element.title,
85+
label: element.ariaLabel,
86+
rel: element.rel,
87+
target: element.target,
88+
origin: element.origin,
89+
}
90+
array.push(data)
8291
} catch (e) {
8392
console.log(e)
8493
}

0 commit comments

Comments
 (0)