您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
下载 iconfont SVG 图标为 QGIS 可调整参数的 SVG 图标
- // ==UserScript==
- // @name Download QGIS Customizable SVG
- // @namespace http://github.com/liuxspro/
- // @version 0.1.0
- // @description 下载 iconfont SVG 图标为 QGIS 可调整参数的 SVG 图标
- // @author Liuxspro
- // @license MIT
- // @homepage https://gist.github.com/liuxspro/052d180ed5667560a5f9d4eda11a8b0a
- // @match https://www.iconfont.cn/collections/detail*
- // @match https://www.iconfont.cn/search/index*
- // @icon data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZpZXdCb3g9IjAgMCA2NCA2NCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik02MC4yNTcyIDYxLjc1NTZMMjYuNTA3MiAyOC4wMDU2SDM1Ljg4MjJMNjAuMjU3MiA1Mi4zODA2TDYwLjI1NzIgNTIuMzgwNVY2MS43NTU2WiIgZmlsbD0iI0YxOEQzNiIvPgo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTI2LjUwNzIgMjguMDA1Nkw2MC4yNTcyIDYxLjc1NTZMNTAuODgyMiA2MS43NTU2TDI2LjUwNzIgMzcuMzgwNkwyNi41MDcyIDI4LjAwNTZaIiBmaWxsPSIjRUU3OTEzIi8+CjxwYXRoIGQ9Ik0zNC4zIDM1LjgxOTFMMzguMDQwNyAzOS41MjU2VjQ4Ljk0OTJMMzQuMyA0NS4xOTEyVjM1LjgxOTFaIiBmaWxsPSIjRjBFNjRBIi8+CjxwYXRoIGQ9Ik00Ny40MzAxIDM5LjU1OThMNDMuNjcyMSAzNS44MTkxTDM0LjMgMzUuODE5MUwzOC4wMzA2IDM5LjU1OThMNDcuNDMwMSAzOS41NTk4WiIgZmlsbD0iI0YyRUE2NSIvPgo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTU4LjI1NzggNDYuNTIxQzYwLjY0MjMgNDIuMjE4MyA2MiAzNy4yNjc3IDYyIDMyQzYyIDE1LjQzMTUgNDguNTY4NSAyIDMyIDJDMTUuNDMxNSAyIDIgMTUuNDMxNSAyIDMyQzIgNDguNTY4NSAxNS40MzE1IDYyIDMyIDYyQzM2LjQ2MTEgNjIgNDAuNjk0NyA2MS4wMjYzIDQ0LjUgNTkuMjc5OEwzNS4yNjg3IDUwLjA0ODVDMzQuMjA4IDUwLjIzOTMgMzMuMTE1NiA1MC4zMzg5IDMyIDUwLjMzODlDMjEuODcxNyA1MC4zMzg5IDEzLjY2MTEgNDIuMTI4MyAxMy42NjExIDMyQzEzLjY2MTEgMjEuODcxNyAyMS44NzE3IDEzLjY2MTEgMzIgMTMuNjYxMUM0Mi4xMjgzIDEzLjY2MTEgNTAuMzM4OSAyMS44NzE3IDUwLjMzODkgMzJDNTAuMzM4OSAzMy45ODk3IDUwLjAyMjEgMzUuOTA1NCA0OS40MzYxIDM3LjY5OTNMNTguMjU3OCA0Ni41MjFaIiBmaWxsPSIjN0RBNjI5Ii8+Cjwvc3ZnPgo=
- // @grant none
- // @run-at document-end
- // ==/UserScript==
- (function () {
- "use strict";
- /**
- * 参考资料:
- * https://github.com/qgis/QGIS/blob/9a800b49983ae266af1264e198b5fc433fdeaa9b/src/core/symbology/qgssvgcache.h#L105
- * https://www.w3.org/TR/2009/WD-SVGParamPrimer-20090616/
- * [教会你自定义SVG样式【文末附福利】](https://mp.weixin.qq.com/s/i9FvQrDlGUNdXT6kLoQxNg)
- * fill="param(fill)" fill-opacity="param(fill-opacity)"
- * stroke="param(outline)" stroke-opacity="param(outline-opacity)" stroke-width="param(outline-width)"
- */
- function tweak_svg(svg) {
- const fill = svg.getAttribute("fill");
- // 设置为 QGIS 可自定义的属性
- svg.setAttribute("fill", "param(fill)");
- svg.setAttribute("fill-opacity", "param(fill-opacity)");
- svg.setAttribute("stroke", "param(outline)");
- svg.setAttribute("stroke-opacity", "param(outline-opacity)");
- svg.setAttribute("stroke-width", "param(outline-width)");
- if (fill) {
- // 将原来的 fill 颜色作为默认值保留
- svg.setAttribute("fill", `param(fill) ${fill}`);
- }
- }
- function download() {
- const svgElement = document.querySelector("div.stage svg");
- const titleElement = document.querySelector("div.top-title span");
- let filename = "download.svg";
- if (titleElement) {
- filename = titleElement.innerText + "_QGIS";
- }
- if (svgElement) {
- const svgClone = svgElement.cloneNode(true);
- svgClone.removeAttribute("style");
- const elementsPath = svgClone.querySelectorAll("path");
- // 不止一条 Path 的时候,需要至少选择一条 Path 作为调整的对象
- if (elementsPath.length > 1) {
- const selectedPaths = Array.from(elementsPath).filter((path) => path.classList.contains("selected"));
- if (selectedPaths.length == 0) {
- alert("当前 SVG 图标有多条 PATH, 请至少选择一条");
- return;
- }
- selectedPaths.forEach((el) => {
- tweak_svg(el);
- });
- } else if (elementsPath.length == 1) {
- elementsPath.forEach((el) => {
- tweak_svg(el);
- });
- }
- const serializer = new XMLSerializer();
- const svgString = serializer.serializeToString(svgClone);
- const blob = new Blob([svgString], { type: "image/svg+xml" });
- const url = URL.createObjectURL(blob);
- const a = document.createElement("a");
- a.href = url;
- a.download = filename;
- document.body.appendChild(a);
- a.click();
- document.body.removeChild(a);
- URL.revokeObjectURL(url);
- } else {
- alert("SVG element not found");
- }
- }
- function add_download_btn() {
- const btn_container = document.querySelectorAll("div.download-btns")[0];
- if (btn_container && !btn_container.querySelector(".qgis-btn")) {
- const qgis_svg_download_btn = document.createElement("span");
- qgis_svg_download_btn.classList = "btn btn-normal qgis-btn";
- qgis_svg_download_btn.innerText = "下载 QGIS SVG";
- qgis_svg_download_btn.onclick = download;
- btn_container.appendChild(qgis_svg_download_btn);
- }
- }
- // MutationObserver to watch for changes in the DOM
- const observer = new MutationObserver((mutations) => {
- mutations.forEach((mutation) => {
- if (mutation.addedNodes.length > 0) {
- const d = mutation.addedNodes[0];
- if (d.classList.contains("download-dialog")) {
- observer2.observe(d, config);
- }
- }
- });
- });
- const observer2 = new MutationObserver((mutations) => {
- mutations.forEach((mutation) => {
- observer2.disconnect();
- add_download_btn(document.body);
- observer2.observe(mutation.target, config);
- });
- });
- // Configuration of the observer
- const config = {
- attributes: false,
- childList: true,
- subtree: true,
- };
- // Start observing the target node for configured mutations
- const targetNode = document.body;
- observer.observe(targetNode, config);
- })();