Comments (4)
One other thing is that the engine has a few places where that basic model does not work well:
Token::Str
holds aCow
so that it can store unescaped strings- for internal loop usage
Instruction::Lookup
andInstruction::GetAttr
also get static strings at times - Internal maps often hold
&'source str
and with that change they would need to hold aString
instead since we could not adjacently borrow
I think a model that could work is to have a StrCache<'source>
which is used everywhere where currently &'source str
is used to hold the source and then a few StrHandle
given out by the StrCache<'source>
. For as long as also for release builds an internal ID is given out that could be made safe without incurring bounds checks. For the few places where a &'static str
is placed there, I think the handle could be allowed to store references to static strings or specific instructions are used instead. For the the Cow
case that only exists in the Token
but never in Instruction
so that problem is much smaller in comparison. In the instructions it's already converted into a Value
which clones.
from minijinja.
I made some small changes internally that address some of these issues. In d53160d I removed static strings added to instructions for loop internals and in 6e60023 I removed the Cow
from the string token.
from minijinja.
I had back out one of these due to performance regressions.
from minijinja.
I have a new way now in which I think I want to go about this. The 'source
lifetime is quite useful for multiple scenarios so it does not need outright removing. What actually however is annoying is that you don't have a convenient way to add owned strings into the environment. This runs against a bunch of lifetime issues, but that is already true for the Source
feature too.
I think what I might be doing for MiniJinja 1.0 and to close off this issue is the following:
- When the
source
feature is enabled, the Engine always holds aSource
object internally to replace the template map Environment::add_template
stays and borrowsEnvironment::add_owned_template
(name TDB) is does what today isenv.source_mut().add_template(...)
- Hide the
Source
object internally.
Since after you can add owned templates there is not a lot of reason to actually expose the Source
object. The main of the Source
object which at that point is internal is to set a loader:
Before:
let mut env = Environment::new();
env.set_source(Source::with_loader(|name| {
if name == "layout.html" {
Ok(Some("...".into()))
} else {
Ok(None)
}
}));
After:
let mut env = Environment::new();
env.set_loader(|name| {
if name == "layout.html" {
Ok(Some("...".into()))
} else {
Ok(None)
}
});
And for owned templates:
Before:
let mut env = Environment::new();
let mut source = Source::new();
source.add_template("index.html", "...").unwrap();
env.set_source(source);
After:
let mut env = Environment::new();
env.add_owned_template("index.html", "...").unwrap();
from minijinja.
Related Issues (20)
- Introduce TemplateModule Abstraction
- Remove State.current_call
- Expose call() on Value
- MiniJinja 1.0 Plans HOT 1
- Move render_block and consorts onto TemplateModule
- Final 0.x Release with Deprecations HOT 1
- MiniJinja 1.0 Alpha Feedback HOT 4
- String indexing and comparison doesn't seem to work HOT 2
- Investigate Value with Lifetime HOT 1
- Replace Arc<String> with Arc<str>
- Obtain eval type of an expression [question] HOT 2
- Support for formatting dates HOT 2
- Loader FnMut and lifetime HOT 4
- raw/endraw includes raw/endraw tags in the output HOT 2
- just a suggestion: comparison between minijinja and tera HOT 1
- impl ArgType for datetime? HOT 3
- None value is converted to string when passed down to filter HOT 2
- Ability to add entries to a Value HOT 6
- {{}} in {%%} cannot work HOT 2
- Please support converting to FluentValue HOT 2
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from minijinja.