Skip to content
Projeler
Gruplar
Parçacıklar
Yardım
Yükleniyor...
Oturum aç / Kaydol
Gezinmeyi değiştir
C
cpython
Proje
Proje
Ayrıntılar
Etkinlik
Cycle Analytics
Depo (repository)
Depo (repository)
Dosyalar
Kayıtlar (commit)
Dallar (branch)
Etiketler
Katkıda bulunanlar
Grafik
Karşılaştır
Grafikler
Konular (issue)
0
Konular (issue)
0
Liste
Pano
Etiketler
Kilometre Taşları
Birleştirme (merge) Talepleri
0
Birleştirme (merge) Talepleri
0
CI / CD
CI / CD
İş akışları (pipeline)
İşler
Zamanlamalar
Grafikler
Paketler
Paketler
Wiki
Wiki
Parçacıklar
Parçacıklar
Üyeler
Üyeler
Collapse sidebar
Close sidebar
Etkinlik
Grafik
Grafikler
Yeni bir konu (issue) oluştur
İşler
Kayıtlar (commit)
Konu (issue) Panoları
Kenar çubuğunu aç
Batuhan Osman TASKAYA
cpython
Commits
8988fb23
Kaydet (Commit)
8988fb23
authored
Eyl 30, 1995
tarafından
Guido van Rossum
Dosyalara gözat
Seçenekler
Dosyalara Gözat
İndir
Eposta Yamaları
Sade Fark
Initial revision
üst
c0e68d1e
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
223 additions
and
0 deletions
+223
-0
mailcap.py
Lib/mailcap.py
+223
-0
No files found.
Lib/mailcap.py
0 → 100644
Dosyayı görüntüle @
8988fb23
# Mailcap file handling. See RFC 1524.
import
os
import
string
import
tempfile
# Part 1: top-level interface.
def
getcaps
():
caps
=
{}
for
mailcap
in
listmailcapfiles
():
try
:
fp
=
open
(
mailcap
,
'r'
)
except
:
continue
morecaps
=
readmailcapfile
(
fp
)
fp
.
close
()
for
key
in
morecaps
.
keys
():
if
not
caps
.
has_key
(
key
):
caps
[
key
]
=
morecaps
[
key
]
else
:
caps
[
key
]
=
caps
[
key
]
+
morecaps
[
key
]
return
caps
def
listmailcapfiles
():
# XXX Actually, this is Unix-specific
if
os
.
environ
.
has_key
(
'MAILCAPS'
):
str
=
os
.
environ
[
'MAILCAPS'
]
mailcaps
=
string
.
splitfields
(
str
,
':'
)
else
:
if
os
.
environ
.
has_key
(
'HOME'
):
home
=
os
.
environ
[
'HOME'
]
else
:
# Don't bother with getpwuid()
home
=
'.'
# Last resort
mailcaps
=
[
home
+
'/.mailcap'
,
'/etc/mailcap'
,
'/usr/etc/mailcap'
,
'/usr/local/etc/mailcap'
]
return
mailcaps
# Part 2: the parser.
def
readmailcapfile
(
fp
):
caps
=
{}
while
1
:
line
=
fp
.
readline
()
if
not
line
:
break
# Ignore comments and blank lines
if
line
[
0
]
==
'#'
or
string
.
strip
(
line
)
==
''
:
continue
nextline
=
line
# Join continuation lines
while
nextline
[
-
2
:]
==
'
\\\n
'
:
nextline
=
fp
.
readline
()
if
not
nextline
:
nextline
=
'
\n
'
line
=
line
[:
-
2
]
+
nextline
# Parse the line
key
,
fields
=
parseline
(
line
)
if
not
(
key
and
fields
):
cotinue
# Normalize the key
types
=
string
.
splitfields
(
key
,
'/'
)
for
j
in
range
(
len
(
types
)):
types
[
j
]
=
string
.
strip
(
types
[
j
])
key
=
string
.
lower
(
string
.
joinfields
(
types
,
'/'
))
# Update the database
if
caps
.
has_key
(
key
):
caps
[
key
]
.
append
(
fields
)
else
:
caps
[
key
]
=
[
fields
]
return
caps
def
parseline
(
line
):
fields
=
[]
i
,
n
=
0
,
len
(
line
)
while
i
<
n
:
field
,
i
=
parsefield
(
line
,
i
,
n
)
fields
.
append
(
field
)
i
=
i
+
1
# Skip semicolon
if
len
(
fields
)
<
2
:
return
None
,
None
key
,
view
,
rest
=
fields
[
0
],
fields
[
1
],
fields
[
2
:]
fields
=
{
'view'
:
view
}
for
field
in
rest
:
i
=
string
.
find
(
field
,
'='
)
if
i
<
0
:
fkey
=
field
fvalue
=
""
else
:
fkey
=
string
.
strip
(
field
[:
i
])
fvalue
=
string
.
strip
(
field
[
i
+
1
:])
if
fields
.
has_key
(
fkey
):
# Ignore it
pass
else
:
fields
[
fkey
]
=
fvalue
return
key
,
fields
def
parsefield
(
line
,
i
,
n
):
start
=
i
while
i
<
n
:
c
=
line
[
i
]
if
c
==
';'
:
break
elif
c
==
'
\\
'
:
i
=
i
+
2
else
:
i
=
i
+
1
return
string
.
strip
(
line
[
start
:
i
]),
i
# Part 3: using the database.
def
findmatch
(
caps
,
type
,
key
=
'view'
,
filename
=
"/dev/null"
,
plist
=
[]):
entries
=
lookup
(
caps
,
type
,
key
)
for
e
in
entries
:
if
e
.
has_key
(
'test'
):
test
=
subst
(
e
[
'test'
],
filename
,
plist
)
if
test
and
os
.
system
(
test
)
!=
0
:
continue
command
=
subst
(
e
[
key
],
type
,
filename
,
plist
)
return
command
,
e
return
None
,
None
def
lookup
(
caps
,
type
,
key
=
None
):
entries
=
[]
if
caps
.
has_key
(
type
):
entries
=
entries
+
caps
[
type
]
types
=
string
.
splitfields
(
type
,
'/'
)
type
=
types
[
0
]
+
'/*'
if
caps
.
has_key
(
type
):
entries
=
entries
+
caps
[
type
]
if
key
is
not
None
:
entries
=
filter
(
lambda
e
,
key
=
key
:
e
.
has_key
(
key
),
entries
)
return
entries
def
subst
(
field
,
type
,
filename
,
plist
=
[]):
# XXX Actually, this is Unix-specific
res
=
''
i
,
n
=
0
,
len
(
field
)
while
i
<
n
:
c
=
field
[
i
];
i
=
i
+
1
if
c
<>
'
%
'
:
if
c
==
'
\\
'
:
c
=
field
[
i
:
i
+
1
];
i
=
i
+
1
res
=
res
+
c
else
:
c
=
field
[
i
];
i
=
i
+
1
if
c
==
'
%
'
:
res
=
res
+
c
elif
c
==
's'
:
res
=
res
+
filename
elif
c
==
't'
:
res
=
res
+
type
elif
c
==
'{'
:
start
=
i
while
i
<
n
and
field
[
i
]
<>
'}'
:
i
=
i
+
1
name
=
field
[
start
:
i
]
i
=
i
+
1
res
=
res
+
findparam
(
name
,
plist
)
# XXX To do:
# %n == number of parts if type is multipart/*
# %F == list of alternating type and filename for parts
else
:
res
=
res
+
'
%
'
+
c
return
res
def
findparam
(
name
,
plist
):
name
=
string
.
lower
(
name
)
+
'='
n
=
len
(
name
)
for
p
in
plist
:
if
string
.
lower
(
p
[:
n
])
==
name
:
return
p
[
n
:]
return
''
# Part 4: test program.
def
test
():
import
sys
caps
=
getcaps
()
if
not
sys
.
argv
[
1
:]:
show
(
caps
)
return
for
i
in
range
(
1
,
len
(
sys
.
argv
),
2
):
args
=
sys
.
argv
[
i
:
i
+
2
]
if
len
(
args
)
<
2
:
print
"usage: mailcap [type file] ..."
return
type
=
args
[
0
]
file
=
args
[
1
]
command
,
e
=
findmatch
(
caps
,
type
,
'view'
,
file
)
if
not
command
:
print
"No viewer found for"
,
type
else
:
print
"Executing:"
,
command
sts
=
os
.
system
(
command
)
if
sts
:
print
"Exit status:"
,
sts
def
show
(
caps
):
print
"Mailcap files:"
for
fn
in
listmailcapfiles
():
print
"
\t
"
+
fn
print
if
not
caps
:
caps
=
getcaps
()
print
"Mailcap entries:"
print
ckeys
=
caps
.
keys
()
ckeys
.
sort
()
for
type
in
ckeys
:
print
type
entries
=
caps
[
type
]
for
e
in
entries
:
keys
=
e
.
keys
()
keys
.
sort
()
for
k
in
keys
:
print
"
%-15
s"
%
k
,
e
[
k
]
print
if
__name__
==
'__main__'
:
test
()
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment