mod markdown; use crate::markdown::parse_markdown; use proc_macro2::{Ident, Span}; use quote::quote; use syn::ItemFn; macro_rules! file_path { ($($key:expr => $value:expr),*) => { { vec![ $( ($key, include_str!($value)), )* ] } } } #[proc_macro] pub fn include_md(_token_stream: proc_macro::TokenStream) -> proc_macro::TokenStream { let file_list = file_path! { "DevelopmentComponentsMdPage" => "../docs/_guide/development/components.md", "InstallationMdPage" => "../docs/_guide/installation.md", "ServerSiderRenderingMdPage" => "../docs/_guide/server_sider_rendering.md", "AccordionMdPage" => "../../thaw/src/accordion/docs/mod.md", // "AlertMdPage" => "../docs/alert/mod.md", "AnchorMdPage" => "../../thaw/src/anchor/docs/mod.md", "AutoCompleteMdPage" => "../../thaw/src/auto_complete/docs/mod.md", "AvatarMdPage" => "../../thaw/src/avatar/docs/mod.md", "BackTopMdPage" => "../../thaw/src/back_top/docs/mod.md", "BadgeMdPage" => "../../thaw/src/badge/docs/mod.md", "BreadcrumbMdPage" => "../../thaw/src/breadcrumb/docs/mod.md", "ButtonMdPage" => "../../thaw/src/button/docs/mod.md", "CalendarMdPage" => "../../thaw/src/calendar/docs/mod.md", "CardMdPage" => "../../thaw/src/card/docs/mod.md", "CheckboxMdPage" => "../../thaw/src/checkbox/docs/mod.md", "ColorPickerMdPage" => "../../thaw/src/color_picker/docs/mod.md", "ComboboxMdPage" => "../../thaw/src/combobox/docs/mod.md", "ConfigProviderMdPage" => "../../thaw/src/config_provider/docs/mod.md", "DatePickerMdPage" => "../../thaw/src/date_picker/docs/mod.md", "DialogMdPage" => "../../thaw/src/dialog/docs/mod.md", "DividerMdPage" => "../../thaw/src/divider/docs/mod.md", "DrawerMdPage" => "../../thaw/src/drawer/docs/mod.md", "GridMdPage" => "../../thaw/src/grid/docs/mod.md", "IconMdPage" => "../../thaw/src/icon/docs/mod.md", "ImageMdPage" => "../docs/image/mod.md", "InputMdPage" => "../docs/input/mod.md", "LayoutMdPage" => "../docs/layout/mod.md", "LoadingBarMdPage" => "../docs/loading_bar/mod.md", "MenuMdPage" => "../docs/menu/mod.md", "MessageBarMdPage" => "../docs/message_bar/mod.md", "NavMdPage" => "../docs/nav/mod.md", "PaginationMdPage" => "../../thaw/src/pagination/docs/mod.md", "PopoverMdPage" => "../docs/popover/mod.md", "ProgressBarMdPage" => "../docs/progress_bar/mod.md", "RadioMdPage" => "../docs/radio/mod.md", "ScrollbarMdPage" => "../docs/scrollbar/mod.md", "SkeletonMdPage" => "../docs/skeleton/mod.md", "SliderMdPage" => "../docs/slider/mod.md", "SpaceMdPage" => "../docs/space/mod.md", "SpinButtonMdPage" => "../docs/spin_button/mod.md", "SpinnerMdPage" => "../docs/spinner/mod.md", "SwitchMdPage" => "../docs/switch/mod.md", "TabListMdPage" => "../docs/tab_list/mod.md", "TableMdPage" => "../docs/table/mod.md", "TagMdPage" => "../docs/tag/mod.md", "TextMdPage" => "../docs/text/mod.md", "TextareaMdPage" => "../docs/textarea/mod.md", "TimePickerMdPage" => "../docs/time_picker/mod.md", "ToastMdPage" => "../docs/toast/mod.md", "UploadMdPage" => "../docs/upload/mod.md" }; let mut fn_list = vec![]; for (fn_name, file_str) in file_list { let fn_name = Ident::new(fn_name, Span::call_site()); let (body, demos, toc) = match parse_markdown(file_str) { Ok(body) => body, Err(err) => { return quote!(compile_error!(#err)).into(); } }; let toc = { let links = toc .into_iter() .map(|h| format!(r##""##, h.0, h.1)) .collect::>() .join(" "); let toc = format!( r##"#[component] fn Toc() -> impl IntoView {{ view! {{ {} }} }}"##, links ); syn::parse_str::(&toc) .expect(&format!("Cannot be resolved as a function: \n {toc}")) }; let demos: Vec = demos .into_iter() .enumerate() .map(|(index, demo)| { format!( "#[component] fn Demo{}() -> impl IntoView {{ {} }}", index + 1, demo ) }) .map(|demo| { syn::parse_str::(&demo) .unwrap_or_else(|_| panic!("Cannot be resolved as a function: \n {demo}")) }) .collect(); fn_list.push(quote! { #[component] pub fn #fn_name() -> impl IntoView { #(#demos)* #toc view! {
#body
} } }); } quote! { #(#fn_list)* } .into() }