mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	Treat Xamarin .workbook files as markdown (#3500)
* Treat Xamarin .workbook files as markdown Xamarin Workbook files are interactive coding documents for C#, serialized as markdown files. They include a YAML front matter header block with some metadata. Interactive code cells are included as `csharp` fenced code blocks. An example can be found here: https://github.com/xamarin/Workbooks/blob/master/csharp/csharp6/csharp6.workbook Treated as markdown, it would appear like so: https://gist.github.com/sandyarmstrong/e331dfeaf89cbce89043a1c31faa1297 * Add .workbook sample Source: https://github.com/xamarin/Workbooks/blob/master/csharp/csharp6/csharp6.workbook
This commit is contained in:
		
				
					committed by
					
						 Colin Seymour
						Colin Seymour
					
				
			
			
				
	
			
			
			
						parent
						
							c98ca20076
						
					
				
				
					commit
					7aeeb82d3d
				
			| @@ -2472,6 +2472,7 @@ Markdown: | |||||||
|   - ".mkdn" |   - ".mkdn" | ||||||
|   - ".mkdown" |   - ".mkdown" | ||||||
|   - ".ron" |   - ".ron" | ||||||
|  |   - ".workbook" | ||||||
|   tm_scope: source.gfm |   tm_scope: source.gfm | ||||||
|   language_id: 222 |   language_id: 222 | ||||||
| Marko: | Marko: | ||||||
|   | |||||||
							
								
								
									
										192
									
								
								samples/Markdown/csharp6.workbook
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										192
									
								
								samples/Markdown/csharp6.workbook
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,192 @@ | |||||||
|  | --- | ||||||
|  | uti: com.xamarin.workbook | ||||||
|  | platforms: | ||||||
|  | - Console | ||||||
|  | --- | ||||||
|  |  | ||||||
|  | # Using C# 6 | ||||||
|  |  | ||||||
|  | Some examples from Xamarin's [intro to C# 6](https://developer.xamarin.com/guides/cross-platform/advanced/csharp_six/). | ||||||
|  |  | ||||||
|  | * Null-conditional operator | ||||||
|  |  | ||||||
|  | * String Interpolation | ||||||
|  |  | ||||||
|  | * Expression-bodied Function Members | ||||||
|  |  | ||||||
|  | * Auto-property Initialization | ||||||
|  |  | ||||||
|  | * Index Initializers | ||||||
|  |  | ||||||
|  | * using static | ||||||
|  |  | ||||||
|  | ## Null-conditional operator | ||||||
|  |  | ||||||
|  | The `?.` operator automatically does a null-check before referencing the | ||||||
|  | specified member. The example string array below has a `null` entry: | ||||||
|  |  | ||||||
|  | ```csharp | ||||||
|  | var names = new string[] { "Foo", null }; | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | In C# 5, a null-check is required before accessing the `.Length` property: | ||||||
|  |  | ||||||
|  | ```csharp | ||||||
|  | // C# 5 | ||||||
|  | int secondLength = 0; | ||||||
|  | if (names[1] != null) | ||||||
|  |   secondLength = names[1].Length; | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | C# 6 allows the length to be queried in a single line; the entire | ||||||
|  | statement returns `null` if any object is null. | ||||||
|  |  | ||||||
|  | ```csharp | ||||||
|  | var length0 = names[0]?.Length; // 3 | ||||||
|  | var length1 = names[1]?.Length; // null | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | This can be used in conjunction with the `??` null coalescing operator | ||||||
|  | to set a default value (such as `0`) in the example below: | ||||||
|  |  | ||||||
|  | ```csharp | ||||||
|  | var lengths = names.Select (names => names?.Length ?? 0); //[3, 0] | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | ## String Interpolation | ||||||
|  |  | ||||||
|  | Previously strings were built in a number of different ways: | ||||||
|  |  | ||||||
|  | ```csharp | ||||||
|  | var animal = "Monkeys"; | ||||||
|  | var food = "bananas"; | ||||||
|  |  | ||||||
|  | var out1 = String.Format ("{0} love to eat {1}", animal, food); | ||||||
|  | var out2 = animal + " love to eat " + food; | ||||||
|  | // or even StringBuilder | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | C# 6 provides a simple syntax where the fieldname can be | ||||||
|  | embedded directly in the string: | ||||||
|  |  | ||||||
|  | ```csharp | ||||||
|  | $"{animal} love to eat {food}" | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | String-formatting can also be done with this syntax: | ||||||
|  |  | ||||||
|  | ```csharp | ||||||
|  | var values = new int[] { 1, 2, 3, 4, 12, 123456 }; | ||||||
|  | foreach (var s in values.Select (i => $"The value is {i,10:N2}.")) { | ||||||
|  |    Console.WriteLine (s); | ||||||
|  | } | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | ## Expression-bodied Function Members | ||||||
|  |  | ||||||
|  | The `ToString` override in the following class is an expression-bodied | ||||||
|  | function - a more succinct declaration syntax. | ||||||
|  |  | ||||||
|  | ```csharp | ||||||
|  | class Person | ||||||
|  | { | ||||||
|  |     public string FirstName { get; } | ||||||
|  |     public string LastName { get; } | ||||||
|  |     public Person (string firstname, string lastname) | ||||||
|  |     { | ||||||
|  |        FirstName = firstname; | ||||||
|  |        LastName = lastname; | ||||||
|  |     } | ||||||
|  |     // note there is no explicit `return` keyword | ||||||
|  |     public override string ToString () => $"{LastName}, {FirstName} {LastName}"; | ||||||
|  | } | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | `void` expression bodied functions are also allowed so long as | ||||||
|  | the expression is a statement: | ||||||
|  |  | ||||||
|  | ```csharp | ||||||
|  | public void Log(string message) => System.Console.WriteLine($"{DateTime.Now.ToString ("s", System.Globalization.CultureInfo.InvariantCulture )}: {message}"); | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | This simple example calls these two methods: | ||||||
|  |  | ||||||
|  | ```csharp | ||||||
|  | Log(new Person("James", "Bond").ToString()) | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | ## Auto-property Initialization | ||||||
|  |  | ||||||
|  | Properties (ie. specified with `{get;set;}`) can be initialized inline | ||||||
|  | with C# 6: | ||||||
|  |  | ||||||
|  | ```csharp | ||||||
|  | class Todo | ||||||
|  | { | ||||||
|  |     public bool Done { get; set; } = false; | ||||||
|  |     public DateTime Created { get; } = DateTime.Now; | ||||||
|  |     public string Description { get; } | ||||||
|  |  | ||||||
|  |     public Todo (string description) | ||||||
|  |     { | ||||||
|  |        this.Description = description; // can assign (only in constructor!) | ||||||
|  |     } | ||||||
|  |     public override string ToString () => $"'{Description}' was created on {Created}"; | ||||||
|  | } | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | ```csharp | ||||||
|  | new Todo("buy apples") | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | ## Index Initializers | ||||||
|  |  | ||||||
|  | Dictionary-style data structures let you specify key/value | ||||||
|  | types with a simple object-initializer-like syntax: | ||||||
|  |  | ||||||
|  | ```csharp | ||||||
|  | var userInfo = new Dictionary<string,object> { | ||||||
|  |     ["Created"] = DateTime.Now, | ||||||
|  |     ["Due"] = DateTime.Now.AddSeconds(60 * 60 * 24), | ||||||
|  |     ["Task"] = "buy lettuce" | ||||||
|  | }; | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | ## using static | ||||||
|  |  | ||||||
|  | Enumerations, and certain classes such as System.Math, are primarily | ||||||
|  | holders of static values and functions. In C# 6, you can import all | ||||||
|  | static members of a type with a single using static statement: | ||||||
|  |  | ||||||
|  | ```csharp | ||||||
|  | using static System.Math; | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | C# 6 code can then reference the static members directly, avoiding | ||||||
|  | repetition of the class name (eg. `Math.PI` becomes `PI`): | ||||||
|  |  | ||||||
|  | ```csharp | ||||||
|  | public class Location  | ||||||
|  | { | ||||||
|  |     public Location (double lat, double @long) {Latitude = lat; Longitude = @long;}  | ||||||
|  |     public double Latitude = 0; public double Longitude = 0;  | ||||||
|  | } | ||||||
|  | static public double MilesBetween(Location loc1, Location loc2) | ||||||
|  | { | ||||||
|  |   double rlat1  = PI * loc1.Latitude / 180; | ||||||
|  |   double rlat2  = PI * loc2.Latitude / 180; | ||||||
|  |   double theta  = loc1.Longitude - loc2.Longitude; | ||||||
|  |   double rtheta = PI * theta / 180; | ||||||
|  |   double dist = | ||||||
|  |       Sin(rlat1) * Sin(rlat2) + Cos(rlat1) * | ||||||
|  |       Cos(rlat2) * Cos(rtheta); | ||||||
|  |   dist = Acos(dist); | ||||||
|  |   dist = dist*180/PI; | ||||||
|  |   dist = dist*60*1.1515; | ||||||
|  |   return dist; //miles | ||||||
|  | } | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | ```csharp | ||||||
|  | MilesBetween (new Location(-12,22), new Location(-13,33)) | ||||||
|  | ``` | ||||||
		Reference in New Issue
	
	Block a user