掌上百科 - PDAWIKI

 找回密码
 免费注册

QQ登录

只需一步,快速开始

查看: 1323|回复: 7

[经验交流] 如何在卡片编辑界面提取[sound:xxxxxx.mp3]这个元素

[复制链接]
  • TA的每日心情

    6 天前
  • 签到天数: 548 天

    [LV.9]以坛为家II

    发表于 2022-3-28 15:07:02 | 显示全部楼层 |阅读模式
    本帖最后由 496147678 于 2022-3-28 15:09 编辑   R" k' c/ }2 B2 F+ q

    7 H% o9 V8 o! j; Z想用
    : w, E/ e) K& k5 P<audio loop autoplay controls src="xxxxx.mp3">的方式完成音频无限制自动循环播放
    4 E- z# o5 p! ]$ k; _( g; F9 b
    $ G, r1 m# {. G0 _  Y于是想提取 xxxxx 的内容7 [4 C/ D0 X- o

    . M( ?, j* V* r" Dvar price = document.getElementById("audio").innerTEXT;/ g: e- t5 u( `( ?
    alert (price)$ c6 D( C3 O4 z) V/ t* l$ K! j: ^
    6 S9 j: p! i, d1 q4 }% P/ B; E
    但是并不可行,想破脑袋,不知道有什么解决方法
    ' a. Y. c* v6 ~2 [. z  t9 b, _
    - g, a" K+ R- N- h- J0 S已经定义了 音频的 id=audio4 ^& `1 H' p" A* M2 F- z
    price反馈的结果是空白  ~0 r7 j$ m7 m  w

    + E9 t' _# j* L& K- T: ~; z用这个方法去弄expression,也就是{{正面}},是可行的
  • TA的每日心情

    6 天前
  • 签到天数: 548 天

    [LV.9]以坛为家II

     楼主| 发表于 2022-4-1 20:27:38 | 显示全部楼层
    arruno 发表于 2022-4-1 10:46
    * B6 ^2 i: F# C  ~# `  D0 M) k我今天抽空试试。其实有一个不那么美观、但是简单有效的方法,就是你在卡片里,把{{音频}}这个字段复制n次 ...

    % W) v. O2 @) T2 x5 D4 G+ ~8 L. s( _7 K1 ~" @6 n1 A/ a/ M
    十分感谢!!我就准备这么做了。另外我也看到了一个帖子,也挺有意思的,与帖子无关,也可以看看学习一下。# u7 H3 w- x. }/ M! X9 Z2 b

    4 d4 i( \! u. e8 U8 d. A再次感谢!" Q1 N+ `! k, n3 r8 H

    " Q0 V* _9 H3 _  P———————————————+ ?5 Y& a) G5 C! Q
    # x7 L: U. ~* Z4 h( j* C
    基本流程:
    * a9 ]6 ]; C0 ~# a* J4 Y  M9 Y. [: N, p
    • 卡负责其模板渲染: render_output
      9 Q8 o" S& I; c4 ^, l; |
          v. {9 C: w  O7 _
      • render_into" Q. X, F8 W3 ?: m$ o

        5 m1 g! p/ T# [1 S
    • 从模板解析{{tts en_US voices=Bob,Jane:Field}}并转换为[anki:tts][en_US voices=Bob,Jane]text[/anki:tts] : tts_filter
    • 从[anki:tts]转换为[anki:play:q:0] : extract_av_tags
      + r' L0 h* p, S8 |; v

        7 }2 H! m5 K& c
      • [sound:]标签也已完成此操作
        9 }1 [) U5 A! j! G; N) `
      • 这会将其转换为AVTag的列表,并且文本表示形式引用此列表的索引。( F' M/ J0 A( s2 n( p" A6 g- W
        2 N$ t  u( p, l! u( B. V5 y3 e4 m
    • AVTag的列表存储在卡中: render_card_from_contextrender_cardquestion_av_tags5 d/ O2 a7 {% t/ _) d
        / X# i2 @. s. K/ |; O( L6 q1 _
      • 列出了两个列表,一个用于问题,一个用于答案。6 v  }- H/ ^7 t$ n
          i2 B! y1 k$ k0 N- X$ Q. g
    • 在卡片上渲染: prepare_card_text_for_display5 T: s1 W* X. f6 g# s
        ; }/ f' Y! [" z/ S: W8 C
      • [anki:play]转换为svg,其调用pycmd('play:q:0') av_refs_to_play_icons
          f# x" x' |# c8 u1 B/ S# h
        ' o- a! X8 w0 [9 H
    • 审阅者将卡中的AVTag传递给sounds.av_player : replay_audio
    • aqt.sounds.av_player是玩家列表的抽象。 这些设置为接受AVTag ,并将其排名为setup_audio _best_player_for_tag
    • 排名逻辑: voice_for_tag- D# [. ~1 |/ ~1 r
      * .play在播放器上被调用,
    • 添加{{tts-voices}}字段: on_tts_voices
      ; s) P* ^: Y6 N3 J! U2 s( U" H
  • TA的每日心情

    6 天前
  • 签到天数: 548 天

    [LV.9]以坛为家II

     楼主| 发表于 2022-3-31 19:36:58 | 显示全部楼层
    arruno 发表于 2022-3-30 22:45
    ; e' W" l# X  l那个,js对大小写敏感,你改成innerText试试。innerHTML/innerText6 P1 t9 h9 }$ k
    另外,直接写上不可以么,如果这个占位 ...

    8 [; {( J5 ?  ]* Q" i占位符都是[sound:appppppple.mp3]的格式,我在浏览器上测试过了没有问题,anki里跑不成,其他方式也试过了,都不行) v9 v  W; N' }' h! t' _, y+ T

    9 y4 Z; |& E+ f1 U卡片HTML部分:
    ) M( Q( u" W- \: T6 y" n1 I) ?<span id="audio1" class="voice">{{音频}}</span>' A$ Q( g3 }# I, |( H
    <audio id="audio2" loop autoplay></audio>
    * s) [) d" b: Z0 |0 W: Y
    , s1 h& h4 Y, ^; R& \% \2 B1 uJS部分:
    1 a$ {6 J: P# g4 J    var str = document.getElementById("audio1").innerHTML; $ p0 ]6 s) V3 M% R) A
        var txt = str.replace("[sound:","").replace("]","");
    9 C5 r2 G- s" M* U; h; a' x# t        txt = "<source src=" + txt + ">"
    1 M, m0 g( l. R! F4 V( H' s4 w3 g& C% g    document.getElementById("audio2").innerHTML = txt;
  • TA的每日心情

    6 天前
  • 签到天数: 548 天

    [LV.9]以坛为家II

     楼主| 发表于 2022-3-31 19:15:27 | 显示全部楼层
    arruno 发表于 2022-3-30 22:454 ]0 H: Q, w* _2 \
    那个,js对大小写敏感,你改成innerText试试。innerHTML/innerText1 T% \8 W+ D/ k( t7 k. d8 a  A: c5 d
    另外,直接写上不可以么,如果这个占位 ...

    0 m8 a$ {1 I# C/ F7 |* A尝试过了,不行,哎。似乎各种方法都识别不了{{音频}},似乎卡片在生成之前就已经被提取转换了。
    + S% N5 r% ?( [5 A1 k  B, X+ [- c
    4 h' O7 r0 @. {/ I4 X4 L2 q头秃啊
  • TA的每日心情

    6 天前
  • 签到天数: 548 天

    [LV.9]以坛为家II

     楼主| 发表于 2022-3-29 23:14:02 | 显示全部楼层
    本帖最后由 496147678 于 2022-3-29 23:23 编辑
    % L$ c+ z6 ]% P2 R4 y
    arruno 发表于 2022-3-29 12:02
    , W% T. d- k) V, n: {. Y! R9 m没有定义id啊,document.getElementsByTagName("audio")[0].src 这样就可以
    ) U& S& _/ }9 }

    : w7 D% D; I) D8 [您可能没有理解我意思。
    ) k* R5 C! m, N5 x( V( ?0 z举个例子,我现在有一张卡片,卡片正面是apple,这张卡片是有音频的,但音频的文件名是随机的,我不清楚。我现在想让这张卡片音频循环播放,于是想到用<audio loop autoplay controls src="xxxxx.mp3">的方法,其中xxxx我不知道。于是我想提取每张卡片的音频文件的名字。
    6 [. A( ~" p: p9 k2 ]+ J5 K; S卡片正面是这样的:0 q" M/ _  L4 t  s/ O
    <div class="section">6 u, v; E4 |* W# i+ W
    <div class="expression">{{单词}}</div>
    * X/ L  a, ?* I: M, C4 K% q<span id=“audio” class="voice">{{音频}}</span
    7 o8 _5 O( I& R2 ?* d</div>: Y/ C9 c6 ?# u( X& i* b: w5 [" L

    + v, h$ ~  \: \6 F3 g也就是我想知道  {{音频}}  的名字是什么,以便下一部操作
    0 l0 C* l: S4 N' j) [, w' M& U- ^/ V" q
    于是我尝试:
      g" M0 O* ], t0 h8 mvar price = document.getElementById("audio").innerTEXT;2 {; c" j' a3 w% Q1 O/ K& u  n% V8 O
    alert (price): M2 j4 y8 _( |2 v) l
    price返回是undefined9 A) r! W8 L3 j; \( h% G
    : X' ~9 g/ O4 ?
    您的方法我也试了,也是一样
    3 |. @% l! `* d- ~' J9 q3 u! [9 c( r. V
    很抱歉麻烦您了,您看看有什么好的建议吗. s+ U8 T7 I& g# a
  • TA的每日心情
    奋斗
    2023-7-19 19:29
  • 签到天数: 458 天

    [LV.9]以坛为家II

    发表于 2022-3-29 12:02:08 | 显示全部楼层
    <audio loop autoplay controls src="xxxxx.mp3"> 没有定义id啊,document.getElementsByTagName("audio")[0].src 这样就可以
  • TA的每日心情
    奋斗
    2023-7-19 19:29
  • 签到天数: 458 天

    [LV.9]以坛为家II

    发表于 2022-3-30 22:45:04 | 显示全部楼层
    那个,js对大小写敏感,你改成innerText试试。innerHTML/innerText
    0 M8 L7 A0 Y* E+ t: e' j另外,直接写上<audio loop autoplay controls src="{{音频}}">不可以么,如果这个占位符就是文件名本身的话,不需要再用js绕一下。
  • TA的每日心情
    奋斗
    2023-7-19 19:29
  • 签到天数: 458 天

    [LV.9]以坛为家II

    发表于 2022-4-1 10:46:14 | 显示全部楼层
    本帖最后由 arruno 于 2022-4-1 10:59 编辑 " D& L5 T  e6 H9 b+ h

    ; M9 u7 G/ A; e0 U* s1 }/ O$ [我今天抽空试试。其实有一个不那么美观、但是简单有效的方法,就是你在卡片里,把{{音频}}这个字段复制n次,它就会自动播放n次。5 t1 g8 z4 U7 }
    比如:{{音频}}{{音频}}{{音频}} 这样就会重复3次。
    1 ~# }+ V9 w$ k* @. U如果不能解决,至少这样可以部分实现你的需求。
    3 b2 x) I1 d# f+ B# s. a% u$ o* B0 ^5 x* X9 Y1 r
    ———————————————9 B* q: Q) X6 w
    看了一下,是我的疏忽,音频比较特殊,会被Anki模板引擎渲染成这样的HTML结构:
      K' i3 ?4 k- }2 m<a class="replay-button soundLink" href="#" onclick="pycmd('play:a:0'); return false;">
    4 z% ^2 \+ Y( G! `' O* P2 H) p<svg class="playImage" viewBox="0 0 64 64" version="1.1">( K& w  N$ W  \
    <circle cx="32" cy="32" r="29"></circle>) }$ d& X1 O. x! A: q) N. h; b) b
    <path d="M56.502,32.301l-37.502,20.101l0.329,-40.804l37.173,20.703Z"></path>2 h: C" c" v9 h0 B5 c; P) }7 e& r
    </svg>  L$ y. ?" r) S5 T! Y( N2 n: b9 J- C9 p
    </a>. o; y5 H( ]! f& d
    建议还是用上面的方法吧,可以加一个hidden属性做好看一点:
    ) k. f  `5 O: D1 W* g, w. ]
    2 O& f" `( o, K<div hidden="true">3 O$ O, `& t' _1 r; C7 Z
    {{音频}}) C7 [2 A- x4 n# |) V# J$ S
    {{音频}}
    % Z2 A9 G. P' k" ^  W0 T{{音频}}6 x; Z0 |+ h2 w$ Q, J0 ]* o
    </div>
    您需要登录后才可以回帖 登录 | 免费注册

    本版积分规则

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

    GMT+8, 2024-4-29 23:37 , Processed in 0.062206 second(s), 9 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2023, Tencent Cloud.

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