From dd922f419ee30a5ecd80629c587b5f3cb976c1cd Mon Sep 17 00:00:00 2001 From: Dylan Verheul Date: Sat, 27 Mar 2021 13:10:41 +0100 Subject: [PATCH] Fix size code --- src/django_bootstrap5/core.py | 27 --------------------------- src/django_bootstrap5/forms.py | 13 +++---------- src/django_bootstrap5/renderers.py | 3 ++- src/django_bootstrap5/size.py | 30 ++++++++++++++++++++++++++++++ 4 files changed, 35 insertions(+), 38 deletions(-) create mode 100644 src/django_bootstrap5/size.py diff --git a/src/django_bootstrap5/core.py b/src/django_bootstrap5/core.py index 36f0c09b..229aecb8 100644 --- a/src/django_bootstrap5/core.py +++ b/src/django_bootstrap5/core.py @@ -2,16 +2,6 @@ from django.conf import settings -from django_bootstrap5.exceptions import BootstrapError -from django_bootstrap5.text import text_value - -SIZE_XS = "xs" -SIZE_SM = "sm" -SIZE_MD = "md" -SIZE_LG = "lg" -SIZES = [SIZE_SM, SIZE_MD, SIZE_LG] -DEFAULT_SIZE = SIZE_MD - BOOTSTRAP5_DEFAULTS = { "css_url": { "url": "https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta2/dist/css/bootstrap.min.css", @@ -94,20 +84,3 @@ def get_form_renderer(**kwargs): def get_field_renderer(**kwargs): renderers = get_bootstrap_setting("field_renderers") return get_renderer(renderers, **kwargs) - - -def parse_size(value, default=None): - """Return size if it is valid, default size if size is empty, or throws exception.""" - size = text_value(value or default) - if size not in SIZES: - valid_sizes = ", ".join(SIZES) - raise BootstrapError(f'Invalid value "{size}" for parameter "size" (valid values are {valid_sizes}).') - return size - - -def get_size_class(size, prefix, *, default=None, skip=None): - """Return CSS class for size with given prefix, unless size needs to be skipped.""" - size = parse_size(size, default=default) - if skip and size in list(skip): - return "" - return f"{prefix}{size}" diff --git a/src/django_bootstrap5/forms.py b/src/django_bootstrap5/forms.py index f6d2d712..cbd61d30 100644 --- a/src/django_bootstrap5/forms.py +++ b/src/django_bootstrap5/forms.py @@ -1,18 +1,11 @@ from django.forms import EmailInput, NumberInput, PasswordInput, Textarea, TextInput, URLInput from django.utils.safestring import mark_safe -from .core import ( - DEFAULT_SIZE, - SIZE_MD, - get_bootstrap_setting, - get_field_renderer, - get_form_renderer, - get_formset_renderer, - get_size_class, -) +from .core import get_bootstrap_setting, get_field_renderer, get_form_renderer, get_formset_renderer from .css import merge_css_classes from .exceptions import BootstrapError from .html import render_tag +from .size import DEFAULT_SIZE, SIZE_MD, get_size_class WRAPPER_CLASS = "" WRAPPER_TAG = "div" @@ -75,7 +68,7 @@ def render_button( ): """Render a button with content.""" attrs = {} - size_class = get_size_class(size, prefix="btn-", skip=SIZE_MD, default=DEFAULT_SIZE) + size_class = get_size_class(size, prefix="btn", skip=SIZE_MD, default=DEFAULT_SIZE) classes = merge_css_classes("btn", button_class, size_class) if button_type: diff --git a/src/django_bootstrap5/renderers.py b/src/django_bootstrap5/renderers.py index 9cabc8b4..cd7e1969 100644 --- a/src/django_bootstrap5/renderers.py +++ b/src/django_bootstrap5/renderers.py @@ -21,10 +21,11 @@ from django.utils.html import conditional_escape, format_html, strip_tags from django.utils.safestring import mark_safe -from .core import DEFAULT_SIZE, SIZE_MD, SIZE_XS, get_bootstrap_setting, get_size_class, parse_size +from .core import get_bootstrap_setting from .css import merge_css_classes from .exceptions import BootstrapError from .forms import WRAPPER_CLASS, WRAPPER_TAG, is_widget_with_placeholder, render_field, render_form, render_label +from .size import DEFAULT_SIZE, SIZE_MD, SIZE_XS, get_size_class, parse_size from .text import text_value from .utils import render_template_file diff --git a/src/django_bootstrap5/size.py b/src/django_bootstrap5/size.py new file mode 100644 index 00000000..d33ee213 --- /dev/null +++ b/src/django_bootstrap5/size.py @@ -0,0 +1,30 @@ +from django_bootstrap5.css import merge_css_classes +from django_bootstrap5.exceptions import BootstrapError +from django_bootstrap5.text import text_value + +SIZE_XS = "xs" +SIZE_SM = "sm" +SIZE_MD = "md" +SIZE_LG = "lg" +SIZES = [SIZE_SM, SIZE_MD, SIZE_LG] +DEFAULT_SIZE = SIZE_MD + + +def parse_size(value, default=None): + """Return size if it is valid, default size if size is empty, or throws exception.""" + size = text_value(value or default) + if size not in SIZES: + valid_sizes = ", ".join(SIZES) + raise BootstrapError(f'Invalid value "{size}" for parameter "size" (valid values are {valid_sizes}).') + return size + + +def get_size_class(size, prefix, *, default=None, skip=None): + """Return CSS class for size with given prefix, unless size needs to be skipped.""" + size = parse_size(size, default=default) + if skip: + if isinstance(skip, str): + skip = merge_css_classes(skip).split(" ") + if size in skip: + return "" + return f"{prefix}-{size}"