您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Save the current leetcode problem as new obsidian note.
- // ==UserScript==
- // @name Save Leetcode Problem to Obsidian
- // @namespace http://tampermonkey.net/
- // @version 2024-07-26
- // @description Save the current leetcode problem as new obsidian note.
- // @author miscde
- // @match https://leetcode.com/problems/*
- // @icon data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==
- // @grant GM_getValue
- // @grant GM_setValue
- // @grant GM_registerMenuCommand
- // @grant GM_notification
- // @grant GM_openInTab
- // @run-at context-menu
- // @license MIT
- // ==/UserScript==
- (function() {
- 'use strict';
- // Function to find and return the timer value
- let containerElement = document.querySelector('#ide-top-btns');
- function getTimerValue() {
- if (containerElement) {
- // Find the timer element within the container
- let timerElement = containerElement.querySelector('.select-none.pr-2.text-sm.text-text-secondary.dark\\:text-text-secondary');
- if (timerElement) {
- let timerValue = timerElement.textContent || timerElement.innerText;
- console.log('Current Timer Value:', timerValue);
- return timerValue;
- } else {
- console.log('Timer element not found within the container');
- return null;
- }
- } else {
- console.log('Container element not found');
- return null;
- }
- }
- // Call the function to capture and log the timer value
- let timerValue = getTimerValue();
- let [hours, minutes, seconds] = timerValue.split(':').map(Number);
- let minutesSpent = hours * 60 + minutes + Math.round(seconds / 60);
- let currentUrl = window.location.href;
- let difficultyElement = document.querySelector('[class*="text-difficulty-"]');
- // Function to get the difficulty level
- function getDifficulty() {
- if (difficultyElement) {
- let difficultyText = difficultyElement.textContent || difficultyElement.innerText;
- difficultyText = difficultyText.toLowerCase();
- console.log('Problem Difficulty:', difficultyText);
- return difficultyText;
- } else {
- console.log('Difficulty element not found');
- return null;
- }
- }
- // Call the function to capture and log the difficulty
- let difficultyValue = getDifficulty();
- let fullPath = window.location.pathname;
- // Extract the relevant part (/problems/xxxx)
- let matchedPath = fullPath.match(/\/problems\/[^\/]+/)[0];
- // Find the <a> element with the matching href attribute
- let linkElement = document.querySelector(`a[href*="${matchedPath}"]`);
- // Function to get the text of the <a> element
- function getProblemName() {
- if (linkElement) {
- let linkText = linkElement.textContent || linkElement.innerText;
- linkText = linkText.replace(/\?/g, "");
- console.log('Link Text:', linkText);
- return linkText;
- } else {
- console.log('Link element not found for href:', matchedPath);
- return null;
- }
- }
- // Call the function to capture and log the link text
- let problemName = getProblemName();
- let today = new Date().toISOString().split('T')[0];
- let content = `---
- lc-link: ${currentUrl}
- minutes-spent: ${minutesSpent}
- attempts:
- difficulty: ${difficultyValue}
- solved-on: ${today}
- comment:
- review-on:
- ---
- # Algorithm
- # Complexities
- - Time:
- - Space:
- # Alternative Approach
- # New Functions`;
- async function createObsidianDocument(obsidianUrl, documentPath, content, token) {
- // check if exists
- let fileExists = false;
- try {
- let response = await fetch(obsidianUrl + '/vault' + documentPath, {
- method: 'GET',
- headers: {
- 'Content-Type': 'text/markdown',
- 'Authorization': `Bearer ${token}`
- }
- });
- if (response.ok) {
- fileExists = true;
- }
- } catch (error) {
- console.error('Error:', error);
- }
- // not exist, create it
- if (!fileExists) {
- try {
- let response = await fetch(obsidianUrl + '/vault' + documentPath, {
- method: 'PUT',
- headers: {
- 'Content-Type': 'text/markdown',
- 'Authorization': `Bearer ${token}`
- },
- body: content
- });
- if (response.ok) {
- console.log('Document created successfully:', response.statusText);
- } else {
- console.error('Error creating document:', response.statusText);
- }
- } catch (error) {
- console.error('Error:', error);
- }
- }
- function openObsidianLink() {
- GM_openInTab('obsidian://', { active: true, insert: true });
- }
- // open the file in obsidian
- try {
- let response = await fetch(obsidianUrl + '/open' + documentPath, {
- method: 'POST',
- headers: {
- 'Authorization': `Bearer ${token}`
- }
- });
- if (!fileExists) {
- GM_notification({ title: 'Problem Imported Successfully', text: `Please open your Obsidian editor to see it.`, timeout: 5000, onclick: openObsidianLink });
- } else {
- GM_notification({ title: 'Problem Exists!', text: `Please open your Obsidian editor to see it.`, timeout: 5000, onclick: openObsidianLink });
- }
- } catch (error) {
- console.error('Error:', error);
- GM_notification({ title: 'Error Occurred', text: `${error} Do you have Obsidian opened?`, timeout: 5000 });
- }
- }
- // Function to get the bearer token
- function getOrPromptForKey(key, promptText) {
- let token = GM_getValue(key, null);
- if (!token) {
- token = prompt(promptText);
- if (token) {
- GM_setValue(key, token);
- GM_notification({ title: 'Input Saved', text: `Your input for ${key} has been saved.`, timeout: 5000 });
- }
- }
- return token;
- }
- function saveToObsidian() {
- let token = getOrPromptForKey('obsidian_web_api_key', 'Please enter your Obsidian API key:');
- let obsidianUrl = getOrPromptForKey('obsidian_api_url', 'Please enter the obsidian HTTPS API URL').replace(/\/$/, '');
- let documentPath = `/Algorithms/LeetCode/${problemName}.md`
- if (token) {
- // Call the function to create the Obsidian document
- createObsidianDocument(obsidianUrl, documentPath, content, token);
- } else {
- console.error('Bearer token is not available.');
- }
- }
- saveToObsidian();
- })();