diff --git a/pybadges/__init__.py b/pybadges/__init__.py index 9b56d8b..4bf2075 100644 --- a/pybadges/__init__.py +++ b/pybadges/__init__.py @@ -117,15 +117,22 @@ def badge( right_text: Optional[str] = None, left_link: Optional[str] = None, right_link: Optional[str] = None, + center_link: Optional[str] = None, whole_link: Optional[str] = None, logo: Optional[str] = None, left_color: str = '#555', right_color: str = '#007ec6', + center_color: str = '#555', measurer: Optional[text_measurer.TextMeasurer] = None, - embed_logo: bool = False, - whole_title: Optional[str] = None, left_title: Optional[str] = None, right_title: Optional[str] = None, + center_title: Optional[str] = None, + whole_title: Optional[str] = None, + right_image: Optional[str] = None, + center_image: Optional[str] = None, + embed_logo: bool = False, + embed_right_image: bool = False, + embed_center_image: bool = False, id_suffix: str = '', ) -> str: """Creates a github-style badge as an SVG image. @@ -182,14 +189,25 @@ def badge( measurer = ( precalculated_text_measurer.PrecalculatedTextMeasurer.default()) - if (left_link or right_link) and whole_link: + if (left_link or right_link or center_link) and whole_link: raise ValueError( - 'whole_link may not bet set with left_link or right_link') + 'whole_link may not bet set with left_link, right_link, or center_link' + ) + + if right_image and center_image: + raise ValueError('cannot have both right_image and center_image') + template = _JINJA2_ENVIRONMENT.get_template('badge-template-full.svg') if logo and embed_logo: logo = _embed_image(logo) + if right_image and embed_right_image: + right_image = _embed_image(right_image) + + if center_image and embed_center_image: + center_image = _embed_image(center_image) + right_text_width = None if right_text: right_text_width = measurer.text_width(right_text) / 10.0 @@ -202,12 +220,17 @@ def badge( left_link=left_link, right_link=right_link, whole_link=whole_link, + center_link=center_link, logo=logo, left_color=_NAME_TO_COLOR.get(left_color, left_color), right_color=_NAME_TO_COLOR.get(right_color, right_color), - whole_title=whole_title, + center_color=_NAME_TO_COLOR.get(center_color, center_color), left_title=left_title, right_title=right_title, + center_title=center_title, + whole_title=whole_title, + right_image=right_image, + center_image=center_image, id_suffix=id_suffix, ) xml = minidom.parseString(svg) diff --git a/pybadges/__main__.py b/pybadges/__main__.py index b1a6b76..dcc6c99 100644 --- a/pybadges/__main__.py +++ b/pybadges/__main__.py @@ -39,9 +39,6 @@ def main(): '--right-text', default=None, help='the text to show on the right-hand-side of the badge') - parser.add_argument('--whole-link', - default=None, - help='the url to redirect to when the badge is clicked') parser.add_argument( '--left-link', default=None, @@ -52,6 +49,18 @@ def main(): default=None, help='the url to redirect to when the right-hand of the badge is ' + 'clicked') + parser.add_argument( + '--center-link', + default=None, + help='the url to redirect to when the center of the badge is ' + + 'clicked') + parser.add_argument('--whole-link', + default=None, + help='the url to redirect to when the badge is clicked') + parser.add_argument( + '--logo', + default=None, + help='a URI reference to a logo to display in the badge') parser.add_argument( '--left-color', default='#555', @@ -61,19 +70,9 @@ def main(): default='#007ec6', help='the background color of the right-hand-side of the badge') parser.add_argument( - '--logo', - default=None, - help='a URI reference to a logo to display in the badge') - parser.add_argument( - '--embed-logo', - nargs='?', - type=lambda x: x.lower() in ['y', 'yes', 't', 'true', '1', ''], - const='yes', - default='no', - help='if the logo is specified then include the image data directly in ' - 'the badge (this will prevent a URL fetch and may work around the ' - 'fact that some browsers do not fetch external image references); ' - 'only works if --logo is a HTTP/HTTPS URI or a file path') + '--center-color', + default='#555', + help='the background color of the right-hand-side of the badge') parser.add_argument('--browser', action='store_true', default=False, @@ -91,11 +90,6 @@ def main(): help='the path to the ttf font file containing DejaVu Sans. If not ' + 'present on your system, you can download it from ' + 'https://www.fontsquirrel.com/fonts/dejavu-sans') - parser.add_argument( - '--whole-title', - default=None, - help='the title to associate with the entire badge. See ' - 'https://developer.mozilla.org/en-US/docs/Web/SVG/Element/title') parser.add_argument( '--left-title', default=None, @@ -106,6 +100,54 @@ def main(): default=None, help='the title to associate with the right part of the badge. See ' 'https://developer.mozilla.org/en-US/docs/Web/SVG/Element/title') + parser.add_argument( + '--center-title', + default=None, + help='the title to associate with the center part of the badge. See ' + 'https://developer.mozilla.org/en-US/docs/Web/SVG/Element/title') + parser.add_argument( + '--whole-title', + default=None, + help='the title to associate with the entire badge. See ' + 'https://developer.mozilla.org/en-US/docs/Web/SVG/Element/title') + parser.add_argument( + '--right-image', + default=None, + help='the image to associate with the right-hand side of the badge') + parser.add_argument( + '--center-image', + default=None, + help='the image to associate with the center of the badge') + parser.add_argument( + '--embed-logo', + nargs='?', + type=lambda x: x.lower() in ['y', 'yes', 't', 'true', '1', ''], + const='yes', + default='no', + help='if the logo is specified then include the image data directly in ' + 'the badge (this will prevent a URL fetch and may work around the ' + 'fact that some browsers do not fetch external image references); ' + 'only works if --logo is a HTTP/HTTPS URI or a file path') + parser.add_argument( + '--embed-right-image', + nargs='?', + type=lambda x: x.lower() in ['y', 'yes', 't', 'true', '1', ''], + const='yes', + default='no', + help='if the right image is specified then include the image data directly in ' + 'the badge (this will prevent a URL fetch and may work around the ' + 'fact that some browsers do not fetch external image references); ' + 'only works if --logo is a HTTP/HTTPS URI or a file path') + parser.add_argument( + '--embed-center-image', + nargs='?', + type=lambda x: x.lower() in ['y', 'yes', 't', 'true', '1', ''], + const='yes', + default='no', + help='if the center image is specified then include the image data directly in ' + 'the badge (this will prevent a URL fetch and may work around the ' + 'fact that some browsers do not fetch external image references); ' + 'only works if --logo is a HTTP/HTTPS URI or a file path') parser.add_argument( '-v', '--version', @@ -113,9 +155,9 @@ def main(): version='%(prog)s {version}'.format(version=__version__)) args = parser.parse_args() - if (args.left_link or args.right_link) and args.whole_link: + if (args.left_link or args.right_link or args.center_link) and args.whole_link: print('argument --whole-link: cannot be set with ' + - '--left-link or --right-link', + '--left-link, --right-link, or --center_link', file=sys.stderr) sys.exit(1) @@ -133,15 +175,22 @@ def main(): right_text=args.right_text, left_link=args.left_link, right_link=args.right_link, + center_link=args.center_link, whole_link=args.whole_link, + logo=args.logo, left_color=args.left_color, right_color=args.right_color, - logo=args.logo, + center_color=args.center_color, measurer=measurer, - embed_logo=args.embed_logo, - whole_title=args.whole_title, left_title=args.left_title, - right_title=args.right_title) + right_title=args.right_title, + center_title=args.center_title, + whole_title=args.whole_title, + right_image=args.right_image, + center_image=args.center_image, + embed_logo=args.embed_logo, + embed_right_image=args.embed_right_image, + embed_center_image=args.embed_center_image) if args.browser: _, badge_path = tempfile.mkstemp(suffix='.svg') diff --git a/pybadges/badge-template-full.svg b/pybadges/badge-template-full.svg index cf1743b..fa97090 100644 --- a/pybadges/badge-template-full.svg +++ b/pybadges/badge-template-full.svg @@ -2,6 +2,7 @@ {% set logo_padding = 3 if (logo and left_text) else 0 %} {% set left_width = left_text_width + 10 + logo_width + logo_padding %} {% set right_width = right_text_width + 10 if right_text_width else 0 %} +{% set image_width = 107 if right_image else 0 %} {% set id_smooth = 'smooth' + id_suffix %} {% set id_round = 'round' + id_suffix %} @@ -37,6 +38,9 @@ {% endif %} {{ left_text }} {{ left_text }} + {% if right_image %} + + {% endif %} {% if right_text %} {{ right_text }} {{ right_text }}