This commit is contained in:
Debucquoy committed 2023-09-20 15:18:20 +02:00
1 parent 00d0cdfaf3
commit 4fd7542f03
228 files changed
+351 -12

No files matched your search

+68
View File
@@ -0,0 +1,68 @@
ttcagttgtgaatgaatggacgtgccaaatagacgtgccgccgccgctcgattcgcactt
tgctttcggttttgccgtcgtttcacgcgtttagttccgttcggttcattcccagttctt
aaataccggacgtaaaaatacactctaacggtcccgcgaagaaaaagataaagacatctc
gtagaaatattaaaataaattcctaaagtcgttggtttctcgttcactttcgctgcctgc
tcaggacgagggccacaccaagaggcaagagaaacaaaaagagggaacataggaacagga
accagataatagtgacataagcgaccctttcgcaaatattttggcgcaaaatgagcgggc
gccaagtgccgcgtggtggagccgcctgaaaatgacatggaaaattcgccgaaaatcgcg
cgttttggcagcatcaatcccaaagcacaaaattaatttctatcataatttctgggtgca
acacggacccataattgaatcgaatatagggcttatctgatagcccggcagcaacattga
actttccggctgcaaaggagacgacaccgagatcgccaattttcgttgggctcgttctct
gggctccggcgataagaaatccatgctgataaggacaggaggacggtctgcggcaaattg
aattcgattctgacctgtatgaaagccagcggagatacggatacctctgggtttatgggt
agaaaacgcagagcgtcgcgccaacatcgaaattatttgcgtttgcatcttctcgtcctt
tcgtttatcgttctgattgccatcgtggtggcgcggtttctattaattttgcttctgtat
cgtttgcaaaatctcaaaagattcaaaaagttcgtcatcagcagccgcaacacaaaaacc
aacgagtgtaaagccgagcatacaaatatcaataaaaacataaacatttacccaatctca
atctcaaaacattcgcatcgtttccacacaaatatgcttagttcgcccaaattgtgattg
tatatatatatttaacggcattaaatacaaaagattaagccctaaattaagtgtaaatct
tacaaaacgtctacgtttttaaacaagaaattgtgatattatatattaatcgggaaattc
gaagtatgagaacaaaacggtgtatatatgtaagtgggcgatgaacatcaatgaatattt
tagctgagcaaagtacacacgaatgaatataaatatacatgaaaatatattttgggcacc
gacttttacaccacaattatatatcgatagaaaagacacgaaaacaatcacagaaaacta
agagtttcaaaatcaaaattgaggaataccaactagaggataaggctacttaaggatcaa
aaaacaccaaggagacgagattttctaccaaatcgagagacgaggggcaggttaatttcg
tcatttttggccaagacagcaaatagaggaacagcaaagcgaaaatcattttatacctca
cacaacaactacacactaactaagattaggctacgcaactgtacattgtacttaagtgtt
caaagtatatttagtttactttgtatataagaaaagtagctaaaagcacgcggacaggga
ggcaggagcaccacagtcactagccactaagcagagtcacagtcacgatcacgttcactc
caggatcaggactcggggcgggatcagcagacgctgaggaagctgccacgatgacgatga
gtacaaacaactgcgagagcatgacctcgtacttcaccaactcgtacatgggggcggaca
tgcatcatgggcactacccgggcaacggggtcaccgacctggacgcccagcagatgcacc
actacagccagaacgcgaatcaccagggcaacatgccctacccgcgctttccaccctacg
accgcatgccctactacaacggccaggggatggaccagcagcagcagcaccaggtctact
cccgcccggacagcccctccagccaggtgggcggggtcatgccccaggcgcagaccaacg
gtcagttgggtgttccccagcagcaacagcagcagcagcaacagccctcgcagaaccagc
agcaacagcaggcgcagcaggccccacagcaactgcagcagcagctgccgcaggtgacgc
aacaggtgacacatccgcagcagcaacaacagcagcccgtcgtctacgccagctgcaagt
tgcaagcggccgttggtggactgggtatggttcccgagggcggatcgcctccgctggtgg
atcaaatgtccggtcaccacatgaacgcccagatgacgctgccccatcacatgggacatc
cgcaggcgcagttgggctatacggacgttggagttcccgacgtgacagaggtccatcaga
accatcacaacatgggcatgtaccagcagcagtcgggagttccgccggtgggtgccccac
ctcagggcatgatgcaccagggccagggtcctccacagatgcaccagggacatcctggcc
aacacacgcctccttcccaaaacccgaactcgcagtcctcggggatgccgtctccactgt
atccctggatgcgaagtcagtttggtaagtgtcaaggaaagtgatcgacaattccacgaa
acgtattaagtggaatttttcttcttcttatcgtagtgggttgaagtagttagttccccg
tttagaattggtcgtagttcccattagaatcgtaactgtgcatacaacagctagagctgt
attatcttaaattgtataataccataactattacagcgaacctcgtgcagcgaagcaaag
cagtaaaaagcagtctagatgtactgctttatattgtgtttcctgcttgatattagatca
ctaagcaagcagacgcgcaagcagttcacgcagatcacgcagacgttaaaaatttaaaaa
tgtttttgtttgcagaaagaagtaccctcttcgcttttcaattttgtagttaaaattcga
gcaaatatatttaaattaaaaaggctcaaacttaaagtactatgtatgtcttgtattttt
gaaaaaattctaaagtttattataaaatgcattttaaatacattttttaacctaccttgt
cgcttgaaatatataaaatttaagttttagatatggaatagataaacaaaatatttccct
ctgtcttaactaatttctttaattaaatgttaagccccaaagcgactacagcttcatgtc
aaactcttaccttaaatatttagagtttgtttgcatttgaactgagaacgttttgtcgac
gaccttgacacgtccgggtaatttcactttattgccttggccaattgcttgacatcatcc
gtaatccatctgcaaagacatcccgatacctgacatttgttcaaatttgcgaatttccca
aatccgagcaaatcgatgaatgcaggcagatgaaagacgaaagaggtggcggaagaggtg
ctccttgggttccgcttgcccagaagatcgcagcacaggaggcggtcctgccagctaatg
caaattgacaatagctcgaaatcgtgcaagaaaaaggtttgccaaaaccctaggcgtaac
taatgagggctggaaaatagagcacactgactgcatgtggtactgctttaggcttagagg
atgttgcataagtggggatagggctcggccgcctttcgagcgaaaaaggtgtaaggtcta
ggaggcgagtccttttcaaatatagaattccaatggcatgtcactttcctcggagaaagt
gaaagtaggcctcaagtggtcggtgcctttgccttgccctccagctgacctgctccctgg
tcattacgcagtccaaggagctctagctctccccatacccagctctcaatgttgttgtgg
ttttttgtttgtagccggctgaattttttcgccaaagccagattgagatgtaaagcacaa
ttgatgagcgccattagttacacgttatgtgcaatggatgccatcaatttattaatctcc
agaacacgccgaggctccattcatagcaccacttcgtcgtcttaatcccctccctcatcc
+90
View File
@@ -0,0 +1,90 @@
#!/bin/python
""" Compression
Usage:
compression.py (-c|-d) -t <type> --in <input> [--out <output>]
compression.py -h | --help
compression.py --version
Options:
-h --help Show this screen
--version Show Version
-c Compress
-d Decompress
-t Choose Compression Type (currently supported: lz, rle)
--in Input file
--out Output file
"""
def read_file(filename:str) -> str:
try:
with open(filename) as file:
return file.read()
except e:
print(e)
def lz_compression(text:str):
"""compress all duplicate word
put each word into a list and make make a string of all the occurence
:text: string to compress
:returns: tuple with (list of word, decoding string)
"""
splitted_text = text.split()
word_list = list()
key = dict()
key_value = 0
for v in splitted_text:
if v not in key.keys():
key[v] = key_value
key_value += 1
word_list.append(key[v])
return word_list, key
def save_lz(filename, word_list, key_list):
with open(filename, 'w') as file:
word_list = map(str, word_list)
file.writelines(' '.join(word_list))
file.writelines(' '.join(list(key_list.items())))
def lz_decompression(text:str):
pass
def rle_compression(text:str):
"""compress all duplicate word
put each word into a list and make make a string of all the occurence
:text: string to compress
:returns: tuple with (list of word, decoding string)
"""
splitted_text = text.split()
def rle_decompression(text:str):
pass
if __name__ == "__main__":
from docopt import docopt
argument = docopt(__doc__, version="V1")
print(argument)
if argument['<type>'].lower() == 'lz':
if argument['-d']:
result = lz_decompression(read_file(argument['<input>']))
print(result)
if argument['-c']:
w_list, k_list = lz_compression(read_file(argument['<input>']))
save_lz('test.Ltxt', w_list, k_list)
elif argument['<type>'].lower() == 'rle':
if argument['-d']:
result = rle_decompression(read_file(argument['<input>']))
print(result)
if argument['-c']:
result = rle_compression(read_file(argument['<input>']))
print(result)
else:
raise TypeError("choose a type between lz and rle")
+581
View File
@@ -0,0 +1,581 @@
"""Pythonic command-line interface parser that will make you smile.
* http://docopt.org
* Repository and issue-tracker: https://github.com/docopt/docopt
* Licensed under terms of MIT license (see LICENSE-MIT)
* Copyright (c) 2013 Vladimir Keleshev, vladimir@keleshev.com
"""
import sys
import re
__all__ = ['docopt']
__version__ = '0.6.2'
class DocoptLanguageError(Exception):
"""Error in construction of usage-message by developer."""
class DocoptExit(SystemExit):
"""Exit in case user invoked program with incorrect arguments."""
usage = ''
def __init__(self, message=''):
SystemExit.__init__(self, (message + '\n' + self.usage).strip())
class Pattern(object):
def __eq__(self, other):
return repr(self) == repr(other)
def __hash__(self):
return hash(repr(self))
def fix(self):
self.fix_identities()
self.fix_repeating_arguments()
return self
def fix_identities(self, uniq=None):
"""Make pattern-tree tips point to same object if they are equal."""
if not hasattr(self, 'children'):
return self
uniq = list(set(self.flat())) if uniq is None else uniq
for i, child in enumerate(self.children):
if not hasattr(child, 'children'):
assert child in uniq
self.children[i] = uniq[uniq.index(child)]
else:
child.fix_identities(uniq)
def fix_repeating_arguments(self):
"""Fix elements that should accumulate/increment values."""
either = [list(child.children) for child in transform(self).children]
for case in either:
for e in [child for child in case if case.count(child) > 1]:
if type(e) is Argument or type(e) is Option and e.argcount:
if e.value is None:
e.value = []
elif type(e.value) is not list:
e.value = e.value.split()
if type(e) is Command or type(e) is Option and e.argcount == 0:
e.value = 0
return self
def transform(pattern):
"""Expand pattern into an (almost) equivalent one, but with single Either.
Example: ((-a | -b) (-c | -d)) => (-a -c | -a -d | -b -c | -b -d)
Quirks: [-a] => (-a), (-a...) => (-a -a)
"""
result = []
groups = [[pattern]]
while groups:
children = groups.pop(0)
parents = [Required, Optional, OptionsShortcut, Either, OneOrMore]
if any(t in map(type, children) for t in parents):
child = [c for c in children if type(c) in parents][0]
children.remove(child)
if type(child) is Either:
for c in child.children:
groups.append([c] + children)
elif type(child) is OneOrMore:
groups.append(child.children * 2 + children)
else:
groups.append(child.children + children)
else:
result.append(children)
return Either(*[Required(*e) for e in result])
class LeafPattern(Pattern):
"""Leaf/terminal node of a pattern tree."""
def __init__(self, name, value=None):
self.name, self.value = name, value
def __repr__(self):
return '%s(%r, %r)' % (self.__class__.__name__, self.name, self.value)
def flat(self, *types):
return [self] if not types or type(self) in types else []
def match(self, left, collected=None):
collected = [] if collected is None else collected
pos, match = self.single_match(left)
if match is None:
return False, left, collected
left_ = left[:pos] + left[pos + 1:]
same_name = [a for a in collected if a.name == self.name]
if type(self.value) in (int, list):
if type(self.value) is int:
increment = 1
else:
increment = ([match.value] if type(match.value) is str
else match.value)
if not same_name:
match.value = increment
return True, left_, collected + [match]
same_name[0].value += increment
return True, left_, collected
return True, left_, collected + [match]
class BranchPattern(Pattern):
"""Branch/inner node of a pattern tree."""
def __init__(self, *children):
self.children = list(children)
def __repr__(self):
return '%s(%s)' % (self.__class__.__name__,
', '.join(repr(a) for a in self.children))
def flat(self, *types):
if type(self) in types:
return [self]
return sum([child.flat(*types) for child in self.children], [])
class Argument(LeafPattern):
def single_match(self, left):
for n, pattern in enumerate(left):
if type(pattern) is Argument:
return n, Argument(self.name, pattern.value)
return None, None
@classmethod
def parse(class_, source):
name = re.findall('(<\S*?>)', source)[0]
value = re.findall('\[default: (.*)\]', source, flags=re.I)
return class_(name, value[0] if value else None)
class Command(Argument):
def __init__(self, name, value=False):
self.name, self.value = name, value
def single_match(self, left):
for n, pattern in enumerate(left):
if type(pattern) is Argument:
if pattern.value == self.name:
return n, Command(self.name, True)
else:
break
return None, None
class Option(LeafPattern):
def __init__(self, short=None, long=None, argcount=0, value=False):
assert argcount in (0, 1)
self.short, self.long, self.argcount = short, long, argcount
self.value = None if value is False and argcount else value
@classmethod
def parse(class_, option_description):
short, long, argcount, value = None, None, 0, False
options, _, description = option_description.strip().partition(' ')
options = options.replace(',', ' ').replace('=', ' ')
for s in options.split():
if s.startswith('--'):
long = s
elif s.startswith('-'):
short = s
else:
argcount = 1
if argcount:
matched = re.findall('\[default: (.*)\]', description, flags=re.I)
value = matched[0] if matched else None
return class_(short, long, argcount, value)
def single_match(self, left):
for n, pattern in enumerate(left):
if self.name == pattern.name:
return n, pattern
return None, None
@property
def name(self):
return self.long or self.short
def __repr__(self):
return 'Option(%r, %r, %r, %r)' % (self.short, self.long,
self.argcount, self.value)
class Required(BranchPattern):
def match(self, left, collected=None):
collected = [] if collected is None else collected
l = left
c = collected
for pattern in self.children:
matched, l, c = pattern.match(l, c)
if not matched:
return False, left, collected
return True, l, c
class Optional(BranchPattern):
def match(self, left, collected=None):
collected = [] if collected is None else collected
for pattern in self.children:
m, left, collected = pattern.match(left, collected)
return True, left, collected
class OptionsShortcut(Optional):
"""Marker/placeholder for [options] shortcut."""
class OneOrMore(BranchPattern):
def match(self, left, collected=None):
assert len(self.children) == 1
collected = [] if collected is None else collected
l = left
c = collected
l_ = None
matched = True
times = 0
while matched:
# could it be that something didn't match but changed l or c?
matched, l, c = self.children[0].match(l, c)
times += 1 if matched else 0
if l_ == l:
break
l_ = l
if times >= 1:
return True, l, c
return False, left, collected
class Either(BranchPattern):
def match(self, left, collected=None):
collected = [] if collected is None else collected
outcomes = []
for pattern in self.children:
matched, _, _ = outcome = pattern.match(left, collected)
if matched:
outcomes.append(outcome)
if outcomes:
return min(outcomes, key=lambda outcome: len(outcome[1]))
return False, left, collected
class Tokens(list):
def __init__(self, source, error=DocoptExit):
self += source.split() if hasattr(source, 'split') else source
self.error = error
@staticmethod
def from_pattern(source):
source = re.sub(r'([\[\]\(\)\|]|\.\.\.)', r' \1 ', source)
source = [s for s in re.split('\s+|(\S*<.*?>)', source) if s]
return Tokens(source, error=DocoptLanguageError)
def move(self):
return self.pop(0) if len(self) else None
def current(self):
return self[0] if len(self) else None
def parse_long(tokens, options):
"""long ::= '--' chars [ ( ' ' | '=' ) chars ] ;"""
long, eq, value = tokens.move().partition('=')
assert long.startswith('--')
value = None if eq == value == '' else value
similar = [o for o in options if o.long == long]
if tokens.error is DocoptExit and similar == []: # if no exact match
similar = [o for o in options if o.long and o.long.startswith(long)]
if len(similar) > 1: # might be simply specified ambiguously 2+ times?
raise tokens.error('%s is not a unique prefix: %s?' %
(long, ', '.join(o.long for o in similar)))
elif len(similar) < 1:
argcount = 1 if eq == '=' else 0
o = Option(None, long, argcount)
options.append(o)
if tokens.error is DocoptExit:
o = Option(None, long, argcount, value if argcount else True)
else:
o = Option(similar[0].short, similar[0].long,
similar[0].argcount, similar[0].value)
if o.argcount == 0:
if value is not None:
raise tokens.error('%s must not have an argument' % o.long)
else:
if value is None:
if tokens.current() in [None, '--']:
raise tokens.error('%s requires argument' % o.long)
value = tokens.move()
if tokens.error is DocoptExit:
o.value = value if value is not None else True
return [o]
def parse_shorts(tokens, options):
"""shorts ::= '-' ( chars )* [ [ ' ' ] chars ] ;"""
token = tokens.move()
assert token.startswith('-') and not token.startswith('--')
left = token.lstrip('-')
parsed = []
while left != '':
short, left = '-' + left[0], left[1:]
similar = [o for o in options if o.short == short]
if len(similar) > 1:
raise tokens.error('%s is specified ambiguously %d times' %
(short, len(similar)))
elif len(similar) < 1:
o = Option(short, None, 0)
options.append(o)
if tokens.error is DocoptExit:
o = Option(short, None, 0, True)
else: # why copying is necessary here?
o = Option(short, similar[0].long,
similar[0].argcount, similar[0].value)
value = None
if o.argcount != 0:
if left == '':
if tokens.current() in [None, '--']:
raise tokens.error('%s requires argument' % short)
value = tokens.move()
else:
value = left
left = ''
if tokens.error is DocoptExit:
o.value = value if value is not None else True
parsed.append(o)
return parsed
def parse_pattern(source, options):
tokens = Tokens.from_pattern(source)
result = parse_expr(tokens, options)
if tokens.current() is not None:
raise tokens.error('unexpected ending: %r' % ' '.join(tokens))
return Required(*result)
def parse_expr(tokens, options):
"""expr ::= seq ( '|' seq )* ;"""
seq = parse_seq(tokens, options)
if tokens.current() != '|':
return seq
result = [Required(*seq)] if len(seq) > 1 else seq
while tokens.current() == '|':
tokens.move()
seq = parse_seq(tokens, options)
result += [Required(*seq)] if len(seq) > 1 else seq
return [Either(*result)] if len(result) > 1 else result
def parse_seq(tokens, options):
"""seq ::= ( atom [ '...' ] )* ;"""
result = []
while tokens.current() not in [None, ']', ')', '|']:
atom = parse_atom(tokens, options)
if tokens.current() == '...':
atom = [OneOrMore(*atom)]
tokens.move()
result += atom
return result
def parse_atom(tokens, options):
"""atom ::= '(' expr ')' | '[' expr ']' | 'options'
| long | shorts | argument | command ;
"""
token = tokens.current()
result = []
if token in '([':
tokens.move()
matching, pattern = {'(': [')', Required], '[': [']', Optional]}[token]
result = pattern(*parse_expr(tokens, options))
if tokens.move() != matching:
raise tokens.error("unmatched '%s'" % token)
return [result]
elif token == 'options':
tokens.move()
return [OptionsShortcut()]
elif token.startswith('--') and token != '--':
return parse_long(tokens, options)
elif token.startswith('-') and token not in ('-', '--'):
return parse_shorts(tokens, options)
elif token.startswith('<') and token.endswith('>') or token.isupper():
return [Argument(tokens.move())]
else:
return [Command(tokens.move())]
def parse_argv(tokens, options, options_first=False):
"""Parse command-line argument vector.
If options_first:
argv ::= [ long | shorts ]* [ argument ]* [ '--' [ argument ]* ] ;
else:
argv ::= [ long | shorts | argument ]* [ '--' [ argument ]* ] ;
"""
parsed = []
while tokens.current() is not None:
if tokens.current() == '--':
return parsed + [Argument(None, v) for v in tokens]
elif tokens.current().startswith('--'):
parsed += parse_long(tokens, options)
elif tokens.current().startswith('-') and tokens.current() != '-':
parsed += parse_shorts(tokens, options)
elif options_first:
return parsed + [Argument(None, v) for v in tokens]
else:
parsed.append(Argument(None, tokens.move()))
return parsed
def parse_defaults(doc):
defaults = []
for s in parse_section('options:', doc):
# FIXME corner case "bla: options: --foo"
_, _, s = s.partition(':') # get rid of "options:"
split = re.split('\n[ \t]*(-\S+?)', '\n' + s)[1:]
split = [s1 + s2 for s1, s2 in zip(split[::2], split[1::2])]
options = [Option.parse(s) for s in split if s.startswith('-')]
defaults += options
return defaults
def parse_section(name, source):
pattern = re.compile('^([^\n]*' + name + '[^\n]*\n?(?:[ \t].*?(?:\n|$))*)',
re.IGNORECASE | re.MULTILINE)
return [s.strip() for s in pattern.findall(source)]
def formal_usage(section):
_, _, section = section.partition(':') # drop "usage:"
pu = section.split()
return '( ' + ' '.join(') | (' if s == pu[0] else s for s in pu[1:]) + ' )'
def extras(help, version, options, doc):
if help and any((o.name in ('-h', '--help')) and o.value for o in options):
print(doc.strip("\n"))
sys.exit()
if version and any(o.name == '--version' and o.value for o in options):
print(version)
sys.exit()
class Dict(dict):
def __repr__(self):
return '{%s}' % ',\n '.join('%r: %r' % i for i in sorted(self.items()))
def docopt(doc, argv=None, help=True, version=None, options_first=False):
"""Parse `argv` based on command-line interface described in `doc`.
`docopt` creates your command-line interface based on its
description that you pass as `doc`. Such description can contain
--options, <positional-argument>, commands, which could be
[optional], (required), (mutually | exclusive) or repeated...
Parameters
----------
doc : str
Description of your command-line interface.
argv : list of str, optional
Argument vector to be parsed. sys.argv[1:] is used if not
provided.
help : bool (default: True)
Set to False to disable automatic help on -h or --help
options.
version : any object
If passed, the object will be printed if --version is in
`argv`.
options_first : bool (default: False)
Set to True to require options precede positional arguments,
i.e. to forbid options and positional arguments intermix.
Returns
-------
args : dict
A dictionary, where keys are names of command-line elements
such as e.g. "--verbose" and "<path>", and values are the
parsed values of those elements.
Example
-------
>>> from docopt import docopt
>>> doc = '''
... Usage:
... my_program tcp <host> <port> [--timeout=<seconds>]
... my_program serial <port> [--baud=<n>] [--timeout=<seconds>]
... my_program (-h | --help | --version)
...
... Options:
... -h, --help Show this screen and exit.
... --baud=<n> Baudrate [default: 9600]
... '''
>>> argv = ['tcp', '127.0.0.1', '80', '--timeout', '30']
>>> docopt(doc, argv)
{'--baud': '9600',
'--help': False,
'--timeout': '30',
'--version': False,
'<host>': '127.0.0.1',
'<port>': '80',
'serial': False,
'tcp': True}
See also
--------
* For video introduction see http://docopt.org
* Full documentation is available in README.rst as well as online
at https://github.com/docopt/docopt#readme
"""
argv = sys.argv[1:] if argv is None else argv
usage_sections = parse_section('usage:', doc)
if len(usage_sections) == 0:
raise DocoptLanguageError('"usage:" (case-insensitive) not found.')
if len(usage_sections) > 1:
raise DocoptLanguageError('More than one "usage:" (case-insensitive).')
DocoptExit.usage = usage_sections[0]
options = parse_defaults(doc)
pattern = parse_pattern(formal_usage(DocoptExit.usage), options)
# [default] syntax for argument is disabled
#for a in pattern.flat(Argument):
# same_name = [d for d in arguments if d.name == a.name]
# if same_name:
# a.value = same_name[0].value
argv = parse_argv(Tokens(argv), list(options), options_first)
pattern_options = set(pattern.flat(Option))
for options_shortcut in pattern.flat(OptionsShortcut):
doc_options = parse_defaults(doc)
options_shortcut.children = list(set(doc_options) - pattern_options)
#if any_options:
# options_shortcut.children += [Option(o.short, o.long, o.argcount)
# for o in argv if type(o) is Option]
extras(help, version, argv, doc)
matched, left, collected = pattern.fix().match(argv)
if matched and left == []: # better error message if left?
return Dict((a.name, a.value) for a in (pattern.flat() + collected))
raise DocoptExit()
Binary file not shown.
+1
View File
@@ -0,0 +1 @@
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 2 3 4 5 0 1 35 2 3 4 5 6 7 8 9 10 11 12 13 36 15 1 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 37 38 39 40 41 42 43 44 45 10 11 12 46 15 1 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 60 70 57 71 72 73 64 74 75 53 76 77 78 79 80 81 82 83 70 84 85 86 87 24 88 89 90 51 91 51 92 93 51 94 95 96 97 51 98 99 100 101 102 103 20 88 104 70 105 106 107 108 102 109 110 111 53 112 70 113 114 115 4 116 117 118 119 120 121 51 52 122 123 124 125 126 127 128 129 102 130 131 51 132 133 93 102 134 135 136 88 74 137 138 93 139 140 141 51 142 20 88 143 67 144 145 146 147 148 149 150 151 152 128 153 154 155 10 11 12 156 157 158 159 20 160 20 161 162 163 164 165 166 167 168 20 88 169 93 4 170 171 172 173 174 175 93 176 51 88 177 152 178 179 180 93 181 182 183 184 185 186 4 166 187 128 188 93 189 178 190 191 192 193 185 194 137 195 20 196 197 198 199 200 201 202 93 111 203 70 49 204 205 53 206 207 125 181 208 209 210 211 20 212 93 213 214 215 216 93 217 218 139 219 220 221 181 222 181 223 51 224 225 226 227 228 229 230 231 181 178 232 233 234 64 235 236 20 237 51 238 239 53 240 20 69 241 139 53 242 102 243 149 244 181 245 126 246 247 248 249 244 250 251 139 248 252 253 254 236 230 255 178 256 257 93 258 181 259 260 20 225 261 102 262 263 67 264 53 109 234 53 265 20 266 93 267 236 268 230 53 269 270 271 272 236 70 273 274 187 178 275 126 276 277 51 278 279 67 280 51 281 53 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 48 297 298 102 299 300 301 69 302 303 128 304 305 306 307 308 309 20 310 311 20 312 313 314 315 93 316 230 317 318 319 149 320 321 226 322 323 324 325 326 20 53 327 152 64 143 328 329 330 49 181 331 332 93 258 181 333 334 335 336 337 338 149 185 339 123 226 340 341 342 271 343 344 270 185 285 345 346 4 347 15 1 348 349 93 350 307 351 102 352 51 353 354 20 355 51 53 356 51 53 357 149 358 51 288 359 360 361 362 363 20 64 364 93 20 365 366 67 100 367 368 369 93 370 20 371 372 93 185 373 287 70 374 375 20 376 377 378 379 380 381 382 69 383 236 93 384 385 236 152 181 174 20 386 93 20 387 388 389 137 390 391 51 392 20 69 393 389 144 394 395 93 258 396 397 398 399 400 93 401 70 402 403 404 389 405 187 128 406 288 169 407 408 53 409 410 2 411 412 413 414 178 415 178 416 93 178 417 4 418 332 93 419 51 420 421 236 93 422 423 93 137 424 51 425 426 64 427 428 171 51 429 128 430 20 431 432 128 433 51 88 434 435 436 93 437 438 139 439 440 198 288 441 146 442 93 220 443 444 445 53 446 447 448 449 288 450 451 51 452 236 453 454 455 456 24 69 457 236 458 459 460 181 461 70 462 187 128 463 93 464 2 465 466 88 467 67 468 4 469 93 470 51 88 471 472 48 137 473 474 270 475 287 167 476 67 477 288 478 479 480 181 481 482 483 288 481 484 485 51 285 287 357 20 486 93 258 51 285 487 357 4 488 489 20 88 149 490 491 362 126 53 492 493 494 215 495 51 496 20 497 187 53 498 51 499 500 501 322 502 285 100 287 347 51 189 503 403 504 505 506 507 508 10 11 12 156 157 509 510 51 511 93 512 513 200 514 365 515 516 388 185 285 517 518 53 519 93 285 520 521 522 523 230 70 524 525 93 526 20 527 146 528 291 529 230 530 20 531 469 532 49 533 534 328 83 93 535 380 536 230 537 61 487 51 249 123 538 539 102 540 67 541 70 542 20 543 544 545 546 67 137 547 548 549 20 137 550 51 365 515 93 185 137 551 552 67 553 554 20 555 556 557 554 558 51 559 560 561 144 562 563 69 564 565 566 567 53 568 569 67 570 521 53 571 572 53 573 215 169 574 572 20 88 575 67 576 577 578 214 20 579 580 225 88 581 582 583 220 88 584 102 585 200 234 88 586 93 587 588 589 187 88 590 51 181 591 592 234 593 185 594 20 69 595 2 596 318 597 598 181 599 600 601 93 602 152 479 149 603 604 171 20 605 606 93 607 51 178 260 608 217 609 20 610 93 418 611 612 613 67 137 614 615 258 288 616 181 617 93 288 618 67 285 619 287 620 621 368 622 623 328 624 20 625 626 24 53 113 627 628 186 288 629 630 612 631 93 632 181 633 634 612 635 149 288 636 637 178 638 20 639 362 88 640 641 93 642 20 643 644 645 646 88 647 20 627 455 3 4 648 93 128 649 20 650 20 651 652 646 653 128 654 200 649 20 328 655 656 657 658 659 15 1 660 661 93 217 662 663 288 664 665 93 666 667 53 668 185 669 288 670 671 93 672 673 674 93 675 53 676 51 677 678 88 679 455 680 681 93 682 683 684 181 685 686 178 687 688 207 178 689 20 450 690 181 691 20 692 51 693 694 93 695 70 449 20 696 697 93 698 215 699 236 125 700 691 701 185 702 703 236 704 276 705 612 126 53 617 706 146 215 707 93 708 24 709 710 181 711 288 712 20 713 714 295 715 126 53 716 717 67 718 719 53 720 721 722 93 581 139 86 320 64 723 724 67 137 725 726 727 149 53 728 53 146 729 93 730 53 146 728 362 93 137 731 187 732 149 733 729 24 734 226 735 736 737 738 20 69 149 739 362 740 93 741 67 144 119 742 185 144 743 288 744 368 745 20 88 746 344 185 747 521 119 748 67 61 88 749 70 750 236 751 752 93 753 93 347 53 754 328 755 293 287 756 187 318 757 758 139 759 149 760 102 761 362 580 187 762 149 285 487 763 704 320 181 332 764 49 577 765 20 766 226 3Line truncated
+417
View File
@@ -0,0 +1,417 @@
CHARLES BAUDELAIRE
Les Fleurs du Mal
AVEC UNE ÉTUDE
SUR LA VIE ET LES OEUVRES DE BAUDELAIRE
Par CAMILLE VERGNIOL
Illustrations de TONY GEORGE-ROUX
Gravées par CH. CLÉMENT
PARIS
LIBRAIRIE ALPHONSE LEMERRE
^3'53> po-^^^tge Choiseul, 2}-^^
Les Fleurs du Mal
CHARLES BAUDELAIRE
f'f
Les Fleurs du Mal
AVEC UNE ÉTUDE
SUR LA VIE ET LES ŒUVRES DE BAUDELAIRE
Par CAMILLE VERGNIOL
Illustrations de TONY GEORGE-ROUX
Gravées par CH. CLÉMENT
PARIS
LIBRAIRIE ALPHONSE LEMERRE
23-33, PASSAGE CHOISEUL, 23-33
fh
Uf-^ 689502
51 ia.5-,p
LA VIE ET L'OEUVRE DE BAUDELAIRE
Charles-Pierre Baudelaire est né à Paris le
9 avril 182 1 . Son père avait 62 ans; sa mère, 27.
Il perdit son père en 1 827. L'an d'après, sa mère épousa
le commandant Aupick. Celui-ci, nommé lieutenant-
colonel, puis général en i8]o (il devait être, par la
suite, ambassadeur à Constantinople, à Londres et à
Madrid), alla tenir garnison à Lyon. L'enfant fut mis
au collège de la ville, en qualité d'interne. Interne
également au lycée Louis-le-Grand, lorsque le général,
en bon crédit auprès du duc d'Orléans, eut été rap-
pelé à Paris (1836). Charles souffrit ce que souffrent
les enfants au sang vif, à l'imagination ardente et au
cœur tendre, dont la mère se remarie et qui sont
tenus à l'écart de la famille. Il a écrit plus tard :
« ... Batailles avec les professeurs... Lourde mclan-
LA VIE ET L OEUVRE
colie... Sentiment de solitude, de destinée éternelle-
ment solitaire. Cependant, goût très vif de la vie et du
plaisir... » Élève médiocre, peu laborieux et rebelle
à la discipline, avec des élans brefs et un enthou-
siasme fragile, il montre du goût pour les lettres et
fait des vers. Des camarades (mais il faut se défier de
souvenirs notés après vingt ou trente ans, et lorsque
l'objet en est devenu célèbre) le dépeignent comme
ce un esprit exalté, plein parfois de mysticisme et par-
fois d'une immoralité et d'un cynisme qui dépassaient
toute mesure..., un excentrique, un cerveau à l'en-
vers ». D'autres témoignages prouvent qu'il tint un
des premiers rangs dans sa classe, — de façon à justi-
fier le mot de son beau-père qui le présentait au
proviseur: « Voici un cadeau que je viens vous faire.
Voici un' élève qui vous fera honneur... »; — qu'il
emporta des succès scolaires, et même un second
prix de vers latins au Concours général. Il quitta le
lycée dans le courant de 1839, et peut-être — puis-
qu'il le dit, mais sans détails — en fut-il renvoyé,
pour des causes que l'on devine, à cet âge. Il obtint
à grand'peine le baccalauréat. Tout ceci ne marque
pas une rare originalité.
La suite n'est guère moins banale. Baudelaire fré-
quente, au quartier latin, selon son goût, parmi les
obscurs cénacles littéraires. 11 connaît Leconte de
Lisle, Gérard de Nerval, L. Ménard, etc., et déclare
qu'il veut, lui aussi, « être auteur ». Cette belle réso-
lution achève de le brouiller avec sa famille. Le géné-
ral est un honnête homme et même un brave homme.
Sa femme affirme qu' « il adorait Charles ». C'est
beaucoup dire, sans doute ; mais il ne l'a point du tout
DE BAUDELAIRE III
négligé et rudoyé. 11 prétendait, au contraire, à s'oc-
cuper de lui, à le pousser, à le faire « arriver à une
haute position sociale », digne de sa naissance et de
ses relations. Il fut donc fort déçu et irrité de cette
résistance et il n'avait pas en vain l'habitude de l'auto-
rité militaire. M""* Aupick aime tendrement son fils, —
et l'aimera toujours, — avec un peu de pitié et de
crainte. Mais elle se plie docilement à l'influence de
son mari; elle a l'âme bourgeoise et même fonction-
naire, l'esprit assez court, et indigent en somme. Elle
mène, elle veut pour les siens une vie régulière. Alors,
le conflit ordinaire. Les parents, humiliés, blessés,
courroucés des goûts, des amitiés et des desseins du
jeune homme et tâchant à l'en détourner, — et celui-ci
s'obstinant et se raidissant à mesure, opposant sa
<£ vocation » à tous les conseils de prudence, toutes
les exhortations à la sagesse pratique. Piques et dis-
putes qui s'enveniment. Puis, après une scène plus
violente, et toute conciliation jugée impossible, le
grand moyen. On forme une petite pacotille à Charles,
— mis, d'abord, aux arrêts par son beau-père, — on
l'embarque sur un navire en partance pour les Iles et
l'Inde. Les voyages forment la jeunesse. Il verra du
pays et reviendra à la raison (1841). Baudelaire se
laissa embarquer mais n'alla pas très loin. Il montra
une telle force d'inertie, un si morne ennui, une si
invincible obstination à ne pas faire de commerce, et
même à ne rien faire du tout, hormis de la « littéra-
ture », que le capitaine marchand profita d'une
relâche à Saint-Denis de Bourbon pour le renvoyer à
Bordeaux (mai 1842). Cette aventure ne fut pas tout
à fait inutile. Elle fournit quelques souvenirs, quel-
i.
LA VIE ET L OEUVRE
ques images à Baudelaire, et suscita peut-être, ou
servit, ses goûts d'exotisme. Mais il ne fit qu'entrevoir
le Tropique et ne vit jamais l'Inde, quoi qu'il en ait dit
et affecté de dire plus tard. La nostalgie qu'il marquait
de ces pays merveilleux est purement imaginaire.
Le général et M™' Aupick reconnurent qu'il n'y
avait rien à faire. Charles était majeur, au reste. Il
entra en possession de l'héritage paternel, environ
yf.ooofr. Il se trouvait maître enfin de se livrer à ses
goûts et il se croyait riche. Il habite quai de Béthune,
rue Vaneau, quai d'Anjou, à l'hôtel Pimodan (qui a
repris, aujourd'hui, son nom d'hôtel Lauzun), où le
rencontra Gautier. Il n'eut jamais le désir ni le sens
d'une vie stable, ni de la maison. Il changea quelque
cinquante fois de logement, et, vers la fin, passait
presque toute la journée au café ou dans la rue,
et allait demander asile, pour la nuit, à un ami. Mais,
dans l'instant, il jouit de son luxe. Les brocanteurs
lui ont composé un mobilier disparate, somptueux et
affligeant*, avec force « objets d'art » de rencontre,
camelote et bric-à-brac, à des prix dignes d'un fils de
famille et jeune poète bien rente. Il se compose lui-
même une tête, un costume et une attitude. Il ne peut
pas s'empêcher d'être fort gentil garçon. Le portrait
de Deroy, commenté par le bon Gautier % montre
une taille moyenne, bien prise et robuste, un large
front bien modelé, « une peau ambrée, des yeux de
velours », la bouche fine et ironique, de longs che-
1. Voir la Préface de Gautier aux Fleurs du Mal, et les Souvenirs
de Théodore de Banville.
2. Voir aussi les Lettres ou Souvenirs de Le Vavasscur, E. Prarond,
Hignard, etc.
DE BAUDELAIRE
veux crespelés et d'un noir chatoyant, une barbe
légère et frisée. Dans le vêtement, il poursuit une
élégance laborieuse et indiscrète: l'habit ample et
flottant, le gilet à quinze boutons, la cravate aux
nuances éclatantes et négligemment nouée sous un col
rabattu, des escarpins ouverts comme des mules de
petite maîtresse, un chapeau de soie à bords vastes et
plats, en forme de cône tronqué et haut d'une coudée,
— ce fameux chapeau auquel il demeura fidèle, —
car l'on pense bien que le costume varia plus d'une
fois, et l'habit, par exemple, devint un paletot-sac,
une sorte de blouse, non moins notoire que le cha-
peau. Il soignait particulièrement le linge, blanc,
souple et fin, qui devait être sa suprême coquetterie.
Il se flattait ainsi d'avoir « le déshabillé le plus habillé
et l'habillé le plus déshabillé », et se proposait pour
modèle « Byron, habillé par Brummel ». Aussi bien,
c'est l'époque de son « dandysme », physique et
moral. Il a été pauvre, il a subi une gêne fort voisine
de la misère ; il n'a jamais été bohème. Il avait la
bohème en horreur, — vie, tenue et style, et tout
le débraillé. Le Dandy n'est pas seulement pour lui
l'être supérieur, qui doit « aspirer au sublime », et,
pour cela, « ne rien faire, car être un homme utile
est quelque chose de hideux ». Le Dandy est tout
l'opposé des oc autres hommes de lettres, pour la plu-
part vils piocheurs très ignorants ». Il s'évertue donc
à se distinguer encore des hommes de lettres, par son
attitude et son langage. Des gestes brefs, une parole
lente, une voix grave, qui débite paisiblement des
mots choisis et précieux ; une politesse calculée,
raffinée, quasi cérémonieuse, qui fuit tout éclat et
VI LA VIE ET L OEUVRE
tout excès. Tout cela est un peu ridicule et bien
puéril, mais pas beaucoup plus que les moeurs du
temps, où les artistes et les écrivains avaient grand
soin de se séparer du commun, par n'importe quel
moyen. Tout cela, au reste, n'empêchait pas Baude-
laire d'avoir vingt-cinq ans. Il ne peut se contraindre
assez, ou assez longtemps, pour refouler toujours le
naturel. Il mène la vie qui lui plaît. II est jeune, il a de
l'entrain, il est gai. Il aime les longues promenades
en joyeuse compagnie; il aime les controverses esthé-
tiques, où il écoute plus qu'il ne parle ; il aime les
bons repas à la Tour d'Argent, ou sous les tonnelles
des guinguettes de banlieue. Il fait des vers, sans
autre dessein et autre joie que d'en faire, car il ne
les publie pas, et, toujours modeste, ou discret, ou
mystérieux, il ne les lit, « d'une voix monotone et
impérieuse », que si on l'en prie avec instances.
Mais on sait qu'il a une vingtaine de pièces, qu'il
retouche et polit sans cesse. Il est heureux (1842-45-).
Ce bonheur ne dura guère. En deux ans, Baudelaire
avait dissipé plus de la moitié de son patrimoine. Il fût
mort de faim plutôt que de demander aide à sa fa-
mille. Mais le général Aupick, qui triomphait d'avoir
trop prévu ce qui arrivait, lui infligea un conseil judi-
ciaire (le brave, l'excellent homme quefutM'Ancelle).
Le poète vécut dès lors du maigre revenu d'une tren-
taine de mille francs, toujours écorné ou dépensé par
avance, auquel s'ajoutent le produit plus maigre en-
core de sa plume*, et, sur la fin, les sommes assez
I. Vers 186), faisant le calcul de ce que lui avaient rapporté ses
œuvres, — vers et prose, — il n'arrivait pas à 15.000 fr. Il n'a
jamais sollicité d'emploi, ni de sinécures. Mais on le voit demander
DE BAUDELAIRE VII
fortes que lui fit tenir, assez souvent, sa mère. C'est
la gêne, et ce sera bientôt le dénûment, que n'allège,
ni ne dissimule, la fierté qui les porte. Baudelaire se
débat parmi les emprunts, billets, protêts, rongé par
les usuriers. Sa correspondance est toute pleine de
ces luttes. Mais comme ses besoins sont modiques, —
et qu'en dépit de son dandysme et de ses artifices
il a gardé un fonds d'ordre et de décence bourgeoise,
— il s'accommode de cette indigence. En vingt ans, il
ne dépasse pas dix mille francs de dettes, avec le
constant souci et le très sincère désir de les payer,
sans tarder. Il a d'autres misères et d'autres tares. Il
s'est acoquiné avec Jeanne Duval, — la Vénus noire,
— dénuée de tout charme et agrément apparents,
sotte, fausse et méchante. Elle le trompe à la journée,
elle lui tire tout l'argent qu'elle peut; il la méprise et
la rudoie, mais il lui revient toujours, soit qu'il la
prenne avec lui, soit qu'il paye ses mois d'hôpital. Sa
santé s'altère. A vingt-sept ans, les tempes se dénudent
et s'argentent; — et, quant au moral, il essaie — ou
fait semblant — de se suicider. Pourtant, il travaille.
Il a le goût de l'art, formé dans les ateliers de l'hôtel
Pimodan, des connaissances techniques, un joli talent
d'amateur, fantasque et macabre. Il publie un Salon
en 1845', ce qui lui vaut d'entrer au Corsaire, où il
donne des chroniques et des fantaisies, justement
dignes d'oubli. Entre temps, il ajoute quelques pièces
ou quelques vers à son volume, qui s'appelle, à ce
moment, les Limbes. Il semble donc en bonne voie.
de petites avances à la Société des Gens de Lettres : 100 fr., — 80,
— deux louis, — et avec force excuses et promesses. Quelle
pitié 1 •
VIII LAVIEETL OEUVRE
Mais non. La Révolution de 1848 le jette dans la poli-
tique, et, du premier coup, il va à l'extrême, naturel-
lement. Lui qui, l'année précédente, flétrissait le parti
républicain comme « l'ennemi acharné des Beaux-
Arts et des Belles-Lettres », il traverse une crise
aiguë de démocratie, à forme socialo-humanitaire. Il
se lie avec Proudhon, fraye avec les innombrables
tribuns de réunions publiques. Aux journées de Fé-
vrier, des amis le voient mêlé à la foule qui pille les
boutiques d'armuriers, brandissant un fusil à deux
coups, « pour tuer le général Aupick ». D'autres le
rencontrent au Palais-Royal, où il gesticule, tonne,
prêche la banqueroute et réclame a la mort des
tyrans ». Ce dernier propos est possible, le premier
certain. L'accès dure assez longtemps pour le lancer
dans les velléités électorales et les campagnes de
presse. En 185'!, il rédige un journal de Châteauroux,
et voici le début de son premier article: « Lorsque
Marat, cet homme doux, et Robespierre, cet homme
propre, demandaient, celui-là, 300.000 têtes, celui-ci,
la permanence de la guillotine, ils obéissaient à l'iné-
luctable logique de leur système... » Les abonnés
blêmissent, braves gens qui ne savaient pas ce que
c'est que mystifier le lecteur. Baudelaire fut congédié
sur l'heure, ravi de cette bonne plaisanterie, et guéri,
non seulement de la politique, mais de la démocratie.
Il sauta à l'autre bord, et ne cessa plus de proclamer
son horreur et sa haine de la République, de la libre
pensée, de l'humanitarisme, « toute cette sottise et
cette canaille ». Au surplus, « il se f... du genre hu-
main ». Il finit par se reconnaître et déclarer catho-
lique et grand admirateur des Jésuites. Il fut catholi-
DE BAUDELAIRE IX
que de la même façon qu'il avait été démocrate.
Mais, à la différence de la République, la religion —
et non pas du tout la foi — devait lui fournir des
souvenirs et des sensations, que l'on retrouve — sans
plus — dans son œuvre.
De cette crise, il tomba dans une autre. — « En
1846-47, dit-il, j'eus connaissance de quelques frag-
ments d'Edgar Poe. J'éprouvai une commotion singu-
lière. Je trouvai — croyez-moi, si vous voulez —
des poèmes et des nouvelles dont j'avais eu la pensée,
mais vague et confuse, mal ordonnée, et que Poe avait
su combiner et mener à la perfection... » Il en conçut
une admiration frénétique. Il se voua tout entier à la
gloire de Poe, impatient de le révéler au public,
comme un bonheur et un bienfait. Il en devient exact
et ponctuel. Il travaille assidûment. C'est la seule
période où il ait travaillé, le seul sujet qui l'ait fait
travailler, et jusqu'à la fin. Traduction excellente,
tant les deux hommes — Poe, avec une imagination
bien autrement riche et puissante — sont en parfaite
communion de goûts et de sensations. Il savait l'anglais
dès l'enfance. Pour se rendre mieux maître du texte,
pour s'assimiler le savoureux dialecte populaire, il
allait l'apprendre dans les tavernes anglaises, buvant
le gin et le whisky avec les grooms et les lads. Il est
payé de sa ferveur, car cette traduction l'a mis en
vue. 11 place, de divers côtés, des articles de critique
et des Petits Poèmes en Prose. En i8f6, la Revue des
Deux-Mondes publie dix-huit poésies. Oh ! choisies
parmi les moins pernicieuses, avec toute sorte de
réserves et d'atténuations qui frisent le désaveu! Mais
cet acte de hardiesse — car ce n'est rien de moins
LA VIE ET L OEUVRE