掌上百科 - PDAWIKI

 找回密码
 免费注册

QQ登录

只需一步,快速开始

查看: 2533|回复: 7

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

[复制链接]
  • TA的每日心情
    无聊
    2025-4-28 13:10
  • 签到天数: 669 天

    [LV.9]以坛为家II

    发表于 2022-3-28 15:07:02 | 显示全部楼层 |阅读模式
    本帖最后由 496147678 于 2022-3-28 15:09 编辑
    ( P# r3 l  L( |% r7 y# s0 m" |. o& V, x! M& B
    想用
    / e1 r- Y$ \- O, c<audio loop autoplay controls src="xxxxx.mp3">的方式完成音频无限制自动循环播放' y' L% @! W# i" E1 Y& p

    ( X& P1 P3 S- |+ M9 }  K于是想提取 xxxxx 的内容1 l5 X% v2 U% n3 C$ p: w) I

    6 p' e3 w: X* B! B0 y9 Q$ X% bvar price = document.getElementById("audio").innerTEXT;5 b7 Y! t% m: y- a* h
    alert (price)
    + s& O- M& t! Q
    / h. {! h4 g! C8 G" w但是并不可行,想破脑袋,不知道有什么解决方法* ~+ b1 U, e9 D, w: v

    . e$ ~  a" [0 a已经定义了 音频的 id=audio8 h% E  R# Q* l9 a: k+ Z! C/ G
    price反馈的结果是空白+ E! ~7 F; B3 ]  _# F" d* ]
    4 m2 @4 l. M- b; ]8 p+ B
    用这个方法去弄expression,也就是{{正面}},是可行的
  • TA的每日心情
    无聊
    2025-4-28 13:10
  • 签到天数: 669 天

    [LV.9]以坛为家II

     楼主| 发表于 2022-4-1 20:27:38 | 显示全部楼层
    arruno 发表于 2022-4-1 10:46
    3 |' G6 e4 n% g& g: R我今天抽空试试。其实有一个不那么美观、但是简单有效的方法,就是你在卡片里,把{{音频}}这个字段复制n次 ...
    ' B. N( ?: b) m) _9 s8 |) }3 h
    ( K( x8 L$ G" |
    十分感谢!!我就准备这么做了。另外我也看到了一个帖子,也挺有意思的,与帖子无关,也可以看看学习一下。4 J2 c* z: C6 U4 Z1 Z* J% c5 e

    ) I. ?! z1 _# e8 v再次感谢!. ]& P6 Z! y) g/ \% K

    0 n! m$ J! E1 w$ x4 h2 Q———————————————+ D+ C$ A7 m) ^8 l6 D
    7 K; t. z4 [) `" v
    基本流程:
    7 t. _" `* T9 D% R: a
    • 卡负责其模板渲染: render_output
      3 w4 N, A5 q6 V
        . J5 V! {" Y% @+ \
      • render_into2 @/ i4 D* F0 A( m# ^

        # \5 x) N% B: q) \' _7 y0 r! Y# I
    • 从模板解析{{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
      , \3 x1 w4 F2 b5 B+ g
        0 s* T. Z* x" o7 I+ G
      • [sound:]标签也已完成此操作) Y: q- Q# M  B- T
      • 这会将其转换为AVTag的列表,并且文本表示形式引用此列表的索引。
        ( }& o: c+ c. I9 f
        % b2 T3 r5 A3 c# ?; |7 F) I& F
    • AVTag的列表存储在卡中: render_card_from_contextrender_cardquestion_av_tags
      % c8 Q7 b6 M8 [

        % B7 O1 h- M% y0 S+ d& m
      • 列出了两个列表,一个用于问题,一个用于答案。
        0 q: M; c( i8 ?* i. Z
        - }3 i7 E% w0 b. A4 u) `( j
    • 在卡片上渲染: prepare_card_text_for_display
      6 D; O% r6 |' X& h/ Y1 a4 }

        : z1 `- \# A# G; L. d
      • [anki:play]转换为svg,其调用pycmd('play:q:0') av_refs_to_play_icons$ r/ V7 R  e) d/ {/ H8 D8 @
        ! p1 Y% ?# U, v
    • 审阅者将卡中的AVTag传递给sounds.av_player : replay_audio
    • aqt.sounds.av_player是玩家列表的抽象。 这些设置为接受AVTag ,并将其排名为setup_audio _best_player_for_tag
    • 排名逻辑: voice_for_tag
      " b0 D. ]/ b4 w- p$ i* .play在播放器上被调用,
    • 添加{{tts-voices}}字段: on_tts_voices/ p0 E2 G) c& a& p; ]& z, v, N
  • TA的每日心情
    无聊
    2025-4-28 13:10
  • 签到天数: 669 天

    [LV.9]以坛为家II

     楼主| 发表于 2022-3-31 19:36:58 | 显示全部楼层
    arruno 发表于 2022-3-30 22:455 P7 a' N, T* H! Q
    那个,js对大小写敏感,你改成innerText试试。innerHTML/innerText' F( I- Q2 \2 T- ^1 o+ Z6 t* ~5 J
    另外,直接写上不可以么,如果这个占位 ...

    , t* J# m0 x: E. U3 ~5 `3 `占位符都是[sound:appppppple.mp3]的格式,我在浏览器上测试过了没有问题,anki里跑不成,其他方式也试过了,都不行
    , {9 Z1 v1 q. e+ a! t( D# F2 p: `6 v# z; B0 l
    卡片HTML部分:4 k( v0 S& x; m- Y  d3 f
    <span id="audio1" class="voice">{{音频}}</span>
    " m! l0 V" s/ L  h" X% H1 P; D' W' W<audio id="audio2" loop autoplay></audio># Y0 ^1 G& |& y! }5 A

    $ o4 m6 U/ ?. A' f: q* m1 _+ yJS部分:4 u) G" S4 j2 e) M3 g9 p/ _
        var str = document.getElementById("audio1").innerHTML;
    6 ?& [% g  _' E4 ~( t$ a2 i    var txt = str.replace("[sound:","").replace("]","");
    ) O4 I0 D2 I3 H& O8 {; }0 @        txt = "<source src=" + txt + ">"
    9 k; k. N0 U; a- J0 _    document.getElementById("audio2").innerHTML = txt;
  • TA的每日心情
    无聊
    2025-4-28 13:10
  • 签到天数: 669 天

    [LV.9]以坛为家II

     楼主| 发表于 2022-3-31 19:15:27 | 显示全部楼层
    arruno 发表于 2022-3-30 22:456 p+ d# e% A6 B- g* ~! Z
    那个,js对大小写敏感,你改成innerText试试。innerHTML/innerText8 X( z5 H( w. @: y& J% [
    另外,直接写上不可以么,如果这个占位 ...

    & }1 ]: T. x4 y4 O; f5 r尝试过了,不行,哎。似乎各种方法都识别不了{{音频}},似乎卡片在生成之前就已经被提取转换了。. o! a' C$ N% Y7 D0 Z8 r
    2 F! S% d' _, s$ p
    头秃啊
  • TA的每日心情
    无聊
    2025-4-28 13:10
  • 签到天数: 669 天

    [LV.9]以坛为家II

     楼主| 发表于 2022-3-29 23:14:02 | 显示全部楼层
    本帖最后由 496147678 于 2022-3-29 23:23 编辑
    : r8 K6 }+ L5 U, E
    arruno 发表于 2022-3-29 12:026 z! ~& w% G' f* O
    没有定义id啊,document.getElementsByTagName("audio")[0].src 这样就可以
    " V, ]# E# c, J  r$ h4 d  `: P$ B
    % S2 A+ P' h6 c; S+ p" r0 K
    您可能没有理解我意思。
    9 k/ C! l. v" t+ b; q举个例子,我现在有一张卡片,卡片正面是apple,这张卡片是有音频的,但音频的文件名是随机的,我不清楚。我现在想让这张卡片音频循环播放,于是想到用<audio loop autoplay controls src="xxxxx.mp3">的方法,其中xxxx我不知道。于是我想提取每张卡片的音频文件的名字。
    * f. j9 Y7 V( u卡片正面是这样的:
      l0 ~  W3 X$ t% E1 J6 |7 U<div class="section">  S& F7 L8 _. Z' s% ], C* D  x& o! z
    <div class="expression">{{单词}}</div>, n2 j. |+ f4 o! \
    <span id=“audio” class="voice">{{音频}}</span
    2 ^+ O7 h/ ^- D/ Z( E1 ~</div>& l# l  |$ h6 V" l/ s
    : g1 b" e5 A% m/ O# }5 P
    也就是我想知道  {{音频}}  的名字是什么,以便下一部操作+ ], Q8 m& ?9 `( y
    # z  _& D5 Z( n# E8 N$ j' D
    于是我尝试:
    $ O7 Y. I1 Z6 {3 J. uvar price = document.getElementById("audio").innerTEXT;5 ?. W4 b, m( v
    alert (price)
    + f: M2 L' K0 b% Q8 R  t/ \price返回是undefined
    5 K' g; k4 B# f( ~" P. L* Y0 ^
    % U6 k* I+ X) F- n. O2 B您的方法我也试了,也是一样
    & S! Z( q' B5 |4 i: y4 {" j
      B* Q# ]2 _; {+ O6 b2 s: r' A0 g很抱歉麻烦您了,您看看有什么好的建议吗. S* y( [/ I# e% W2 L$ v) C. _- M
  • TA的每日心情

    前天 16:35
  • 签到天数: 460 天

    [LV.9]以坛为家II

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

    前天 16:35
  • 签到天数: 460 天

    [LV.9]以坛为家II

    发表于 2022-3-30 22:45:04 | 显示全部楼层
    那个,js对大小写敏感,你改成innerText试试。innerHTML/innerText
    " ?3 K, w9 Q( `6 U& q另外,直接写上<audio loop autoplay controls src="{{音频}}">不可以么,如果这个占位符就是文件名本身的话,不需要再用js绕一下。
  • TA的每日心情

    前天 16:35
  • 签到天数: 460 天

    [LV.9]以坛为家II

    发表于 2022-4-1 10:46:14 | 显示全部楼层
    本帖最后由 arruno 于 2022-4-1 10:59 编辑   j8 h. {) J; W% F8 M4 O
    - {1 N; {4 F) ~; x' T1 ~) V. G) x
    我今天抽空试试。其实有一个不那么美观、但是简单有效的方法,就是你在卡片里,把{{音频}}这个字段复制n次,它就会自动播放n次。3 M; B" V4 T; r8 C4 V6 J  J
    比如:{{音频}}{{音频}}{{音频}} 这样就会重复3次。8 e& j! Y: k0 O% Y$ Y
    如果不能解决,至少这样可以部分实现你的需求。
    ; r' u) j# F. P+ f( g
    " b9 j, `/ M! D4 e3 |" H; c———————————————  F  |7 {  b6 X7 \- y8 q) q, T
    看了一下,是我的疏忽,音频比较特殊,会被Anki模板引擎渲染成这样的HTML结构:! v& C9 x. ]% }, z
    <a class="replay-button soundLink" href="#" onclick="pycmd('play:a:0'); return false;">1 ~/ e2 N3 @! q, C/ Q, V
    <svg class="playImage" viewBox="0 0 64 64" version="1.1">
    % ~" r. i# p3 V<circle cx="32" cy="32" r="29"></circle>, G. D$ z9 _3 R- n! T7 Y
    <path d="M56.502,32.301l-37.502,20.101l0.329,-40.804l37.173,20.703Z"></path>/ x. e, ?6 m+ x, d9 N
    </svg>, T5 q1 _' v: V# u
    </a>. T$ U1 k- k1 P% g* a; X
    建议还是用上面的方法吧,可以加一个hidden属性做好看一点:
    0 q  ~. z0 n. `, S. k1 j# l/ u* O1 U- C9 N1 W% b0 K4 ~
    <div hidden="true">
    : k) A* y, u/ |! B1 S  Z9 v+ W{{音频}}4 u! S( d9 o9 B9 S  b5 Q
    {{音频}}
    ' K! p3 X& c( U& O{{音频}}
    1 k- w: U" y! B8 N- l/ B+ \$ S</div>
    您需要登录后才可以回帖 登录 | 免费注册

    本版积分规则

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

    GMT+8, 2025-5-11 08:30 , Processed in 0.021889 second(s), 22 queries .

    Powered by Discuz! X3.4

    © 2001-2023 Discuz! Team.

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