diff --git a/example/Charade/Charade.ptx b/example/Charade/Charade.ptx index 6da862b..db38ba6 100644 Binary files a/example/Charade/Charade.ptx and b/example/Charade/Charade.ptx differ diff --git a/example/Charade/Charade.txt b/example/Charade/Charade.txt index 9cceadd..780db94 100644 --- a/example/Charade/Charade.txt +++ b/example/Charade/Charade.txt @@ -50,16 +50,16 @@ COMMENTS: $CN=1 {Actor=Cary Grant} USER DELAY: 0 Samples STATE: CHANNEL EVENT CLIP NAME START TIME END TIME DURATION STATE -1 1 "Does this belong to you?" (alt for "Does HE belong to you?" {R=Replace Line} 01:05:10:16 01:05:11:19 00:00:01:03 Unmuted -1 2 "Well I telephones by nobody answered." {R=Off mic} 01:13:47:24 01:13:49:19 00:00:01:19 Unmuted -1 3 "It's in all the afternoon papers." {R=Replace Line} {Note=Adding "ALL"} 01:13:59:21 01:14:01:11 00:00:01:14 Unmuted -1 4 "Here you are." {R=Replace temp} 01:33:08:00 01:33:09:01 00:00:01:01 Unmuted -1 5 "On the street where you live..." {R=Replace temp} 01:33:10:09 01:33:12:03 00:00:01:19 Unmuted -1 6 (adlib response to REGGIE) {R=Added/Replaces sync} [ADLIB] 01:34:27:10 01:34:29:03 00:00:01:18 Unmuted -1 7 (effort add PUNCH efforts, react to GETTING PUNCHED) {R=Added} [EFF] 01:34:31:11 01:34:41:23 00:00:10:12 Unmuted -1 8 "… And close these windows after me." {R=Replace temp} 01:35:19:16 01:35:21:11 00:00:01:20 Unmuted -1 9 (effort LEAPING to balcony) [EFF] {R=Added} 01:36:13:02 01:36:15:06 00:00:02:04 Unmuted -1 10 "It's me, Peter." {R=Performance} {Note=More voice, call through door} 01:38:32:01 01:38:33:03 00:00:01:02 Unmuted +1 1 "Does this belong to you?" (alt for "Does HE belong to you?" {R=Replace Line} $QN=P101 01:05:10:16 01:05:11:19 00:00:01:03 Unmuted +1 2 "Well I telephones by nobody answered." {R=Off mic} $QN=P102 01:13:47:24 01:13:49:19 00:00:01:19 Unmuted +1 3 "It's in all the afternoon papers." {R=Replace Line} {Note=Adding "ALL"} $QN=P103 01:13:59:21 01:14:01:11 00:00:01:14 Unmuted +1 4 "Here you are." {R=Replace temp} $QN=P104 01:33:08:00 01:33:09:01 00:00:01:01 Unmuted +1 5 "On the street where you live..." {R=Replace temp} $QN=P105 01:33:10:09 01:33:12:03 00:00:01:19 Unmuted +1 6 (adlib response to REGGIE) {R=Added/Replaces sync} [ADLIB] $QN=P106 01:34:27:10 01:34:29:03 00:00:01:18 Unmuted +1 7 (effort add PUNCH efforts, react to GETTING PUNCHED) {R=Added} [EFF] $QN=P107 01:34:31:11 01:34:41:23 00:00:10:12 Unmuted +1 8 "… And close these windows after me." {R=Replace temp} $QN=P108 01:35:19:16 01:35:21:11 00:00:01:20 Unmuted +1 9 (effort LEAPING to balcony) [EFF] {R=Added} $QN=P109 01:36:13:02 01:36:15:06 00:00:02:04 Unmuted +1 10 "It's me, Peter." {R=Performance} {Note=More voice, call through door} $QN=P110 01:38:32:01 01:38:33:03 00:00:01:02 Unmuted TRACK NAME: REGGIE @@ -67,16 +67,16 @@ COMMENTS: $CN=2 {Actor=Audrey Hepburn} USER DELAY: 0 Samples STATE: CHANNEL EVENT CLIP NAME START TIME END TIME DURATION STATE -1 1 (react to getting squirted by gun) {R=Added} [EFF] 01:03:40:02 01:03:41:19 00:00:01:16 Unmuted -1 2 "Look I admit I came to Paris to escape American Provincial but that doesn't mean I'm ready for French Traditional!" {R=Clarity} {Note=Low Priority} 01:04:45:22 01:04:50:15 00:00:04:18 Unmuted -1 3 "Oh, no— you see, I don't really love him." {R=Clarity} 01:06:14:17 01:06:16:15 00:00:01:22 Unmuted -1 4 (reactions to empty house, turning open cupboards etc.) {R=Added} [EFF] 01:07:41:13 01:08:41:19 00:01:00:06 Unmuted -1 5 (effort RUN INTO Grandpierre) {R=Added} [EFF] 01:08:41:19 01:08:45:12 00:00:03:17 Unmuted -1 6 "I know, I'm sorry." {R=Replace Sync} {Note=More hesitant} 01:10:36:00 01:10:38:06 00:00:02:06 Unmuted -1 7 "Misses Lampert, Misses Charles Lampert." {R=Clarity} {Note=Prounonce P of Lampert harder} 01:19:30:22 01:19:32:18 00:00:01:21 Unmuted -1 8 "Mister Bartholomew this is Regina Lampert— Mister Bartholomew I just saw one of those me—" {R=Clarity} 01:30:24:12 01:30:28:16 00:00:04:04 Unmuted -1 9 "Where?" {R=Replace temp} 01:33:09:07 01:33:09:24 00:00:00:16 Unmuted -1 10 "Peter? … Peter? … Peter are you alright?" {R=More sotto voce} 01:34:53:10 01:35:01:02 00:00:07:16 Unmuted +1 1 (react to getting squirted by gun) {R=Added} [EFF] $QN=R101 01:03:40:02 01:03:41:19 00:00:01:16 Unmuted +1 2 "Look I admit I came to Paris to escape American Provincial but that doesn't mean I'm ready for French Traditional!" {R=Clarity} {Note=Low Priority} $QN=R102 01:04:45:22 01:04:50:15 00:00:04:18 Unmuted +1 3 "Oh, no— you see, I don't really love him." {R=Clarity} $QN=R103 01:06:14:17 01:06:16:15 00:00:01:22 Unmuted +1 4 (reactions to empty house, turning open cupboards etc.) {R=Added} [EFF] $QN=R104 01:07:41:13 01:08:41:19 00:01:00:06 Unmuted +1 5 (effort RUN INTO Grandpierre) {R=Added} [EFF] $QN=R105 01:08:41:19 01:08:45:12 00:00:03:17 Unmuted +1 6 "I know, I'm sorry." {R=Replace Sync} {Note=More hesitant} $QN=R106 01:10:36:00 01:10:38:06 00:00:02:06 Unmuted +1 7 "Misses Lampert, Misses Charles Lampert." {R=Clarity} {Note=Prounonce P of Lampert harder} $QN=R107 01:19:30:22 01:19:32:18 00:00:01:21 Unmuted +1 8 "Mister Bartholomew this is Regina Lampert— Mister Bartholomew I just saw one of those me—" {R=Clarity} $QN=R108 01:30:24:12 01:30:28:16 00:00:04:04 Unmuted +1 9 "Where?" {R=Replace temp} $QN=R109 01:33:09:07 01:33:09:24 00:00:00:16 Unmuted +1 10 "Peter? … Peter? … Peter are you alright?" {R=More sotto voce} $QN=R110 01:34:53:10 01:35:01:02 00:00:07:16 Unmuted TRACK NAME: BARTHOLOMEW @@ -84,9 +84,9 @@ COMMENTS: $CN=3 {Actor=Walter Matthau} $Mins=8 USER DELAY: 0 Samples STATE: CHANNEL EVENT CLIP NAME START TIME END TIME DURATION STATE -1 1 "Is there anything wrong, Miss Tompkins?" {R=Replace offscreen} 01:19:17:07 01:19:19:07 00:00:02:00 Unmuted -1 2 "Oh yes, uh, please— uh come in, Misses Lampert." {R=Clarity} {Note=Harder P on Lampert} 01:19:33:02 01:19:37:13 00:00:04:11 Unmuted -1 3 "You're Charles Lampert's widow, yes?" {R=Clarity} 01:20:03:06 01:20:04:22 00:00:01:16 Unmuted +1 1 "Is there anything wrong, Miss Tompkins?" {R=Replace offscreen} $QN=B101 01:19:17:07 01:19:19:07 00:00:02:00 Unmuted +1 2 "Oh yes, uh, please— uh come in, Misses Lampert." {R=Clarity} {Note=Harder P on Lampert} $QN=B102 01:19:33:02 01:19:37:13 00:00:04:11 Unmuted +1 3 "You're Charles Lampert's widow, yes?" {R=Clarity} $QN=B103 01:20:03:06 01:20:04:22 00:00:01:16 Unmuted TRACK NAME: TEX @@ -94,8 +94,8 @@ COMMENTS: $CN=4 {Actor=James Coburn} USER DELAY: 0 Samples STATE: CHANNEL EVENT CLIP NAME START TIME END TIME DURATION STATE -1 1 "But if you do find that money…" {R=Accent} 01:37:50:08 01:37:52:15 00:00:02:07 Unmuted -1 2 "You ain't gonna forget to tell your buddies about it are ya?" {R=Accent} 01:37:53:15 01:37:55:24 00:00:02:08 Unmuted +1 1 "But if you do find that money…" {R=Accent} $QN=T101 01:37:50:08 01:37:52:15 00:00:02:07 Unmuted +1 2 "You ain't gonna forget to tell your buddies about it are ya?" {R=Accent} $QN=T102 01:37:53:15 01:37:55:24 00:00:02:08 Unmuted TRACK NAME: SCOBIE @@ -103,8 +103,8 @@ COMMENTS: $CN=5 {Actor=George Kennedy} USER DELAY: 0 Samples STATE: CHANNEL EVENT CLIP NAME START TIME END TIME DURATION STATE -1 1 (effort HEAVY BREATHING) {R=Added} [EFF] 01:34:05:10 01:34:15:04 00:00:09:18 Unmuted -1 2 (effort add PUNCH efforts, react to GETTING PUNCHED) {R=Added} [EFF] 01:34:31:11 01:34:41:23 00:00:10:12 Unmuted +1 1 (effort HEAVY BREATHING) {R=Added} [EFF] $QN=SC101 01:34:05:10 01:34:15:04 00:00:09:18 Unmuted +1 2 (effort add PUNCH efforts, react to GETTING PUNCHED) {R=Added} [EFF] $QN=SC102 01:34:31:11 01:34:41:23 00:00:10:12 Unmuted TRACK NAME: SYLVIE @@ -112,7 +112,7 @@ COMMENTS: $CN=6 {Actor=Dominique Minot} USER DELAY: 0 Samples STATE: CHANNEL EVENT CLIP NAME START TIME END TIME DURATION STATE -1 1 "It is infuriating that your unhappiness does not turn to fat!" {R=Accent} 01:04:25:08 01:04:28:19 00:00:03:11 Unmuted +1 1 "It is infuriating that your unhappiness does not turn to fat!" {R=Accent} $QN=SY101 01:04:25:08 01:04:28:19 00:00:03:11 Unmuted TRACK NAME: GIDEON @@ -120,8 +120,8 @@ COMMENTS: $CN=7 {Actor=Ned Glass} USER DELAY: 0 Samples STATE: CHANNEL EVENT CLIP NAME START TIME END TIME DURATION STATE -1 1 (effort) "OWWW!" (kicked in shin) {R=Added} [EFF] 01:29:55:21 01:29:58:16 00:00:02:19 Unmuted -1 2 "Eh" (sotto/closed-mouth reaction) {R=Added} [ADLIB] 01:38:08:16 01:38:10:07 00:00:01:16 Unmuted +1 1 (effort) "OWWW!" (kicked in shin) {R=Added} [EFF] $QN=GD101 01:29:55:21 01:29:58:16 00:00:02:19 Unmuted +1 2 "Eh" (sotto/closed-mouth reaction) {R=Added} [ADLIB] $QN=GD102 01:38:08:16 01:38:10:07 00:00:01:16 Unmuted TRACK NAME: JEAN-LOUIS @@ -129,9 +129,9 @@ COMMENTS: $CN=8m {Actor=Thomas Chelimsky} USER DELAY: 0 Samples STATE: CHANNEL EVENT CLIP NAME START TIME END TIME DURATION STATE -1 1 "When you get your divorce, are you going back to America?" {R=Revioce} 01:07:14:07 01:07:17:07 00:00:03:00 Unmuted -1 2 "Yes, of course, but if you went back and wrote me a letter—" {R=Revoice} 01:07:18:20 01:07:21:18 00:00:02:23 Unmuted -1 3 "Okay." {R=Revoice} 01:07:24:13 01:07:25:01 00:00:00:13 Unmuted +1 1 "When you get your divorce, are you going back to America?" {R=Revioce} $QN=JL101 01:07:14:07 01:07:17:07 00:00:03:00 Unmuted +1 2 "Yes, of course, but if you went back and wrote me a letter—" {R=Revoice} $QN=JL102 01:07:18:20 01:07:21:18 00:00:02:23 Unmuted +1 3 "Okay." {R=Revoice} $QN=JL103 01:07:24:13 01:07:25:01 00:00:00:13 Unmuted TRACK NAME: Group @@ -139,11 +139,11 @@ COMMENTS: $CN=99g {Char=Group} {Actor=Per LG} USER DELAY: 0 Samples STATE: CHANNEL EVENT CLIP NAME START TIME END TIME DURATION STATE -1 1 ALL (Pool walla, FC "Whoo!" on man diving.) 01:04:29:05 01:04:43:09 00:00:14:04 Unmuted -1 2 (1M) "Madame" / "Miss" / "Merci" {R=Replace on-screen} 01:07:35:23 01:07:36:06 00:00:00:07 Unmuted -1 3 "D'accord" {R=Replace Futz} 01:10:47:20 01:10:48:08 00:00:00:13 Unmuted -1 4 (ALL KIDS) React to Punch and Judy Show, laughter bursts 01:25:12:07 01:25:23:22 00:00:11:15 Unmuted -1 5 (ALL) Laugh! Prelap cut 01:25:33:18 01:25:38:10 00:00:04:17 Unmuted +1 1 ALL (Pool walla, FC "Whoo!" on man diving.) $QN=G101 01:04:29:05 01:04:43:09 00:00:14:04 Unmuted +1 2 (1M) "Madame" / "Miss" / "Merci" {R=Replace on-screen} $QN=G102 01:07:35:23 01:07:36:06 00:00:00:07 Unmuted +1 3 "D'accord" {R=Replace Futz} $QN=G103 01:10:47:20 01:10:48:08 00:00:00:13 Unmuted +1 4 (ALL KIDS) React to Punch and Judy Show, laughter bursts $QN=G104 01:25:12:07 01:25:23:22 00:00:11:15 Unmuted +1 5 (ALL) Laugh! Prelap cut $QN=G105 01:25:33:18 01:25:38:10 00:00:04:17 Unmuted TRACK NAME: Group.dup1 @@ -151,7 +151,7 @@ COMMENTS: $CN=99g {Char=Group} {Actor=Per LG} USER DELAY: 0 Samples STATE: CHANNEL EVENT CLIP NAME START TIME END TIME DURATION STATE -1 1 (2M 2F) Detail reaction to show 01:25:14:03 01:25:15:23 00:00:01:20 Unmuted +1 1 (2M 2F) Detail reaction to show $QN=G106 01:25:14:03 01:25:15:23 00:00:01:20 Unmuted TRACK NAME: Group.dup2 @@ -159,12 +159,12 @@ COMMENTS: $CN=99g {Char=Group} {Actor=Per LG} USER DELAY: 0 Samples STATE: CHANNEL EVENT CLIP NAME START TIME END TIME DURATION STATE -1 1 (1M) Boy reacts to show [ADLIB] [TBW] 01:25:15:21 01:25:18:12 00:00:02:16 Unmuted -1 2 (1M) Pointing boy 01:25:20:02 01:25:22:16 00:00:02:14 Unmuted +1 1 (1M) Boy reacts to show [ADLIB] [TBW] $QN=G107 01:25:15:21 01:25:18:12 00:00:02:16 Unmuted +1 2 (1M) Pointing boy $QN=G108 01:25:20:02 01:25:22:16 00:00:02:14 Unmuted M A R K E R S L I S T I N G # LOCATION TIME REFERENCE UNITS NAME COMMENTS -1 01:00:00:00 2880000 Samples {Title=Charade} {Client=Stanley Donen Films/Universal} {Supv=Allan Morrison} {Spot=2021-0520} $Reel=1 [ADR] -2 01:18:50:20 57159360 Samples $Reel=2 -3 01:36:49:04 108919680 Samples $Reel=3 +1 01:00:00:00 2880000 Samples {Title=Charade} {Client=Stanley Donen Films/Universal} {Supv=Allan Morrison} {Spot=2021-0520} $Reel=R1 [ADR] $Mins=5 +2 01:18:50:20 57159360 Samples $Reel=R2 +3 01:36:49:04 108919680 Samples $Reel=R3 diff --git a/ptulsconv/pdf/common.py b/ptulsconv/pdf/common.py index 70de778..33ede77 100644 --- a/ptulsconv/pdf/common.py +++ b/ptulsconv/pdf/common.py @@ -87,7 +87,7 @@ def time_format(mins, zero_str=""): else: m = round(mins) hh, mm = divmod(m, 60) - return "%ih%im" % (hh, mm) + return "%ih%i" % (hh, mm) def draw_header_footer(a_canvas, title_box, doc_title_box, footer_box, record, doc_title=""): diff --git a/ptulsconv/pdf/line_count.py b/ptulsconv/pdf/line_count.py index 8bca968..f0bdaee 100644 --- a/ptulsconv/pdf/line_count.py +++ b/ptulsconv/pdf/line_count.py @@ -12,7 +12,7 @@ from .common import time_format, make_doc_template def build_columns(records, show_priorities=False): columns = list() - reel_numbers = sorted(set([x.get('Reel', None) for x in records['events'] if 'Reel' in x.keys()])) + reel_numbers = sorted(set([x['Reel'] for x in records['events'] if 'Reel' in x.keys()])) def blank_len(i): length = len(i) @@ -41,30 +41,24 @@ def build_columns(records, show_priorities=False): 'summarize': False }) - # columns.append({ - # 'heading': 'Actor', - # 'value_getter': lambda recs: recs[0].get('Actor Name', ''), - # 'style_getter': lambda col_index: [(('LINEAFTER'), (col_index, 0), (col_index, -1), 1.0, colors.black)], - # 'width': 1.75 * inch - # }) - if len(reel_numbers) > 0: - columns.append({ - 'heading': 'RX', - 'value_getter': lambda recs: blank_len([r for r in recs if r.get('Reel', None) in ("", None)]), - 'value_getter2': lambda recs: time_format(sum([r.get('Time Budget Mins', 0.) for r in recs - if r.get('Reel', None) in ("", None)])), - 'style_getter': lambda col_index: [('ALIGN', (col_index, 0), (col_index, -1), 'CENTER')], - 'width': num_column_width - }) + # columns.append({ + # 'heading': 'RX', + # 'value_getter': lambda recs: blank_len([r for r in recs if 'Reel' not in r.keys()]), + # 'value_getter2': lambda recs: time_format(sum([r.get('Time Budget Mins', 0.) for r in recs + # if 'Reel' not in r.keys()])), + # 'style_getter': lambda col_index: [('ALIGN', (col_index, 0), (col_index, -1), 'CENTER')], + # 'width': num_column_width + # }) for n in reel_numbers: columns.append({ 'heading': n, - 'value_getter': lambda recs: blank_len([r for r in recs if r['Reel'] == n]), - 'value_getter2': lambda recs: time_format(sum([r.get('Time Budget Mins', 0.) for r in recs - if r['Reel'] == n])), - 'style_getter': lambda col_index: [('ALIGN', (col_index, 0), (col_index, -1), 'CENTER')], + 'value_getter': lambda recs, n1=n: blank_len([r for r in recs if r['Reel'] == n1]), + 'value_getter2': lambda recs, n1=n: time_format(sum([r.get('Time Budget Mins', 0.) for r in recs + if r['Reel'] == n1])), + 'style_getter': lambda col_index: [('ALIGN', (col_index, 0), (col_index, -1), 'CENTER'), + ('LINEAFTER', (col_index, 0), (col_index, -1), .5, colors.gray)], 'width': num_column_width }) @@ -109,14 +103,14 @@ def build_columns(records, show_priorities=False): 'width': num_column_width }) - # columns.append({ - # 'heading': 'Eff', - # 'value_getter': lambda recs: blank_len([r for r in recs if 'Effort' in r.keys()]), - # 'value_getter2': lambda recs: time_format(sum([r.get('Time Budget Mins',0.) - # for r in recs if 'Effort' in r.keys()])), - # 'style_getter': lambda col_index: [('ALIGN', (col_index, 0), (col_index, -1), 'CENTER')], - # 'width': 0.5 * inch - # }) + columns.append({ + 'heading': 'Eff', + 'value_getter': lambda recs: blank_len([r for r in recs if 'Effort' in r.keys()]), + 'value_getter2': lambda recs: time_format(sum([r.get('Time Budget Mins',0.) + for r in recs if 'Effort' in r.keys()])), + 'style_getter': lambda col_index: [('ALIGN', (col_index, 0), (col_index, -1), 'CENTER')], + 'width': num_column_width + }) columns.append({ 'heading': 'Total', @@ -125,23 +119,9 @@ def build_columns(records, show_priorities=False): for r in recs if 'Omitted' not in r.keys()]), zero_str=None), 'style_getter': lambda col_index: [('LINEBEFORE', (col_index, 0), (col_index, -1), 1.0, colors.black), ('ALIGN', (col_index, 0), (col_index, -1), 'CENTER')], - 'width': num_column_width + 'width': 0.5 * inch }) - # columns.append({ - # 'heading': 'Studio Time', - # 'value_getter': lambda recs: time_format(sum([r.get('Time Budget Mins', 0.) for r in recs])), - # 'style_getter': lambda col_index: [('ALIGN', (col_index, 0), (col_index, -1), 'RIGHT')], - # 'width': inch - # }) - - # columns.append({ - # 'heading': 'Omit', - # 'value_getter': lambda recs: blank_len([r for r in recs if 'Omitted' in r.keys()]), - # 'style_getter': lambda col_index: [('LINEBEFORE', (col_index, 0), (col_index, -1), 1.0, colors.black)], - # 'width': 0.5 * inch - # }) - return columns @@ -150,8 +130,9 @@ def populate_columns(records, columns): styles = list() columns_widths = list() - sorted_character_numbers = sorted(set([x['CN'] for x in records['events']]), - key=lambda x: int(x)) + sorted_character_numbers = sorted(set([x['Character Number'] for x in records['events'] + if 'Character Number' in x.keys()]), + key=lambda x: str(x)) # construct column styles @@ -164,15 +145,14 @@ def populate_columns(records, columns): lines = [x for x in records['events'] if 'Omitted' not in x.keys()] for n in sorted_character_numbers: - char_records = sorted([x for x in lines if x['Character Number'] == n], - key=lambda x: x['PT.Clip.Start_Seconds']) + char_records = list([x for x in lines if x['Character Number'] == n]) row_data = list() row_data2 = list() for col in columns: row1_index = len(data) row2_index = row1_index + 1 - row_data.append(col['value_getter'](char_records)) - row_data2.append(col['value_getter2'](char_records)) + row_data.append(col['value_getter'](list(char_records))) + row_data2.append(col['value_getter2'](list(char_records))) styles.extend([('TEXTCOLOR', (0, row2_index), (-1, row2_index), colors.red), ('LINEBELOW', (0, row2_index), (-1, row2_index), 0.5, colors.black)]) diff --git a/ptulsconv/pdf/summary_log.py b/ptulsconv/pdf/summary_log.py index 4d5df93..63a7cb0 100644 --- a/ptulsconv/pdf/summary_log.py +++ b/ptulsconv/pdf/summary_log.py @@ -69,8 +69,8 @@ def build_story(lines): colWidths=[inch, inch, inch * 3., 0.5 * inch, inch * 2.], style=table_style) - if line['Scene'] != this_scene: - this_scene = line['Scene'] + if line.get('Scene', "[No Scene]") != this_scene: + this_scene = line.get('Scene', "[No Scene]") story.append(KeepTogether([ Spacer(1., 0.25 * inch), Paragraph("" + this_scene + "", scene_style), diff --git a/ptulsconv/ptuls_grammar.py b/ptulsconv/ptuls_grammar.py index 4713749..55505e6 100644 --- a/ptulsconv/ptuls_grammar.py +++ b/ptulsconv/ptuls_grammar.py @@ -68,6 +68,6 @@ protools_text_export_grammar = Grammar( block_ending = rs rs string_value = ~"[^\t\n]*" integer_value = ~"\d+" - float_value = ~"\d+(\.\d+)" + float_value = ~"\d+(\.\d+)?" isp = ~"[^\d\t\n]*" """)