LINUX.ORG.RU

На чём спотыкается JavaScript в букмарклете? Вероятно, что-то в работе с JSON

 , ,


0

1

Букмарклет:

javascript:(function() {
    var isbn = prompt("Enter the ISBN of the book");
    var lang = prompt("Optionally enter the Wikipedia subdomain (for supported non-English Wikipedias)");

    if (!isbn) {
        alert("No ISBN provided.");
        return;
    }

    fetch("https://www.googleapis.com/books/v1/volumes?q=isbn:" + isbn)
        .then(response => response.json())
        .then(data => {
            var title = data.items[0].volumeInfo.title;
            var author = data.items[0].volumeInfo.authors.join(", ");
            var publisher = data.items[0].volumeInfo.publisher;
            var date = data.items[0].volumeInfo.publishedDate;
            var year = date.substring(0, 4);

            var template = "";
            if (lang === "ru") {
                template = "{{" + "Книга" + "\n" +
                    "  |название=" + title + "\n" +
                    "  |автор=" + author + "\n" +
                    "  |год=" + year + "\n" +
                    "  |издательство=" + publisher + "\n" +
                    "  |isbn=" + isbn + "\n" +
                    "  |ref=" + "\n" +
                    "}}";
            }
			
            else {
                template = "{{" + "Cite book" + "\n" +
                    "  |title=" + title + "\n" +
                    "  |author=" + author + "\n" +
                    "  |date=" + date + "\n" +
                    "  |publisher=" + publisher + "\n" +
                    "  |isbn=" + isbn + "\n" +
                    "  |ref=" + "\n" +
                    "}}";
            }
			
    template.select();
    document.execCommand('copy');
    prompt("Your Wikipedia template:", template, " has been copied into the clipboard.");
   });
})();

Ожидаемое поведение: сгенерированный шаблон для Википедии из пропарсенного JSON от Google Books копируется в буфер обмена.

Внешнее поведение: показываются промпты для ввода; не показывается вывод и ничего не копируется.

Консоль Chrome: https://pastebin.com/raw/etPh6SJe

★★★★★
Ответ на: комментарий от eugrus

Ну я и говорю, можно и нужно всё засунуть в одну строку, но там будет 10+ килобайт текста, который будет делать то же самое что и js у тебя, только медленее в разы =) Там ещё ведь сжаный фенгар этот, если чистаемость сохранить то уххх.

Суть в том что отрабатывает lua, да пусть только при открытой странице где подгружена виртуалка для lua на js. Главное работает, остальное дело техники, к сожалению я с js на вы, поэтому пердолится не хоца =) Да и результат если оч постараться будет сомнительным.

Но эксперимент я считаю удачным :)

LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от LINUX-ORG-RU

Именно что не можно в одну строку с транспайлером - браузер не примет такое длинное закладкой :)

Рабочим решением была бы подгрузка коротким JS в закладке fengari-web.js со стороннего сервера: тут обсуждались всякие варианты https://stackoverflow.com/questions/14521108/dynamically-load-js-inside-js

А дальше fengari.load()

eugrus ★★★★★
() автор топика
Последнее исправление: eugrus (всего исправлений: 1)
Ответ на: комментарий от eugrus

Во. Теперь игрался с luarocks и автоматической проверки зависимостей и их накатки.


package.path  = package.path ..  ";/home/"..os.getenv("USER").."/.luarocks/share/lua/5.1/?.lua;"
package.cpath = package.cpath .. ";/home/"..os.getenv("USER").."./lualib/lib/lua/5.1/?.so;"

local json, https;

function loadmodules() 
json  = require("rxi-json-lua")
https = require("ssl.https")
end
-----------------------------------------------------------
if pcall(loadmodules) then
    --print("all okey")
else
    print("Первый запуск, установка зависимостей")
    os.execute("luarocks --local install rxi-json-lua")
    json  = require("rxi-json-lua")
    os.execute("luarocks --local install luasec")
    https = require("ssl.https")
