Compare commits

..

30 Commits

Author SHA1 Message Date
FutureX
bf6e440651 Version 1.2.3
Мини исправление бага с заданиями radio-buttons
2019-05-22 02:38:11 +03:00
FutureX
46c02e2bb3 Version 1.2.2
-
2019-05-22 01:18:34 +03:00
FutureX
b4ea41fd8c Version 1.2.2
Улучшение работы автозаполнения в заданиях с переносом блоков
2019-05-22 01:15:05 +03:00
FutureX
6a9568d46d Version 1.2.2
Небольшие добавления для работы автозаполнения в заданиях с перетаскиванием блоков
2019-05-21 23:29:34 +03:00
FutureX
05db1c175b Version 1.2.2
Исправлена ошибка, изза которой не заполнялись текстовые задания
2019-05-21 22:51:00 +03:00
FutureX
4d121390fe Version 1.2.2
Заполняет некоторые задания, где надо перемещать блоки в линии
2019-05-21 22:40:01 +03:00
FutureX
cf55bea9c1 Version 1.2.1
Небольшое исправление автозаполнения заданий, где надо перемещать нехватающую часть предложения в отведенное место
2018-05-21 20:59:21 +03:00
FutureX
1a7fa8e210 Version 1.2.0
В некоторых случаях не заполнялись ответы для inputBox(текст)
2018-04-25 15:23:46 +03:00
FutureX
bf3ca076ff
Update README.md 2018-04-25 14:41:00 +03:00
FutureX
d961d1cf00
Update README.md 2018-04-25 14:39:48 +03:00
FutureX
42977a5b55
Update README.md 2018-04-25 14:39:15 +03:00
FutureX
a0338001b6
Update README.md 2018-04-25 14:35:19 +03:00
FutureX
5f61af3c2c Version 1.2.0
Исправлена ошибка, изза которой неверно отображался статус расширения
2018-04-25 14:29:40 +03:00
FutureX
5850cf5c42 Version 1.2.0
Исправил ошибки заполнения некоторых ответов

Добавил options меню (такое же как и popup)

Версия более менее стабильная
2018-04-25 14:27:37 +03:00
FutureX
44b58955ba Version 1.2.0 2018-04-22 23:13:30 +03:00
FutureX
3d655c6ff2 Version 1.2.0
Неправильно отображалось состояние расширениия
2018-04-22 23:09:31 +03:00
FutureX
510a469b93 Version 1.2.0
Заполняет автоматически большую часть заданий
2018-04-22 22:48:45 +03:00
FutureX
87ce498997 Version 1.1.3
Добавил заполнение кроссвордов и заданий, где нужно распределить слова по столбцам с произношением
2018-04-22 17:34:42 +03:00
FutureX
c5a2332273 Version 1.1.3
Добавил заполение заданий, где надо руками вводить слова(после этого надо убрать последний символ в строке, для корректной проверки задания)

Добавил заполнение заданий, где есть radio-buttons
2018-04-22 17:15:40 +03:00
FutureX
bb63305744 Version 1.1.3
Убрал мерцание текста в меню расширения

Добавил заготовку для автоматического заполнения тестов(На стадии тестирования, работает только часть заданий)
2018-04-22 16:05:30 +03:00
FutureX
e9f4ad855c Version 1.1.3
Исправлена ошибка, из-за которой при показанных ответах на кроссворд нельзя было вводить ответы
2018-04-17 01:06:38 +03:00
FutureX
baa49ad871
Version 1.1.2 2018-04-13 23:10:08 +03:00
FutureX
32472240b2
Version 1.1.2
Добавил инструкцию по установке
2018-04-13 23:08:41 +03:00
FutureX
2d21a77d7e
Update README.md
Улучшение описания,  подготовка к быстрому перемещению по документу
2018-04-13 22:32:42 +03:00
FutureX
f042bbd439
Version 1.1.2
Обновил описание до версии 1.1.2
2018-04-13 16:13:12 +03:00
FutureX
8ec55e0dd9 Version 1.1.2
Добавил режим, в котором на странице кроме основной части ничего не отображается.

Раньше не отображались ответы к некоторым типам заданий(например кроссворд)
2018-04-13 15:58:22 +03:00
FutureX
2f8c070f62
Небольшое описание 2018-04-13 01:17:20 +03:00
FutureX
9ac51eaa9c Version 1.1.1
Распределил файлы по папкам

Добавил функцию из другого расширения - при нажатии кнопки проверить у вас будут верны все ответы, даже если все поля пустые(так лучше не делать, поскольку преподователи видят это)
2018-04-13 00:25:58 +03:00
FutureX
54a10af97c Version 1.1.0
Добавил контекстное меню, вызываемое правой кнопкой мыши. Теперь там можно нажать кнопку "Посмотреть ответы"

Улучшил вид popup меню, добавил css для красивого оформления

Теперь скрипты показа ответов не будет грузить лишний раз браузер, будет работать только в нужных фреймах
2018-04-13 00:09:16 +03:00
FutureX
e6195eb458 Version 1.0.2
Теперь по нажатии иконки расширения будет появляться меню. В нем добавил возможность выключения расширения
2018-04-12 23:57:35 +03:00
15 changed files with 840 additions and 35 deletions

53
README.md Normal file
View File

