掌上百科 - PDAWIKI

 找回密码
 免费注册

QQ登录

只需一步,快速开始

查看: 1322|回复: 7

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

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

    6 天前
  • 签到天数: 548 天

    [LV.9]以坛为家II

    发表于 2022-3-28 15:07:02 | 显示全部楼层 |阅读模式
    本帖最后由 496147678 于 2022-3-28 15:09 编辑 - G7 g# n5 {& w  z; X8 ^# S
    $ r9 \& @8 h* E! i7 r* ^
    想用
    ! n! N+ y- ^6 V- K5 M8 w; w, z! M<audio loop autoplay controls src="xxxxx.mp3">的方式完成音频无限制自动循环播放
    9 @5 f$ ^0 I" W: A. E& t
    ' {7 j" {  s$ L: U于是想提取 xxxxx 的内容$ e: K! h! k* ^' @% F0 r
    . b. y/ p. Y! Z
    var price = document.getElementById("audio").innerTEXT;
    9 `' q; a, h3 zalert (price)
    & q! m9 [8 m# s* a( N  T; h, ~& V7 e6 Y0 L7 R9 ?% Q# a
    但是并不可行,想破脑袋,不知道有什么解决方法
    ! G" ~! E$ s& m2 c
    ; l7 r0 j" a: a( h已经定义了 音频的 id=audio
    ; h; @, @5 f$ m, c4 Z  T& dprice反馈的结果是空白" o2 i1 T$ }/ ?) _' Z
    " p5 h2 Q2 j; o3 M! l7 d2 ^
    用这个方法去弄expression,也就是{{正面}},是可行的
  • TA的每日心情

    6 天前
  • 签到天数: 548 天

    [LV.9]以坛为家II

     楼主| 发表于 2022-4-1 20:27:38 | 显示全部楼层
    arruno 发表于 2022-4-1 10:46
    5 @( W6 D% p7 d4 S9 h& b我今天抽空试试。其实有一个不那么美观、但是简单有效的方法,就是你在卡片里,把{{音频}}这个字段复制n次 ...

    0 P; K  p1 l' e. n  K' n) k* J+ S" v& D- ?: Z0 T3 z* a0 G/ ~
    十分感谢!!我就准备这么做了。另外我也看到了一个帖子,也挺有意思的,与帖子无关,也可以看看学习一下。% ]: Z: [- Q2 Y6 I  D. ^1 ]

    , c9 f. Y3 w  v# F, X. e9 g再次感谢!5 x4 e2 Q/ K" l
    5 N- \5 A! K0 a& T6 x7 ^/ X3 L/ B
    ———————————————5 K! {/ c. r9 N! G+ \5 _

    3 t4 E& g2 L1 V/ g1 Y 基本流程:
    : W4 J/ U6 V  W2 q5 Z1 w
    • 卡负责其模板渲染: render_output
      ' B# }, h6 C# M. ~" B( Y

        - n. a4 d" a+ q
      • render_into
        6 B' M; O/ g6 F2 S2 N2 i8 a0 D5 N& t" [
    • 从模板解析{{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_tags8 ?2 P+ t( E1 G% `& t" P% Y

        # r5 n& M6 \: D* @$ _3 `9 z# W
      • [sound:]标签也已完成此操作
        ; K7 Z) g3 W# Q' j
      • 这会将其转换为AVTag的列表,并且文本表示形式引用此列表的索引。
        , X5 o) }1 u0 K) b5 M( N/ [+ [1 f. `! F7 q  b3 g
    • AVTag的列表存储在卡中: render_card_from_contextrender_cardquestion_av_tags
      4 v5 d2 @. ~) g$ O! [3 A0 `. S2 r
        1 |% F( {" {; V1 M7 o3 r
      • 列出了两个列表,一个用于问题,一个用于答案。
        * B* a  o8 Q5 T* s" ~+ q2 w9 v: r1 S; ]6 Q
    • 在卡片上渲染: prepare_card_text_for_display
      & ?& p# E( H4 u+ r$ Y5 ?4 N
        8 S$ \$ _% G' Q$ I2 w
      • [anki:play]转换为svg,其调用pycmd('play:q:0') av_refs_to_play_icons  M3 M. F- y, d# f/ v  T8 Z0 H

        " B, }4 \$ v9 Y6 G( R5 }9 R( W
    • 审阅者将卡中的AVTag传递给sounds.av_player : replay_audio
    • aqt.sounds.av_player是玩家列表的抽象。 这些设置为接受AVTag ,并将其排名为setup_audio _best_player_for_tag
    • 排名逻辑: voice_for_tag: \5 P! g: b$ p
      * .play在播放器上被调用,
    • 添加{{tts-voices}}字段: on_tts_voices) O9 \; r6 [: \5 v9 t- S/ C+ {# B
  • TA的每日心情

    6 天前
  • 签到天数: 548 天

    [LV.9]以坛为家II

     楼主| 发表于 2022-3-31 19:36:58 | 显示全部楼层
    arruno 发表于 2022-3-30 22:45
    : j. w2 J$ E- L, l; s那个,js对大小写敏感,你改成innerText试试。innerHTML/innerText
    . n+ J7 v  t9 o* m6 k另外,直接写上不可以么,如果这个占位 ...
    6 I" ~8 I& D* R
    占位符都是[sound:appppppple.mp3]的格式,我在浏览器上测试过了没有问题,anki里跑不成,其他方式也试过了,都不行
      u5 q- T" M8 U- \8 k2 ^" s# s" a+ S, y' F$ e
    卡片HTML部分:/ \7 l- j# h( I% T6 U8 J  t
    <span id="audio1" class="voice">{{音频}}</span>3 a% e3 ?+ x# R: q2 e2 j+ g
    <audio id="audio2" loop autoplay></audio>7 r) N( o1 g/ ~) {5 v9 c7 R# A

    0 h2 m' h1 W  q! C( C4 jJS部分:$ V* R- T. i* p8 x
        var str = document.getElementById("audio1").innerHTML; ) [. Z7 Q* [* _1 ]& G: ]$ I" r
        var txt = str.replace("[sound:","").replace("]","");# V4 ~8 A$ C6 K$ E* P
            txt = "<source src=" + txt + ">"& |$ F1 q8 ?: r- A+ d/ B
        document.getElementById("audio2").innerHTML = txt;
  • TA的每日心情

    6 天前
  • 签到天数: 548 天

    [LV.9]以坛为家II

     楼主| 发表于 2022-3-31 19:15:27 | 显示全部楼层
    arruno 发表于 2022-3-30 22:45
    4 r" }, N! W" B) T! \1 x5 @那个,js对大小写敏感,你改成innerText试试。innerHTML/innerText
    9 O! _+ e' N" }- A+ Y另外,直接写上不可以么,如果这个占位 ...
    " {6 G3 f  j7 V* |* {0 Q
    尝试过了,不行,哎。似乎各种方法都识别不了{{音频}},似乎卡片在生成之前就已经被提取转换了。! c. @8 I0 `: @( N' g; Z, |- a
    % y5 o1 e* z: F+ Q
    头秃啊
  • TA的每日心情

    6 天前
  • 签到天数: 548 天

    [LV.9]以坛为家II

     楼主| 发表于 2022-3-29 23:14:02 | 显示全部楼层
    本帖最后由 496147678 于 2022-3-29 23:23 编辑
    + l6 o9 b, U+ I% C; i1 m9 T! x
    arruno 发表于 2022-3-29 12:02$ r' h4 K) V" {, j1 H: g( t5 r' S
    没有定义id啊,document.getElementsByTagName("audio")[0].src 这样就可以
    + K4 m; R7 ^( {

    & |1 G: J* U$ M" A; m" ?您可能没有理解我意思。
    3 k0 T9 X& x  @& v6 p5 P举个例子,我现在有一张卡片,卡片正面是apple,这张卡片是有音频的,但音频的文件名是随机的,我不清楚。我现在想让这张卡片音频循环播放,于是想到用<audio loop autoplay controls src="xxxxx.mp3">的方法,其中xxxx我不知道。于是我想提取每张卡片的音频文件的名字。1 `0 }8 |, |" _! l
    卡片正面是这样的:5 _7 Q+ ]1 I% M- M/ t
    <div class="section">" X8 Z+ e# q, V, \6 ]$ n. `
    <div class="expression">{{单词}}</div>0 \( y9 x, L: a. V) f. \
    <span id=“audio” class="voice">{{音频}}</span5 i: Z5 \% D, N! k) o) T
    </div>
    % |* Y9 P* D, H( o* \8 `$ v2 k3 K/ p; G
    也就是我想知道  {{音频}}  的名字是什么,以便下一部操作$ Z- |( H! |9 l" Q6 B% `; ]

    ) l& |8 k. O3 e" a& ~' e" N于是我尝试:, g" i& z: q) p
    var price = document.getElementById("audio").innerTEXT;: o: S* s( @; F  a! h: }) b
    alert (price)
    $ w3 B, [$ n! ^price返回是undefined5 o3 O. _. w$ O& }3 U3 d6 M8 c

    5 |  [- D2 V: D您的方法我也试了,也是一样
    & K9 E" I: S$ a' k) ?" w/ x! U9 D
    , X+ h  K- \% m3 A/ [很抱歉麻烦您了,您看看有什么好的建议吗4 O& l* U+ ], ^2 h
  • 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/innerText5 V8 |8 `) c: q4 h9 l! 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 编辑
    ! e1 [1 V/ i1 P8 P
    6 ^6 u' r! u! g1 ^- G) x3 Z5 B# R" o我今天抽空试试。其实有一个不那么美观、但是简单有效的方法,就是你在卡片里,把{{音频}}这个字段复制n次,它就会自动播放n次。
    , ^3 k! a8 Z7 ^; G; Z1 I比如:{{音频}}{{音频}}{{音频}} 这样就会重复3次。
    ; p! ?6 A' L- B& `$ P; s2 M如果不能解决,至少这样可以部分实现你的需求。
    & V) h& H. u; m; [; s
    ( l$ D" `8 \" a2 d3 w5 [- J1 ^9 H( H———————————————9 d" l) [/ w+ R" p
    看了一下,是我的疏忽,音频比较特殊,会被Anki模板引擎渲染成这样的HTML结构:
    ! A! S8 E1 d* \, N1 w<a class="replay-button soundLink" href="#" onclick="pycmd('play:a:0'); return false;">
    & ?0 G; \! h" ~9 u/ Q+ J<svg class="playImage" viewBox="0 0 64 64" version="1.1">
    8 }. C1 p% l" Y* a<circle cx="32" cy="32" r="29"></circle>
    ; y5 k& A0 H% m/ Q3 z+ V* o<path d="M56.502,32.301l-37.502,20.101l0.329,-40.804l37.173,20.703Z"></path>
    / v+ e/ g- e0 _$ `1 ?! c9 x</svg>
    ; x) S$ d" x$ ?</a>
    ' d5 a2 Y+ d. a( D+ {4 E建议还是用上面的方法吧,可以加一个hidden属性做好看一点:
    # P! Y# W; J  c. n8 o  x" O  K. \" D( X! S1 G1 j/ [- k
    <div hidden="true">, G  V6 Z  X9 h0 L# [4 y& o4 I
    {{音频}}. h. ^$ u# j! m! l* s$ B2 I
    {{音频}}
    % _  ^$ u/ X2 \- [6 ^" D  u, u. P{{音频}}
    1 m( q! T" M0 B0 F3 X2 t; b0 m9 d7 j. c' a</div>
    您需要登录后才可以回帖 登录 | 免费注册

    本版积分规则

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

    GMT+8, 2024-4-29 16:04 , Processed in 0.056934 second(s), 9 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2023, Tencent Cloud.

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