forked from fediversity/fediversity
		
	split content types into separate files
This commit is contained in:
		
							parent
							
								
									04fef22dc3
								
							
						
					
					
						commit
						836ceb846a
					
				
					 7 changed files with 178 additions and 158 deletions
				
			
		|  | @ -10,12 +10,8 @@ in | |||
|         menu.label = "Consortium"; | ||||
|         menu.items = map (page: { inherit page; }) (with pages; [ nlnet oid tweag nordunet ]); | ||||
|       } | ||||
|       { | ||||
|         page = pages.fediversity; | ||||
|       } | ||||
|       { | ||||
|         page = pages.grants; | ||||
|       } | ||||
|       { page = pages.fediversity; } | ||||
|       { page = pages.grants; } | ||||
|     ]; | ||||
|   }; | ||||
| } | ||||
|  |  | |||
							
								
								
									
										35
									
								
								website/structure/article.nix
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								website/structure/article.nix
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,35 @@ | |||
| { config, options, lib, ... }: | ||||
| let | ||||
|   inherit (lib) | ||||
|     mkOption | ||||
|     types | ||||
|     ; | ||||
|   cfg = config; | ||||
| in | ||||
| { | ||||
|   content-types. article = { config, collection, ... }: { | ||||
|     imports = [ cfg.content-types.page ]; | ||||
|     options = { | ||||
|       collection = mkOption { | ||||
|         description = "Collection this article belongs to"; | ||||
|         type = options.collections.type.nestedTypes.elemType; | ||||
|         default = collection; | ||||
|       }; | ||||
|       date = mkOption { | ||||
|         description = "Publication date"; | ||||
|         type = with types; str; | ||||
|         default = null; | ||||
|       }; | ||||
|       author = mkOption { | ||||
|         description = "Page author"; | ||||
|         type = with types; either str (nonEmptyListOf str); | ||||
|         default = null; | ||||
|       }; | ||||
|     }; | ||||
|     config.name = lib.slug config.title; | ||||
|     # TODO: this should be covered by the TBD `link` function instead, | ||||
|     #       taking a historical list of collection names into account | ||||
|     config.outPath = "${collection.name}/${lib.head config.locations}"; | ||||
|     config.outputs.html = lib.mkForce (cfg.templates.html.article cfg config); | ||||
|   }; | ||||
| } | ||||
|  | @ -1,151 +0,0 @@ | |||
| { config, lib, options, ... }: | ||||
| let | ||||
|   inherit (lib) | ||||
|     mkOption | ||||
|     types | ||||
|     ; | ||||
|   cfg = config; | ||||
| in | ||||
| { | ||||
|   options = { | ||||
|     content-types = mkOption { | ||||
|       description = "Content types"; | ||||
|       type = with types; attrsOf deferredModule; | ||||
|     }; | ||||
|   }; | ||||
|   config.content-types = { | ||||
|     document = { name, config, link, ... }: { | ||||
|       config._module.args.link = config.link; | ||||
|       options = { | ||||
|         name = mkOption { | ||||
|           description = "Symbolic name, used as a human-readable identifier"; | ||||
|           type = types.str; | ||||
|           default = name; | ||||
|         }; | ||||
|         # TODO: reconsider using `page.outPath` and what to put into `locations`. | ||||
|         #       maybe we can avoid having ".html" suffixes there. | ||||
|         #       since templates can output multiple files, `html` is merely one of many things we *could* produce. | ||||
|         # TODO: make `apply` configurable so one can programmatically modify locations | ||||
|         locations = mkOption { | ||||
|           description = '' | ||||
|             List of historic output locations for the resulting file | ||||
| 
 | ||||
|             The first element is the canonical location. | ||||
|             All other elements are used to create redirects to the canonical location. | ||||
|           ''; | ||||
|           type = with types; nonEmptyListOf str; | ||||
|         }; | ||||
|         link = mkOption { | ||||
|           description = "Helper function for transparent linking to other pages"; | ||||
|           type = with types; functionTo str; | ||||
|           default = target: with lib; relativePath (head config.locations) (head target.locations); | ||||
|         }; | ||||
|         # TODO: may not need it when using `link`; could repurpose it to render the default template | ||||
|         outPath = mkOption { | ||||
|           description = '' | ||||
|             Location of the page, used for transparently creating links | ||||
|           ''; | ||||
|           type = types.str; | ||||
|           default = lib.head config.locations; | ||||
|         }; | ||||
|         outputs = mkOption { | ||||
|           description = '' | ||||
|             Representations of the document in different formats | ||||
|           ''; | ||||
|           type = with types; attrsOf str; | ||||
|         }; | ||||
|       }; | ||||
|     }; | ||||
|     page = { name, config, ... }: { | ||||
|       imports = [ cfg.content-types.document ]; | ||||
|       options = { | ||||
|         title = mkOption { | ||||
|           description = "Page title"; | ||||
|           type = types.str; | ||||
|           default = name; | ||||
|         }; | ||||
|         description = mkOption { | ||||
|           description = '' | ||||
|             One-sentence description of page contents | ||||
|           ''; | ||||
|           type = types.str; | ||||
|         }; | ||||
|         summary = mkOption { | ||||
|           description = '' | ||||
|             One-paragraph summary of page contents | ||||
|           ''; | ||||
|           type = types.str; | ||||
|         }; | ||||
|         body = mkOption { | ||||
|           description = '' | ||||
|             Page contents in CommonMark | ||||
|           ''; | ||||
|           type = types.str; | ||||
|         }; | ||||
|       }; | ||||
|       config.outputs.html = cfg.templates.html.page cfg config; | ||||
|     }; | ||||
| 
 | ||||
|     article = { config, collection, ... }: { | ||||
|       imports = [ cfg.content-types.page ]; | ||||
|       options = { | ||||
|         collection = mkOption { | ||||
|           description = "Collection this article belongs to"; | ||||
|           type = options.collections.type.nestedTypes.elemType; | ||||
|           default = collection; | ||||
|         }; | ||||
|         date = mkOption { | ||||
|           description = "Publication date"; | ||||
|           type = with types; str; | ||||
|           default = null; | ||||
|         }; | ||||
|         author = mkOption { | ||||
|           description = "Page author"; | ||||
|           type = with types; either str (nonEmptyListOf str); | ||||
|           default = null; | ||||
|         }; | ||||
|       }; | ||||
|       config.name = lib.slug config.title; | ||||
|       # TODO: this should be covered by the TBD `link` function instead, | ||||
|       #       taking a historical list of collection names into account | ||||
|       config.outPath = "${collection.name}/${lib.head config.locations}"; | ||||
|       config.outputs.html = lib.mkForce (cfg.templates.html.article cfg config); | ||||
|     }; | ||||
| 
 | ||||
|     named-link = { ... }: { | ||||
|       options = { | ||||
|         label = mkOption { | ||||
|           description = "Link label"; | ||||
|           type = types.str; | ||||
|         }; | ||||
|         url = mkOption { | ||||
|           description = "Link URL"; | ||||
|           type = types.str; | ||||
|         }; | ||||
|       }; | ||||
|     }; | ||||
| 
 | ||||
|     navigation = { name, ... }: { | ||||
|       options = { | ||||
|         name = mkOption { | ||||
|           description = "Symbolic name, used as a human-readable identifier"; | ||||
|           type = types.str; | ||||
|           default = name; | ||||
|         }; | ||||
|         label = mkOption { | ||||
|           description = "Menu label"; | ||||
|           type = types.str; | ||||
|           default = name; | ||||
|         }; | ||||
|         items = mkOption { | ||||
|           description = "List of menu items"; | ||||
|           type = with types; listOf (attrTag { | ||||
|             menu = mkOption { type = submodule cfg.content-types.navigation; }; | ||||
|             page = mkOption { type = submodule cfg.content-types.page; }; | ||||
|             link = mkOption { type = submodule cfg.content-types.named-link; }; | ||||
|           }); | ||||
|         }; | ||||
|       }; | ||||
|     }; | ||||
|   }; | ||||
| } | ||||
|  | @ -7,7 +7,12 @@ let | |||
|   cfg = config; | ||||
| in | ||||
| { | ||||
|   imports = [ ./content-types.nix ]; | ||||
|   imports = lib.nixFiles ./.; | ||||
| 
 | ||||
|   options.content-types = mkOption { | ||||
|     description = "Content types"; | ||||
|     type = with types; attrsOf deferredModule; | ||||
|   }; | ||||
| 
 | ||||
|   # TODO: enable i18n, e.g. via a nested attribute for language-specific content | ||||
|   options.pages = mkOption { | ||||
|  |  | |||
							
								
								
									
										51
									
								
								website/structure/document.nix
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								website/structure/document.nix
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,51 @@ | |||
| { lib, ... }: | ||||
| let | ||||
|   inherit (lib) | ||||
|     mkOption | ||||
|     types | ||||
|     ; | ||||
| in | ||||
| { | ||||
|   content-types.document = { name, config, link, ... }: { | ||||
|     config._module.args.link = config.link; | ||||
|     options = { | ||||
|       name = mkOption { | ||||
|         description = "Symbolic name, used as a human-readable identifier"; | ||||
|         type = types.str; | ||||
|         default = name; | ||||
|       }; | ||||
|       # TODO: reconsider using `page.outPath` and what to put into `locations`. | ||||
|       #       maybe we can avoid having ".html" suffixes there. | ||||
|       #       since templates can output multiple files, `html` is merely one of many things we *could* produce. | ||||
|       # TODO: make `apply` configurable so one can programmatically modify locations | ||||
|       locations = mkOption { | ||||
|         description = '' | ||||
|           List of historic output locations for the resulting file | ||||
| 
 | ||||
|           The first element is the canonical location. | ||||
|           All other elements are used to create redirects to the canonical location. | ||||
|         ''; | ||||
|         type = with types; nonEmptyListOf str; | ||||
|       }; | ||||
|       link = mkOption { | ||||
|         description = "Helper function for transparent linking to other pages"; | ||||
|         type = with types; functionTo str; | ||||
|         default = target: with lib; relativePath (head config.locations) (head target.locations); | ||||
|       }; | ||||
|       # TODO: may not need it when using `link`; could repurpose it to render the default template | ||||
|       outPath = mkOption { | ||||
|         description = '' | ||||
|           Location of the page, used for transparently creating links | ||||
|         ''; | ||||
|         type = types.str; | ||||
|         default = lib.head config.locations; | ||||
|       }; | ||||
|       outputs = mkOption { | ||||
|         description = '' | ||||
|           Representations of the document in different formats | ||||
|         ''; | ||||
|         type = with types; attrsOf str; | ||||
|       }; | ||||
|     }; | ||||
|   }; | ||||
| } | ||||
							
								
								
									
										45
									
								
								website/structure/navigation.nix
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								website/structure/navigation.nix
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,45 @@ | |||
| { config, lib, ... }: | ||||
| let | ||||
|   inherit (lib) | ||||
|     mkOption | ||||
|     types | ||||
|     ; | ||||
|   cfg = config; | ||||
| in | ||||
| { | ||||
|   content-types.named-link = { ... }: { | ||||
|     options = { | ||||
|       label = mkOption { | ||||
|         description = "Link label"; | ||||
|         type = types.str; | ||||
|       }; | ||||
|       url = mkOption { | ||||
|         description = "Link URL"; | ||||
|         type = types.str; | ||||
|       }; | ||||
|     }; | ||||
|   }; | ||||
| 
 | ||||
|   content-types.navigation = { name, ... }: { | ||||
|     options = { | ||||
|       name = mkOption { | ||||
|         description = "Symbolic name, used as a human-readable identifier"; | ||||
|         type = types.str; | ||||
|         default = name; | ||||
|       }; | ||||
|       label = mkOption { | ||||
|         description = "Menu label"; | ||||
|         type = types.str; | ||||
|         default = name; | ||||
|       }; | ||||
|       items = mkOption { | ||||
|         description = "List of menu items"; | ||||
|         type = with types; listOf (attrTag { | ||||
|           menu = mkOption { type = submodule cfg.content-types.navigation; }; | ||||
|           page = mkOption { type = submodule cfg.content-types.page; }; | ||||
|           link = mkOption { type = submodule cfg.content-types.named-link; }; | ||||
|         }); | ||||
|       }; | ||||
|     }; | ||||
|   }; | ||||
| } | ||||
							
								
								
									
										39
									
								
								website/structure/page.nix
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								website/structure/page.nix
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,39 @@ | |||
| { config, lib, ... }: | ||||
| let | ||||
|   inherit (lib) | ||||
|     mkOption | ||||
|     types | ||||
|     ; | ||||
|   cfg = config; | ||||
| in | ||||
| { | ||||
|   content-types.page = { name, config, ... }: { | ||||
|     imports = [ cfg.content-types.document ]; | ||||
|     options = { | ||||
|       title = mkOption { | ||||
|         description = "Page title"; | ||||
|         type = types.str; | ||||
|         default = name; | ||||
|       }; | ||||
|       description = mkOption { | ||||
|         description = '' | ||||
|           One-sentence description of page contents | ||||
|         ''; | ||||
|         type = types.str; | ||||
|       }; | ||||
|       summary = mkOption { | ||||
|         description = '' | ||||
|           One-paragraph summary of page contents | ||||
|         ''; | ||||
|         type = types.str; | ||||
|       }; | ||||
|       body = mkOption { | ||||
|         description = '' | ||||
|           Page contents in CommonMark | ||||
|         ''; | ||||
|         type = types.str; | ||||
|       }; | ||||
|     }; | ||||
|     config.outputs.html = cfg.templates.html.page cfg config; | ||||
|   }; | ||||
| } | ||||
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 Valentin Gagarin
							Valentin Gagarin