| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 | <%!  import re  import hashlib  def calc_to_filter(path):    return '\\'.join(path.split('/')[:-1])%>\<%def name="get_repo_root(proj)">${'$(SolutionDir)\..'}</%def>\<%def name="to_windows_path(path)">${path.replace('/','\\')}</%def>\<%def name="to_filter(path)">${calc_to_filter(path)}</%def>\<%def name="filter_to_guid(proj, filter)">${re.sub('(........)(....)(....)(....)', r'\1-\2-\3-\4-', hashlib.md5(''.join([filter, proj])).hexdigest())}</%def>\<%def name="gen_filters(name, collection)">\% for project in vsprojects:  % if project.name == name:<?xml version="1.0" encoding="utf-8"?><Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">  % if project.get('src',[]):  <ItemGroup>    % for src_name in project.src:    <ClCompile Include="${get_repo_root(project)}\${to_windows_path(src_name)}">      <Filter>${to_filter(src_name)}</Filter>    </ClCompile>    % endfor  </ItemGroup>  % endif  % if project.get('dll_def', None):  <ItemGroup>    <None Include="${get_repo_root(project)}\${to_windows_path(project.dll_def)}" />  </ItemGroup>  % endif  % if project.get('public_headers',[]):  <ItemGroup>    % for public_header in project.public_headers:    <ClInclude Include="${get_repo_root(project)}\${to_windows_path(public_header)}">      <Filter>${to_filter(public_header)}</Filter>    </ClInclude>    % endfor  </ItemGroup>  % endif  % if project.get('headers',[]):  <ItemGroup>    % for header in project.headers:    <ClInclude Include="${get_repo_root(project)}\${to_windows_path(header)}">      <Filter>${to_filter(header)}</Filter>    </ClInclude>    % endfor  </ItemGroup>  % endif<%  filters = set()  files = project.get('src', []) + project.get('public_headers', []) + project.get('headers', [])  for file in files:    filter = calc_to_filter(file)    paths = filter.split('\\')    for i in range(len(paths)):      filters.add('\\'.join(paths[:i + 1]))  filters = sorted(filters)%>  <ItemGroup>  % for filter in filters:    <Filter Include="${filter}">      <UniqueIdentifier>{${filter_to_guid(project.name, filter)}}</UniqueIdentifier>    </Filter>  % endfor  </ItemGroup></Project>  % endif% endfor</%def>\
 |