掌上百科 - PDAWIKI

 找回密码
 免费注册

QQ登录

只需一步,快速开始

查看: 3560|回复: 67

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

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

    [LV.6]常住居民II

    发表于 2021-2-18 10:49:51 | 显示全部楼层 |阅读模式
    本帖最后由 zhangchaont 于 2021-2-20 10:53 编辑 - [7 P5 o4 d* r  J
    9 ~! `$ {: p8 K$ o" b) Q2 O) q
    为了给孩子学习英语,我把单词做成了卡片放在Anki里,但是课文却一直没有什么好的方法,在电脑上用一个复读机软件给孩子们练习,但是Mac上没有什么好用的复读机软件,所以学来学去还在最开始的几课里面打转。我本来想自己写一个复读机APP的,但是考虑到水平有限,估计得花很多时间,而且最大的问题不能利用Anki里schedule安排学习。! ?* J& M; p: i+ Q  @2 m
    7 p2 I, H8 e, H( h) Q, Y. C
    春节在家,我突然灵光一闪,Anki是基于PyQt5开发,而这个模块是支持一部分html、css和javascript的,如果用javascript读取字幕里面的时间戳,然后根据时间段来播放MP3,不就实现了一个简单的复读机了嘛。说干就干,因为没有javascript语言基础,都是需要什么就搜索,一步步的拼凑起来的,目前已经基本能用,成品在iOS上显示如下:
    - \8 L9 r$ n" U& O/ A; w
    5 I( s6 x* P0 A0 D0 CmacOS上的效果
    7 l( I, A! R6 Y; ?, a- I) ^1 F
    4 L" x5 U3 X2 k
    4 W5 K2 y9 o$ M. O" p) @/ w& l& Ojs代码如下:
    8 ?2 Q/ ^$ w6 D& m( @3 V
    1. const lesson = document.getElementsByClassName("items")[0].innerText;
      6 _) \9 [. e& t' k  M: i
    2. const button_next = document.createElement("button");
      0 `9 t% E2 `6 M- Z0 d
    3. button_next.innerHTML = '下一句';: f  s3 k* ~5 u2 M* @
    4. button_next.setAttribute('row_count', "4");
      1 q5 b4 G, B, z2 R/ [3 ~: ]" G
    5. let section = document.getElementsByClassName("section")[0];" ?3 ]& }% k& [' t4 ]$ w& [) _0 H
    6. 4 Z) D# l" J. l  l) V
    7. const button_repeat = document.createElement("button");
      - n0 M6 G3 u6 F" j4 G2 N
    8. button_repeat.innerHTML = '重复此句';3 V/ m, E7 C+ `/ K$ T7 j

    9. ; Q7 Z% w. V" N
    10. const button_previous = document.createElement("button");
      ) {+ R" X: D: {( G
    11. button_previous.innerHTML = '上一句';
      8 x1 P, q7 P6 R( Z- p( V( B
    12. 8 Q* ~$ x: w) b$ z

    13. " b: a) E2 w4 x' W1 {9 h
    14. let div = document.createElement('div');* f3 L5 }* I6 x
    15. div.setAttribute('class', 'text');' t- W# y1 ^. M3 [. `
    16. section.appendChild(div);
        r4 D* ~+ O+ E  M" k2 P4 R  H& t% ~# ?
    17. let p = document.createElement('p');. ]/ t3 [* U2 u# x; R7 P
    18. div.appendChild(p);( f$ M2 S) a/ C* n" p" `" U

    19. / L0 A  F6 L9 Z8 H  ^+ \3 s
    20. buttons_div = document.createElement('div');
      ' {, n1 F6 d% r+ \# m# m
    21. buttons_div.setAttribute('class', 'buttons');  o" q6 e5 e1 R" j; w6 [
    22. 2 X  b# x1 V& |; Y, K$ j& K, L/ i" V* w
    23. section.appendChild(buttons_div);" a9 O  r4 L6 t* Q* h! z2 H
    24. # p' \6 @( ^& R4 h  ^% G
    25. buttons_div.appendChild(button_previous);
      , C, Q( y( d! X5 b, o
    26. buttons_div.appendChild(button_repeat);
      ; [) [" R# A1 d' O
    27. buttons_div.appendChild(button_next);
      9 `: r6 c2 d) a  T( [

    28. ; V! M  v3 i8 B6 m

    29.   \; l+ O: s# U, j! t$ H! w! C
    30. button_next.onclick = next;; r; M7 W' k% ^/ b0 l$ f
    31. button_repeat.onclick = repeat;
      ! z# F* _) }' n. B
    32. button_previous.onclick = previous;
      4 o7 t% P1 H9 b8 v" h$ n
    33. section.onload = play;
      $ v/ |( T& c: F& i( i. L2 }
    34. , R! k7 b+ u! Y
    35. function next() {
      4 }4 u1 v, R2 D+ l
    36.     let index = parseInt(button_next.getAttribute('row_count'));! I' x. g! F0 S6 X5 @
    37.     index += 1;
      8 |8 p. {# `; H* N7 j
    38.     button_next.setAttribute('row_count', index.toString())4 v$ g, O2 w  r/ x
    39.     play().then(r => '');
      6 K: I8 S3 b6 D( r9 K
    40. }, h" k) }5 [+ a: A; _

    41. 6 S% L( R2 }  P/ D  V: i) M
    42. function previous() {( c6 v1 ~6 q/ M
    43.     let index = parseInt(button_next.getAttribute('row_count'));
      $ u. ^1 j) ?) S& `8 h' X& m
    44.     index -= 1;. d1 B8 y2 n1 _/ }1 q" q
    45.     button_next.setAttribute('row_count', index.toString())
      1 n) h7 {0 t/ U. H
    46.     play().then(r => '');. m9 S; f7 K  J
    47. }  S6 v7 [: S0 V/ p* d5 t4 c0 I
    48. & h* `. n3 f! r9 S! S
    49. function repeat() {3 ^2 K& S( I- B+ `9 Z
    50.     play().then(r => '');0 G6 ^  S( P) w- E! Q7 k7 A! N" V
    51. }$ n) h9 h# I7 S  A1 r
    52. : Q) Q2 J1 J, x; c& L
    53. async function play() {1 a; y) S/ j4 t) P1 H* @8 \) `
    54.     const file = "NCE1-" + lesson + ".lrc";( u4 H0 N0 j" J% V4 f3 G
    55.     let myObject = await fetch(file);$ O" z0 k$ d+ H7 D
    56.     let myText = (await myObject.text()).trim();
      9 w0 \  k+ ^9 F; }! m' {8 M- ^
    57.     let lines = myText.split('\n');' y. b; @  z6 X3 y# B6 \/ C5 p
    58.     let index = parseInt(button_next.getAttribute('row_count'));7 }' b0 G7 \$ B5 N" K& m( D7 _

    59. ' v: s# ?' l; T; s
    60.     if (index < 4) {) w6 `/ X  h6 @6 H' C! _$ a5 ]
    61.         index = lines.length - 1;
      ; z# V; C6 r  L# m
    62.         button_next.setAttribute('row_count', index.toString());
      * r- _/ w! ~6 u2 Z1 \& g
    63.     }, k1 g  ]* G% U4 ~1 w
    64.     if (index > lines.length - 1) {
      6 b$ t1 P* k, a6 [5 J
    65.         index = 4;$ ^% K4 o  e/ k$ V3 h
    66.         button_next.setAttribute('row_count', index.toString());& l' M  P3 ]) W3 j* {) _
    67.     }
      ) q" q; W2 Y! s0 m- v- x9 x# p
    68.     let current_line = lines[index];2 ^% }9 r' _+ m6 [$ ?
    69.     let text = current_line.slice(10, current_line.length - 1);
      2 [  j% ?4 T+ k, J7 }3 C5 b
    70.     p.innerText = text;/ j: V+ g+ n2 x0 D4 ^5 u
    71.     if (index < (lines.length - 1)) {, f/ @8 W2 Y' o0 p9 o+ l
    72.         let next_index = index + 1;0 f. d1 Y# i& E
    73.         let next_line = lines[next_index];: _5 Y9 z8 |0 J4 Y: `7 o
    74.         let current_time = current_line.slice(1, 9);: C% R; }1 J4 r1 `% p9 {
    75.         let current_time_min_sec = current_time.split(':');
      ' z1 O) b1 n- [! m  Q5 T
    76.         let start = parseFloat(current_time_min_sec[0]) * 60 + parseFloat(current_time_min_sec[1]);+ r/ }, H7 X) Z4 ~6 @: w9 J. G1 X9 T
    77.         let next_time = next_line.slice(1, 9);
      & \1 E: d, z6 o2 Z# M: R( Z2 `
    78.         let next_time_min_sec = next_time.split(':');6 C1 c% D* `0 B. D- ^, T+ Y! j
    79.         let end = parseFloat(next_time_min_sec[0]) * 60 + parseFloat(next_time_min_sec[1]) - 0.25;
      # J: ]# X5 U+ X. t( ^* w: Z1 G
    80.         let audio = new Audio("NCE1-" + lesson + ".mp3" + "#t=" + start + "," + end);
      : m) N5 B9 A! v$ q, t
    81.         const play1 = audio.play();
      . ?2 B" i4 I# i/ s
    82.     } else {
      - k2 E, |# K# l" U9 ?
    83.         let current_time = current_line.slice(1, 9);0 V! d; w4 _( L8 a/ e
    84.         let current_time_min_sec = current_time.split(':');$ ^3 V' q4 r# [3 d
    85.         let start = parseFloat(current_time_min_sec[0]) * 60 + parseFloat(current_time_min_sec[1]);
      # }6 z" q' G- A2 |; d  R
    86.         let audio = new Audio("NCE1-" + lesson + ".mp3" + "#t=" + start);
      / Q& c) H7 J$ c" f
    87.         const play2 = audio.play();
      . y! Q- p# s, k
    88.     }
      6 d6 ]- @# x' p1 v: b/ }* |0 k
    89. }
    复制代码

    $ ^! p# [. T+ `: n* ]! z+ \# o$ r: N; E' V4 Y8 a, Q# M4 F
    使用的时候,把下面网盘链接里面的Anki卡片导入,然后把新概念的音频和字幕文件拷贝到Anki的collection.media文件夹里面,如果不知道media文件夹的位置在网上搜索一下。
    5 @6 l/ u' F3 O) l  @' C* j# y; ?; [  S3 G' L2 \% t
    1. /*区块全局样式*/& Q5 c* m3 E; O5 K* O5 r
    2. .section {
      0 j1 p2 K4 i! F4 ~+ H
    3.   background-color : #f6f6f6;            /*背景颜色-#f6f6f6*/
      ( g6 [7 C; p$ @8 ?
    4.   border           : 2px solid #3f3f41;  /*边缘样式-实线2px*/
      / |! E0 b( K; K/ `* x8 _
    5.   border-radius    : 3px;                /*圆角幅度-3px*/6 ?3 g, j6 s0 A' H5 j3 J2 y/ O8 D+ G
    6.   margin           : 8px 8px;              /*上下间隔-8px*/% k6 E/ |8 i0 J0 Q6 S6 U- }# }
    7.         display                                                 : flex;
      & V2 @/ }  ]: Y! a( B# w$ ]5 p
    8.         flex-direction                 : column;, L/ n  J' K1 g/ P
    9.         height: 95vh;
      5 Z' `( ]/ H$ M! j5 n* n7 |
    10. }
      ( t0 {  l# c  Z! C+ I* n
    11. 9 u, h( v* R$ W
    12. /*区块全局样式*/
        c6 C0 f8 E* f- _+ o
    13. .mobile .section {6 g) I. e8 R4 H6 }
    14.   background-color : #f6f6f6;            /*背景颜色-#f6f6f6*/) O; X& w  Z8 g1 K/ [3 m
    15.   border           : 2px solid #3f3f41;  /*边缘样式-实线2px*/
      3 t$ T3 [- D9 u& Z, g( i
    16.   border-radius    : 3px;                /*圆角幅度-3px*/# Z. C' A# P; |2 D: q3 B
    17.   margin           : 8px 8px;              /*上下间隔-8px*/
      ( V# O6 n! V4 S- r1 L9 r+ b
    18.         display                                                 : flex;' \2 I0 @; E6 Q, O! M. c! T
    19.         flex-direction                 : column;
      3 Q0 y# @/ u4 w1 Z2 k1 j
    20.         height: 77vh;' G+ [: z9 S( A$ O+ Q' k. I
    21. }
    复制代码
    . t$ b2 w& Q9 z+ h
    在模板里面的css部分,可以调节整个区块的大小,修改height后面的数值来调节。前面有.mobile的是对移动设备的设置。
    9 z5 j$ b: p, H" F
    9 W% V0 f/ W3 H' H1 Q你也可以把这个模板稍加修改就可以添加新概念后面的几本书。8 R6 [- g8 V# |" S: v& Z* H2 m
    ! ?  m# t# `( r( [9 p
    游客,如果您要查看本帖隐藏内容请回复

    ( m* Q" p5 i7 u$ J* _# Q; N' o
    注意,因为iOS版本的Anki不会自动重新加载js,所以到第二张卡片的时候就会按钮显示不出来,退到deck界面再进去就可以了。

    本帖子中包含更多资源

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

    x

    评分

    2

    查看全部评分

  • TA的每日心情
    慵懒
    2021-9-1 08:46
  • 签到天数: 61 天

    [LV.6]常住居民II

     楼主| 发表于 2021-7-29 09:51:16 | 显示全部楼层
    yensen2006 发表于 2021-7-20 20:44
    ( u) w, J( V( |0 k. L- O多谢多享!有没有第二册?
    ! b# E, M, V# z6 _
    第二册的资源我应该有的,等我空了我找找做一下。

    该用户从未签到

    发表于 2022-11-24 00:04:27 | 显示全部楼层
    HAVE  A   LOOK,THX
  • TA的每日心情
    慵懒
    2024-4-11 15:43
  • 签到天数: 1128 天

    [LV.10]以坛为家III

    发表于 2021-9-26 11:55:18 | 显示全部楼层
    HAVE  A   LOOK,THX
    : X' \; Q& e- d! [* X* U/ n
  • TA的每日心情
    开心
    17 小时前
  • 签到天数: 2220 天

    [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的每日心情
    开心
    7 天前
  • 签到天数: 704 天

    [LV.9]以坛为家II

    发表于 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, 2024-4-27 17:11 , Processed in 0.072921 second(s), 11 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2023, Tencent Cloud.

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