Loading...
More JavaScript Posts
import { configureStore } from "@reduxjs/toolkit";import { combineReducers } from "redux";import profile from "./profile";import auth from "./auth";import alert from "./alert";const reducer = combineReducers({profile,auth,alert,});const store = configureStore({ reducer });export default store;
function filePath(file){let folders = file.getParents();const parents = [];function makePathString(folderArray){let path = "";folderArray.forEach((folder)=>{path += "/" + folder.getName();});return path;}while (folders.hasNext()) {const folder = folders.next(); //This should hopefully remove that folder from the iteratorparents.unshift(folder);}return makePathString(parents);}function myFunction() {const myEmail = Session.getEffectiveUser().getEmail();Logger.log("My email is " + myEmail);// Log the name of every file in the user's Drive.var fileIterator = DriveApp.getFiles();const files = []; //List of [File, size] entriesconst filesMaxSize = 10;while (fileIterator.hasNext()) {var file = fileIterator.next();const owner = file.getOwner();//Only files I ownif((!(owner)) || (!(owner.getEmail)) || owner.getEmail() != myEmail){continue;}const entry = [file, file.getSize()];function slideUp(arr, index){//Let's keep sliding it up so we don't have to sort it at the end.for(let i = index; i > 0; --i){ //Stops at 1const nextFile = arr[i-1];if(nextFile[1] > entry[1]){break;}else{//Swap with the next file to slide the file upconst temp = arr[i];arr[i] = arr[i - 1];arr[i - 1] = temp;}}}if(files.length < filesMaxSize){files.push(entry);slideUp(files, files.length - 1);}else{if(entry[1] > files[files.length - 1][1]){ //If it's bigger than the smallest file in the list.files[files.length - 1] = entry; //Replace the smallest fileslideUp(files, files.length - 1); //Slide it up}}}for(let i = 0; i < filesMaxSize; ++i){const file = files[i][0];const size = files[i][1];Logger.log(size + "\t" + filePath(file) + "/" + file.getName() + "\t" + file.getOwner().getName());}}
function formatDate(date) {return date.toLocaleDateString();}function Comment(props) {return (<div className="Comment"><div className="UserInfo"><imgclassName="Avatar"src={props.author.avatarUrl}alt={props.author.name}/><div className="UserInfo-name">{props.author.name}</div></div><div className="Comment-text">{props.text}</div><div className="Comment-date">{formatDate(props.date)}</div></div>);}const comment = {date: new Date(),text: 'I hope you enjoy learning React!',author: {name: 'Hello Kitty',avatarUrl: 'https://placekitten.com/g/64/64',},};ReactDOM.render(<Commentdate={comment.date}text={comment.text}author={comment.author}/>,document.getElementById('root'));
function copyString(text){async function navigatorClipboardCopy(text){if(document.location.protocol != "https:"){return false;}return new Promise((resolve, reject)=>{navigator.clipboard.writeText(text).then(()=>{resolve(true);}, ()=>{resolve(false);});});}function domCopy(text){if(!(document.execCommand)){console.warn("They finally deprecated document.execCommand!");}const input = document.createElement('textarea');input.value = text;document.body.appendChild(input);input.select();const success = document.execCommand('copy');document.body.removeChild(input);return success;}function promptCopy(){prompt("Copy failed. Might have ... somewhere. Check console.", text);console.log(text);}function done(){alert("Copied to clipboard");}navigatorClipboardCopy(text).catch(()=>{return false;}).then((success)=>{if(success){done();}else{if(domCopy(text)){done();}else{promptCopy();}}});}
//Allegedly never tested on the twitter websitefunction scrapeScreen(){let articles = Array.from(document.getElementsByTagName("article"));let results = [];for(let tweet of articles){const isAnAd = Array.from(tweet.querySelectorAll("span")).map((e)=>e.textContent).includes("Ad");if(isAnAd){//console.log(tweet, "is an ad. Skipping...");continue;}const userName = tweet.querySelector("[data-testid='User-Name'] > div:nth-child(2) > div > div")?.textContent;const tweetContent = tweet.querySelector("[data-testid='tweetText']")?.textContent;const timeStamp = tweet.querySelector("time")?.getAttribute("datetime");const tweetLink = tweet.querySelector("time")?.parentElement?.getAttribute("href");if((!userName) || (!tweetContent)) continue;results.push({username: userName,tweetText: tweetContent,timeStamp: timeStamp,tweetLink: tweetLink});}return results;}let scraped = scrapeScreen();setInterval(()=>{scraped = scraped.concat(scrapeScreen().filter((tweet)=>{for(let scrapedTweet of scraped){if(scrapedTweet.username == tweet.username && scrapedTweet.tweetText == tweet.tweetText) return false;}return true;}));}, 500); //Scrape everything on the screen twice a secondwindow.scrollIntervalId = setInterval(function(){window.scrollBy(0, 1000);}, 500); //Scroll for me//http://bgrins.github.io/devtools-snippets/#console-save(function(console){console.save = function(data, filename){if(!data) {console.error('Console.save: No data')return;}if(!filename) filename = 'console.json'if(typeof data === "object"){data = JSON.stringify(data, undefined, '\t')}var blob = new Blob([data], {type: 'text/json'}),e = document.createEvent('MouseEvents'),a = document.createElement('a')a.download = filenamea.href = window.URL.createObjectURL(blob)a.dataset.downloadurl = ['text/json', a.download, a.href].join(':')e.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null)a.dispatchEvent(e)}})(console)setTimeout(()=>{clearTimeout(window.scrollIntervalId);delete window.scrollIntervalId;console.save(scraped, "TwitterScrape" + Date.now() + ".json");}, 60 * 1000 * 20); //Twenty minutes
const reverse = str => str.split('').reverse().join('');reverse('hello world');// Result: 'dlrow olleh'