15 Commits
1.0.2 ... 1.2.0

Author SHA1 Message Date
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 733 additions and 35 deletions

50
README.md Normal file
View File

@@ -0,0 +1,50 @@
# 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%BF%D1%80%D0%B8-%D0%BE%D1%82%D0%BA%D1%80%D1%8B%D1%82%D0%B8%D0%B8-%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D1%8B-%D1%81-%D1%82%D0%B5%D1%81%D1%82%D0%BE%D0%BC-%D0%BE%D1%82%D0%B2%D0%B5%D1%82%D1%8B-%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%BF%D0%BE%D1%8F%D0%B2%D1%8F%D1%82%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)
> * ### [Инструкция по установке](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/meGnP7/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"}]}}]

190
js/auto_mode.js Normal file
View File

@@ -0,0 +1,190 @@
//По окончании загрузки документа вызывается функция
$(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 = true;
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.getElementsByTagName('input');
answers = document.getElementsByTagName('b');
if(test&&answers) fill_input(test,answers);
//editDiv
test = document.getElementsByClassName('editableDiv');
answers = document.getElementsByClassName('correctAnsDiv');
if(test&&answers) fill_editable(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;
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);
if(answers_arr&&test_arr)answers_arr.forEach(function(item, i) {
if(test_arr[i])
if(test_arr[i].getAttribute("type")!=="radio"){
test_arr[i].setAttribute("class","inputBox ng-scope ng-valid ng-dirty");
test_arr[i].value = item.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) {
answer+=item1.innerHTML.replace(/(^\s*)|(\s*)$/g, '');
if(!item1.innerHTML.search(/[a-zA-Z]/)===-1)answer=answer.substring(0,answer.length-1)
if(item1.innerHTML!=='-')answer+=' ';
});
answer=answer.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.innerHTML.includes(answer)) {
var c = item1.innerHTML.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_choises = document.getElementsByClassName('all-items-container')[0];
if(test_choises){
var text_test_choises = Array.prototype.slice.call(test_choises.getElementsByClassName('ng-binding'));
test_choises=test_choises.getElementsByClassName('dragger');
}
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 text_answers_arr = Array.prototype.slice.call(answers_arr[i].getElementsByTagName('b'));
var a = "";
if(text_answers_arr) text_answers_arr.forEach(function(item1) {a+=item1.innerHTML});
a=a.replace(/(^\s*)|(\s*)$/g, '');
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);
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;");
}
});
});
}
//Заполнить задания, где есть 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_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')[1].click();
if(!answers_arr[i].innerHTML.includes("No change"))
item.innerHTML=answers_arr[i].innerHTML.replace(/<[^>]+>/g,'');
});
}

32
js/background.js Normal file
View File

@@ -0,0 +1,32 @@
chrome.storage.sync.get(['show_mode','simple_mode','true_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

@@ -2,28 +2,40 @@
"name": "LMS helper ♥",
"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"
},
"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.9rem; }
.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);}