Как вставить случайный элемент на карту Anki?
В Anki на лицевой стороне карточки написано « X+Y? », а на обороте — « Z ». Например, спереди « 4+7? », а сзади « 11 ». Но я хочу, чтобы в следующий раз, когда я увижу эту карту, числа были другими, рандомизируя элементы X, Y и Z. Я думаю, это может быть возможно при выборе значений из пула, ранее определенного мной.
Поискав здесь, я нашел этот код:
import random
foo = ['a', 'b', 'c', 'd', 'e']
print(random.choice(foo))
Как я могу заставить его работать на Anki? Потому что я просто пытался скопировать его и вставить в редактор модели карты, но ничего не произошло. Извините, я не программист, поэтому я был бы признателен за любую информацию, которая может помочь мне функционализировать это случайное отображение. Спасибо за ваше время.
1 ответ
Несмотря на то, что это возможно (но запутанно, чтобы это произошло), обычно (очень сильно) не рекомендуется использовать случайный контент на Anki. Причина в следующем: если какой-то контент имеет изменение отображения на лицевой стороне карточки, значит, вы хотите его запомнить. Но тогда это означает, что вы раздуваете несколько вещей , которые хотите выучить, в одну карточку. По нескольким причинам (среди которых: Anki оптимизирована для работы с предположением, что каждая карта соответствует одной, атомарной вещи , которую вы хотите изучить. Нарушение этого предположения может только ухудшить ее работу, что, в конце концов, заставляет вас тратить больше времени на попытки чтобы изучить этот материал), лучше просто иметь карточку для каждой возможной вещи , которую вы хотите изучить.
Отредактируйте , прочитав мои слова предупреждения, я оставлю вас судить о том, действительно ли это хорошее решение делать то, что вы хотите.
Первое, что нужно понять, это то, что несмотря на то, что Anki в основном написан на Rust и Python (это два языка программирования) и хотя он поддерживает надстройки, написанные на Python, для этого следует использовать не Python (и не Rust) . цель. Я говорю это, потому что фрагмент кода, который вы предоставили, написан на Python.
Причина этого в том, что Anki использует веб-просмотры для рендеринга карточек, а это означает, что когда вы видите карточку, это так же, как если бы вы видели веб-сайт. Поэтому, если вы хотите выполнять код только при просмотре карточек (а не, скажем, автоматически генерировать карточки), вы должны использовать язык JavaScript. К сожалению, я не программист JavaScript, поэтому мой ответ может быть отстойным. К счастью, JavaScript — это довольно простой язык программирования, очень хорошо документированный, и ваш запрос достаточно прост, чтобы у меня не было много места для кода (это означает, что этот ответ не должен быть слишком отстойным). Как говорится, давайте заставим это работать:
- Добавьте в свои заметки поле, которое будет содержать возможные значения, которые будут показаны. Для простоты предположим, что ни одно из этих значений не содержит запятых, поэтому мы можем просто записать значения через запятую. Допустим, вы назвали это поле (переименуйте как хотите). По умолчанию он выберет первое из этих значений, если не может выбрать случайным образом. Подробнее об этом в конце.
- Теперь откройте окно редактирования шаблона для этой заметки. Если вы находитесь в браузере, это должна быть кнопка Карты....
- Выберите Front Template (он должен быть выбран по умолчанию). В верхней части шаблона добавьте следующий код, который позволит сохранить случайно выбранное значение также при раскрытии ответа (поскольку по умолчанию он просто переоценит весь сценарий, снова выбрав случайным образом).
Этот код взят из ankipersistence . Кроме того, при редактировании шаблонов, пожалуйста, не пишите значения над фрагментом, всегда под ним (это не изменит его рендеринг, но обеспечит загрузку всего этого кода, прежде чем вы сделаете что-либо еще).
- Выберите
, и добавьте следующий фрагмент вверху шаблона (это то же самое, что и раньше):
<script>
// v1.0.0 - https://github.com/SimonLammer/anki-persistence/blob/cd2ca88e019dc3b8f32dad623932c1eabdba7e21/script.js
if(void 0===window.Persistence){var _persistenceKey="github.com/SimonLammer/anki-persistence/",_defaultKey="_default";if(window.Persistence_sessionStorage=function(){var e=!1;try{"object"==typeof window.sessionStorage&&(e=!0,this.clear=function(){for(var e=0;e<sessionStorage.length;e++){var t=sessionStorage.key(e);0==t.indexOf(_persistenceKey)&&(sessionStorage.removeItem(t),e--)}},this.setItem=function(e,t){null==t&&(t=e,e=_defaultKey),sessionStorage.setItem(_persistenceKey+e,JSON.stringify(t))},this.getItem=function(e){return null==e&&(e=_defaultKey),JSON.parse(sessionStorage.getItem(_persistenceKey+e))},this.removeItem=function(e){null==e&&(e=_defaultKey),sessionStorage.removeItem(_persistenceKey+e)})}catch(e){}this.isAvailable=function(){return e}},window.Persistence_windowKey=function(e){var t=window[e],n=!1;"object"==typeof t&&(n=!0,this.clear=function(){t[_persistenceKey]={}},this.setItem=function(e,n){null==n&&(n=e,e=_defaultKey),t[_persistenceKey][e]=n},this.getItem=function(e){return null==e&&(e=_defaultKey),null==t[_persistenceKey][e]?null:t[_persistenceKey][e]},this.removeItem=function(e){null==e&&(e=_defaultKey),delete t[_persistenceKey][e]},null==t[_persistenceKey]&&this.clear()),this.isAvailable=function(){return n}},window.Persistence=new Persistence_sessionStorage,Persistence.isAvailable()||(window.Persistence=new Persistence_windowKey("py")),!Persistence.isAvailable()){var titleStartIndex=window.location.toString().indexOf("title"),titleContentIndex=window.location.toString().indexOf("main",titleStartIndex);titleStartIndex>0&&titleContentIndex>0&&titleContentIndex-titleStartIndex<10&&(window.Persistence=new Persistence_windowKey("qt"))}}
</script>
- Вернитесь к Front Template и добавьте следующее туда, где вы хотите, чтобы отображалось значение. Если вы не знаете, просто поместите его куда угодно, проверьте в конце, где он хорошо отображается, и затем измените его, чтобы у вас была визуальная обратная связь. Также избегайте использования других тегов с
.
Если вы переименовали поле
<script>
var valuesNode = document.getElementById("values");
var values = valuesNode.innerText.split(',');
var defaultValue = values[0];
var value = defaultValue;
if (Persistence.isAvailable()) {
value = Persistence.getItem();
if (value == null) {
value = values[Math.floor(Math.random() * values.length)];
Persistence.setItem(value);
}
}
valuesNode.innerText = value;
</script>
- Перейдите к Back Template и добавьте следующее туда, где вы хотите, чтобы отображалось значение (точно так же, как в переднем шаблоне):
<div id="values">{{Values}}</div>
- В нижней части шаблона добавьте следующее. Это будет отвечать за отображение случайно выбранного значения при отображении ответа.
<script>
var valuesNode = document.getElementById("values");
var values = valuesNode.innerText.split(',');
var defaultValue = values[0];
var value = defaultValue;
if (Persistence.isAvailable()) {
value = Persistence.getItem();
Persistence.clear();
}
valuesNode.innerText = value;
</script>
Здесь я объясню, почему существует значение по умолчанию. Это связано с тем, что некоторые клиенты Anki по-разному обрабатывают JavaScript. Постоянство anki должно работать при просмотре карты, но может не работать при предварительном просмотре карты. В этих случаях он все еще мог выбрать случайное значение, но когда вы раскрывали ответ, он не мог «запомнить», какое значение он выбрал, поэтому он выбирал другое значение наугад. Чтобы предотвратить это, если он знает, что не запомнит, он просто выберет вариант по умолчанию, чтобы он был последовательным, когда вы показываете ответ.