shortcodes should return content, not output directly