@ -0,0 +1,53 @@
# Chrome Extension - LMS Answers
* #### Небольшое расширение для легкого выполнения тестов в среде Cambridge LMS.
## Последнюю версию всегда можно найти в разделе [releases](https://github.com/FutureXpo/Chrome-Extension-LMS-Answers/releases)
***
***
## Быстрое перемещение по документу
> * ### [Функционал](https://github.com/FutureXpo/Chrome-Extension-LMS-Answers/blob/master/README.md#%D0%A4%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%B0%D0%BB-1)
> * #### [Меню расширения](https://github.com/FutureXpo/Chrome-Extension-LMS-Answers/blob/master/README.md#%D0%9F%D1%80%D0%B8-%D0%BD%D0%B0%D0%B6%D0%B0%D1%82%D0%B8%D0%B8-%D0%BD%D0%B0-%D0%B8%D0%BA%D0%BE%D0%BD%D0%BA%D1%83-%D1%80%D0%B0%D1%81%D1%88%D0%B8%D1%80%D0%B5%D0%BD%D0%B8%D1%8F-%D0%BF%D0%BE%D1%8F%D0%B2%D0%B8%D1%82%D1%81%D1%8F-%D0%BC%D0%B5%D0%BD%D1%8E-%D1%80%D0%B0%D1%81%D1%88%D0%B8%D1%80%D0%B5%D0%BD%D0%B8%D1%8F)
> * #### [Возможности](https://github.com/FutureXpo/Chrome-Extension-LMS-Answers/blob/master/README.md#%D0%A7%D1%82%D0%BE-%D0%BC%D0%BE%D0%B6%D0%BD%D0%BE-%D1%81%D0%B4%D0%B5%D0%BB%D0%B0%D1%82%D1%8C-%D0%B8%D0%B7-%D1%8D%D1%82%D0%BE%D0%B3%D0%BE-%D0%BC%D0%B5%D0%BD%D1%8E)
> * [Автопоказ ответов](https://github.com/FutureXpo/Chrome-Extension-LMS-Answers/blob/master/README.md#%D0%9C%D0%BE%D0%B6%D0%BD%D0%BE-%D0%B2%D1%8B%D0%B1%D1%80%D0%B0%D1%82%D1%8C-%D1%80%D0%B5%D0%B6%D0%B8%D0%BC-%D0%90%D0%B2%D1%82%D0%BE%D0%BC%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9-%D1%80%D0%B5%D0%B6%D0%B8%D0%BC---%D0%B1%D0%BE%D0%BB%D1%8C%D1%88%D0%B0%D1%8F-%D1%87%D0%B0%D1%81%D1%82%D1%8C-%D1%82%D0%B5%D1%81%D1%82%D0%BE%D0%B2-%D0%B1%D1%83%D0%B4%D0%B5%D1%82-%D0%B0%D0%B2%D1%82%D0%BE%D0%BC%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8-%D0%B7%D0%B0%D0%BF%D0%BE%D0%BB%D0%BD%D1%8F%D1%82%D1%8C%D1%81%D1%8F)
> * [Автоматический режим(beta)](https://github.com/FutureXpo/Chrome-Extension-LMS-Answers/blob/master/README.md#%D0%9C%D0%BE%D0%B6%D0%BD%D0%BE-%D0%B2%D1%8B%D0%B1%D1%80%D0%B0%D1%82%D1%8C-%D1%80%D0%B5%D0%B6%D0%B8%D0%BC-%D0%90%D0%B2%D1%82%D0%BE%D0%BC%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9-%D1%80%D0%B5%D0%B6%D0%B8%D0%BC---%D0%B1%D0%BE%D0%BB%D1%8C%D1%88%D0%B0%D1%8F-%D1%87%D0%B0%D1%81%D1%82%D1%8C-%D1%82%D0%B5%D1%81%D1%82%D0%BE%D0%B2-%D0%B1%D1%83%D0%B4%D0%B5%D1%82-%D0%B0%D0%B2%D1%82%D0%BE%D0%BC%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8-%D0%B7%D0%B0%D0%BF%D0%BE%D0%BB%D0%BD%D1%8F%D1%82%D1%8C%D1%81%D1%8F)
> * [Упрощенная страница](https://github.com/FutureXpo/Chrome-Extension-LMS-Answers/blob/master/README.md#%D0%9C%D0%BE%D0%B6%D0%BD%D0%BE-%D0%B2%D1%8B%D0%B1%D1%80%D0%B0%D1%82%D1%8C-%D1%80%D0%B5%D0%B6%D0%B8%D0%BC-%D0%A3%D0%BF%D1%80%D0%BE%D1%89%D0%B5%D0%BD%D0%BD%D0%B0%D1%8F-%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B0---%D0%B2%D0%BE-%D0%B2%D1%80%D0%B5%D0%BC%D1%8F-%D1%82%D0%B5%D1%81%D1%82%D0%BE%D0%B2-%D0%B1%D1%83%D0%B4%D0%B5%D1%82-%D0%BE%D1%82%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B0%D1%82%D1%8C%D1%81%D1%8F-%D1%82%D0%BE%D0%BB%D1%8C%D0%BA%D0%BE-%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%BD%D0%B0%D1%8F-%D1%87%D0%B0%D1%81%D1%82%D1%8C)
> * [Максимальные баллы](https://github.com/FutureXpo/Chrome-Extension-LMS-Answers/blob/master/README.md#%D0%9C%D0%BE%D0%B6%D0%BD%D0%BE-%D0%B2%D1%8B%D0%B1%D1%80%D0%B0%D1%82%D1%8C-%D1%80%D0%B5%D0%B6%D0%B8%D0%BC-%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5-%D0%B1%D0%B0%D0%BB%D0%BB%D1%8B---%D0%BF%D1%80%D0%B8-%D0%BF%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B5-%D0%BE%D1%82%D0%B2%D0%B5%D1%82%D0%BE%D0%B2-%D0%B2%D1%81%D0%B5%D0%B3%D0%B4%D0%B0-%D0%B1%D1%83%D0%B4%D0%B5%D1%82-%D0%BF%D0%BE%D0%BB%D0%BD%D1%8B%D0%B9-%D0%B1%D0%B0%D0%BB%D0%BB)
> * #### [Пример работы](https://github.com/FutureXpo/Chrome-Extension-LMS-Answers/blob/master/README.md#%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B-%D1%80%D0%B0%D1%81%D1%88%D0%B8%D1%80%D0%B5%D0%BD%D0%B8%D1%8F-%D0%BF%D1%80%D0%B8-%D0%B2%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%BD%D0%BE%D0%BC-%D1%80%D0%B5%D0%B6%D0%B8%D0%BC%D0%B5-%D0%BC%D0%B0%D0%BA%D1%81%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5-%D0%B1%D0%B0%D0%BB%D0%BB%D1%8B)
> * ### [Инструкция по установке](https://github.com/FutureXpo/Chrome-Extension-LMS-Answers/blob/master/README.md#%D0%98%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%86%D0%B8%D1%8F-%D0%BF%D0%BE-%D1%83%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B5-1)
***
***
## Функционал:
### При нажатии на иконку расширения появится меню расширения
![Меню расширения](https://image.ibb.co/nJ8Jmx/image.png "Меню расширения")
### Что можно сделать из этого меню?
* #### Можно выбрать режим "Показывать ответы" - при открытии страницы с тестом ответы автоматически появятся
* Если этого не сделать, то всегда можно нажать на кнопку "Показать ответы"
* #### Можно выбрать режим "Автоматический режим" - большая часть тестов будет автоматически заполняться
* Возможны ошибки, но их вероятность мала
* #### Можно выбрать режим "Упрощенная страница" - во время тестов будет отображаться только основная часть
* Основной частью считается само задание и кнопки перехода к предыдущему и следующему заданиям
* #### Можно выбрать режим "Максимальные баллы" - при проверке ответов всегда будет полный балл
* Однако преподаватель будет видеть, что поля для ответов пустые, поэтому лучше не оставлять поля пустыми.
* После включения и выключения надо обновить страницу для того, чтобы расширение начало действовать
### Пример работы расширения при включенном режиме "максимальные баллы":
![Максимальные баллы](https://preview.ibb.co/mxoZ47/image.png)
***
***
## Инструкция по установке
1. Скачиваем последнюю версию расширения в разделе [releases](https://github.com/FutureXpo/Chrome-Extension-LMS-Answers/releases)
![Скачиваем файл](https://preview.ibb.co/kFwoE7/image.png)
1. Распаковываем архив в любое место, запоминаем пусть к нему
1. Открываем Google Chrome, идем во вкладку расширения
![Открываем расширения](https://preview.ibb.co/hFLkcS/image.png)
1. Включаем режим разработчика. Нажимаем "Загрузить распакованное расширение". Выбираем папку LMS, которую распаковали из архива
![Добавляем новое в список](https://preview.ibb.co/fY3hP7/image.png) ![Выбираем папку](https://image.ibb.co/kH1Bj7/image.png)
1. В списке расширений появилось новое - LMS Answers. Активируем его
![Появившееся расширение](https://image.ibb.co/mbZLcS/image.png)
1. Все готово, можно начинать пользоваться!

View File

@ -1,7 +0,0 @@
chrome.browserAction.setBadgeText({text: "on"});
//При нажатии иконки расширения вызывается данная функция
chrome.browserAction.onClicked.addListener(function() {
chrome.tabs.query({active: true, currentWindow: true}, function(tabs) {
chrome.tabs.sendMessage(tabs[0].id, {command: "show"});
});
});

View File

Before

Width:  |  Height:  |  Size: 5.9 KiB

After

Width:  |  Height:  |  Size: 5.9 KiB

View File

@ -1,19 +0,0 @@
//По окончании загрузки документа вызывается функция
$(document).ready(function() {
var timerId = setInterval(show, 2000);
setTimeout(function() {
clearInterval(timerId);
}, 7000);
})
//При получении команды 'show' показывает ответы
chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
if(request.command==="show") show();
});
//Показать ответы
function show() {
$('*[class^="correct"]').show().removeClass("ng-hide").parent().show().removeClass("ng-hide");
$("table.ng-hide").removeClass("ng-hide");
$("section").css("user-select","initial");
}

View File

@ -0,0 +1 @@
[{"description":"treehash per file","signed_content":{"payload":"eyJjb250ZW50X2hhc2hlcyI6W3siYmxvY2tfc2l6ZSI6NDA5NiwiZGlnZXN0Ijoic2hhMjU2IiwiZmlsZXMiOlt7InBhdGgiOiJpY29uLnBuZyIsInJvb3RfaGFzaCI6InZYSzRsclYwcDdlZGhRdTdpRUVoY1Eza2xaYU8xVU9lM1lHTXQtbm1XdzQifSx7InBhdGgiOiJpbmplY3QuanMiLCJyb290X2hhc2giOiI2WmdFbGhhLUR4ZWRXc2FWY0hpV3ZFMEt2cVZXdGVyZ1F0blhYM0JyNGVBIn0seyJjYW5vbmljYWxfanNvbl9yb290X2hhc2giOiJCeWZIczFha1ZUX0VpeW9WQXlTTmYydFQ3bkZLVG92ak96OGVjQXhpNjdrIiwicGF0aCI6Im1hbmlmZXN0Lmpzb24iLCJyb290X2hhc2giOiJxc1JKdm45dnBybHNUdTE4ZFFkMm8zRnE4TUxIQTlSclRtNzdHd185bmlrIn1dLCJmb3JtYXQiOiJ0cmVlaGFzaCIsImhhc2hfYmxvY2tfc2l6ZSI6NDA5Nn1dLCJpdGVtX2lkIjoiYWVtZ2hwbXBpY25vZ2JhZGRhYmljZWNiaWVob2VoYmIiLCJpdGVtX3ZlcnNpb24iOiI2LjY2IiwicHJvdG9jb2xfdmVyc2lvbiI6MX0","signatures":[{"header":{"kid":"publisher"},"protected":"eyJhbGciOiJSUzI1NiJ9","signature":"QoEO2p82NrNNQBbKAJAmjlSSMmTSPzX9lkFTKwEAZ37p8xIYnaL7_NydUA_QVu0vxp8jkpQrBCjY-UwfffnoMiHROhuzY57iS2pj2q3_rp5at-sjMlE43cZrKINcamCFKQN7A4tGThd30D_RngRNDhh4Kmu4fxd1CWKSRrD2rBvv29nk0ODjpsCoJ6i5OjXLRFjj7ocPpz227tSRg5ACJRUY3fQa0U6l-ZRwIwT0sVQN-hkNV-0qWtwiTpWU2807N3RZTY4CgeA-2-YO9pmDHTkFaWtg4fPOEZSdWe_Trheh_2U7n-CeTxruPrGr_jf7L3znmIB8OItiilcVXEI_qg"},{"header":{"kid":"webstore"},"protected":"eyJhbGciOiJSUzI1NiJ9","signature":"YbWAdtSJm-YNi1GO1s8Xm1cPIYXhlQ0CxmzGPoXoafbPz9EuwnpRsL6pOWi7MragwJ3rkwgonbrqkba7xuWDj9Vzd8PWSSywyHttPOJeFBBLyfXVjHbLUNb9kKCkgYOdlnhadgGcaXXe1Y5O-1KVWgXqyzY8jxfD-jJivhsxsfFV1QA0w1BJOngqygF5O4X7dx9m4k4UeyNvbAYJu2_tYObzJVkcjSQa96sLPd5rwC6LaJaS10yCsC--qvOrKr4KY5KEvF1M4dwQhv5NvRRbYLuGgkf5t_3ccjAhHXGYIb_H7g3Ilj71eg95NMNcjw5vIqEEtfX8POsEg_Ca55v8DQ"}]}}]

289
js/auto_mode.js Normal file
View File

@ -0,0 +1,289 @@
//По окончании загрузки документа вызывается функция
$(document).ready(function() {
var path = window.location.pathname;
var page = path.split("/").pop();
if(page === 'index.html') {
//При получении команды 'auto_mode' заполняет ответы
chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
if(request.command==="auto_mode") {
auto_mode();
}
});
//Если выбрана функция автоматического показа ответов запускается функция заполнения ответов
chrome.storage.sync.get(['auto_mode'], function(items) {
var choise=items['auto_mode'];
if(choise == undefined) choise = false;
if(choise){
var timerId = setInterval(auto_mode, 2000);
setTimeout(function() {
clearInterval(timerId);
}, 7000);
}
});
}
})
var init = 0;
//Заполнить ответы
function auto_mode() {
var test,answers;
//select box
test = document.getElementsByClassName('selectBox');
answers = document.getElementsByTagName('b');
if(test&&answers) fill_selectbox(test,answers);
//phrases
test = document.getElementsByClassName('all-items-drop');
answers = document.getElementsByClassName('correctAnswer');
if(test&&answers) fill_phrases(test,answers);
//radio_columns
test = document.getElementsByTagName('input');
if(test) fill_columns(test);
//radio button
test = document.getElementsByClassName('option_horizontal');
answers = document.getElementsByClassName('correct-answers');
if(test&&answers) fill_radio(test,answers);
//crossword
test = document.getElementsByClassName('word-Box')[0];
answers = document.getElementsByClassName('all-words-Answer')[0];
if(test&&answers) fill_crossword(test,answers);
//pronunciation
test = document.getElementsByClassName('categories')[0];
answers = document.getElementsByClassName('categories')[1];
if(test&&answers) fill_pronunciation(test,answers);
//text input
test = document.getElementsByClassName('inputBox');
answers = document.getElementsByClassName('correctAnsDiv');
if(test&&answers) fill_input(test,answers);
//editDiv
test = document.getElementsByClassName('editableDiv');
answers = document.getElementsByClassName('correctAnsDiv');
if(test&&answers) fill_editable(test,answers);
//moveToken
test = document.getElementsByClassName('moveToken');
answers = document.getElementsByClassName('answerSentClass');
if(test&&answers) fill_sorting(test,answers);
}
//Заполнить задания, где есть selectBox
function fill_selectbox(test,answers) {
var test_arr = Array.prototype.slice.call(test);
var answers_arr = Array.prototype.slice.call(answers);
if(answers_arr&&test_arr)answers_arr.forEach(function(item, i) {
var a = item.innerHTML.replace(/(^\s*)|(\s*)$/g, '');;
if(test_arr[i])
Array.prototype.slice.call(test_arr[i].options).forEach(function(item) {
if(item.value.includes(a)) {
var b = item.value.replace(a, '');
if( b.search(/[a-zA-Z]/) === -1 ) test_arr[i].value = item.value;
}
});
});
}
//Заполнить задания, где есть inputBox
function fill_input(test,answers) {
var test_arr = Array.prototype.slice.call(test);
var answers_arr = Array.prototype.slice.call(answers);
var txt_answers_arr = [];
if(answers_arr&&test_arr)answers_arr.forEach(function(item, i) {
txt_answers_arr = push_answer_b(item.getElementsByClassName("showAnswersentenseClass"),txt_answers_arr);
});
if(answers_arr&&test_arr)test_arr.forEach(function(item, i) {
if(item.getAttribute("type")!=="radio"&&item.getAttribute("class")!=="inputBox ng-scope ng-valid ng-dirty"){
item.setAttribute("class","inputBox ng-scope ng-valid ng-dirty");
item.value = txt_answers_arr[i]+"-";//.innerHTML + "-";
if(init===0)alert("Не забудьте убрать знак '-' в каждом задании");
init = 1;
}
});
}
//Заполнить задания, где есть radio buttons
function fill_radio(test,answers) {
var test_arr = Array.prototype.slice.call(test);
var answers_arr = Array.prototype.slice.call(answers);
if(answers_arr&&test_arr)answers_arr.forEach(function(item, i) {
var radio_arr = Array.prototype.slice.call(test_arr[i].getElementsByTagName('input'));
var text_answers_arr = Array.prototype.slice.call(answers_arr[i].getElementsByTagName('b'));
var answer = "";
if(text_answers_arr) text_answers_arr.forEach(function(item1) {
if(item1.innerHTML.search(/[a-zA-Z]/)===-1)answer=answer.substring(0,answer.length-1);
answer+=item1.innerHTML.replace(/(^\s*)|(\s*)$/g, '');
if(item1.innerHTML!=='-')answer+=' ';
});
answer=answer.replace('/','').replace(/(^\s*)|(\s*)$/g, '');
var text_test_arr = Array.prototype.slice.call(test_arr[i].getElementsByClassName('optionText'));
if(text_test_arr) text_test_arr.forEach(function(item1,j) {
if(item1.innerText.includes(answer)) {
var c = item1.innerText.replace(answer, '');
if( c.search(/[a-zA-Z]/) === -1 ) radio_arr[j].click();
}
});
});
}
//Заполнить кроссворд
function fill_crossword(test,answers) {
var table_test = test.getElementsByTagName('table')[0];
var answers_test = answers.getElementsByTagName('table')[0];
var table_test_arr = Array.prototype.slice.call(table_test.getElementsByTagName('div'));
var answers_test_arr = Array.prototype.slice.call(answers_test.getElementsByTagName('div'));
if(table_test_arr&&answers_test_arr) table_test_arr.forEach(function(item,i) {
item.innerHTML = answers_test_arr[i].innerHTML;
});
}
//Заполнить произношение
function fill_pronunciation(test,answers) {
var test_choises = document.getElementsByClassName('all-items-container')[0].getElementsByClassName('dragger');
var text_test_choises = Array.prototype.slice.call(document.getElementsByClassName('all-items-container')[0].getElementsByClassName('ng-binding'));
var table_test = test.getElementsByClassName('category-box');
var table_answers = answers.getElementsByClassName('category-correctans-box');
var table_test_arr = Array.prototype.slice.call(table_test);
var answers_test_arr = Array.prototype.slice.call(table_answers);
if(answers_test_arr&&table_test_arr) answers_test_arr.forEach(function(item,i) {
var answers = Array.prototype.slice.call(item.getElementsByClassName('dragger'));
if(answers) answers.forEach(function(item) {
var a = item.getElementsByClassName('ng-binding')[0].innerHTML;
if(text_test_choises) text_test_choises.forEach(function(item,j) {
if(item.innerHTML === a&&test_choises[j].getAttribute("class")!=="dragger draggable ng-scope ui-draggable cloneDropped opacityDiv") {
test_choises[j].setAttribute("class","dragger draggable ng-scope ui-draggable cloneDropped opacityDiv");
var b = test_choises[j].cloneNode(true);
b.setAttribute("class","dragger draggable ng-scope ui-draggable cloneDropped clone");
table_test_arr[i].getElementsByClassName('all-items-drop dropped-items drop-dest')[0].append(b);
}
});
});
});
}
//Заполнить фразы словами
function fill_phrases(test,answers) {
var test_arr = Array.prototype.slice.call(test);
var answers_arr = Array.prototype.slice.call(answers);
var d = [];
if(answers_arr&&test_arr)answers_arr.forEach(function(item, i) {
Array.prototype.slice.call(item.getElementsByClassName('dndAnswerLineClass')).forEach(function(item) {d.push(item);});;
});
if(d.length>0)answers_arr=d;
var test_choises = document.getElementsByClassName('all-items-container')[0];
var txt_answers_arr = [];
if(test_choises){
var text_test_choises = Array.prototype.slice.call(test_choises.getElementsByClassName('ng-binding'));
test_choises=test_choises.getElementsByClassName('dragger');
}
if(answers_arr&&test_arr)txt_answers_arr = push_answer_b(answers,txt_answers_arr);
if(answers_arr&&test_arr)test_arr.forEach(function(item, i) {
var lil = 0;
/*var text_answers_arr = Array.prototype.slice.call(answers_arr[i].getElementsByTagName('b'));
var a = "";
if(text_answers_arr) text_answers_arr.forEach(function(item1) {
if(item1.innerHTML.search(/[a-zA-Z]/)===-1)a=a.substring(0,a.length-1);
a+=item1.innerHTML.replace(/(^\s*)|(\s*)$/g, '');
if(item1.innerHTML!=='-')a+=' ';
});
a=a.replace(/(^\s*)|(\s*)$/g, '');*/
var a = txt_answers_arr[i];
if(text_test_choises) text_test_choises.forEach(function(item,j) {
if(item.innerHTML.includes(a)) {
var b = item.innerHTML.replace(a, '');
if( b.search(/[a-zA-Z]/) === -1 )
if(lil===0&&test_choises[j].getAttribute("class")!=="dragger draggable ng-scope ui-draggable cloneDropped opacityDiv") {
test_choises[j].setAttribute("class","dragger draggable ng-scope ui-draggable cloneDropped opacityDiv");
var b = test_choises[j].cloneNode(true);
test_arr[i].append(b);
test_arr[i].setAttribute("style",b.getAttribute("style"));
test_arr[i].setAttribute("class","drop-dest droppable-Item all-items-drop dropped-items ui-droppable droppableWhiteBG droppableTransparentBG");
b.setAttribute("class","dragger draggable ng-scope ui-draggable cloneDropped clone");
b.setAttribute("style",b.getAttribute("style")+"position: relative; left: 0px; top: 0px;");
lil=1;
}
}
});
});
}
//Заполнить задания, где есть radio columns
function fill_columns(test) {
var test_arr = Array.prototype.slice.call(test);
if(test_arr)test_arr.forEach(function(item, i) {
if(test_arr[i+test_arr.length/2])if(test_arr[i+test_arr.length/2].checked)item.click();
});
}
//Заполнить задания, где надо перемещать
function fill_sorting(test,answers) {
var test_arr = Array.prototype.slice.call(test);
var answers_arr = Array.prototype.slice.call(answers);
if(test_arr&&answers_arr)test_arr.forEach(function(item, i) {
var text_test_choises = Array.prototype.slice.call(item.getElementsByClassName('ng-binding'));
var test_choises = Array.prototype.slice.call(item.getElementsByClassName('sorting_li ng-scope'));
var answer = answers_arr[i].innerHTML.replace(/<[^>]+>/g,'').replace(/(^\s*)|(\s*)$/g, '');
var size = text_test_choises.length;
var a = answer;
var b = "";
while (size > 0){
text_test_choises.forEach(function(item1, i) {
if(item1.innerHTML.toUpperCase().includes(a.toUpperCase())){
size--;
answer=answer.substring(a.length,answer.length).replace(/(^\s*)|(\s*)$/g, '');
a=answer;
b = b + test_choises[i].outerHTML;
}
});
a = a.substring(0,a.length-1);
}
item.innerHTML = b;
});
}
//Заполнить задания, где надо исправить ошибки
function fill_editable(test,answers) {
var test_buttons = document.getElementsByClassName('buttonContainer');
var test_arr = Array.prototype.slice.call(test);
var answers_arr = Array.prototype.slice.call(answers);
if(test_arr&&answers_arr)test_arr.forEach(function(item, i) {
test_buttons[i].getElementsByTagName('button')[0].click();
if(!answers_arr[i].innerHTML.includes("No change"))
item.innerHTML=answers_arr[i].innerHTML.replace(/<[^>]+>/g,'');
});
}
//Найти ответы в строке(для inputBox)
function push_answer_b(answer_arr,answers_arr){
var answers = Array.prototype.slice.call(answer_arr);
if(answers)answers.forEach(function(answers) {
if(answers){
var txt = answers.innerHTML+" ";
var answer = " ";
var mode = 0;
var i = 0;
for(var i=0; i<txt.length;i++) {
var a = txt[i];
switch(mode){
case 0:
if(a === "<"){
var b = txt.substring(i,txt.length);
if(b.startsWith("<b>")){
mode = 2;
answer+=" ";
if(answer.endsWith(" - "))answer=answer.substring(0,answer.length-3)+"-";
}
}
break;
case 1:
if(a === "<"){
var b = txt.substring(i,txt.length);
if(b.startsWith("</b>")){
if(answer.endsWith(" .")||answer.endsWith(" ,"))answer=answer.substring(0,answer.length-2)+answer.substring(answer.length-1,answer.length);
mode = 0;
if(!(b.startsWith("</b><b>")||b.startsWith("</b> <b>"))){
answer=answer.replace(/(^\s*)|(\s*)$/g, '');
answers_arr.push(answer);
answer = "";
}
}
}
else answer += a;
break;
case 2:
if(a === ">"){
mode = 1;
}
break;
}
}
}
});
return answers_arr;
}

32
js/background.js Normal file
View File

@ -0,0 +1,32 @@
chrome.storage.sync.get(['show_mode','simple_mode','true_mode','auto_mode'], function(items) {
var choise=items['show_mode'];
if(choise == undefined) choise = true;
if(choise) chrome.browserAction.setBadgeText({text: "on"});
else chrome.browserAction.setBadgeText({text: "off"});
choise=items['simple_mode'];
if(choise == undefined) choise = false;
if(choise) chrome.browserAction.setBadgeText({text: "on"});
choise=items['true_mode'];
if(choise == undefined) choise = false;
if(choise) chrome.browserAction.setBadgeText({text: "on"});
choise=items['auto_mode'];
if(choise == undefined) choise = false;
if(choise) chrome.browserAction.setBadgeText({text: "on"});
});
//Создать контекстное меню
chrome.contextMenus.create({"title": "Показать ответы","onclick" : show});
//Показать ответы
function show(info) {
var url = info.pageUrl;
var url_ = "www.cambridgelms.org";
if(JSON.stringify(url).includes(url_))
{
var query = { active: true, currentWindow: true };
chrome.tabs.query(query, function(tabs) {
chrome.tabs.sendMessage(tabs[0].id, {command: "show"});
});
}
}

View File

32
js/show_mode.js Normal file
View File

@ -0,0 +1,32 @@
//По окончании загрузки документа вызывается функция
$(document).ready(function() {
var path = window.location.pathname;
var page = path.split("/").pop();
if(page === 'index.html') {
//При получении команды 'show' показывает ответы
chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
if(request.command==="show") {
show();
}
});
//Если выбрана функция автоматического показа ответов заппускается функция показа ответов
chrome.storage.sync.get(['show_mode'], function(items) {
var choise=items['show_mode'];
if(choise == undefined) choise = true;
if(choise){
var timerId = setInterval(show, 2000);
setTimeout(function() {
clearInterval(timerId);
}, 7000);
}
});
}
})
//Показать ответы
function show() {
$('*[class^="correct"]').show().removeClass('ng-hide').parent().show().removeClass('ng-hide');
$('*[ng-show^="doShowAnswer"]').removeClass("ng-hide").has('input').find('input').remove();
$('table.ng-hide').removeClass('ng-hide');
$('section').css('user-select','initial');
}

63
js/simple_mode.js Normal file
View File

@ -0,0 +1,63 @@
chrome.storage.sync.get(['simple_mode'], function(items) {
var choise=items['simple_mode'];
if(choise == undefined) choise = false;
if(choise) simple_mode_on();
document.getElementById('autologout-cache-check').remove();
});
//id и class ненужных элементов
var massiv_id = ['header','dashboard-toogle','skip-link','tools-iframe','cboxOverlay','colorbox','autologout-cache-check'];
var massiv_name = ['content-page-header','header-content scorm-header clearfix','region region-footer','left-nav hide','ipad-popup','top-btn save ipad-pos f-right disableMultipleClick-processed'];
//Включить простого вида
function simple_mode_on() {
var a;
a = document.getElementsByClassName('header-content scorm-header clearfix addBorder-top')[0];
if(a) a.setAttribute("class", "header-content scorm-header clearfix");
a = document.getElementsByClassName('main-content remove-pad hide clearfix')[0];
if(a) a.setAttribute("style", "display:block;");
a = document.getElementsByClassName('header-content scorm-header clearfix addBorder-top')[0];
if(a) a.setAttribute("class", "header-content scorm-header clearfix");
a = document.getElementById('content');
if(a) a.setAttribute('id','content_');
a = document.getElementsByClassName("scromoverlaydiv")[0];
if(a) a.remove();
a = document.getElementById('content-iframe');
if(a) a.setAttribute("style", "position:relative;display:block;height:93vh;visibility: visible;margin-left:-0.7%")
//Убираем отображение всех элементов из массивов
massiv_id.forEach(function(item, i, arr) {
a = document.getElementById(item);
if(a) a.setAttribute("style","transform: scale(0);margin-top:-9%");
});
massiv_name.forEach(function(item, i, arr) {
a = document.getElementsByClassName(item)[0];
if(a) a.setAttribute("style","transform: scale(0);");
});
}
//Выключить простого вида
function simple_mode_off() {
var a;
a = document.getElementsByClassName('dashboard-toggle-bg')[0];
if(a) a.innerHTML = "Hide Dashboard";
a = document.getElementById('content_');
if(a) a.setAttribute('id','content');
if(a) a.removeAttribute("style");
a = document.getElementById('content-iframe');
if(a) a.setAttribute("style", "position:relative;display:block;height:93vh;visibility: visible;");
//Возвращаем отображение всех элементов из массивов
massiv_id.forEach(function(item, i, arr) {
a = document.getElementById(item);
if(a) a.removeAttribute("style");
});
massiv_name.forEach(function(item, i, arr) {
a = document.getElementsByClassName(item)[0];
if(a) a.removeAttribute("style");
});
}
//Ожидание команд
chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
if(request.command==="simple_mode_on") {
simple_mode_on();
}
if(request.command==="simple_mode_off") {
simple_mode_off();
}
});

34
js/true_mode.js Normal file

File diff suppressed because one or more lines are too long

View File

@ -1,29 +1,46 @@
{
"name": "LMS helper ♥",
"homepage_url": "https://github.com/FutureXpo/Chrome-Extension-LMS-Answers",
"description": "Easy answers from your heart. Made with love by FutureX",
"icons": {
"16": "icon.png",
"32": "icon.png",
"48": "icon.png",
"128": "icon.png"
"16": "icons/icon.png",
"32": "icons/icon.png",
"48": "icons/icon.png",
"128": "icons/icon.png"
},
"version": "1.4.8.8",
"manifest_version": 2,
"browser_action": {
"default_icon": "icon.png"
"default_icon": "icons/icon.png",
"default_popup": "popup/popup.html"
},
"options_ui": {
"page": "popup/popup.html",
"open_in_tab": false
},
"background": {
"scripts": ["background.js"]
"scripts": ["js/background.js", "js/true_mode.js" ]
},
"content_scripts": [
{
"matches": [ "*://www.cambridgelms.org/*" ],
"js": [ "jquery.js", "inject.js" ],
"run_at": "document_end",
"js": [ "js/simple_mode.js" ],
"run_at": "document_end"
},{
"matches": [ "*://www.cambridgelms.org/*" ],
"js": [ "js/jquery.js", "js/show_mode.js", "js/auto_mode.js" ],
"run_at": "document_idle",
"all_frames": true
}
],
"permissions": [
"tabs"
"tabs",
"contextMenus",
"storage",
"webRequest",
"webRequestBlocking",
"*://www.cambridgelms.org/*",
"activeTab",
"management"
]
}

40
popup/popup.html Normal file
View File

@ -0,0 +1,40 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<html>
<head>
<title>LMS Answers</title>
<link rel="stylesheet" href="popup_style.css">
<script type="text/javascript" src="popup.js"> </script>
</head>
<body>
<div class="shadow title_text">
<h1>LMS Answers</h1>
</div>
<div class="button-add style style_4">
<input id="show_mode" type="checkbox">
<label for="show_mode" data-text="Показывать ответы"></label>
<div class="button-add__icon"></div>
</div>
<div class="button-add style style_1">
<input id="auto_mode" type="checkbox">
<label for="auto_mode" data-text="Автоматический режим(β)"></label>
<div class="button-add__icon"></div>
</div>
<div class="button-add style style_3">
<input id="true_mode" type="checkbox">
<label for="true_mode" data-text="Максимальные баллы"></label>
<div class="button-add__icon"></div>
</div>
<div class="button-add style style_2">
<input id="simple_mode" type="checkbox">
<label for="simple_mode" data-text="Упрощенная страница"></label>
<div class="button-add__icon"></div>
</div>
<div class="">
<button id="showBtn">Показать ответы</button>
</div>
</body>
</html>

109
popup/popup.js Normal file
View File

@ -0,0 +1,109 @@
document.addEventListener('DOMContentLoaded', function() {
loadOptions();
var showButton = document.getElementById('showBtn');
showButton.addEventListener('click', function() {
show();
}, false);
var autoChecker = document.getElementById('auto_mode');
autoChecker.addEventListener('change', function() {
saveOptions();
auto_mode();
}, false);
var showChecker = document.getElementById('show_mode');
showChecker.addEventListener('change', function() {
saveOptions();
if(showChecker.checked)show();
}, false);
var simpleChecker = document.getElementById('simple_mode');
simpleChecker.addEventListener('change', function() {
saveOptions();
simple_mode();
}, false);
var trueChecker = document.getElementById('true_mode');
trueChecker.addEventListener('change', function() {
saveOptions();
true_mode();
}, false);
}, false);
function loadOptions() {
chrome.storage.sync.get(['show_mode','simple_mode','true_mode','auto_mode'], function(items) {
var choise=items['show_mode'];
if(choise == undefined) choise = true;
var select = document.getElementById("show_mode");
select.checked = choise;
if(select.checked) chrome.browserAction.setBadgeText({text: "on"});
else chrome.browserAction.setBadgeText({text: "off"});
choise=items['simple_mode'];
if(choise == undefined) choise = false;
var select = document.getElementById("simple_mode");
select.checked = choise;
if(select.checked) chrome.browserAction.setBadgeText({text: "on"});
choise=items['true_mode'];
if(choise == undefined) choise = false;
var select = document.getElementById("true_mode");
select.checked = choise;
if(select.checked) chrome.browserAction.setBadgeText({text: "on"});
choise=items['auto_mode'];
if(choise == undefined) choise = false;
var select = document.getElementById("auto_mode");
select.checked = choise;
if(select.checked) chrome.browserAction.setBadgeText({text: "on"});
});
}
function saveOptions() {
var select = document.getElementById("show_mode");
chrome.storage.sync.set({'show_mode': select.checked});
if(select.checked) chrome.browserAction.setBadgeText({text: "on"});
else chrome.browserAction.setBadgeText({text: "off"});
select = document.getElementById("simple_mode");
chrome.storage.sync.set({'simple_mode': select.checked});
if(select.checked) chrome.browserAction.setBadgeText({text: "on"});
select = document.getElementById("true_mode");
chrome.storage.sync.set({'true_mode': select.checked});
if(select.checked) chrome.browserAction.setBadgeText({text: "on"});
select = document.getElementById("auto_mode");
chrome.storage.sync.set({'auto_mode': select.checked});
if(select.checked) chrome.browserAction.setBadgeText({text: "on"});
}
function show() {
var query = { active: true, currentWindow: true };
chrome.tabs.query(query, function(tabs) {
chrome.tabs.sendMessage(tabs[0].id, {command: "show"});
});
}
function auto_mode() {
var query = { active: true, currentWindow: true };
chrome.tabs.query(query, function(tabs) {
chrome.tabs.sendMessage(tabs[0].id, {command: "auto_mode"});
});
}
function simple_mode() {
var select = document.getElementById("simple_mode");
var query = { active: true, currentWindow: true };
chrome.tabs.query(query, function(tabs) {
if(select.checked===true)
chrome.tabs.sendMessage(tabs[0].id, {command: "simple_mode_on"})
else
chrome.tabs.sendMessage(tabs[0].id, {command: "simple_mode_off"})
});
}
function true_mode() {
alert("Чтобы обновления вступили в силу обновите страницу");
var select = document.getElementById("true_mode");
if(select.checked===true)
chrome.runtime.sendMessage({msg: "auto_on"})
else
chrome.runtime.sendMessage({msg: "auto_off"});
}

161
popup/popup_style.css Normal file
View File

@ -0,0 +1,161 @@
@import url(https://fonts.googleapis.com/css?family=Arvo:700);
body {
background-color: #222;
width: 250px;
}
.shadow {
color: #fff;
font-family: Arvo;
font-weight: bold;
text-shadow:
-3px -3px 0 #222,
3px -3px 0 #222,
-3px 3px 0 #222,
3px 3px 0 #222,
4px 4px 0 #fff,
5px 5px 0 #fff,
6px 6px 0 #fff,
7px 7px 0 #fff;
line-height: 1.8em;
letter-spacing: 0.1em;
transform: scaleY(0.7);
-webkit-transform: scaleY(0.7);
-moz-transform: scaleY(0.7);
margin:0;
text-align: center;
padding:0;
}
.title_text {
margin: -22px;
font-size: 22px;
}
.button-add {
margin: 0 20px;
margin-bottom: 5px; }
.button-add {
position: relative;
display: inline-block;
color: #fff; }
.button-add label {
display: inline-block;
text-transform: uppercase;
cursor: pointer;
text-align: left; }
.button-add input {
display: none; }
.button-add__icon {
cursor: pointer;
pointer-events: none; }
.button-add__icon:before, .button-add__icon:after {
content: "";
position: absolute;
top: 45%;
left: 35%;
transition: 0.2s ease-out; }
.style label {
will-change: transform;
height: 30px;
line-height: 30px;
transition: all 0.2s;
border-radius: 2rem; }
.style input[type=checkbox] ~ label {
width: 210px;
background: #FF5335; }
.style input[type=checkbox]:checked ~ label {
width: 210px;
background: #61B136; }
.style input[type=checkbox]:checked ~ .button-add__icon:before {
transform: translate(-10%, 100%) rotate(45deg);
width: 10.66667px; }
.style input[type=checkbox]:checked ~ .button-add__icon:after {
transform: translate(30%) rotate(-45deg); }
.button-add__icon {
position: absolute;
left: 0;
top: 0;
height: 30px;
width: 30px; }
.button-add__icon:before, .button-add__icon:after {
height: 3px;
border-radius: 3px;
background: #fff;
box-shadow: 0 1px 0 rgba(0, 0, 0, 0.1); }
.button-add__icon:before {
width: 17px;
transform: rotate(90deg); }
.button-add__icon:after {
width: 17px;
transform: rotate(0); }
.style_1 label:before, .style_1 label:after {
content: attr(data-text);
position: absolute;
right: 0.4rem; }
.style_2 label:before, .style_2 label:after {
content: attr(data-text);
position: absolute;
right: 1.3rem; }
.style_3 label:before, .style_3 label:after {
content: attr(data-text);
position: absolute;
right: 1.4rem; }
.style_4 label:before, .style_4 label:after {
content: attr(data-text);
position: absolute;
right: 1.9rem; }
button {
will-change: transform;
text-decoration: none;
outline: none;
display: inline-block;
padding: 10px 30px;
margin: 10px 20px;
position: relative;
color: white;
border: 1px solid rgba(255,255,255,.4);
background: none;
font-weight: 300;
font-family: 'Montserrat', sans-serif;
text-transform: uppercase;
letter-spacing: 2px;
}
button:before,
button:after {
content: "";
position: absolute;
width: 0;
height: 0;
opacity: 0;
box-sizing: border-box;
}
button:before {
bottom: 0;
left: 0;
border-left: 1px solid white;
border-top: 1px solid white;
transition: 0s ease opacity .8s, .2s ease width .4s, .2s ease height .6s;
}
button:after {
top: 0;
right: 0;
border-right: 1px solid white;
border-bottom: 1px solid white;
transition: 0s ease opacity .4s, .2s ease width , .2s ease height .2s;
}
button:hover:before,
button:hover:after{
height: 100%;
width: 100%;
opacity: 1;
}
button:hover:before {transition: 0s ease opacity 0s, .2s ease height, .2s ease width .2s;}
button:hover:after {transition: 0s ease opacity .4s, .2s ease height .4s , .2s ease width .6s;}
button:hover {background: rgba(255,255,255,.2);}