195640e3a20adea634b4df4ccf8c93f411184c438joi@chromium.org#!/usr/bin/env python
295640e3a20adea634b4df4ccf8c93f411184c438joi@chromium.org# Copyright (c) 2012 The Chromium Authors. All rights reserved.
301b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org# Use of this source code is governed by a BSD-style license that can be
401b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org# found in the LICENSE file.
501b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
601b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org''' Toolbar postprocessing class. Modifies the previously processed GRD tree
701b3bc768461bd303bff39f8cd1663682254e407joi@chromium.orgby creating separate message groups for each of the IDS_COMMAND macros.
801b3bc768461bd303bff39f8cd1663682254e407joi@chromium.orgAlso adds some identifiers nodes to declare specific ids to be included
901b3bc768461bd303bff39f8cd1663682254e407joi@chromium.orgin the generated grh file.
1001b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org'''
1101b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
1201b3bc768461bd303bff39f8cd1663682254e407joi@chromium.orgimport postprocess_interface
1301fadb72b6e94e6511eaffd1874a8cc095f098a7joi@chromium.orgfrom grit import lazy_re
1401b3bc768461bd303bff39f8cd1663682254e407joi@chromium.orgimport grit.node.empty
1501b3bc768461bd303bff39f8cd1663682254e407joi@chromium.orgfrom grit.node import misc
1601b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
1701b3bc768461bd303bff39f8cd1663682254e407joi@chromium.orgclass ToolbarPostProcessor(postprocess_interface.PostProcessor):
1801b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org  ''' Defines message groups within the grd file for each of the
1901b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org  IDS_COMMAND stuff.
2001b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org  '''
2101b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
2201fadb72b6e94e6511eaffd1874a8cc095f098a7joi@chromium.org  _IDS_COMMAND = lazy_re.compile(r'IDS_COMMAND_')
2301fadb72b6e94e6511eaffd1874a8cc095f098a7joi@chromium.org  _GRAB_PARAMETERS = lazy_re.compile(
2401fadb72b6e94e6511eaffd1874a8cc095f098a7joi@chromium.org      r'(IDS_COMMAND_[a-zA-Z0-9]+)_([a-zA-z0-9]+)')
2501b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
2601b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org  def Process(self, rctext, rcpath, grdnode):
2701b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    ''' Processes the data in rctext and grdnode.
2801b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    Args:
2901b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org      rctext: string containing the contents of the RC file being processed.
3001b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org      rcpath: the path used to access the file.
3101b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org      grdnode: the root node of the grd xml data generated by
3201b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org      the rc2grd tool.
3301b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
3401b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    Return:
3501b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org      The root node of the processed GRD tree.
3601b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    '''
3701b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
3801b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    release = grdnode.children[2]
3901b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    messages = release.children[2]
4001b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
4101b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    identifiers = grit.node.empty.IdentifiersNode()
4201b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    identifiers.StartParsing('identifiers', release)
4301b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    identifiers.EndParsing()
4401b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    release.AddChild(identifiers)
4501b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
4601b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
4701b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    #
4801b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    # Turn the IDS_COMMAND messages into separate message groups
4901b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    # with ids that are offsetted to the message group's first id
5001b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    #
5101b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    previous_name_attr = ''
5201b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    previous_prefix = ''
5301b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    previous_node = ''
5401b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    new_messages_node = self.ConstructNewMessages(release)
5501b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    for node in messages.children[:]:
5601b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org      name_attr = node.attrs['name']
5701b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org      if self._IDS_COMMAND.search(name_attr):
5801b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org        mo = self._GRAB_PARAMETERS.search(name_attr)
5901b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org        mp = self._GRAB_PARAMETERS.search(previous_name_attr)
6001b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org        if mo and mp:
6101b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org          prefix = mo.group(1)
6201b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org          previous_prefix = mp.group(1)
6301b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org          new_message_id = mp.group(2)
6401b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org          if prefix == previous_prefix:
6501b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org            messages.RemoveChild(previous_name_attr)
6601b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org            previous_node.attrs['offset'] = 'PCI_' + new_message_id
6701b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org            del previous_node.attrs['name']
6801b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org            new_messages_node.AddChild(previous_node)
6901b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org          else:
7001b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org            messages.RemoveChild(previous_name_attr)
7101b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org            previous_node.attrs['offset'] = 'PCI_' + new_message_id
7201b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org            del previous_node.attrs['name']
7301b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org            new_messages_node.AddChild(previous_node)
7401b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org            new_messages_node.attrs['first_id'] = previous_prefix
7501b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org            new_messages_node = self.ConstructNewMessages(release)
7601b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org        else:
7701b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org          if self._IDS_COMMAND.search(previous_name_attr):
7801b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org            messages.RemoveChild(previous_name_attr)
7901b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org            previous_prefix = mp.group(1)
8001b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org            new_message_id = mp.group(2)
8101b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org            previous_node.attrs['offset'] = 'PCI_' + new_message_id
8201b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org            del previous_node.attrs['name']
8301b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org            new_messages_node.AddChild(previous_node)
8401b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org            new_messages_node.attrs['first_id'] = previous_prefix
8501b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org            new_messages_node = self.ConstructNewMessages(release)
8601b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org      else:
8701b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org        if self._IDS_COMMAND.search(previous_name_attr):
8801b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org          messages.RemoveChild(previous_name_attr)
8901b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org          mp = self._GRAB_PARAMETERS.search(previous_name_attr)
9001b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org          previous_prefix = mp.group(1)
9101b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org          new_message_id = mp.group(2)
9201b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org          previous_node.attrs['offset'] = 'PCI_' + new_message_id
9301b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org          del previous_node.attrs['name']
9401b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org          new_messages_node.AddChild(previous_node)
9501b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org          new_messages_node.attrs['first_id'] = previous_prefix
9601b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org          new_messages_node = self.ConstructNewMessages(release)
9701b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org      previous_name_attr = name_attr
9801b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org      previous_node = node
9901b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
10001b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
10101b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    self.AddIdentifiers(rctext, identifiers)
10201b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    return grdnode
10301b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
10401b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org  def ConstructNewMessages(self, parent):
10501b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    new_node = grit.node.empty.MessagesNode()
10601b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    new_node.StartParsing('messages', parent)
10701b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    new_node.EndParsing()
10801b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    parent.AddChild(new_node)
10901b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    return new_node
11001b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
11101b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org  def AddIdentifiers(self, rctext, node):
11201b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    node.AddChild(misc.IdentifierNode.Construct(node, 'IDS_COMMAND_gcFirst', '12000', ''))
11301b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    node.AddChild(misc.IdentifierNode.Construct(node,
11401b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org                                                'IDS_COMMAND_PCI_SPACE', '16', ''))
11501b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    node.AddChild(misc.IdentifierNode.Construct(node, 'PCI_BUTTON', '0', ''))
11601b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    node.AddChild(misc.IdentifierNode.Construct(node, 'PCI_MENU', '1', ''))
11701b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    node.AddChild(misc.IdentifierNode.Construct(node, 'PCI_TIP', '2', ''))
11801b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    node.AddChild(misc.IdentifierNode.Construct(node, 'PCI_OPTIONS_TEXT', '3', ''))
11901b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    node.AddChild(misc.IdentifierNode.Construct(node, 'PCI_TIP_DISABLED', '4', ''))
12001b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    node.AddChild(misc.IdentifierNode.Construct(node, 'PCI_TIP_MENU', '5', ''))
12101b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    node.AddChild(misc.IdentifierNode.Construct(node, 'PCI_TIP_MENU_DISABLED', '6', ''))
12201b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    node.AddChild(misc.IdentifierNode.Construct(node, 'PCI_TIP_OPTIONS', '7', ''))
12301b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    node.AddChild(misc.IdentifierNode.Construct(node, 'PCI_TIP_OPTIONS_DISABLED', '8', ''))
12401b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    node.AddChild(misc.IdentifierNode.Construct(node,
12501b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org                                                'PCI_TIP_DISABLED_BY_POLICY', '9', ''))
12601b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
127