掌上百科 - PDAWIKI

 找回密码
 免费注册

QQ登录

只需一步,快速开始

查看: 6408|回复: 77

[记忆库] 新概念英语第一册 - 带复读机按钮

  [复制链接]
  • TA的每日心情
    慵懒
    2021-9-1 08:46
  • 签到天数: 61 天

    [LV.6]常住居民II

    发表于 2021-2-18 10:49:51 | 显示全部楼层 |阅读模式
    本帖最后由 zhangchaont 于 2021-2-20 10:53 编辑
    - w3 E1 \1 Y8 h' _& u" K' e
    $ x0 E% @; T- E. w为了给孩子学习英语,我把单词做成了卡片放在Anki里,但是课文却一直没有什么好的方法,在电脑上用一个复读机软件给孩子们练习,但是Mac上没有什么好用的复读机软件,所以学来学去还在最开始的几课里面打转。我本来想自己写一个复读机APP的,但是考虑到水平有限,估计得花很多时间,而且最大的问题不能利用Anki里schedule安排学习。# r, m. n8 Y4 R1 w' f! f

    ( E: K0 }/ S9 k/ O春节在家,我突然灵光一闪,Anki是基于PyQt5开发,而这个模块是支持一部分html、css和javascript的,如果用javascript读取字幕里面的时间戳,然后根据时间段来播放MP3,不就实现了一个简单的复读机了嘛。说干就干,因为没有javascript语言基础,都是需要什么就搜索,一步步的拼凑起来的,目前已经基本能用,成品在iOS上显示如下:( m7 _! `$ w; ^! D5 W
    / }* ?: @2 J; c# b: q1 {
    macOS上的效果$ K2 f& C) n$ ?& J
    % C4 Z% q: b( z) q+ h' H

    4 y$ m9 B# C5 N& V. Bjs代码如下:
    ' z  [) v0 J2 n" S7 h
    1. const lesson = document.getElementsByClassName("items")[0].innerText;
      % O3 v+ L$ F+ J/ w: ?- O8 ]
    2. const button_next = document.createElement("button");& s. h9 Q" k; a# I& A# g
    3. button_next.innerHTML = '下一句';
      6 v9 ?) M* k# n! R: g; f
    4. button_next.setAttribute('row_count', "4");: ^& O3 o- o  O8 s. z$ \1 Y
    5. let section = document.getElementsByClassName("section")[0];5 [, N$ {0 F8 c

    6. + a) c- [4 ]" u. A- I9 v9 _* ^
    7. const button_repeat = document.createElement("button");6 I* D$ r. o+ C1 ?) v7 \
    8. button_repeat.innerHTML = '重复此句';3 }& c8 d/ r) w% A0 |9 _( v
    9.   @" R7 k8 O! O6 u: f
    10. const button_previous = document.createElement("button");
      ( L3 Q0 s2 a6 \( b/ M
    11. button_previous.innerHTML = '上一句';/ n* n8 x* U3 d* _

    12. $ P+ ?$ {9 z& x
    13.   [  {! Q8 W. R5 E) P
    14. let div = document.createElement('div');
      9 P5 L7 P* r3 @& }& ]) ^% ~+ B7 T
    15. div.setAttribute('class', 'text');
      4 V6 |+ Y5 @8 S' g! [6 ~
    16. section.appendChild(div);- {' i  f' Q' N; |" O" Y5 I" s
    17. let p = document.createElement('p');
      # ]' Z# n$ N5 t/ D0 o
    18. div.appendChild(p);
      ) G5 {- ^  j  j9 t" w* g) i/ h) H5 V7 Y

    19. + V& o" W' F: H: ~2 P
    20. buttons_div = document.createElement('div');& B# W& ^0 A: N# W
    21. buttons_div.setAttribute('class', 'buttons');0 W3 i1 @9 p& ]. r/ s
    22. 9 L( `2 A, f2 M/ m6 p$ B0 m: G
    23. section.appendChild(buttons_div);) x; P7 u. _4 E7 ~
    24. ! M, y9 b% N/ G. a# Y3 g8 G
    25. buttons_div.appendChild(button_previous);" V  J' \# ^# U3 H5 g/ m
    26. buttons_div.appendChild(button_repeat);
      6 E8 f* L7 a0 d( T" S
    27. buttons_div.appendChild(button_next);; y# W# R1 h9 ~) F7 w- j

    28. 5 \9 w* E4 |) l' P9 q6 r

    29. 0 i. e4 G7 b- q4 ]4 d
    30. button_next.onclick = next;
      : [7 S1 T1 H$ i8 k. u0 j
    31. button_repeat.onclick = repeat;
      . q9 c$ s# S! I4 g) i) _( ?7 e
    32. button_previous.onclick = previous;2 a% H/ f% F" {4 u- ~4 u9 {! `
    33. section.onload = play;/ ^5 R+ V, a) o# B9 x, _7 L: {3 d
    34. ! u* O8 Q& s9 e
    35. function next() {
      " y) b; k" V6 H, |1 u  t
    36.     let index = parseInt(button_next.getAttribute('row_count'));  U7 J. x8 D2 V
    37.     index += 1;3 ], A* P" F3 U/ I: C
    38.     button_next.setAttribute('row_count', index.toString())
      , Q6 k5 X! ]% V* ^; p
    39.     play().then(r => '');% h) _$ s8 m& g# ]8 y5 D
    40. }* X/ K3 x4 R8 [' \7 a. M

    41. + d& l" G" ~; Z! z
    42. function previous() {; H& `3 \5 j' e; r! W, J! a" v# z
    43.     let index = parseInt(button_next.getAttribute('row_count'));5 ]& R' X6 X, O/ K" r" V
    44.     index -= 1;' R9 p, e; g# d
    45.     button_next.setAttribute('row_count', index.toString())* v8 {9 J: |0 U
    46.     play().then(r => '');0 n  `. H+ G2 I
    47. }
      . S. A) V8 `: I) R2 g* O& L) H

    48. 7 J0 t' a5 B) H/ X9 M8 d
    49. function repeat() {) U# Y# Y4 P6 _2 L8 r' G, F# d4 _2 L
    50.     play().then(r => '');
      7 N! h/ X$ d* z7 f! B
    51. }
      2 O5 v! T. p: ~* R
    52. ) V  e2 u; J4 Z# ]3 @0 e
    53. async function play() {* X, X0 u+ t7 o
    54.     const file = "NCE1-" + lesson + ".lrc";
      1 Y" V( I5 x  l+ }
    55.     let myObject = await fetch(file);
      5 A5 B* S5 Y1 b7 m7 _  z0 F
    56.     let myText = (await myObject.text()).trim();! H0 Z6 h1 L" R% B$ B, J% m! D! n
    57.     let lines = myText.split('\n');' z( v9 G5 ~/ t* z7 h$ u
    58.     let index = parseInt(button_next.getAttribute('row_count'));1 A3 N* R$ w: ^" Q* m

    59. ( Z4 g& X0 F: P. W; W
    60.     if (index < 4) {
        d3 Z: V  v1 T5 X
    61.         index = lines.length - 1;
      " ?% d; x# F/ e0 J" [4 V+ O
    62.         button_next.setAttribute('row_count', index.toString());
      ' m/ k0 r4 ?; M5 z0 z
    63.     }
      . a# ]- K2 i$ T+ Q8 f+ w7 f
    64.     if (index > lines.length - 1) {
      , O5 T5 p# j) p! t* V6 m9 n2 W
    65.         index = 4;) V$ e* O* `, ]  j* Q# E
    66.         button_next.setAttribute('row_count', index.toString());
      ) R0 b% z6 |5 a2 u2 U
    67.     }/ G% A( R, s  Q* j/ {! g& ]1 Q! M
    68.     let current_line = lines[index];
      # a3 `0 d) S+ {3 L; L
    69.     let text = current_line.slice(10, current_line.length - 1);
        E! d6 A2 C4 ]0 J( r$ t
    70.     p.innerText = text;
      0 p3 \9 M2 E6 p; i
    71.     if (index < (lines.length - 1)) {& r% R' I' x8 v6 w
    72.         let next_index = index + 1;- c( a! ?0 }0 U) M/ t
    73.         let next_line = lines[next_index];
      * B/ t6 ?0 T& P6 Q; ]) {
    74.         let current_time = current_line.slice(1, 9);! ~8 x# @/ N) D. w' x0 r$ S
    75.         let current_time_min_sec = current_time.split(':');' G& _; w' \! Z
    76.         let start = parseFloat(current_time_min_sec[0]) * 60 + parseFloat(current_time_min_sec[1]);
      3 W& r% z" e$ S( e+ i5 ]
    77.         let next_time = next_line.slice(1, 9);
      : r6 j* R9 ~+ l* A6 \& d9 _! u4 a6 r
    78.         let next_time_min_sec = next_time.split(':');, h) x+ y9 M7 M( h
    79.         let end = parseFloat(next_time_min_sec[0]) * 60 + parseFloat(next_time_min_sec[1]) - 0.25;& R1 B# d) X8 @3 V) i8 b' H
    80.         let audio = new Audio("NCE1-" + lesson + ".mp3" + "#t=" + start + "," + end);: m8 B; ?/ ^4 P3 ?0 u, c. Y
    81.         const play1 = audio.play();
      : U$ u& @+ h4 A( v
    82.     } else {7 G) m" M, j$ ]* Z. P
    83.         let current_time = current_line.slice(1, 9);
      4 ]9 L; w- ^+ \
    84.         let current_time_min_sec = current_time.split(':');- l' W3 I6 H0 s# Y/ @
    85.         let start = parseFloat(current_time_min_sec[0]) * 60 + parseFloat(current_time_min_sec[1]);; ]3 k7 s* e1 f: P" f
    86.         let audio = new Audio("NCE1-" + lesson + ".mp3" + "#t=" + start);
      6 d, }1 x6 L1 E; M7 q1 R
    87.         const play2 = audio.play();7 ]% e0 X+ _& G2 b8 `3 v
    88.     }" x9 ?+ m- @% {
    89. }
    复制代码

    * G$ c$ E. g: j, u
    - c$ H: u. h  u使用的时候,把下面网盘链接里面的Anki卡片导入,然后把新概念的音频和字幕文件拷贝到Anki的collection.media文件夹里面,如果不知道media文件夹的位置在网上搜索一下。/ v, C( r; w! L; v% w& V0 J) U
    3 ], \/ O' @3 \+ ]* |7 q
    1. /*区块全局样式*/
      % [- L8 q0 s' f# x
    2. .section {
      * J9 T! D% J" G/ z0 _
    3.   background-color : #f6f6f6;            /*背景颜色-#f6f6f6*/2 ~0 a. e- o8 n% ^2 Y# A
    4.   border           : 2px solid #3f3f41;  /*边缘样式-实线2px*/$ c- z) U' K! l+ P5 a. V: |
    5.   border-radius    : 3px;                /*圆角幅度-3px*/
      % Y8 A  F: y0 L7 c6 y* H) Y
    6.   margin           : 8px 8px;              /*上下间隔-8px*/
      4 K6 {* s/ ?7 ]$ c) c/ r) N* T
    7.         display                                                 : flex;
      - T/ p0 n9 E+ e4 t+ _8 S3 U) ^
    8.         flex-direction                 : column;+ U) H% c; A6 B' o% k% |
    9.         height: 95vh;$ ^. I* o( r. }6 P
    10. }
      1 e& @3 r5 K  X3 {) n' ?+ o  u

    11. 9 F# [! m2 _! O! C- j$ S- m& ^
    12. /*区块全局样式*/; Y" y8 W% g& c& q; j% R0 A! p
    13. .mobile .section {
      " U. g7 m1 n3 W
    14.   background-color : #f6f6f6;            /*背景颜色-#f6f6f6*/
      ! T3 h7 Q& ?; A' j4 ]& I7 a9 w1 S
    15.   border           : 2px solid #3f3f41;  /*边缘样式-实线2px*/7 v4 A$ D: p0 R
    16.   border-radius    : 3px;                /*圆角幅度-3px*/
      " L5 e' t0 Q4 i1 K5 D! J
    17.   margin           : 8px 8px;              /*上下间隔-8px*/  H6 S! F3 K9 {# V) u' v- Z
    18.         display                                                 : flex;( ]4 j/ F: Q! C/ z' {
    19.         flex-direction                 : column;
      * f+ q/ p$ W. v$ c8 }9 Y" n- U. f2 ^
    20.         height: 77vh;
        {7 W' n/ H4 c- J0 F
    21. }
    复制代码

    & M, B# Z. m7 O6 x在模板里面的css部分,可以调节整个区块的大小,修改height后面的数值来调节。前面有.mobile的是对移动设备的设置。( w4 c8 v% ~% k7 X+ b! k
      e8 I% x: ]% }2 L4 k5 Y1 Y
    你也可以把这个模板稍加修改就可以添加新概念后面的几本书。
    & H7 z5 n& y% G  ^8 r4 u# n* T: j7 ]* s, v& n! [, g# X
    游客,如果您要查看本帖隐藏内容请回复
    % m- s4 K" E- k* \

    2 B6 y5 o0 H! c+ }" K4 ~6 I注意,因为iOS版本的Anki不会自动重新加载js,所以到第二张卡片的时候就会按钮显示不出来,退到deck界面再进去就可以了。

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?免费注册

    x

    评分

    2

    查看全部评分

    该用户从未签到

    发表于 2024-8-31 16:01:00 | 显示全部楼层
    这个思路跟我用来练习唱英文类似! A  O8 H; t7 O% `) O  X- G

    5 F: d" m- ^1 H+ \9 |5 `+ w/ _【用Anki学唱英文歌,小段小段的练习,已经成功搞定几十首了】 https://www.bilibili.com/video/B ... 14ed81161268aaee250
  • TA的每日心情
    慵懒
    2021-9-1 08:46
  • 签到天数: 61 天

    [LV.6]常住居民II

     楼主| 发表于 2021-7-29 09:51:16 | 显示全部楼层
    yensen2006 发表于 2021-7-20 20:44
    # N) `4 r8 h; K* i多谢多享!有没有第二册?
    3 T$ o/ B- h/ h/ q; A) U) G! t
    第二册的资源我应该有的,等我空了我找找做一下。

    该用户从未签到

    发表于 2022-11-24 00:04:27 | 显示全部楼层
    HAVE  A   LOOK,THX
  • TA的每日心情
    开心
    1 小时前
  • 签到天数: 2602 天

    [LV.Master]伴坛终老

    发表于 2021-2-18 13:27:05 | 显示全部楼层
    Thanks for sharing...
  • TA的每日心情
    开心
    2021-2-18 14:34
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2021-2-18 15:23:46 | 显示全部楼层
    下来看看学习- W
  • TA的每日心情
    擦汗
    2024-2-8 08:54
  • 签到天数: 902 天

    [LV.10]以坛为家III

    发表于 2021-2-18 15:49:41 | 显示全部楼层
    这个牛。感谢楼主。
  • TA的每日心情
    开心
    2023-1-13 07:39
  • 签到天数: 629 天

    [LV.9]以坛为家II

    发表于 2021-2-18 16:29:42 | 显示全部楼层
    多谢分享好资源!

    该用户从未签到

    发表于 2021-2-18 18:24:19 | 显示全部楼层
    好东西。谢谢。
  • TA的每日心情
    开心
    2021-9-12 05:53
  • 签到天数: 192 天

    [LV.7]常住居民III

    发表于 2021-2-19 07:41:06 | 显示全部楼层
    学习新概念的人可以好好利用这个资料。
  • TA的每日心情
    慵懒
    2023-7-14 06:42
  • 签到天数: 854 天

    [LV.10]以坛为家III

    发表于 2021-2-20 21:25:24 | 显示全部楼层
    楼主厉害了
  • TA的每日心情
    开心
    2020-11-1 15:46
  • 签到天数: 4 天

    [LV.2]偶尔看看I

    发表于 2021-4-14 12:07:34 | 显示全部楼层
    thanks a lot
  • TA的每日心情
    开心
    2021-4-21 12:48
  • 签到天数: 92 天

    [LV.6]常住居民II

    发表于 2021-5-10 11:57:04 | 显示全部楼层
    thanks a lot
  • TA的每日心情
    奋斗
    2022-5-29 17:29
  • 签到天数: 96 天

    [LV.6]常住居民II

    发表于 2021-5-19 23:06:48 | 显示全部楼层
    感谢楼主分享
  • TA的每日心情
    擦汗
    2023-4-2 23:09
  • 签到天数: 10 天

    [LV.3]偶尔看看II

    发表于 2021-6-19 14:21:00 | 显示全部楼层
    非常的不错
  • TA的每日心情
    开心
    2019-10-10 05:35
  • 签到天数: 328 天

    [LV.8]以坛为家I

    发表于 2021-6-19 15:23:01 | 显示全部楼层
    挺好,有创意,一切为了孩子。好父母
  • TA的每日心情
    开心
    5 小时前
  • 签到天数: 1077 天

    [LV.10]以坛为家III

    发表于 2021-7-17 08:50:21 | 显示全部楼层
    多谢分享好资源!
  • TA的每日心情
    难过
    2021-9-2 10:15
  • 签到天数: 26 天

    [LV.4]偶尔看看III

    发表于 2021-7-20 20:44:12 | 显示全部楼层
    多谢多享!有没有第二册?
  • TA的每日心情
    开心
    2018-9-16 01:02
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2021-7-20 22:38:33 | 显示全部楼层
    感谢分享,学习下
    您需要登录后才可以回帖 登录 | 免费注册

    本版积分规则

    小黑屋|手机版|Archiver|PDAWIKI |网站地图

    GMT+8, 2025-7-2 13:11 , Processed in 0.025930 second(s), 25 queries .

    Powered by Discuz! X3.4

    © 2001-2023 Discuz! Team.

    快速回复 返回顶部 返回列表