end
------------------------------------------------------------
BOOK = "https://www.googleapis.com/books/v1/volumes?q=isbn:"
ISBN =  arg[1] -- example "3940862215"
LANG =  arg[2] -- "ru" or "en"

if ISBN == "en" or ISBN == "ru" then
    LANG = ISBN
    ISBN = nil
end

if ISBN == nil then
    clip_pipe = io.popen("xclip -selection clipboard -o")
    clip_data = tonumber(clip_pipe:read("*a"))
    if type(clip_data) == "number" then
        ISBN = clip_data;
    end
end 
if ISBN == nil then
    print("Нужно задать ISBN номер книги в параметры запуска скрипта: $lua script.lua ISBN_НОМЕР [en ru опционально] ")
    print("Или скопировать номер ISBN в буфер обмена")
    return
end
------------------------------------------------------------
if LANG == nil then
   LANG = "ru" -- default russian
end
------------------------------------------------------------
body, code, headers, status = https.request(BOOK..ISBN)
data = json.decode(body)
------------------------------------------------------------
if data == nil or data.items == nil then
    print("Нет книг для этого ISBN")
    return
end
------------------------------------------------------------
title  =    data.items[1].volumeInfo.title;
author =    ""
for k,v in  pairs(data.items[1].volumeInfo.authors) do
    author = v .. ", "
end
author =    author:sub(0,#author-2)
publisher = data.items[1].volumeInfo.publisher;
date =      data.items[1].volumeInfo.publishedDate;
year =      date:sub(0, 4);
------------------------------------------------------------
if LANG == "ru" then
template = "{{" .. "Книга" .. "\n" ..
       "  |название=" .. tostring(title)  .. "\n" ..
       "  |автор="    .. tostring(author) .. "\n" ..
       "  |год="      .. tostring(year)   .. "\n" ..
       "  |издательство=" .. tostring(publisher) .. "\n" ..
       "  |isbn="     .. tostring(ISBN)   .. "\n" ..
       "  |ref="      .. "\n" ..
       "}}";
else
template = "{{" .. "Book" .. "\n" ..
       "  |title="     .. tostring(title)  .. "\n" ..
       "  |author="    .. tostring(author) .. "\n" ..
       "  |date="      .. tostring(year)   .. "\n" ..
       "  |publisher=" .. tostring(publisher) .. "\n" ..
       "  |isbn="      .. tostring(ISBN)   .. "\n" ..
       "  |ref="       .. "\n" ..
       "}}";
end
------------------------------------------------------------
print(template)
clipboard = io.popen("xclip -selection clipboard","w")
clipboard:write(template)
clipboard:close()
print("Шаблон скопирован в буфер обмена")
os.execute("notify-send -e 'Шаблон скопирован в буфер обмена'")

Теперь оно само развернёт при первом запуске необходимое, а патчи прописаны сразу. en/ru на выбор. В случае неправильного кода ISBN будут сообщения, мол такой книги нету. Если парамерты не заданы то пытается взять код из буфера обмена, если это удаётся то получает данные, в терминале можно отдельно задать язык без указывания кода ISBN тогда код будет браться только из буфера обмена. Номер ISBN обязан быть числом иначе не распознает

Всё вроде работает, всё я наигрался. Досвиданья.

LINUX-ORG-RU ★★★★★
()
Последнее исправление: LINUX-ORG-RU (всего исправлений: 1)
Ответ на: комментарий от token_polyak

К слову да, вот буквально 15 минут назад хотел в толксы про это написать. Мол я понял наконец почему у нас все дистрибутивы засраны скриптовым говном, почему утилитки на две строки имеют зависимости как IDE и всё вот это вот. Это оказывается удобно, а люди ленивые твари. И от этого пошла молва мол «вычислильное время сейчас дешёвое,докупи оперативки, поменяй проц, время дороже» и прочий отчасти бред. Это удобно, действительно удобно, только вот есть одно, но. Удобно для прототипирования и частых изменений, если программа устоялась, переписать на компилируемое и не сношать моск.

Но тут у меня есть оправдание, я тренируюсь =) Надо же прикладные вещи делать при обучении, вот тыкнул пальцем попал сюда и всё. Мне нужен скоро будет язык компаньон для автоматизации и одновременно встраиваемый, для прототипирования и расширения основной программы, типа если есть новый формат файла который надо сожрать то сначала набрасывается реализация на компаньоне, а когда уже изменений нет и не будет то переписывается на сишку (хотя если оно вообще стоит того, скрипты для себя хоть на PHP можно держать, переписывать надо что-то дельное и обладающее реальной вычислительной затратностью, а не тупо логику).

