Ejemplo n.º 1
0
def get_elements_used_by_template(filename):
    """
    Returns a list of format elements that are called by the given format template.
    The returned elements also give their dependencies on tags.

    Dependencies on tag might be approximative. See get_tags_used_by_element()
    doc string.

    We must handle usage of bfe_field in a special way if we want to retrieve
    used tag: used tag is given in "tag" parameter, not inside element code.

    The list is returned sorted by name::

        [ {'filename':"filename_1.py"
           'name':"filename_1"
           'tags': ['710__a', '920__']
          },
          ...
        ]

    :param filename: a format template filename
    :return: elements sorted by name
    """
    format_elements = {}
    format_template = bibformat_engine.get_format_template(filename=filename, with_attributes=True)
    code = format_template['code']
    format_elements_iter = bibformat_engine.pattern_tag.finditer(code)
    for result in format_elements_iter:
        function_name = result.group("function_name").lower()
        if function_name is not None and function_name not in format_elements \
               and not function_name == "field":
            filename = bibformat_engine.resolve_format_element_filename("BFE_"+function_name)
            if filename is not None:
                tags = get_tags_used_by_element(filename)
                format_elements[function_name] = {'name':function_name.lower(),
                                                  'filename':filename,
                                                  'tags':tags}
        elif function_name == "field":
            # Handle bfe_field element in a special way
            if function_name not in format_elements:
                #Indicate usage of bfe_field if not already done
                filename = bibformat_engine.resolve_format_element_filename("BFE_"+function_name)
                format_elements[function_name] = {'name':function_name.lower(),
                                                  'filename':filename,
                                                  'tags':[]}
            # Retrieve value of parameter "tag"
            all_params = result.group('params')
            function_params_iterator = bibformat_engine.pattern_function_params.finditer(all_params)
            for param_match in function_params_iterator:
                name = param_match.group('param')
                if name == "tag":
                    value = param_match.group('value')
                    if not value in format_elements[function_name]['tags']:
                        format_elements[function_name]['tags'].append(value)
                    break

    keys = format_elements.keys()
    keys.sort()
    return map(format_elements.get, keys)
Ejemplo n.º 2
0
def get_tags_used_by_element(filename):
    """
    Returns a list of tags used by given format element

    APPROXIMATIVE RESULTS: the tag are retrieved in field(), fields()
    and control_field() function. If they are used computed, or saved
    in a variable somewhere else, they are not retrieved
    @TODO: There is room for improvements. For example catch
    call to BibRecord functions.

    :param filename: a format element filename
    :return: tags sorted by value
    """
    tags = {}

    format_element = bibformat_engine.get_format_element(filename)
    if format_element is None:
        return []
    elif format_element['type'] == "field":
        tags = format_element['attrs']['tags']
        return tags

    filename = bibformat_engine.resolve_format_element_filename(filename)
    path = bibformat_engine.get_format_element_path(filename)
    format = open(path, 'r')
    code = format.read()
    format.close
    tags_pattern = re.compile(
        '''
    (field|fields|control_field)\s*       #Function call
    \(\s*                                 #Opening parenthesis
    [\'"]+                                #Single or double quote
    (?P<tag>.+?)                          #Tag
    [\'"]+\s*                             #Single or double quote
    (,[^\)]+)*                            #Additional function param
    \)                                    #Closing parenthesis
     ''', re.VERBOSE | re.MULTILINE)

    tags_iter = tags_pattern.finditer(code)
    for result in tags_iter:
        tags[result.group("tag")] = result.group("tag")

    return tags.values()
Ejemplo n.º 3
0
def get_tags_used_by_element(filename):
    """
    Returns a list of tags used by given format element

    APPROXIMATIVE RESULTS: the tag are retrieved in field(), fields()
    and control_field() function. If they are used computed, or saved
    in a variable somewhere else, they are not retrieved
    @TODO: There is room for improvements. For example catch
    call to BibRecord functions.

    :param filename: a format element filename
    :return: tags sorted by value
    """
    tags = {}

    format_element = bibformat_engine.get_format_element(filename)
    if format_element is None:
        return []
    elif format_element['type']=="field":
        tags = format_element['attrs']['tags']
        return tags

    filename = bibformat_engine.resolve_format_element_filename(filename)
    path = bibformat_engine.get_format_element_path(filename)
    format = open(path, 'r')
    code = format.read()
    format.close
    tags_pattern = re.compile('''
    (field|fields|control_field)\s*       #Function call
    \(\s*                                 #Opening parenthesis
    [\'"]+                                #Single or double quote
    (?P<tag>.+?)                          #Tag
    [\'"]+\s*                             #Single or double quote
    (,[^\)]+)*                            #Additional function param
    \)                                    #Closing parenthesis
     ''', re.VERBOSE | re.MULTILINE)

    tags_iter = tags_pattern.finditer(code)
    for result in tags_iter:
        tags[result.group("tag")] = result.group("tag")

    return tags.values()
Ejemplo n.º 4
0
def get_elements_used_by_template(filename):
    """
    Returns a list of format elements that are called by the given format template.
    The returned elements also give their dependencies on tags.

    Dependencies on tag might be approximative. See get_tags_used_by_element()
    doc string.

    We must handle usage of bfe_field in a special way if we want to retrieve
    used tag: used tag is given in "tag" parameter, not inside element code.

    The list is returned sorted by name::

        [ {'filename':"filename_1.py"
           'name':"filename_1"
           'tags': ['710__a', '920__']
          },
          ...
        ]

    :param filename: a format template filename
    :return: elements sorted by name
    """
    format_elements = {}
    format_template = bibformat_engine.get_format_template(
        filename=filename, with_attributes=True)
    code = format_template['code']
    format_elements_iter = bibformat_engine.pattern_tag.finditer(code)
    for result in format_elements_iter:
        function_name = result.group("function_name").lower()
        if function_name is not None and function_name not in format_elements \
               and not function_name == "field":
            filename = bibformat_engine.resolve_format_element_filename(
                "BFE_" + function_name)
            if filename is not None:
                tags = get_tags_used_by_element(filename)
                format_elements[function_name] = {
                    'name': function_name.lower(),
                    'filename': filename,
                    'tags': tags
                }
        elif function_name == "field":
            # Handle bfe_field element in a special way
            if function_name not in format_elements:
                #Indicate usage of bfe_field if not already done
                filename = bibformat_engine.resolve_format_element_filename(
                    "BFE_" + function_name)
                format_elements[function_name] = {
                    'name': function_name.lower(),
                    'filename': filename,
                    'tags': []
                }
            # Retrieve value of parameter "tag"
            all_params = result.group('params')
            function_params_iterator = bibformat_engine.pattern_function_params.finditer(
                all_params)
            for param_match in function_params_iterator:
                name = param_match.group('param')
                if name == "tag":
                    value = param_match.group('value')
                    if not value in format_elements[function_name]['tags']:
                        format_elements[function_name]['tags'].append(value)
                    break

    keys = format_elements.keys()
    keys.sort()
    return map(format_elements.get, keys)