A .dplybundle packs a document together with its libraries in one file. The libraries are collapsed below — click to expand.
1---
2version: 0.1.0
3precision: 2
4form_title: Morse Code Converter
5form_description: Convert between text and Morse code. Pick a direction, type your input, read the result.
6form_inputs: Direction|direction[Text to Morse:1,Morse to Text:0], Input|input
7form_outputs: Result|result
8---
9# draftply Pro — Morse Code Converter
10# The library below is bundled with this document and imported here.
11# Tap the form icon for an input mask.
12import "morse_code.dplylib"
13
14# ── Your input ─────────────────────────────────
15input = "Hello World!"
16direction = 1 # 1 = text to morse, 0 = morse to text
17
18# ── Conversion ─────────────────────────────────
19# draftply has no == for strings, so the direction is a number.
20result = to_morse(input) if direction == 1 else from_morse(input)
21
22"Direction (1 = to morse)": direction
23"Input": input
24"Result": result
25
26# ── Round trip: encode, then decode again ──────
27"Encoded": to_morse("SOS")
28"Decoded again": from_morse(to_morse("SOS"))
⬡ morse_code.dplyliblibrary
1---
2version: 1.0.0
3min_app_version: 0.1.0
4---
5# morse_code.dplylib — Morse encoding and decoding for radio amateurs.
6# Import with: import "morse_code.dplylib" (Pro: functions + loops)
7#
8# to_morse("SOS") -> "... --- ..."
9# from_morse("... --- ...") -> "SOS"
10#
11# Letters are separated by one space, words by " / ".
12#
13# How this works: draftply has no true/false, no == on strings and no
14# s[i] on strings. It does have ord(text), which returns the list of
15# character codes — so every comparison here is numeric. A morse symbol
16# is packed into a number as well (. = 1, - = 2, read left to right),
17# which makes ".-" the number 12 and the reverse lookup a number match.
18
19# ── Character code → morse ──────────────────────────────
20def char_to_morse(code):
21 c = code
22 if c >= 97 and c <= 122: # lower case → upper case
23 c = c - 32
24 if c == 32: return " "
25 if c == 33: return "-.-.--" # !
26 elif c == 34: return ".-..-." # "
27 elif c == 36: return "...-..-" # $
28 elif c == 38: return ".-..." # &
29 elif c == 39: return ".----." # '
30 elif c == 40: return "-.--." # (
31 elif c == 41: return "-.--.-" # )
32 elif c == 43: return ".-.-." # +
33 elif c == 44: return "--..--" # ,
34 elif c == 45: return "-....-" # -
35 elif c == 46: return ".-.-.-" # .
36 elif c == 48: return "-----" # 0
37 elif c == 49: return ".----" # 1
38 elif c == 50: return "..---" # 2
39 elif c == 51: return "...--" # 3
40 elif c == 52: return "....-" # 4
41 elif c == 53: return "....." # 5
42 elif c == 54: return "-...." # 6
43 elif c == 55: return "--..." # 7
44 elif c == 56: return "---.." # 8
45 elif c == 57: return "----." # 9
46 elif c == 58: return "---..." # :
47 elif c == 59: return "-.-.-." # ;
48 elif c == 61: return "-...-" # =
49 elif c == 63: return "..--.." # ?
50 elif c == 64: return ".--.-." # @
51 elif c == 65: return ".-" # A
52 elif c == 66: return "-..." # B
53 elif c == 67: return "-.-." # C
54 elif c == 68: return "-.." # D
55 elif c == 69: return "." # E
56 elif c == 70: return "..-." # F
57 elif c == 71: return "--." # G
58 elif c == 72: return "...." # H
59 elif c == 73: return ".." # I
60 elif c == 74: return ".---" # J
61 elif c == 75: return "-.-" # K
62 elif c == 76: return ".-.." # L
63 elif c == 77: return "--" # M
64 elif c == 78: return "-." # N
65 elif c == 79: return "---" # O
66 elif c == 80: return ".--." # P
67 elif c == 81: return "--.-" # Q
68 elif c == 82: return ".-." # R
69 elif c == 83: return "..." # S
70 elif c == 84: return "-" # T
71 elif c == 85: return "..-" # U
72 elif c == 86: return "...-" # V
73 elif c == 87: return ".--" # W
74 elif c == 88: return "-..-" # X
75 elif c == 89: return "-.--" # Y
76 elif c == 90: return "--.." # Z
77 elif c == 95: return "..--.-" # _
78 return ""
79
80# ── Morse as a number → character ───────────────────────
81# 12 is ".-" and therefore "A" — see the note at the top.
82def morse_to_char(k):
83 if k == 1: return "E" # .
84 elif k == 2: return "T" # -
85 elif k == 11: return "I" # ..
86 elif k == 12: return "A" # .-
87 elif k == 21: return "N" # -.
88 elif k == 22: return "M" # --
89 elif k == 111: return "S" # ...
90 elif k == 112: return "U" # ..-
91 elif k == 121: return "R" # .-.
92 elif k == 122: return "W" # .--
93 elif k == 211: return "D" # -..
94 elif k == 212: return "K" # -.-
95 elif k == 221: return "G" # --.
96 elif k == 222: return "O" # ---
97 elif k == 1111: return "H" # ....
98 elif k == 1112: return "V" # ...-
99 elif k == 1121: return "F" # ..-.
100 elif k == 1211: return "L" # .-..
101 elif k == 1221: return "P" # .--.
102 elif k == 1222: return "J" # .---
103 elif k == 2111: return "B" # -...
104 elif k == 2112: return "X" # -..-
105 elif k == 2121: return "C" # -.-.
106 elif k == 2122: return "Y" # -.--
107 elif k == 2211: return "Z" # --..
108 elif k == 2212: return "Q" # --.-
109 elif k == 11111: return "5" # .....
110 elif k == 11112: return "4" # ....-
111 elif k == 11122: return "3" # ...--
112 elif k == 11222: return "2" # ..---
113 elif k == 12111: return "&" # .-...
114 elif k == 12121: return "+" # .-.-.
115 elif k == 12222: return "1" # .----
116 elif k == 21111: return "6" # -....
117 elif k == 21112: return "=" # -...-
118 elif k == 21221: return "(" # -.--.
119 elif k == 22111: return "7" # --...
120 elif k == 22211: return "8" # ---..
121 elif k == 22221: return "9" # ----.
122 elif k == 22222: return "0" # -----
123 elif k == 112211: return "?" # ..--..
124 elif k == 112212: return "_" # ..--.-
125 elif k == 121121: return '"' # .-..-.
126 elif k == 121212: return "." # .-.-.-
127 elif k == 122121: return "@" # .--.-.
128 elif k == 122221: return "'" # .----.
129 elif k == 211112: return "-" # -....-
130 elif k == 212121: return ";" # -.-.-.
131 elif k == 212122: return "!" # -.-.--
132 elif k == 212212: return ")" # -.--.-
133 elif k == 221122: return "," # --..--
134 elif k == 222111: return ":" # ---...
135 elif k == 1112112: return "$" # ...-..-
136 return ""
137
138# ── Text → morse ────────────────────────────────────────
139def to_morse(text):
140 # The extra space guarantees a list even for one-character input —
141 # ord() returns a plain number when the text is a single character.
142 codes = ord(text + " ")
143 n = len(text)
144 out = ""
145 started = 0
146 for i in 0..n-1:
147 code = codes[i]
148 if code == 32:
149 out = out + " /"
150 started = 1
151 else:
152 m = char_to_morse(code)
153 if len(m) > 0:
154 if started == 1:
155 out = out + " "
156 out = out + m
157 started = 1
158 return out
159
160# ── Morse → text ────────────────────────────────────────
161def from_morse(code):
162 codes = ord(code + " ")
163 n = len(code)
164 out = ""
165 k = 0
166 gap = 0
167 for i in 0..n-1:
168 c = codes[i]
169 if c == 46: # "."
170 k = k * 10 + 1
171 elif c == 45: # "-"
172 k = k * 10 + 2
173 elif c == 47: # "/" — word separator
174 gap = 1
175 else: # space: the symbol is complete
176 if k > 0:
177 out = out + morse_to_char(k)
178 k = 0
179 if gap == 1:
180 out = out + " "
181 gap = 0
182 if k > 0:
183 out = out + morse_to_char(k)
184 return out