|
- #!/usr/bin/env python3
- # -*- coding: utf-8 -*-
- """
- Created on Thu Mar 19 18:13:56 2020
-
- @author: ljia
- """
-
- def options_string_to_options_map(options_string):
- """Transforms an options string into an options map.
-
- Parameters
- ----------
- options_string : string
- Options string of the form "[--<option> <arg>] [...]".
-
- Return
- ------
- options_map : dict{string : string}
- Map with one key-value pair (<option>, <arg>) for each option contained in the string.
- """
- if options_string == '':
- return
- options_map = {}
- words = []
- tokenize(options_string, ' ', words)
- expect_option_name = True
- for word in words:
- if expect_option_name:
- is_opt_name, word = is_option_name(word)
- if is_opt_name:
- option_name = word
- if option_name in options_map:
- raise Exception('Multiple specification of option "' + option_name + '".')
- options_map[option_name] = ''
- else:
- raise Exception('Invalid options "' + options_string + '". Usage: options = "[--<option> <arg>] [...]"')
- else:
- is_opt_name, word = is_option_name(word)
- if is_opt_name:
- raise Exception('Invalid options "' + options_string + '". Usage: options = "[--<option> <arg>] [...]"')
- else:
- options_map[option_name] = word
- expect_option_name = not expect_option_name
- return options_map
-
-
- def tokenize(sentence, sep, words):
- """Separates a sentence into words separated by sep (unless contained in single quotes).
-
- Parameters
- ----------
- sentence : string
- The sentence that should be tokenized.
-
- sep : string
- The separator. Must be different from "'".
-
- words : list[string]
- The obtained words.
- """
- outside_quotes = True
- word_length = 0
- pos_word_start = 0
- for pos in range(0, len(sentence)):
- if sentence[pos] == '\'':
- if not outside_quotes and pos < len(sentence) - 1:
- if sentence[pos + 1] != sep:
- raise Exception('Sentence contains closing single quote which is followed by a char different from ' + sep + '.')
- word_length += 1
- outside_quotes = not outside_quotes
- elif outside_quotes and sentence[pos] == sep:
- if word_length > 0:
- words.append(sentence[pos_word_start:pos_word_start + word_length])
- pos_word_start = pos + 1
- word_length = 0
- else:
- word_length += 1
- if not outside_quotes:
- raise Exception('Sentence contains unbalanced single quotes.')
- if word_length > 0:
- words.append(sentence[pos_word_start:pos_word_start + word_length])
-
-
- def is_option_name(word):
- """Checks whether a word is an option name and, if so, removes the leading dashes.
-
- Parameters
- ----------
- word : string
- Word.
-
- return
- ------
- True if word is of the form "--<option>".
-
- word : string
- The word without the leading dashes.
- """
- if word[0] == '\'':
- word = word[1:len(word) - 2]
- return False, word
- if len(word) < 3:
- return False, word
- if word[0] == '-' and word[1] == '-' and word[2] != '-':
- word = word[2:]
- return True, word
- return False, word
|