Всякие luarocks с поддтягом зависимостей это ненужное зло, но надо понимать хоть маленько как оно работает ибо локально порой надо что-то сделать быстро/временно, может пригодится.

Метался между языками lua и pawn оба подходят, у обоих приколы у павна сишный синтаксис (это и есть си для маленьких) у луа гибкость. pawn проиграл, но язык интересный очень.

Можно то что выше переписать используя системные curl для получения данных и jq для разбора json будет просто bash скрипт с логикой на чистой lua. И это было бы уже Ъ решение, без зависимостей (системные не в счёт), по всем канонам. Но надо поиграться и с зависимостями.

Вот такие пироги, на этапе обучения надо тыкать всё. Каюсь, позорище. Но lua это исключение, луа это уродливая няшка, дочка папы Си которая бегает в школу аэробики и часто там стукалась головой, развив гибкость и немного тугодумия ^.^

А как компаньён/скрипота lua хороша для такого, на баше яб не стал такое писать.
До этого это был скрипт на си запускаемый через tcc

------------------------------------------
-------Simple auto WakeUP from sleep------
------копиригхт Цы LINUX-ORG-RU-----------
------------license WTFPL-----------------
------------------------------------------
--- заранее в /etc/rc.local шобы работало
--- chmod ugo+r  /dev/rtc0
--- chown $USER  /sys/power/state
------------------------------------------

local ctime = 
{
    year = tonumber(os.date("%Y")),
    mont = tonumber(os.date("%m")),
    days = tonumber(os.date("%d")),
    hour = tonumber(os.date("%H")),
    mins = tonumber(os.date("%M")),
    seco = tonumber(os.date("%S")),
}

chunks = {}
for substring in arg[1]:gmatch("([^:]+)") do
   table.insert(chunks, substring)
end

local wtime = 
{
    hour = tonumber(chunks[1]),
    mins = tonumber(chunks[2]),
}

if wtime.hour == nil or wtime.mins == nil then
    print("./rtcwake час:минута")
    return
end

local time = 0
local incd = 0

if ctime.hour > wtime.hour then
    incd = 1
end

time = os.time
{
    year  = ctime.year,
    month = ctime.mont,
    day   = ctime.days+incd,
    hour  = wtime.hour,
    min   = wtime.mins,
    sec   = ctime.secs
}

print("Включение в "..ctime.year.."/"..ctime.mont.."/"..ctime.days+incd.." "..wtime.hour..":"..wtime.mins)

os.execute("killall rtcwake")
os.execute("/usr/sbin/rtcwake -m mem -s "..time-os.time())
os.execute("sleep 2")
os.execute("xset dpms force on")
os.execute("nmcli networking off")
os.execute("nmcli networking on")

print("тютютю")

Всё, я оправдался :D

LINUX-ORG-RU ★★★★★
()
Последнее исправление: LINUX-ORG-RU (всего исправлений: 1)
Ответ на: комментарий от LINUX-ORG-RU

Имхо best practice, когда скрипт говорит, как установить нужные ему зависимости, но не инициализирует их установку сам.

eugrus ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.