Badgeyay is a simple badge generator that aims for promoting an open-source tool for generation of badges in PDF format. The project has options to choose from predefined set of images or upload a background image. User can choose from set of fonts and color of the same. But now Badgeyay also has option to choose custom font-size in generation of badges.
To implement font size feature, first, the component that is determining the font of the label has to be identified. The label that determines the text on the badge is the <text> label and within it, the label that determines the properties of the text is <tspan>. So mainly we need to alter the properties in the tspan.
The property that determines the font size for the badge is font-size and its default value is set to 31.25 px. If the property in the labels changed, then we can see the corresponding changes in the PDF generated from the svg.
Now the challenges were:
- To Determine the font value from the frontend.
- Using the same for the font-config.
- Changing the built svg accordingly.
Procedure
- Firstly frontend component has to be changed to incorporate a slider to give input for the variable font size. So a range input is inserted with range from 15 px to 45 px and default as 30 px. The size_print label gets changed dynamically to show the value selected from the range slider.
<li> <input type="radio" name="fontsize" id="font-size-picker"> Choose font size </li> <section id="font-size-input" style="display:none;"> <label for="inputFile" id="size_print"></label> <div> <input type="range" id="font-size" max=45 min=15 step=5 value=30 class="form-control" name="font_size"> </div> </section>
- After adding the component, form script is changed to add toggle behaviour to the button. For adding the toggling behaviour in the component, checkbox is used and the value of the label is updated dynamically as the slider value is changed.
$("#size_print").text($("#font-size").val() + " px"); $("#font-size-picker").click(function () { if ($(this).is(":checked")) { $("#font-size-input").css("display", "block"); } else { $("#font-size-input").css("display", "none"); } }); $("#font-size").on('input', function () { $("#size_print").text($(this).val() + " px"); });
- After completing the work on the frontend, it is necessary to modify the backend too. The method for choosing custom font has to be refactored. It now checks whether the custom font is set or font size variable is set, and creates a config file for fonts which after use gets deleted.
font_config = {} # custom font is specified if custom_font != '': font_config['font'] = custom_font if font_size != '': font_config['font_size'] = font_size if custom_font != '' or font_size != '': json_str = json.dumps(font_config) print(json_str) f = open(os.path.join(app.config['UPLOAD_FOLDER'], 'fonts.json'), "w+") f.write(json_str) f.close()
- The generator class is modified as well to accommodate the changes, by adding a new class attribute called font_size. We find the keys in the dict object loaded from the file and assign the same to class attribute.
if 'font_size' in self.DATA.keys(): self.font_size = self.DATA['font_size']
- Make the necessary change in the svg, so that font size change can be represented in the generated PDF. Replace the old font size with the new font size specified.
if self.font_size: content = content.replace("font-size:31.25px", "font-size:" + str(self.font_size) + "px")
- After all the changes, badge generated will have a different font size.
The Pull request for the above change is at this Link
Topics Involved
Working on this Issue (Link) involve following topics:
- SVG Label manipulation
- Sending data from Ember frontend to Backend.
- Javascript for the toggle radio button.