@@ -58,6 +58,7 @@ class Converter(object):
5858
5959 def __init__ (self , * ,
6060 strings : Optional [Union [str , Sequence [str ]]]= None ,
61+ string_origins : Optional [Union [str , pathlib .Path , Sequence [str ], Sequence [pathlib .Path ]]]= None ,
6162 paths : Optional [Union [str , Sequence [str ], pathlib .Path , Sequence [pathlib .Path ]]]= None ,
6263 no_cache : Optional [bool ]= False ,
6364 cache_path : Optional [Union [str , pathlib .Path ]]= None ,
@@ -80,6 +81,8 @@ def __init__(self, *,
8081 self .session_defaults = session_defaults
8182
8283 if paths is not None and strings is None :
84+ if string_origins is not None :
85+ raise TypeError
8386 if isinstance (paths , str ):
8487 paths = [pathlib .Path (paths )]
8588 elif isinstance (paths , pathlib .Path ):
@@ -135,15 +138,47 @@ def __init__(self, *,
135138 elif not (isinstance (strings , collections .abc .Sequence ) and
136139 strings and all (isinstance (x , str ) for x in strings )):
137140 raise TypeError
141+ string_origins_normalized : Optional [Union [Sequence [str ], Sequence [pathlib .Path ]]]
142+ if string_origins is None :
143+ string_origins_normalized = None
144+ elif isinstance (string_origins , str ) or isinstance (string_origins , pathlib .Path ):
145+ string_origins_normalized = [string_origins ]
146+ elif (isinstance (string_origins , collections .abc .Sequence ) and string_origins and
147+ (all (isinstance (x , str ) for x in string_origins ) or all (isinstance (x , pathlib .Path ) for x in string_origins ))):
148+ string_origins_normalized = string_origins
149+ else :
150+ raise TypeError
151+
138152 # Normalize newlines, as if read from file with universal newlines
139- origin_strings = [io .StringIO (s , newline = None ).read () or '\n ' for s in strings ]
140- if len (strings ) == 1 :
141- origin_names = ['<string>' ]
153+ origin_strings = []
154+ for s in strings :
155+ if '\r ' in s :
156+ origin_strings .append (io .StringIO (s , newline = None ).read () or '\n ' )
157+ else :
158+ origin_strings .append (s or '\n ' )
159+ if string_origins_normalized is not None :
160+ origin_names = []
161+ self .raw_origin_paths = []
162+ self .expanded_origin_paths = {}
163+ cwd_path = pathlib .Path ('.' ).absolute ()
164+ for string_origin in string_origins_normalized :
165+ string_origin_path = pathlib .Path (string_origin )
166+ try :
167+ string_origin_rel_path = string_origin_path .relative_to (cwd_path )
168+ except ValueError :
169+ string_origin_rel_path = string_origin_path
170+ origin_name = string_origin_rel_path .as_posix ()
171+ origin_names .append (origin_name )
172+ self .raw_origin_paths .append (string_origin_path )
173+ self .expanded_origin_paths [origin_name ] = string_origin_path
142174 else :
143- origin_names = ['<string({0})>' .format (n + 1 ) for n in range (len (strings ))]
175+ if len (strings ) == 1 :
176+ origin_names = ['<string>' ]
177+ else :
178+ origin_names = ['<string({0})>' .format (n + 1 ) for n in range (len (strings ))]
179+ self .raw_origin_paths = None
180+ self .expanded_origin_paths = None
144181 self .origins = collections .OrderedDict (zip (origin_names , origin_strings ))
145- self .raw_origin_paths = None
146- self .expanded_origin_paths = None
147182 if from_format is None :
148183 raise TypeError ('Document format is required' )
149184 if self .from_formats is not None and from_format not in self .from_formats :
0 commit comments