Date: prev next · Thread: first prev next last
2013 Archives by date, by thread · List index


Hi,

I have submitted a patch for review:

    https://gerrit.libreoffice.org/2762

To pull it, you can do:

    git pull ssh://gerrit.libreoffice.org:29418/core refs/changes/62/2762/1

first crack at writing a linter for .ui files

Change-Id: I51fd2b426e3292647ca618bf867d22275d7ed4fd
---
A bin/lint-ui.py
1 file changed, 89 insertions(+), 0 deletions(-)



diff --git a/bin/lint-ui.py b/bin/lint-ui.py
new file mode 100755
index 0000000..0c8a9ac
--- /dev/null
+++ b/bin/lint-ui.py
@@ -0,0 +1,89 @@
+#!/usr/bin/env python3
+#
+# This file is part of the LibreOffice project.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, you can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Takes a LibreOffice .ui file and provides linting tips for maintaining
+# a consistent look for dialogs
+
+import sys
+import xml.etree.ElementTree as ET
+
+DEFAULT_WARNING_STR = 'Lint assertion failed'
+
+POSSIBLE_TOP_LEVEL_WIDGETS = ['GtkDialog', 'GtkBox', 'GtkFrame', 'GtkGrid']
+IGNORED_TOP_LEVEL_WIDGETS = ['GtkAdjustment', 'GtkImage', 'GtkListStore', 'GtkSizeGroup', 
'GtkMenu', 'GtkTextBuffer']
+BORDER_WIDTH = '6'
+BUTTON_BOX_SPACING = '12'
+ALIGNMENT_TOP_PADDING = '6'
+
+def lint_assert(predicate, warning=DEFAULT_WARNING_STR):
+    if not predicate:
+        print("    * " + warning)
+
+def check_top_level_widget(element):
+    # check widget type
+    widget_type = element.attrib['class']
+    lint_assert(widget_type in POSSIBLE_TOP_LEVEL_WIDGETS,
+                "Top level widget should be 'GtkDialog', 'GtkFrame', 'GtkBox', or 'GtkGrid'")
+
+    # check border_width property
+    border_width_properties = element.findall("property[@name='border_width']")
+    if len(border_width_properties) < 1:
+        lint_assert(False, "No border_width set on top level widget. Should probably be " + 
BORDER_WIDTH)
+    if len(border_width_properties) == 1:
+        border_width = border_width_properties[0]
+        lint_assert(border_width.text == BORDER_WIDTH,
+                    "Top level 'border_width' property should be " + BORDER_WIDTH)
+
+def check_button_box_spacing(element):
+    spacing = element.findall("property[@name='spacing']")[0]
+    lint_assert(spacing.text == BUTTON_BOX_SPACING,
+                "Button box 'spacing' should be " + BUTTON_BOX_SPACING)
+
+def check_frames(root):
+    frames = [element for element in root.findall('.//object') if element.attrib['class'] == 
'GtkFrame']
+    for frame in frames:
+        frame_alignments = frame.findall("./child/object[@class='GtkAlignment']")
+        assert len(frame_alignments) <= 1
+        if len(frame_alignments) < 1:
+            lint_assert(False, "No GtkAlignment in GtkFrame with id = '" + frame.attrib['id'] + 
"'")
+        if len(frame_alignments) == 1:
+            alignment = frame_alignments[0]
+            check_alignment_top_padding(alignment)
+
+def check_alignment_top_padding(alignment):
+    top_padding_properties = alignment.findall("./property[@name='top_padding']")
+    assert len(top_padding_properties) <= 1
+    if len(top_padding_properties) < 1:
+        lint_assert(False, "No GtkAlignment 'top_padding' set. Should probably be " + 
ALIGNMENT_TOP_PADDING)
+    if len(top_padding_properties) == 1:
+        top_padding = top_padding_properties[0]
+        lint_assert(top_padding.text == ALIGNMENT_TOP_PADDING,
+                    "GtkAlignment 'top_padding' should be " + ALIGNMENT_TOP_PADDING)
+
+def main():
+    print(" == " + sys.argv[1] + " ==")
+    tree = ET.parse(sys.argv[1])
+    root = tree.getroot()
+
+    top_level_widgets = [element for element in root.findall('object') if element.attrib['class'] 
not in IGNORED_TOP_LEVEL_WIDGETS]
+    assert len(top_level_widgets) == 1
+
+    top_level_widget = top_level_widgets[0]
+    check_top_level_widget(top_level_widget)
+
+    # TODO - only do this if we have a GtkDialog?
+    # check button box spacing
+    button_box = top_level_widget.findall("child[@id='dialog-vbox1']")
+    if len(button_box) > 0:
+        element = button_box[0]
+        check_button_box_spacing(element)
+
+    check_frames(root)
+
+if __name__ == "__main__":
+    main()

-- 
To view, visit https://gerrit.libreoffice.org/2762
To unsubscribe, visit https://gerrit.libreoffice.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I51fd2b426e3292647ca618bf867d22275d7ed4fd
Gerrit-PatchSet: 1
Gerrit-Project: core
Gerrit-Branch: master
Gerrit-Owner: Jack Leigh <leighman@gmx.se>


Context


Privacy Policy | Impressum (Legal Info) | Copyright information: Unless otherwise specified, all text and images on this website are licensed under the Creative Commons Attribution-Share Alike 3.0 License. This does not include the source code of LibreOffice, which is licensed under the Mozilla Public License (MPLv2). "LibreOffice" and "The Document Foundation" are registered trademarks of their corresponding registered owners or are in actual use as trademarks in one or more countries. Their respective logos and icons are also subject to international copyright laws. Use thereof is explained in our trademark policy.