|
楼主 |
kuing
发表于 2024-2-6 22:55
本帖最后由 kuing 于 2024-2-6 23:14 编辑 贴一下我用来将帖子保存为简洁样式的 PDF 所用的油猴脚本:
- // ==UserScript==
- // @name 悠闲3_保存PDF
- // @namespace http://tampermonkey.net/
- // @version 2024-2-1
- // @description 自用
- // @author kk
- // @match https://kuing.cjhb.site/forum.php?mod=viewthread&tid=*
- // @grant GM_addStyle
- // ==/UserScript==
- (function() {
- 'use strict';
- GM_addStyle(`
- /*隐藏主体外的东东*/
- #hd,#toptb,#pt/*顶部、导航*/
- ,#pgt,#modmenu/*上方的回帖按钮与页码、管理按钮*/
- ,.cgb,#ft/*草稿本、底部*/
- ,.mlcls,#scrolltop/*目录、右边浮动小按钮*/
- ,.pgbtn/*下方的下一页(一整行那个)*/
- { display: none; }
- /*隐藏主体内的东东*/
- .pls,.plm/*作者信息(左边那整列)、签名栏及1楼收藏评分那栏*/
- ,#fj,#postlist .vwthd>.y/*电梯直达、右上方那个打印*/
- ,.authi .none,.authi:hover .none,.authi .show,.authi:hover .show/*1楼的倒序浏览|阅读模式*/
- ,img.authicn.vm/*会员icon*/
- ,div.psti > span > a/*点评删除按钮*/
- { display: none; }
- #ct { margin-top: 62px; min-height: unset; }/*主体与顶部距离、不设最小高度*/
- /*编辑等按钮以及点赞的处理(后面的 js 会进一步处理)*/
- .po.hin { display: none; }
- .authi em a:before {
- font-family: dzicon;
- color: #FF9C00;
- }
- .authi em a { margin-right:10px; float:left; }
- #recommend_add { margin-right:10px; }
- #recommendv_add { color:blue; }
- #recommend_add,.replyadd { background: #E6EDF2; border-radius: 4px; padding: 0 4px; }
- @media print {
- .printnosee { visibility: hidden; }
- .printnosee.cansee,.printnosee .cansee { visibility:initial; }
- }/*用 visibility 才能实现隐藏父级而显示某子元素(用 display:none 就不行),但是父级还会占位*/
- /*显示内 ID 及微调*/
- .neiid {
- display: unset !important;
- color: #429296;
- font-weight: 700;
- }
- .wp { width:800px; }/*主体宽度*/
- .ad .plc { height: 6px; }/*楼层分界线高度*/
- .ptg.mbm.mtn { margin-top: 15px !important; }/*标签上方距离调小*/
- .tip { visibility: hidden; }/*附件信息(移到图上才出来那种)*/
- .authi .user_avatar { max-height: 36px; max-width: 36px; margin-top: -6px; }/*用 js 将头图移出来后的设置*/
- .modact, .modact a { line-height: unset !important; }
- .modact { height: unset; padding: 0; }/*主题分类减少空白*/
- /*标题栏相关*/
- #postlist .vwthd { padding-right: 20px !important; }/*原是80是因为那打印按钮*/
- #postlist .vwthd>span.xg1 { display: inline-block; }
- #postlist .vwthd>span.xg1>a { color: #369 !important; text-decoration: underline; }/*因改为“打开原网页(tid=...)”而改*/
- /*加尾注相关*/
- #postlist { margin-bottom:0; }
- #zhu { width: 800px; margin-top: 15px; }
- #zhu>span {
- display: inline-block;
- padding: 2px 20px;
- background-color: #FFF4DD;
- border-radius: 0 14px 14px 0;/*模仿点评*/
- }
- #zhu a { color: #369; text-decoration: underline; }
- #tas { position:fixed; top:62px; left:10px; width:calc(50% - 420px); min-width:130px; }
- #tas textarea { width:100%; box-sizing:border-box; word-break:break-all; }
- #tas details button { padding: 0 3px; }
- .dspin { display: inline; }
- .hideed { font-size: 12px; margin-left: 2px; color: #999; }/*折叠楼层后的显示*/
- /*大帖用:*/
- /*
- @media print {
- tbody.printhides { display: initial; }
- }
- */
- `)
- var thisurl = window.location.href;
- var slink = "https://kuing.cjhb.site/forum.php?mod=viewthread&" + thisurl.match(/tid=\d+/);
- //
- //第2页起不显示标题、背景并将主体贴顶,第1页则将[复制链接]改为[打开原网页(tid=...)]
- if (thisurl.match(/&page=[2-9]/)) {
- GM_addStyle(`#postlist .vwthd { display: none; }
- body { background:none; }
- #ct { margin-top: 0; }
- `)
- slink += thisurl.match(/&page=\d+/);
- } else {
- document.querySelector('#postlist .vwthd>span.xg1>a').innerHTML = "[打开原网页(" + thisurl.match(/tid=\d+/) + ")]";
- }
- //
- //处理网页 title,它决定保存 PDF 时的文件名
- var tit = document.getElementsByTagName("title")[0];
- tit.innerHTML = tit.innerHTML
- .replace(' 悠闲数学娱乐论坛(第3版) - Powered by Discuz!','')
- .replace('初等数学讨论 - ','')
- .replace(/\\/g,'\')
- .replace(/\//g,'/')
- .replace(/:/g,':')
- .replace(/\*/g,'*')
- .replace(/\?/g,'?')
- .replace(/"/g,'"')
- .replace(/</g,'<')
- .replace(/>/g,'>')
- .replace(/\|/g,'|')
- .replace(/~/g,'~')
- ;
- var url_tid = thisurl.match(/tid=\d+/);
- var url_page = thisurl.match(/&page=\d+/) || '';
- var flstr = document.querySelector("#postlist .vwthd h1.ts>a") ? document.querySelector("#postlist .vwthd h1.ts>a").innerHTML : '[无分类]';
- tit.innerHTML = flstr + tit.innerHTML + url_tid + url_page;
- //
- var quotes = document.querySelectorAll('.quote');
- for (let item of quotes) {
- if(item.innerHTML.match('操作数据库失误导致由')) {
- item.innerHTML = '此帖原文本已丢失';
- item.style = "display: inline-block; padding: 5px 20px; border: 2px lightgray dashed; background: none;";
- }
- }
- //
- //折叠楼层、移动头像及编辑等按钮
- var postlistdivs = document.querySelectorAll('#postlist>div[id^=post_]');
- for (var i=0;i<postlistdivs.length;i++) {
- var hide = document.createElement("a");
- hide.href = "javascript:;";
- hide.style = "float: right;";
- hide.innerHTML = "折叠";
- hide.classList.add('printhides');
- hide.setAttribute("onclick",`document.querySelector('#${postlistdivs[i].id}>table').classList.add('dspn');
- document.querySelector('#${postlistdivs[i].id}>span').classList.remove('dspn');
- document.querySelector('#${postlistdivs[i].id}').classList.add('dspin');`);
- var plc_pi = postlistdivs[i].querySelector('.plc .pi');
- plc_pi.insertBefore(hide,plc_pi.childNodes[1]);
- var hideed = document.createElement("span");
- hideed.classList.add('dspn','hideed');
- hideed.innerHTML = plc_pi.querySelector('strong>a').innerHTML + "已折叠";
- hideed.setAttribute("onclick",`document.querySelector('#${postlistdivs[i].id}>table').classList.remove('dspn');
- document.querySelector('#${postlistdivs[i].id}>span').classList.add('dspn');
- document.querySelector('#${postlistdivs[i].id}').classList.remove('dspin');`);
- postlistdivs[i].insertBefore(hideed,postlistdivs[i].childNodes[0]);
- var u_a = postlistdivs[i].querySelector('.pls.cl.favatar .user_avatar');
- if(u_a){
- plc_pi.querySelector('.authi').insertBefore(u_a,plc_pi.querySelector('.authi').childNodes[0]);
- }
- var edts = postlistdivs[i].querySelector('.po.hin>.pob.cl>em');
- edts.classList.add('y','printnosee');
- plc_pi.querySelector('.authi').insertBefore(edts,plc_pi.querySelector('.authi').childNodes[0]);
- }
- //有点赞的才显示赞
- var replyadds = document.querySelectorAll('.replyadd');
- for (let item of replyadds) {
- if(item.querySelector('span').innerHTML>0) {
- item.classList.add('cansee');
- item.href = "javascript:;";
- }
- }
- if(document.querySelector('#recommend_add')){
- var d_add = document.querySelector('#recommend_add');
- if(document.querySelector('#recommendv_add').innerHTML>0){//注意多一个v,是数字
- d_add.classList.add('y');
- d_add.href = "javascript:;";
- plcpi[0].querySelector('.authi').insertBefore(d_add,plcpi[0].querySelector('.authi').childNodes[0]);
- //此 plcpi 为 zdy3pc.js 里定义的:var plcpi = document.querySelectorAll('.plc .pi');
- }
- }
- //加尾注按钮
- var zu = document.createElement("div");
- zu.id = "zhu";
- zu.classList.add('wp');
- document.querySelector('body').appendChild(zu);
- var ta = document.createElement("div");
- ta.id = "tas";
- ta.classList.add('printhides');
- //下一行的 threadads 为 zdy3pc.js 里定义的:var threadads = document.querySelectorAll("tr.ad");
- ta.innerHTML = `<button onclick="hidelou(${threadads.length-1});printto(threadads[${threadads.length-1}]);print()" style="width:100%;height:100px;">打印到底</button>
- <details open><summary>加尾注</summary>
- <button onclick="document.querySelector('#zhutext').innerHTML='上面的 GIF 动图在 PDF 里无法动起来,请前往原网页查看动图。';">GIF问题</button>
- <button onclick="document.querySelector('#zhutext').innerHTML='为节省篇幅,原帖后面还有一些讨论我看不太懂就没有截上来,有兴趣的请看原网页。';">省略了后面</button>
- <button onclick="document.querySelector('#zhutext').innerHTML='原帖其实还有不少内容,为节省篇幅,这里只截取了我感兴趣的部分,建议看原网页。';">只截取部分</button>
- <button onclick="document.querySelector('#zhutext').innerHTML='# ~ # 在上一版撸题集里已有记载,所以折叠了,想看可前往原网页。';">省略了上一版</button>
- <textarea id="zhutext" rows="4"></textarea>
- <button onclick="document.querySelector('#zhu').innerHTML='<span>注:'+document.querySelector('#zhutext').value.replace(/原网页/g,'<a href=\\\'${slink}\\\'>原网页</a>')+'</span>';window.scrollTo(0, document.body.scrollHeight)">加入</button>
- </details>
- `;
- document.querySelector('body').appendChild(ta);
- })();
复制代码
使用该油猴脚本后,进入帖子页,界面就会变得简洁。
点击左边的“打印到底”,就会弹出打印窗口,选择“另存为 PDF”保存即可,这是保存到当前页面的最后的,而那些“回复”、“编辑”之类的按钮并不会出现在 PDF 里。
如果想隐藏某些楼层,可先点楼层右上角的“折叠”再点打印。
如果只想打印 1~n 楼,则点击第 n 楼下的线条即可。
左边的输入框是用来添加尾注说明的,输入说明内容点下面的“加入”即可,也可以点击我预设的那几个按钮。
我之前就是这样去浏览这两年的帖子来保存我想要的 PDF,然后再分类合并起来的。 |
|